:root{
  /* ---- 品牌 / 状态色 ---- */
  --blue:#1a5fd0;
  --blue-d:#14499f;
  --blue-l:#e8f0fd;
  --blue-b:#cfe0fb;
  --red:#d93a3a;
  --green:#0f9d58;
  /* ---- 文字 ---- */
  --ink:#1c2330;
  --ink-1:#333c4d;
  --ink-2:#5a6577;
  --ink-3:#9aa3b2;
  /* ---- 线条 / 面 ---- */
  --line:#e3e8f0;
  --line-2:#d5dde8;
  --bd:#e3e8f0;
  --bg:#f4f6fa;
  --panel:#ffffff;
  --surface:#ffffff;
  --surface-2:#f7f9fc;
  --surface-3:#eef1f6;
  --surface-hover:#fafbfe;
  /* ---- 语义文字色（用于卡片/表格里的强调数字） ---- */
  --v-blue:#1d4ed8;
  --v-slate:#475569;
  --v-green:#047857;
  --v-orange:#c2410c;
  --v-amber:#a36905;
  --v-cyan:#0e7490;
  --v-red:#b91c1c;
  --v-teal:#0f766e;
  --v-rose:#be123c;
  --v-violet:#6d28d9;
  --v-purple:#8e44ad;
  /* ---- 柔和 Chip 底色 ---- */
  --bg-red-soft:#fdeeee;
  --bg-green-soft:#e9f7ef;
  --bg-amber-soft:#fdf3e0;
  --bg-purple-soft:#f0e9fd;
  --bd-red:#f1c0c0;
  --bd-green:#c8e8d4;
  --bd-amber:#f0d9ac;
  --bd-purple:#ddccf5;
  /* ---- 遮罩 / toast / 顶栏 ---- */
  --mask:rgba(16,24,40,.45);
  --toast-bg:rgba(28,35,48,.94);
  --toast-err:rgba(185,40,40,.95);
  --toast-warn:rgba(176,104,16,.96);
  --topbar-a:#14499f;
  --topbar-b:#1a5fd0;
  --topbar-c:#2f7ae0;
  --topbar-shadow:rgba(20,73,159,.18);
  --radius:6px;
  color-scheme:light;
}

/* ================= 暗色主题 ================= */
[data-theme="dark"]{
  --blue:#6ea8ff;
  --blue-d:#3d82e8;
  --blue-l:#1b2942;
  --blue-b:#2f4570;
  --red:#ff7b7b;
  --green:#4ad28f;
  --ink:#e4eaf3;
  --ink-1:#cdd6e3;
  --ink-2:#939fb2;
  --ink-3:#6b7688;
  --line:#2b3646;
  --line-2:#3a4759;
  --bd:#2b3646;
  --bg:#11161f;
  --panel:#1a2130;
  --surface:#1a2130;
  --surface-2:#202a3a;
  --surface-3:#293343;
  --surface-hover:#243044;
  --v-blue:#8ab4ff;
  --v-slate:#a8b3c4;
  --v-green:#4ade80;
  --v-orange:#fb923c;
  --v-amber:#fbbf24;
  --v-cyan:#38bdf8;
  --v-red:#ff8080;
  --v-teal:#2dd4bf;
  --v-rose:#fb7185;
  --v-violet:#a78bfa;
  --v-purple:#c084fc;
  --bg-red-soft:#3a1f22;
  --bg-green-soft:#16332a;
  --bg-amber-soft:#3a2d15;
  --bg-purple-soft:#2c2440;
  --bd-red:#5c2f33;
  --bd-green:#2c5343;
  --bd-amber:#5c4622;
  --bd-purple:#463a63;
  --mask:rgba(0,0,0,.66);
  --toast-bg:rgba(38,48,64,.96);
  --toast-err:rgba(153,27,27,.96);
  --toast-warn:rgba(146,84,12,.96);
  --topbar-a:#12233f;
  --topbar-b:#1b3a6b;
  --topbar-c:#25508f;
  --topbar-shadow:rgba(0,0,0,.45);
  color-scheme:dark;
}
/* 暗色下把纯白图片的观感压一档，避免刺眼 */
[data-theme="dark"] img{filter:brightness(.9)}
/* 打印用的对账单/单据样式始终浅色，不受主题影响 */
[data-theme="dark"] .sheet-bill,
[data-theme="dark"] .sheet,
[data-theme="dark"] .sheet-list{background:#fff;color:#000}
*{box-sizing:border-box;margin:0;padding:0}
/* hidden 属性必须最高优先级：否则 .mask{display:flex} 等会盖掉它，导致弹窗默认显示 */
[hidden]{display:none !important}
body{
  font-family:"Microsoft YaHei","PingFang SC","Helvetica Neue",Arial,sans-serif;
  background:var(--bg);color:var(--ink);font-size:14px;
}
/* ---------- 顶栏 ---------- */
.topbar{
  height:64px;background:linear-gradient(90deg,var(--topbar-a),var(--topbar-b));
  display:flex;align-items:center;justify-content:space-between;
  padding:0 24px;color:#fff;box-shadow:0 2px 8px var(--topbar-shadow);
}
.brand{display:flex;align-items:center;gap:12px}
.logo{
  width:40px;height:40px;border-radius:8px;background:rgba(255,255,255,.16);
  border:1px solid rgba(255,255,255,.35);display:flex;align-items:center;justify-content:center;
  font-weight:700;font-size:14px;letter-spacing:.5px;
}
.brand-text h1{font-size:19px;font-weight:700;letter-spacing:1px}
.brand-text p{font-size:12px;opacity:.85;margin-top:2px}
.top-right{display:flex;align-items:center;gap:10px;min-width:0}
.sync-bar{display:flex;align-items:center;gap:10px;font-size:13px}
/* 下面两个只在窄屏由 @media 打开，桌面端保持隐藏 */
.more-btn{display:none}
.sm-filter-toggle{display:none}
.dot{width:9px;height:9px;border-radius:50%;display:inline-block}
.dot.on{background:#4ade80;box-shadow:0 0 0 3px rgba(74,222,128,.25)}
.dot.off{background:#f87171;box-shadow:0 0 0 3px rgba(248,113,113,.2)}
.dot.wait{background:#fbbf24;box-shadow:0 0 0 3px rgba(251,191,36,.25)}

/* ---------- 按钮 ---------- */
.btn{
  border:1px solid var(--line);background:var(--surface);color:var(--ink);
  padding:7px 14px;border-radius:var(--radius);cursor:pointer;font-size:13px;
  font-family:inherit;transition:.15s;white-space:nowrap;
}
.btn:hover{border-color:var(--blue);color:var(--blue)}
.btn-primary{background:var(--blue);border-color:var(--blue);color:#fff}
.btn-primary:hover{background:var(--blue-d);border-color:var(--blue-d);color:#fff}
.btn-danger{background:var(--red);border-color:var(--red);color:#fff}
.btn-danger:hover{background:#b82d2d;color:#fff}
.btn-ok{background:var(--bg-green-soft);border-color:var(--green);color:var(--green)}
.btn-ok:hover{border-color:var(--green);color:var(--green)}
.btn-ghost{background:var(--surface);border-color:var(--line-2);color:var(--ink)}
.btn-ghost:hover{border-color:var(--blue);color:var(--blue);background:var(--blue-l)}
.topbar .btn-ghost{background:rgba(255,255,255,.14);border-color:rgba(255,255,255,.4);color:#fff}
.topbar .btn-ghost:hover{background:rgba(255,255,255,.26);color:#fff;border-color:#fff}
.btn-mini{padding:4px 9px;font-size:12px}
.btn-link{border:none;background:none;color:var(--blue);cursor:pointer;font-size:13px;padding:2px 6px;font-family:inherit}
.btn-link:hover{text-decoration:underline}
.btn-link.red{color:var(--red)}

/* ---------- Tab ---------- */
.tabs{background:var(--surface);border-bottom:1px solid var(--line);padding:0 24px;display:flex;gap:4px}
.tab{
  border:none;background:none;padding:13px 20px;font-size:14px;cursor:pointer;
  color:var(--ink-2);border-bottom:2px solid transparent;font-family:inherit;
}
.tab:hover{color:var(--blue)}
.tab.active{color:var(--blue);border-bottom-color:var(--blue);font-weight:600}

/* ---------- 布局 ---------- */
.wrap{padding:20px 24px 60px;max-width:1500px;margin:0 auto}
.view{display:none}
.view.active{display:block}

/* ---------- 统计卡 ---------- */
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:14px;margin-bottom:16px}
.card{background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:16px 18px}
.card-label{font-size:12px;color:var(--ink-2)}
.card-value{font-size:24px;font-weight:700;color:var(--blue);margin-top:6px;font-variant-numeric:tabular-nums}

/* ---------- 工具条 ---------- */
.toolbar{
  background:var(--surface);border:1px solid var(--line);border-radius:8px;padding:12px 14px;
  display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:14px;
}
.filters{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.tilde{color:var(--ink-2)}
.toolbar-right{margin-left:auto;display:flex;gap:8px}
.ipt{
  border:1px solid var(--line);border-radius:var(--radius);padding:7px 10px;
  font-size:13px;font-family:inherit;color:var(--ink);background:var(--surface);outline:none;
}
.ipt:focus{border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-l)}
.grow{flex:1;min-width:200px}

/* ---------- 表格 ---------- */
.table-wrap{background:var(--surface);border:1px solid var(--line);border-radius:8px;overflow:auto}
.grid{width:100%;border-collapse:collapse;font-size:13px}
.grid th,.grid td{border:1px solid var(--line);border-width:0 1px 1px 0;padding:9px 10px;text-align:left;vertical-align:middle}
.grid th:first-child,.grid td:first-child{border-left:1px solid var(--line)}
.grid thead th{border-top:1px solid var(--line)}
.grid thead th{background:var(--surface-2);font-weight:600;color:var(--ink-2);white-space:nowrap;position:sticky;top:0;z-index:2}
.grid tbody tr:hover{background:var(--surface-hover)}
.grid td.num,.grid th.num{text-align:right;font-variant-numeric:tabular-nums}
.ipt-cell{width:100%;border:none;background:transparent;font-size:13px;font-family:inherit;color:var(--ink);outline:none;padding:0}
.empty{padding:46px 0;text-align:center;color:var(--ink-2);font-size:13px}
.expand{cursor:pointer;color:var(--ink-2);user-select:none;display:inline-block;width:16px}
.detail-row td{background:var(--surface-2);padding:0}
.detail-inner{padding:10px 16px 14px 46px}
.detail-table{width:100%;border-collapse:collapse;font-size:13px}
.detail-table th,.detail-table td{border:1px solid var(--line);padding:6px 10px;text-align:left}
.detail-table th{background:var(--surface-3);color:var(--ink-2);font-weight:600}
.ops{display:flex;gap:2px;flex-wrap:nowrap;white-space:nowrap}
/* 出库日期（明细展开行顶部） */
.ship-date{font-size:12px;color:var(--ink-2);font-variant-numeric:tabular-nums;white-space:nowrap}
.detail-meta{font-size:12px;color:var(--ink-2);margin-bottom:6px;font-variant-numeric:tabular-nums}
.foot-sum{padding:12px 4px;font-size:13px;color:var(--ink-2)}
.foot-sum b{color:var(--blue);font-size:15px;font-variant-numeric:tabular-nums}

/* 分页控件（各表列表底部） */
.pager{display:flex;align-items:center;justify-content:center;gap:14px;padding:10px 4px;flex-wrap:wrap}
.pager:empty{display:none}
.pg-info{font-size:13px;color:var(--ink-2)}
.pg-btns{display:inline-flex;align-items:center;gap:4px}
.pg-btn{min-width:32px;height:30px;padding:0 8px;border:1px solid var(--line-2);background:var(--surface);border-radius:6px;color:var(--ink);font-size:14px;cursor:pointer;line-height:1;transition:all .15s}
.pg-btn:hover:not(:disabled){border-color:var(--blue);color:var(--blue);background:var(--blue-l)}
.pg-btn:disabled{opacity:.38;cursor:not-allowed}
.pg-cur{min-width:32px;height:30px;display:inline-flex;align-items:center;justify-content:center;border-radius:6px;background:var(--blue);color:#fff;font-size:13px;font-weight:700}
.pg-size{display:inline-flex;align-items:center;gap:6px;margin-left:4px}
.pg-size-label{font-size:12px;color:var(--ink-2)}
.pg-size-sel{height:30px;padding:0 6px;border:1px solid var(--line-2);background:var(--surface);border-radius:6px;color:var(--ink);font-size:13px;cursor:pointer;font-family:inherit}
.pg-size-sel:hover{border-color:var(--blue)}
.pg-size-sel:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-l)}

.tag-items{color:var(--ink-2);font-size:12px}
.tag-ledger{display:inline-block;padding:1px 7px;border-radius:3px;font-size:12px;background:var(--bg-red-soft);color:var(--v-red)}
.unshipped{color:var(--red);font-weight:700}
.tag-unshipped{display:inline-block;padding:0 6px;border-radius:3px;font-size:11px;background:var(--bg-red-soft);color:var(--red);font-weight:700}
.ship-chk{display:inline-flex;align-items:center;gap:4px;font-size:12px;color:var(--ink-2);cursor:pointer;white-space:nowrap}
.ship-chk input{width:14px;height:14px;cursor:pointer}

/* 本年份收入分类汇总（收入表页面最下方） */
.year-sum{margin-top:6px;background:var(--blue-l);border:1px solid var(--blue-b);border-radius:8px;padding:14px 16px}
.year-sum-head{display:flex;align-items:baseline;gap:12px;margin-bottom:10px}
.year-sum-label{font-size:13px;color:var(--ink-2)}
.year-sum-total{font-size:22px;font-weight:700;color:var(--blue);font-variant-numeric:tabular-nums}
.year-sum-items{display:flex;gap:10px;flex-wrap:wrap}
.ysi{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border-radius:16px;font-size:13px;background:var(--surface);border:1px solid var(--line)}
.ysi b{font-variant-numeric:tabular-nums;font-weight:600}
.ysi-cash b{color:var(--ink)}
.ysi-pub b{color:var(--blue)}
.ysi-acc b{color:var(--v-amber)}
.ysi-out b{color:var(--v-purple)}

/* ---------- 账户余额（支出表底部） ---------- */
.balance-box{margin-top:6px;background:var(--blue-l);border:1px solid var(--blue-b);border-radius:8px;padding:14px 16px}
.balance-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:12px}
.balance-label{font-size:13px;color:var(--ink-2)}
.balance-total{font-size:22px;font-weight:700;color:var(--blue);font-variant-numeric:tabular-nums}
.balance-items{display:flex;gap:12px;flex-wrap:wrap}
.bal-item{flex:1 1 200px;min-width:200px;background:var(--surface);border:1px solid var(--line);border-radius:8px;padding:12px 14px}
.bal-name{font-size:13px;color:var(--ink-2);margin-bottom:4px}
.bal-value{font-size:22px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--ink)}
.bal-sub{margin-top:6px;font-size:12px;color:var(--ink-2);font-variant-numeric:tabular-nums}
.bal-sub span{color:var(--ink);font-weight:600}
#balCash.bal-value,#balPub.bal-value,#balAcc.bal-value{color:var(--ink)}
#balPub.bal-value{color:var(--blue)}
#balAcc.bal-value{color:var(--v-amber)}

/* ---------- 面板 ---------- */
.panel{background:var(--surface);border:1px solid var(--line);border-radius:8px;padding:18px;margin-bottom:16px}
.panel-title{font-size:15px;margin-bottom:12px;color:var(--ink)}
.panel-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:12px}
.cm-search{display:flex;gap:6px;align-items:center}
.cm-search .ipt{width:240px}
@media (max-width:640px){.cm-search{width:100%}.cm-search .ipt{flex:1;width:auto}}
.rank-item{display:flex;align-items:center;gap:12px;padding:8px 0;border-bottom:1px dashed var(--line)}
.rank-no{width:22px;height:22px;border-radius:4px;background:var(--blue-l);color:var(--blue);font-size:12px;display:flex;align-items:center;justify-content:center;font-weight:700}
.rank-name{flex:1}
.rank-bar{height:8px;border-radius:4px;background:linear-gradient(90deg,#1a5fd0,#5b9bff);min-width:2px}
.rank-bar-box{flex:2;background:var(--surface-3);border-radius:4px;overflow:hidden;height:8px}
.rank-val{width:120px;text-align:right;font-variant-numeric:tabular-nums;color:var(--ink-2);font-size:13px}

/* ---------- 弹窗 ---------- */
.mask{position:fixed;inset:0;background:var(--mask);display:flex;align-items:flex-start;justify-content:center;z-index:50;padding:36px 16px;overflow:auto}
.modal{background:var(--surface);border-radius:10px;width:1000px;max-width:100%;box-shadow:0 18px 48px rgba(16,24,40,.25)}
.modal-s{width:400px}
.modal-head{padding:14px 18px;border-bottom:1px solid var(--line);font-size:15px;font-weight:600;display:flex;justify-content:space-between;align-items:center}
.x{border:none;background:none;font-size:22px;line-height:1;cursor:pointer;color:var(--ink-2)}
.modal-body{padding:16px 18px;max-height:calc(100vh - 260px);overflow:auto}
.modal-foot{padding:12px 18px;border-top:1px solid var(--line);display:flex;justify-content:flex-end;gap:10px}
.modal-lg{width:1100px}
.btn-close{background:transparent;border:none;font-size:22px;line-height:1;cursor:pointer;color:var(--ink-2);width:34px;height:34px;border-radius:8px}
.btn-close:hover{background:var(--line)}
.history-table{max-height:60vh;overflow:auto;border:1px solid var(--line);border-radius:8px}
.history-table .grid{margin:0;border:none}
.history-table .grid th,.history-table .grid td{padding:8px 10px;font-size:12px;border-right:1px solid var(--line);border-bottom:1px solid var(--line)}
.history-table .grid th{position:sticky;top:0;background:var(--surface-2);z-index:1}
.history-table .snap{font-family:Consolas,monospace;color:var(--ink-2);word-break:break-all;display:block;max-height:60px;overflow:auto}
.panel-actions{display:flex;gap:10px;margin-top:14px;justify-content:flex-end}
.setting-line{display:flex;flex-direction:column;gap:10px;background:var(--surface-2);border:1px solid var(--line);border-radius:8px;padding:14px;margin:12px 0}
.setting-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.setting-row .ipt{width:240px}
.setting-row span{color:var(--ink-1)}
.empty{color:var(--ink-2);padding:24px;text-align:center;font-size:13px}
.form-row{display:flex;align-items:center;gap:10px;margin-bottom:14px;flex-wrap:wrap}
.form-row label{font-size:13px;color:var(--ink-2);width:64px;text-align:right}
.form-row .ipt{width:210px}
.items-head{display:flex;justify-content:space-between;align-items:center;margin:6px 0 8px;font-size:13px;color:var(--ink-2)}
.grid-items th,.grid-items td{border:1px solid var(--line)}
.grid-items td{padding:4px 6px}
.grid-items .ipt{width:100%;border:1px solid transparent;background:var(--surface);padding:6px 8px}
.grid-items .ipt:focus{border-color:var(--blue)}
.tf-label{text-align:right;font-weight:600;color:var(--ink-2)}
.ipt-flat{background:var(--surface-2)!important;border:1px solid var(--line)!important;text-align:right;font-weight:600;color:var(--blue)}
.big-amount{margin-top:10px;font-size:13px;color:var(--ink-2)}
.big-amount span{color:var(--ink);font-weight:600}

/* ============ 总金额折扣区 ============ */
.discounts-box{margin-top:14px;border:1px solid var(--line);border-radius:6px;background:var(--surface);padding:8px 10px}
.disc-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;font-size:13px;color:var(--ink-2)}
.disc-head .disc-tip{color:var(--ink-3);font-style:normal;font-size:12px;margin-left:4px}
.disc-table{width:100%;border-collapse:collapse;font-size:12px}
.disc-table th,.disc-table td{border:1px solid var(--line);padding:5px 6px;text-align:left}
.disc-table thead th{background:var(--surface-2);font-weight:600;color:var(--ink-2);white-space:nowrap;text-align:center}
.disc-table .d-num{text-align:right;font-variant-numeric:tabular-nums}
.disc-table .d-center{text-align:center}
.disc-table .d-ipt{width:100%;border:1px solid transparent;background:#fff;padding:4px 6px;border-radius:3px;font-size:12px}
.disc-table .d-ipt:focus{border-color:var(--blue);outline:none}
.disc-table .d-ipt.num{text-align:right}
.disc-table .d-del{cursor:pointer;color:var(--red);background:none;border:none;padding:2px 6px;font-size:12px}
.disc-table .d-del:hover{text-decoration:underline}
.disc-table .d-running{color:var(--blue);font-weight:600}
.disc-table .d-running.up{color:#d03030}                  /* 加价：折后金额高于基数，红字 */
.disc-table .d-deduct.up{color:#d03030;font-weight:600}    /* 加价：本调整+ */
.disc-table .d-deduct.down{color:#2a8a2a}                  /* 减扣：本调整- */
.disc-table .d-empty{text-align:center;color:var(--ink-3);padding:10px}
.disc-summary{display:flex;gap:18px;margin-top:8px;font-size:13px;color:var(--ink-2);padding:6px 4px;border-top:1px dashed var(--line);flex-wrap:wrap}
.disc-summary b{color:var(--ink);font-variant-numeric:tabular-nums;margin-left:2px}
.disc-summary #dsDeduct.up{color:#d03030}
.disc-summary #dsDeduct.up b{color:#d03030}
.disc-summary #dsDeduct.down{color:#2a8a2a}
.disc-summary #dsDeduct.down b{color:#2a8a2a}
.disc-summary .ds-hint{font-size:11px;margin-left:6px;color:var(--ink-3)}
.disc-summary .ds-net{color:var(--blue);font-weight:600;font-size:14px}
.disc-summary .ds-net b{color:var(--blue)}

/* 列表中"有折扣"的角标 */
.tag-disc{display:inline-block;background:#fff5d9;color:#a06600;border:1px solid #f0d479;border-radius:3px;font-size:11px;padding:0 5px;margin-left:4px;vertical-align:1px}
.tag-disc.up{background:#ffe5e5;color:#b8000f;border-color:#ffb3b3}      /* 加价：红底 */
.tag-disc.down{background:#e8f5e8;color:#2a6a2a;border-color:#b8dfb8}    /* 减扣：绿底（默认 .tag-disc 已是黄底，这里允许显式覆盖） */

/* ---------- 对账单 / 数据管理 ---------- */
.fl{font-size:13px;color:var(--ink-2)}
.card-value.green{color:var(--green)}
.card-value.red{color:var(--red)}
.panel-title small{font-weight:400;color:var(--ink-2);font-size:12px;margin-left:8px}
.switch-inline{
  float:right;font-size:12px;font-weight:400;color:var(--ink-2);
  display:inline-flex;align-items:center;gap:5px;cursor:pointer;margin-top:2px;
}
.switch-inline input{width:14px;height:14px;margin:0;cursor:pointer;accent-color:var(--blue)}
/* 对账单：单据小计行 */
.grid tr.sub td{background:var(--surface-2);font-weight:600;color:var(--ink-2);font-size:13px}
.grid tr.sub td:first-child{padding-left:10px}
.grid td.muted{color:var(--ink-3)}
/* 结算方式徽章 */
.settle-chip{
  display:inline-flex;align-items:center;padding:3px 10px;border-radius:20px;
  font-size:12px;font-weight:600;white-space:nowrap;
  background:var(--blue-l);color:var(--blue);border:1px solid var(--blue-b);
}
.settle-chip.sc-cash{background:var(--bg-amber-soft);color:var(--v-amber);border-color:var(--bd-amber)}
.settle-chip.sc-month{background:var(--bg-green-soft);color:var(--green);border-color:var(--bd-green)}
.settle-chip.sc-quarter{background:var(--bg-purple-soft);color:var(--v-purple);border-color:var(--bd-purple)}
/* 产值明细可编辑表 */
/* === 产值明细：冻结客户名列 + 锁定前两行表头 === */
#viewOutput .table-wrap {
  max-height: min(70vh, 720px);
  overflow: auto;
}
/* 客户名称列（thead 与 tbody 第一格 + tfoot 合计列）锁定在左侧 */
.grid-out th:first-child,
.grid-out td.cust,
.grid-out tfoot td:first-child {
  position: sticky;
  left: 0;
  z-index: 2;
  background: var(--surface);
  box-shadow: 1px 0 0 var(--line);
}
.grid-out tfoot td:first-child { background: var(--surface-2); }
/* 表头两行锁定在顶部；行 1 top:0，行 2 top:36px（每行高 ≈ 36px） */
.grid-out thead tr:nth-child(1) th { position: sticky; top: 0; background: var(--surface-2); z-index: 3; }
.grid-out thead tr:nth-child(2) th { position: sticky; top: 36px; background: var(--surface-2); z-index: 3; }
/* 左上角格（同时 top + left）z 最高 */
.grid-out thead tr:nth-child(1) th:first-child { z-index: 5; }
.grid-out thead tr:nth-child(2) th:first-child { z-index: 5; }

.grid-out input.cell{
  width:74px;border:1px solid transparent;background:transparent;text-align:right;
  font-size:13px;padding:4px 6px;border-radius:4px;font-variant-numeric:tabular-nums;
}
.grid-out input.cell.pub{color:var(--blue)}
.grid-out input.cell:hover{border-color:var(--line);background:var(--surface)}
.grid-out input.cell:focus{border-color:var(--blue);background:var(--surface);outline:none}
.grid-out td.cust{font-weight:600}
.grid-out tfoot td{background:var(--surface-2);font-weight:700;border-top:2px solid var(--line)}
.chk{display:inline-flex;align-items:center;gap:5px;font-size:13px;color:var(--ink-2);cursor:pointer;white-space:nowrap}
.chk input{width:15px;height:15px;accent-color:var(--blue)}
.tag-inv{display:inline-block;padding:1px 7px;border-radius:3px;font-size:12px;background:var(--bg-green-soft);color:var(--green);white-space:nowrap;text-align:center}
/* 注：「未开票」胶囊 .tag-uninv 曾于 2026-09-21 加过又撤（用户：这个不要，只要待开票），别再往收入表每行挂未开票标签。 */
.method-tag{display:inline-block;padding:1px 7px;border-radius:3px;font-size:12px;background:var(--surface-3);color:var(--ink-2);white-space:nowrap;text-align:center}
/* 收入/支出列表主表：每格付款方式 */
.method-cell{padding:4px 6px;font-size:12px;color:var(--ink-1);white-space:nowrap;text-align:center}
/* 含胶囊标签（method-tag / tag-inv）的单元格水平居中，让标签视觉上对得齐 */
.grid td:has(> .method-tag),
.grid td:has(> .tag-inv){text-align:center;vertical-align:middle}
.method-cell:nth-child(odd of .method-cell){background:var(--surface-2)}
.btn-mini{padding:3px 10px;font-size:12px}
/* 路径/文件名展示块：柔和底色 + 等宽字体，让文件名一眼可辨 */
.path-display{display:inline-block;margin-top:6px;padding:4px 10px;background:var(--surface-2);border-radius:4px;font-size:12px;color:var(--ink-1);font-family:Consolas,Menlo,monospace;max-width:100%;word-break:break-all}
.path-display b{color:var(--brand);font-weight:600}
.path-display[style*="cursor: pointer"],.path-display b{cursor:pointer}
/* 最近一次成功写入摘要 — 让用户能区分"绿点常亮（内存就绪）" vs "实际已写盘" */
.last-write{margin-top:8px;padding:6px 10px;background:var(--surface-2);border-left:3px solid var(--green);border-radius:3px;font-size:12px;color:var(--ink-1);line-height:1.6}
.last-write b{font-weight:600}
.path-display b:hover{text-decoration:underline}
.hint{font-size:13px;color:var(--ink-2);line-height:1.7;margin-bottom:14px}
.hint-inline{font-size:12px;color:var(--ink-2);margin-left:8px}
.cb-inline{font-size:13px;color:var(--ink-2);cursor:pointer;user-select:none;display:inline-flex;align-items:center;gap:6px}
.cb-inline input{cursor:pointer}
.btn-line{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:14px}
/* Excel 面板「目录绑定」行：chip + 按钮 + hint 提示，三段紧凑同行 */
.bind-row{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin:8px 0 12px;padding:8px 10px;background:var(--surface-1);border-radius:4px;border-left:3px solid var(--brand)}
.btn-xs{padding:6px 10px;font-size:12px}
/* 多形式方式编辑器：纵向布局，避免窄弹窗内金额输入框被挤压到 0 宽 */
.form-col{flex-direction:column;align-items:stretch}
.form-col>label{width:auto;text-align:left}
.methods-box{display:flex;flex-direction:column;gap:6px;width:100%}
.methods-line{display:flex;gap:8px;align-items:center}
.methods-line select.ipt{min-width:110px;flex:0 0 auto}
.methods-line input.ipt{flex:1;min-width:80px}
.methods-line .btn-rm{padding:4px 10px;font-size:12px;color:var(--red);background:transparent;border:1px solid var(--bd-red);border-radius:6px;cursor:pointer}
.methods-line .btn-rm:hover{background:var(--bg-red-soft)}
.methods-foot{display:flex;align-items:center;gap:12px;margin-top:4px}
.methods-sum{font-size:13px;color:var(--ink-2);font-variant-numeric:tabular-nums}
.methods-sum.ok{color:var(--blue);font-weight:600}
.methods-sum.warn{color:var(--red)}
.export-checks{display:flex;gap:20px;flex-wrap:wrap;padding:6px 2px}
.export-checks .chk{font-size:14px;color:var(--ink)}
.stat-line{
  font-size:13px;color:var(--ink-2);background:var(--surface-2);border:1px solid var(--line);
  border-radius:var(--radius);padding:10px 12px;line-height:1.9
}
.stat-line b{color:var(--ink)}
.stat-line .k{display:inline-block;min-width:110px;color:var(--ink-2)}
.export-state{font-size:13px;color:var(--ink-2);align-self:center}
.export-state.ok{color:var(--blue)}
.export-state.err{color:var(--red)}
.bill-export-panel .btn-primary{font-weight:600}
.sheet-bill h2{text-align:center;font-size:20px;letter-spacing:3px}
.sheet-bill .sub{text-align:center;font-size:12px;color:#444;margin-bottom:10px;letter-spacing:2px}
.sheet-bill .meta{display:flex;justify-content:space-between;border-top:2px solid #000;border-bottom:1px solid #000;padding:6px 2px}
.sheet-bill table{width:100%;border-collapse:collapse;margin-top:8px}
.sheet-bill th,.sheet-bill td{border:1px solid #333;padding:5px 8px;font-size:12px}
.sheet-bill th{background:#f0f0f0;text-align:center;font-weight:600}
.sheet-bill td.c{text-align:center}
.sheet-bill td.r{text-align:right}
.sheet-bill .total td{font-weight:700;background:#f7f7f7}
.sheet-bill .balance{display:flex;border:1px solid #333;border-top:none;font-size:12px}
.sheet-bill .balance div{flex:1;padding:8px 10px;border-right:1px solid #333}
.sheet-bill .balance div:last-child{border-right:none}
.sheet-bill .balance b{font-size:14px}
.sheet-bill .sec{font-weight:700;margin-top:14px;font-size:13px}
.sheet-bill .sign{display:flex;justify-content:space-between;margin-top:26px;font-size:12px}
.sheet-bill .sign div{width:45%}
.sheet-bill .sign span{display:inline-block;border-bottom:1px solid #000;width:62%;height:18px;vertical-align:bottom}
.sheet-bill .foot-note{margin-top:14px;font-size:11px;color:#555;display:flex;justify-content:space-between}

.toast{
  position:fixed;top:20px;left:50%;transform:translateX(-50%);
  background:var(--toast-bg);color:#fff;padding:10px 20px;border-radius:6px;
  font-size:13px;z-index:99;box-shadow:0 6px 20px rgba(0,0,0,.2)
}

/* ---------- 打印 ---------- */
#printArea{display:none}
@media print{
  body>*:not(#printArea){display:none!important}
  #printArea{display:block!important}
  .sheet{page-break-after:always;padding:0}
  .sheet:last-child{page-break-after:auto}
  @page{size:A4 portrait;margin:12mm}
  /* 强制保留颜色：Chrome 打印默认把彩色文字去色成黑 */
  *{-webkit-print-color-adjust:exact!important;print-color-adjust:exact!important}
}
.sheet{width:190mm;margin:0 auto;color:#000;font-size:12px;background:#fff}
.sheet h2{text-align:center;font-size:20px;letter-spacing:4px;margin-bottom:2px}
.sheet .sub{text-align:center;font-size:12px;color:#444;margin-bottom:12px;letter-spacing:1px}
.sheet .meta{display:flex;justify-content:space-between;border-top:2px solid #000;border-bottom:1px solid #000;padding:6px 2px;margin-bottom:0}
.sheet table{width:100%;border-collapse:collapse}
.sheet table th,.sheet table td{border:1px solid #333;padding:6px 8px;font-size:12px}
.sheet table th{background:#f0f0f0;text-align:center;font-weight:600}
.sheet td.c{text-align:center}
.sheet td.r{text-align:right}
.sheet .total td{font-weight:700;background:#f7f7f7}
.sheet .sign{display:flex;justify-content:space-between;margin-top:26px;font-size:12px}
.sheet .sign div{width:30%}
.sheet .sign span{display:inline-block;border-bottom:1px solid #000;width:60%;height:18px;vertical-align:bottom}
.sheet .foot-note{margin-top:14px;font-size:11px;color:#555;display:flex;justify-content:space-between}
.sheet .big{margin-top:8px;font-size:12px;font-weight:600}
/* 排产单底部备注：加粗加大 + 红色（!important 防被覆盖；print-color-adjust 保证打印保色） */
.sheet .plan-note{margin-top:10px;font-size:16px;font-weight:700;color:#d00!important;-webkit-print-color-adjust:exact;print-color-adjust:exact}
.sheet .plan-note span{font-weight:700;color:#d00!important;-webkit-print-color-adjust:exact;print-color-adjust:exact}
.sheet .disc-print{width:100%;border-collapse:collapse;margin-top:8px;font-size:12px}
.sheet .disc-print th,.sheet .disc-print td{border:1px solid #333;padding:5px 6px}
.sheet .disc-print th{background:#f0f0f0;text-align:center;font-weight:600}
.sheet .disc-print td.r{text-align:right;font-variant-numeric:tabular-nums}
.sheet .disc-print td.up{color:#d03030;font-weight:600}     /* 打印：加价红字 */
.sheet .disc-print td.down{color:#2a8a2a}                   /* 打印：减扣绿字 */
.sheet .disc-print-total{margin-top:6px;font-size:13px;font-weight:600;display:flex;gap:14px;flex-wrap:wrap}
.sheet .disc-print-total .net{color:#1a5fd0}
.sheet-list h2{text-align:center;font-size:18px;margin-bottom:4px}
.sheet-list .sub{text-align:center;font-size:12px;margin-bottom:10px}
.sheet-list table{width:100%;border-collapse:collapse;font-size:11px;margin-top:10px}
.sheet-list th,.sheet-list td{border:1px solid #333;padding:4px 6px}
.sheet-list th{background:#f0f0f0}

/* ---------- 登录界面 ---------- */
.mask-login{
  background:linear-gradient(135deg,var(--topbar-a) 0%,var(--topbar-b) 55%,var(--topbar-c) 100%);
  align-items:center;z-index:200;
}
.modal-login{
  width:360px;max-width:92%;background:var(--surface);border-radius:12px;
  box-shadow:0 24px 64px rgba(10,30,70,.4);padding:34px 30px 28px;text-align:center;
}
.login-logo{
  width:56px;height:56px;margin:0 auto 14px;border-radius:12px;
  background:linear-gradient(135deg,var(--topbar-a),var(--topbar-b));color:#fff;
  display:flex;align-items:center;justify-content:center;font-weight:800;font-size:18px;letter-spacing:.5px;
}
.login-title{font-size:20px;font-weight:700;letter-spacing:1px;color:var(--ink)}
.login-sub{font-size:12px;color:var(--ink-2);margin:4px 0 22px;letter-spacing:1px}
.login-form{display:flex;flex-direction:column;gap:12px}
.login-remember{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--ink-2);cursor:pointer;user-select:none}
.login-remember input{cursor:pointer}
.login-ipt{width:100%;height:42px;padding:0 14px;font-size:14px;border-radius:8px;border:1px solid var(--line)}
.login-ipt:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 3px rgba(26,95,208,.12)}
.btn-block{width:100%;height:42px;font-size:15px;font-weight:600;border-radius:8px;margin-top:4px}
.login-error{color:var(--red);font-size:12px;text-align:left;min-height:16px}

/* ---------- 账户管理 ---------- */
.user-bar{
  color:#fff;font-size:13px;padding:0 4px;max-width:160px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap;opacity:.92;
}
.role-tag{
  display:inline-block;padding:1px 8px;border-radius:10px;font-size:11px;
  background:var(--blue-l);color:var(--blue);border:1px solid var(--blue-b);
}
.role-tag.admin{background:var(--bg-red-soft);color:var(--red);border-color:var(--bd-red)}
.me-tag{
  display:inline-block;padding:0 6px;border-radius:8px;font-size:11px;
  background:var(--bg-green-soft);color:var(--green);border:1px solid var(--bd-green);margin-left:4px;
}
#accBody .btn-link{padding:2px 4px}

/* ---------- JSON 备份面板 ---------- */
.panel code{background:var(--surface-3);padding:1px 6px;border-radius:4px;font-size:12px;color:var(--v-blue)}
.panel .stat-line{display:flex;align-items:center;gap:8px;margin-top:10px;font-size:13px;color:var(--ink-2);flex-wrap:wrap}
#jsonSyncText{color:var(--ink);font-weight:600}

/* ---------- 应收账款账龄分析 ---------- */
.aging-toolbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:12px 0}
.aging-toolbar label{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--ink-2)}
.aging-toolbar .ipt{padding:5px 10px}

.aging-summary{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin:14px 0}
.aging-card{border-radius:10px;padding:14px 16px;border:1px solid var(--bd);background:var(--surface);box-shadow:0 1px 2px rgba(0,0,0,0.04)}
.aging-card-label{font-size:12px;color:var(--ink-2);margin-bottom:6px}
.aging-card-value{font-size:22px;font-weight:700;color:var(--ink)}
.aging-card-sub{font-size:12px;color:var(--ink-2);margin-top:4px}
.aging-card-total .aging-card-value{color:var(--v-blue)}
.aging-card-paid .aging-card-value{color:var(--v-green)}
.aging-card-unpaid .aging-card-value{color:var(--v-red)}
.aging-card-advance .aging-card-value{color:var(--v-amber)}

.aging-bar{display:flex;flex-direction:column;gap:8px;margin:8px 0 14px}
.aging-bar-row{display:grid;grid-template-columns:90px 1fr 200px;align-items:center;gap:10px;font-size:13px}
.aging-bar-label{color:var(--ink-2);text-align:right}
.aging-bar-track{height:18px;background:var(--surface-3);border-radius:4px;overflow:hidden}
.aging-bar-fill{height:100%;border-radius:4px;transition:width .3s ease}
.aging-bar-fill-0-30{background:#3b82f6}
.aging-bar-fill-30-60{background:#f59e0b}
.aging-bar-fill-60-90{background:#f97316}
.aging-bar-fill-90plus{background:#dc2626}
.aging-bar-value{font-variant-numeric:tabular-nums;color:var(--ink-2)}

.aging-b-0-30{background:rgba(59,130,246,0.08);color:var(--v-blue)}
.aging-b-30-60{background:rgba(245,158,11,0.10);color:var(--v-amber)}
.aging-b-60-90{background:rgba(249,115,22,0.10);color:var(--v-orange)}
.aging-b-90plus{background:rgba(220,38,38,0.10);color:var(--v-red);font-weight:600}

.aging-detail>td{padding:0!important;background:var(--surface-2)}
.aging-detail-inner{padding:14px 18px;border-top:2px solid var(--bd)}
.aging-detail-inner table{margin:0}
.aging-detail-inner th{background:var(--surface-3)}

/* ============ 月度经营报表 ============ */
.mt-kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin-bottom:18px}
.mt-card{padding:14px 16px;border-radius:8px;border:1px solid var(--bd);background:var(--surface);box-shadow:0 1px 2px rgba(0,0,0,0.03)}
.mt-card-title{font-size:12px;color:var(--ink-2);margin-bottom:6px}
.mt-card-val{font-size:20px;font-weight:700;color:var(--ink);font-variant-numeric:tabular-nums}
.mt-card-sub{font-size:11px;color:var(--ink-2);margin-top:2px}
.mt-card.kpi-revenue{border-left:4px solid #3b82f6}
.mt-card.kpi-revenue .mt-card-val{color:var(--v-blue)}
.mt-card.kpi-cost{border-left:4px solid #64748b}
.mt-card.kpi-cost .mt-card-val{color:var(--v-slate)}
.mt-card.kpi-gross-pos{border-left:4px solid #10b981;background:rgba(16,185,129,0.04)}
.mt-card.kpi-gross-pos .mt-card-val{color:var(--v-green)}
.mt-card.kpi-gross-neg{border-left:4px solid #f97316;background:rgba(249,115,22,0.04)}
.mt-card.kpi-gross-neg .mt-card-val{color:var(--v-orange)}
.mt-card.kpi-received{border-left:4px solid #06b6d4}
.mt-card.kpi-received .mt-card-val{color:var(--v-cyan)}
.mt-card.kpi-expense{border-left:4px solid #ef4444}
.mt-card.kpi-expense .mt-card-val{color:var(--v-red)}
.mt-card.kpi-cash-pos{border-left:4px solid #14b8a6;background:rgba(20,184,166,0.04)}
.mt-card.kpi-cash-pos .mt-card-val{color:var(--v-teal)}
.mt-card.kpi-cash-neg{border-left:4px solid #f43f5e;background:rgba(244,63,94,0.04)}
.mt-card.kpi-cash-neg .mt-card-val{color:var(--v-rose)}
.mt-card.kpi-output{border-left:4px solid #8b5cf6}
.mt-card.kpi-output .mt-card-val{color:var(--v-violet)}
.mt-card.kpi-profit-pos{border-left:4px solid #22c55e;background:rgba(34,197,94,0.06)}
.mt-card.kpi-profit-pos .mt-card-val{color:var(--v-green)}
.mt-card.kpi-profit-neg{border-left:4px solid #dc2626;background:rgba(220,38,38,0.06)}
.mt-card.kpi-profit-neg .mt-card-val{color:var(--v-red)}

.mt-bars{display:flex;align-items:flex-end;gap:6px;height:200px;padding:12px 8px;border:1px solid var(--bd);border-radius:8px;background:var(--surface);margin-bottom:18px}
.mt-bar-col{flex:1;display:flex;flex-direction:column;align-items:center;min-width:0}
.mt-bar-pair{display:flex;align-items:flex-end;justify-content:center;gap:2px;height:160px;width:100%}
.mt-bar{width:42%;min-height:1px;border-radius:3px 3px 0 0;transition:height 0.4s ease}
.mt-bar-revenue{background:linear-gradient(to top,#3b82f6,#60a5fa)}
.mt-bar-profit-pos{background:linear-gradient(to top,#ef4444,#f87171)}
.mt-bar-profit-neg{background:linear-gradient(to top,#dc2626,#b91c1c);opacity:0.7}
.mt-bar-label{font-size:11px;color:var(--ink-2);margin-top:4px;font-variant-numeric:tabular-nums}

.mt-table{margin-top:8px}
.mt-table th,.mt-table td{padding:8px 10px}
.mt-table tfoot td{background:var(--surface-2);border-top:2px solid var(--bd);font-weight:600}
.mt-table .mt-row-avg td{background:var(--surface-3);color:var(--ink-2)}
.mt-pos{color:var(--v-green)}
.mt-neg{color:var(--v-red)}
.mt-rate{font-size:11px;color:var(--ink-2);font-weight:400;margin-left:2px}

/* ================= 主题切换按钮 ================= */
.theme-btn{
  width:34px;height:34px;padding:0;border-radius:8px;line-height:1;
  display:inline-flex;align-items:center;justify-content:center;
  font-size:16px;cursor:pointer;transition:.15s;flex:none;
}
.topbar .theme-btn{background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.4);color:#fff}
.topbar .theme-btn:hover{background:rgba(255,255,255,.26);border-color:#fff}

/* 顶部「未发货徽章」:打开系统第一时间可看见剩余待发数 */
.badge-chip{display:inline-flex;align-items:center;gap:4px;height:30px;padding:0 12px;border:1px solid rgba(255,255,255,.5);border-radius:16px;background:rgba(217,58,58,.92);color:#fff;font-size:13px;font-weight:600;cursor:pointer;transition:transform .15s,box-shadow .15s,background .15s;box-shadow:0 1px 4px rgba(217,58,58,.4)}
.badge-chip:hover{background:rgba(217,58,58,1);transform:translateY(-1px);box-shadow:0 3px 10px rgba(217,58,58,.55)}
.badge-chip[hidden]{display:none!important}
.badge-chip .badge-pulse{display:inline-block;width:6px;height:6px;border-radius:50%;background:#ffd1d1;animation:badgePulse 1.6s ease-in-out infinite}
@keyframes badgePulse{0%,100%{opacity:.55;transform:scale(1)}50%{opacity:1;transform:scale(1.35)}}
[data-theme="dark"] .badge-chip{background:rgba(255,107,107,.95);border-color:rgba(255,200,200,.5)}
/* 暗色下按钮里的文字压暗，保持与浅色一致的对比 */
[data-theme="dark"] .btn-danger:hover{background:#a02525}
[data-theme="dark"] .grid tbody tr:hover{background:var(--surface-hover)}
[data-theme="dark"] .mt-card,
[data-theme="dark"] .aging-card{box-shadow:0 1px 3px rgba(0,0,0,.3)}

/* ============ 运费查看 ============ */
.fr-tip{font-size:12px;color:var(--ink-2);margin:12px 0 4px;padding:8px 12px;background:var(--surface);border:1px dashed var(--line);border-radius:6px}
.frt{margin-top:18px}
.frt h3{font-size:15px;font-weight:700;margin:0 0 8px;color:var(--ink);border-left:4px solid var(--blue);padding-left:8px}
.fr-table{width:100%;border-collapse:collapse;font-size:12px}
.fr-table th,.fr-table td{border:1px solid var(--line);padding:7px 8px;text-align:left;vertical-align:middle}
.fr-table thead th{background:var(--surface-2);font-weight:600;color:var(--ink-2);white-space:nowrap}
.fr-table tbody tr:hover{background:var(--surface-hover)}
.fr-note{margin-top:10px;font-size:12px;color:var(--ink-2);line-height:1.7;background:var(--surface);border:1px dashed var(--line);padding:10px 12px;border-radius:6px}
/* 可编辑单元格 */
.fr-editable{cursor:pointer;transition:background .12s}
.fr-editable:hover{background:var(--blue-l);outline:1px dashed var(--blue)}
.fr-editable.fr-editing{padding:0;background:#fff}
.fr-cell-ipt{width:100%;box-sizing:border-box;border:2px solid var(--blue);border-radius:4px;padding:6px 8px;font-size:12px;font-family:inherit;color:var(--ink);background:#fff;outline:none}

/* ==================== 移动端适配（≤768px）====================
   只在小屏生效；桌面端规则完全不受影响。
   设计目标：把「顶栏 + 统计卡 + 工具条」三块压缩到一屏的 1/4 以内，
   让表格第一眼就能看见；次要操作收进「☰」和「🔍 筛选」两个折叠开关。
   折叠状态由 body 上的 .sm-more-open / .sm-filters-open 两个类控制（app.js 负责切换）。 */
@media (max-width:768px){
  /* ---------- 顶栏：默认只有一行，次要操作收进 ☰ ---------- */
  .topbar{
    height:auto;min-height:0;padding:7px 10px;gap:6px;
    flex-wrap:wrap;align-items:center;justify-content:space-between;
  }
  .brand{order:1;flex:1 1 auto;gap:8px;min-width:0}
  .brand-text{min-width:0}
  .logo{width:30px;height:30px;font-size:11px;border-radius:7px}
  .brand-text h1{font-size:15px;letter-spacing:.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  .brand-text p{display:none}

  /* 第一行：[品牌] ……… [绿点][未发货徽标][☰] */
  .top-right{order:2;flex:0 0 auto;min-width:0;flex-wrap:wrap;justify-content:flex-end;gap:6px}
  .more-btn{
    order:3;flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;
    min-width:38px;min-height:32px;padding:0 8px;font-size:15px;line-height:1;
  }
  .sync-bar{font-size:12px;gap:6px}
  #syncText{display:none}
  .top-right>.badge-chip{height:30px;padding:0 10px;font-size:12px}

  /* 常态：导出 / 导入 / 主题 / 账号 / 退出 全部收起 */
  .top-right>#btnExport,
  .top-right>#btnImport,
  .top-right>#btnTheme,
  .top-right>#userBar,
  .top-right>#btnLogout{display:none}

  /* 点开 ☰ 后：操作区独占一行，两列网格排布 */
  body.sm-more-open .top-right{
    order:3;flex:1 1 100%;display:grid;grid-template-columns:1fr 1fr;
    align-items:center;gap:6px;justify-content:stretch;
    padding-top:7px;border-top:1px solid rgba(255,255,255,.2);
  }
  body.sm-more-open .more-btn{order:2}
  body.sm-more-open .top-right>.sync-bar{display:none}   /* 绿点已在悬浮徽标上，收起时再显示 */
  body.sm-more-open .top-right>.badge-chip{grid-column:1 / -1;justify-self:start}
  body.sm-more-open .top-right>#btnExport,
  body.sm-more-open .top-right>#btnImport{display:inline-flex;justify-content:center}
  body.sm-more-open .top-right>#btnTheme{display:inline-flex;justify-content:center}
  body.sm-more-open .top-right>#userBar:not([hidden]){
    display:inline-flex;justify-content:flex-end;
  }
  body.sm-more-open .top-right>#btnLogout:not([hidden]){
    display:inline-flex;justify-content:center;grid-column:1 / -1;
  }

  /* 标签栏：改为**自动换行**（2026-09-23 改）。
     ⚠️ 旧写法是 flex-wrap:nowrap + overflow-x:auto（横滑），9 个大项实测总宽 732px、
        容器只有 412px → 靠右的「客户对账单/运费查看/单价查询/数据管理」4 个**完全在屏幕外**，
        而且没有任何视觉提示，老板根本不知道该往右滑 —— 加「单价查询」后更严重。
     换行后 3 行内看全，代价只是标签栏高了 ~30px；桌面端不受影响（整块在 media 里）。 */
  .tabs{padding:0 8px;overflow-x:visible;flex-wrap:wrap;row-gap:0}
  .tab{padding:9px 12px;font-size:13px;white-space:nowrap;flex:0 0 auto}

  /* ---------- 主容器与统计卡：压扁 ---------- */
  .wrap{padding:10px 10px 80px}
  .cards{grid-template-columns:repeat(auto-fit,minmax(102px,1fr));gap:8px;margin-bottom:10px}
  .card{padding:9px 11px;border-radius:8px}
  .card-label{font-size:11px;line-height:1.25}
  .card-value{font-size:19px;margin-top:3px}
  .panel{padding:12px;margin-bottom:12px}
  .panel-title{font-size:14px}

  /* ---------- 工具条：默认只显示「主按钮 + 🔍 筛选」一行 ---------- */
  .toolbar{padding:8px;gap:8px;margin-bottom:10px}
  .sm-filter-toggle{display:inline-flex;align-items:center;gap:4px;flex:0 0 auto;min-height:36px;padding:0 12px;font-size:13px}
  body:not(.sm-filters-open) .toolbar>.filters,
  body:not(.sm-filters-open) .toolbar>.toolbar-right{display:none}
  .toolbar>.btn-primary{flex:1 1 auto;min-width:0}
  .toolbar>.filters{flex:1 1 100%;width:100%;gap:6px}
  .toolbar>.toolbar-right{margin-left:0;width:100%;flex:1 1 100%;flex-wrap:wrap;gap:6px}
  .toolbar>.toolbar-right>.btn{flex:1 1 calc(50% - 3px)}
  .grow{min-width:0;flex:1 1 100%}

  /* 筛选区内部：日期/下拉各占半行，文本框整行，按钮两两一行 */
  .filters>.tilde{display:none}
  .filters>input[type=date],
  .filters>input[type=month],
  .filters>input[type=number],
  .filters>select{flex:1 1 calc(50% - 3px);min-width:0;width:auto}
  .filters>input[type=text]{flex:1 1 100%;min-width:0}
  .filters>.btn{flex:1 1 calc(50% - 3px)}
  .filters>.cb-inline{flex:1 1 100%}
  .filters>.fl{flex:1 1 100%;line-height:1.2;margin-bottom:-2px}

  /* iOS 上输入框字号 <16px 会触发自动缩放，统一提到 16px */
  .ipt,select.ipt,textarea.ipt{font-size:16px;padding:9px 10px}
  .btn{min-height:38px;padding:9px 14px}
  .btn-mini{min-height:30px;padding:5px 9px;font-size:12px}
  .btn-link{min-height:30px}

  /* 表格：横向滑动 + 紧凑排版
     ⚠️ min-width 是关键：不加的话浏览器会把「客户名称/产品明细」这些弹性列
     压到最小内容宽度，中文被折成三四行、日期也断成两截，比滑动难看得多。 */
  .table-wrap{-webkit-overflow-scrolling:touch;border-radius:8px}
  .grid{font-size:12px}
  .grid th,.grid td{padding:6px 7px}
  .grid thead th{font-size:11px}
  /* 列表类表格不折行 —— 让表格按内容撑开、由 .table-wrap 横向滑动，
     而不是把「客户名称/产品明细」压到最小宽度折成三四行。
     不写 min-width：窄表（如运费 3 列）本来就放得下，硬撑开反而要横向滑。
     产值明细(.grid-out)、单据弹窗(.grid-items) 要输入和多行，日志表文字长 —— 都不套用。
     （.grid-items 只出现在「新增销售出库单」「新增采购入库」两个弹窗里，
       窄屏下另有卡片式规则，见文件末尾。） */
  .grid:not(.grid-out):not(.grid-items):not(.history-table) th,
  .grid:not(.grid-out):not(.grid-items):not(.history-table) td{white-space:nowrap}
  .foot-sum,.pager{font-size:12px}

  /* 弹窗：接近全屏，底部按钮可换行、动词均分宽度 */
  .mask{padding:8px;align-items:flex-start}
  .modal,.modal-lg{width:100%;max-width:100%;border-radius:10px}
  .modal-head{padding:12px}
  .modal-body{padding:12px;max-height:calc(100vh - 160px)}
  .modal-foot{padding:12px;flex-wrap:wrap}
  .modal-foot .btn{flex:1 1 auto;min-width:96px}

  /* 登录框：.mask-login 同时带 .mask 类，上面的 .mask{align-items:flex-start}
     会把它顶到屏幕最上方，这里恢复垂直居中；宽度明确不超过视口 */
  .mask-login{align-items:center;padding:16px}
  .modal-login{width:100%;max-width:100%;padding:26px 22px 22px}
  .login-title{font-size:18px}

  /* 同步状态徽标缩小，避免遮挡内容 */
  div[title="NBRL 多端同步"]{font-size:11px;padding:3px 7px;right:8px;bottom:8px}
  body.sm-filters-open div[title="NBRL 多端同步"]{display:none}

  /* ============================================================
     单据编辑弹窗（新增销售出库单 / 新增采购入库）手机版改版
     桌面端零影响：全部规则都在这个 @media 里。
     明细行靠 app.js 模板里的 <td data-label="…"> 走 ::before 出标签。
     ============================================================ */
  .modal-body{padding:10px;max-height:calc(100vh - 150px)}
  .modal-foot{padding:10px;gap:8px}

  /* 表单行：标签定宽左置，输入框吃掉整行剩余宽度。
     用 flex-basis:calc(100% - 78px) 强制「一行一组」，否则 label+input 会两两挤在一行。
     原来 .ipt 固定 210px，右边空一大截、点起来还费劲。 */
  .modal .form-row{gap:8px;margin-bottom:10px}
  .modal .form-row:not(.form-col)>label{flex:0 0 70px;width:70px;text-align:right;line-height:1.3}
  .modal .form-row:not(.form-col)>label.chk{flex:1 1 auto;width:auto;text-align:left}
  .modal .form-row:not(.form-col)>.ipt,
  .modal .form-row:not(.form-col)>input,
  .modal .form-row:not(.form-col)>select{flex:1 1 calc(100% - 78px);width:auto;min-width:0}
  .modal .form-row.form-col>.ipt,
  .modal .form-row.form-col>input,
  .modal .form-row.form-col>select{width:100%}

  /* 「产品明细 + 按钮」头：标题一行、按钮另起一行两等分 */
  .modal .items-head{flex-direction:column;align-items:stretch;gap:7px;margin:6px 0 9px}
  .modal .items-head>div{display:flex;gap:7px}
  .modal .items-head .btn{flex:1 1 auto;min-width:0}

  /* ---------- 明细表 → 每行一张卡片 ---------- */
  /* 销售单 9 列、采购单 8 列，但前 7 列完全同构，所以规则可以共用。
     网格布局（两列）+ 显式定位「行号在左上、删除在右上」，
     名称/备注/发货情况跨整行，其余字段两两成对。 */
  .grid-items{border:none;background:none}
  .grid-items thead{display:none}
  .grid-items tbody,.grid-items tfoot,.grid-items tr,.grid-items td{display:block}
  .grid-items tr{
    display:grid;grid-template-columns:1fr 1fr;gap:9px;
    position:relative;margin-bottom:10px;padding:10px;
    border:1px solid var(--line);border-radius:9px;background:var(--surface);
  }
  .grid-items td{border:none;padding:0;min-width:0}
  .grid-items td::before{
    content:attr(data-label);display:block;
    font-size:11px;color:var(--ink-3);line-height:1.4;margin-bottom:3px;
  }
  .grid-items td:not([data-label])::before,
  .grid-items td.idx::before{display:none}
  .grid-items .ipt{
    width:100%;background:var(--surface-2);border:1px solid var(--line);
    font-size:16px;padding:9px 10px;
  }
  /* 第 1 行：行号徽标（左）+ 删除（右） */
  .grid-items td.idx{
    grid-column:1;grid-row:1;align-self:center;justify-self:start;
    width:24px;height:24px;border-radius:50%;
    display:flex;align-items:center;justify-content:center;
    background:var(--blue-l);color:var(--blue);font-size:12px;font-weight:700;
  }
  .grid-items td.del-cell{grid-column:2;grid-row:1;text-align:right;align-self:center}
  .grid-items td.del-cell::before{display:none}   /* 按钮本身写着「删」，标签是多余的 */
  .grid-items td.del-cell .btn-link{min-height:32px;padding:0 10px;font-size:13px}
  /* 第 2 行起：产品名称、备注、发货情况各占整行
     ⚠️ 必须限定在 tbody 里 —— 否则 tfoot 的「数量合计」格也nth-child(2)，
        会被撑成整行，合计区就歪了（踩过）。 */
  .grid-items tbody td:nth-child(2){grid-column:1 / -1}
  .grid-items tbody td:nth-child(7){grid-column:1 / -1}
  .grid-items td.ship-cell{grid-column:1 / -1;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
  .grid-items td.ship-cell::before{width:100%;margin-bottom:0}
  .grid-items td.ship-cell .i-shipdate{flex:1 1 150px;width:auto}
  /* 合计行：虚线卡片，数量/金额两列 */
  .grid-items tfoot tr{background:var(--surface-2);border-style:dashed;margin-bottom:0}
  .grid-items tfoot td:empty{display:none}
  .grid-items tfoot td.tf-label{grid-column:1 / -1;text-align:left;font-weight:600;color:var(--ink-2)}
  .grid-items tfoot td.tf-label::before{display:none}

  /* ---------- 折扣明细表 → 卡片式 ---------- */
  .discounts-box{padding:9px}
  .disc-head{flex-direction:column;align-items:stretch;gap:6px}
  .disc-head .disc-tip{display:block;margin-top:2px}
  .disc-head .btn{width:100%}
  .disc-table{display:block;border:none}
  .disc-table thead{display:none}
  .disc-table tbody,.disc-table tr,.disc-table td{display:block}
  .disc-table tr{
    display:grid;grid-template-columns:1fr 1fr;gap:9px;
    margin-bottom:9px;padding:9px;
    border:1px solid var(--line);border-radius:9px;background:var(--surface);
  }
  .disc-table tr:last-child{margin-bottom:0}
  .disc-table td{border:none;padding:0;min-width:0}
  .disc-table td::before{
    content:attr(data-label);display:block;
    font-size:11px;color:var(--ink-3);line-height:1.4;margin-bottom:3px;
  }
  .disc-table td:not([data-label])::before{display:none}
  .disc-table td.d-idx{
    grid-column:1;grid-row:1;align-self:center;justify-self:start;
    width:24px;height:24px;border-radius:50%;
    display:flex;align-items:center;justify-content:center;
    background:var(--blue-l);color:var(--blue);font-size:12px;font-weight:700;
  }
  .disc-table td.d-idx::before{display:none}
  .disc-table td.del-cell{grid-column:2;grid-row:1;text-align:right;align-self:center}
  .disc-table td.del-cell::before{display:none}   /* 同上：按钮已写「删除」 */
  .disc-table td:nth-child(2),
  .disc-table td:nth-child(3),
  .disc-table td:nth-child(4){grid-column:1 / -1;text-align:left}
  .disc-table .d-ipt{
    background:var(--surface-2);border:1px solid var(--line);
    font-size:16px;padding:9px 10px;border-radius:6px;width:100%;
  }
  .disc-table .d-del{min-height:32px;padding:0 10px;font-size:13px}
  /* 「本次调整 / 折后金额」是只读结果，给个底衬更像读数 */
  .disc-table .d-deduct,.disc-table .d-running{
    background:var(--surface-2);border:1px solid var(--line);border-radius:6px;
    padding:9px 10px;font-size:14px;font-weight:600;
  }
  /* 空态提示行（没有折扣时）不套卡片样式 */
  .disc-table td.d-empty{grid-column:1 / -1}
  .disc-table td.d-empty::before{display:none}
}

/* 弹窗打开时收起右下角的同步状态徽标 —— 否则它会盖住弹窗底部的「保存」按钮。
   用 :has() 纯 CSS 判断「有可见的遮罩层」，不必到处改 JS。
   浏览器不支持 :has() 时会忽略这条，退化成旧行为，无副作用。 */
body:has(.mask:not([hidden])) div[title="NBRL 多端同步"]{display:none}

/* 超窄屏（≤380px，如 iPhone SE / 老安卓）：再降一档字号与留白 */
@media (max-width:380px){
  .topbar{padding:6px 8px}
  .brand-text h1{font-size:14px}
  .logo{width:26px;height:26px;font-size:10px}
  .wrap{padding:8px 8px 80px}
  .cards{grid-template-columns:repeat(auto-fit,minmax(88px,1fr));gap:6px}
  .card{padding:8px 9px}
  .card-value{font-size:17px}
  .tab{padding:8px 10px;font-size:12px}
  /* 单据弹窗：标签再窄一点，明细卡片留白再紧一档 */
  .modal .form-row:not(.form-col)>label{flex-basis:58px;width:58px;font-size:12px}
  .modal .form-row:not(.form-col)>.ipt,
  .modal .form-row:not(.form-col)>input,
  .modal .form-row:not(.form-col)>select{flex-basis:calc(100% - 66px)}
  .grid-items tr,.disc-table tr{padding:9px;gap:8px}
}

/* 🔴 「未开票客户汇总」弹窗 2026-09-21 已下线，其手机版样式整块删除（原 #maskUninv 系列规则）。
   留下两条教训（别再犯）：
   ① 窄屏表格放不下时，优先砍**次要列**而不是让用户横滑 —— 真 412px 视口只有 359px 可用，
      551px 的表要横滑 192px，关键列一开始就在屏幕外，等于白给。
   ② th 上写了 inline style="width:…" 时，样式表的普通规则压不住，必须 !important。 */

/* ============================================================
   单价查询 —— 手机版（2026-09-23）
   实测（iframe 撑出的真 412px 视口）：7 列表格 544px，容器只有 390px → 需横滑 154px，
   「金额」「备注」两列一开始完全在屏幕外 —— 又是上面教训①那同一个坑。
   （2026-09-23 加「数量」列后变 8 列，手机更要守住这一屏原则。）
   手机上查单价就是要**一眼扫完**，所以窄屏砍两列：
     · 编号 —— 有日期就能定位是哪次成交，且它最宽（92px）；
     · 备注 —— 老板列的字段里排最后，次要。
   留下 日期 / 产品名称 / 单价 / 单位 / 数量 / 金额 六列，一屏看完不用滑。
   产品名列放开折行（white-space:normal），免得长型号名把整表又撑开。
   桌面端零影响：整块都在 media 里。
   ============================================================ */
@media (max-width:768px){
  #viewPrice .grid th:nth-child(1),#viewPrice .grid td:nth-child(1),
  #viewPrice .grid th:nth-child(8),#viewPrice .grid td:nth-child(8){display:none}
  #viewPrice .grid th:nth-child(2),#viewPrice .grid td:nth-child(2){width:74px !important}
  #viewPrice .grid th:nth-child(4),#viewPrice .grid td:nth-child(4){width:62px !important}
  #viewPrice .grid th:nth-child(5),#viewPrice .grid td:nth-child(5){width:38px !important}
  #viewPrice .grid th:nth-child(6),#viewPrice .grid td:nth-child(6){width:46px !important}
  #viewPrice .grid th:nth-child(7),#viewPrice .grid td:nth-child(7){width:64px !important}
  #viewPrice .grid th:nth-child(3),#viewPrice .grid td:nth-child(3){white-space:normal}
}

/* ============================================================
   进口皮单价 —— 手机版（2026-09-24）
   实测（真 412px 视口）：8 列表格 515px、容器 390px → 需横滑 125px，
   「备注」「操作」两列完全在屏幕外 —— 又是上面那个坑。
   取舍：老板要的 7 个业务列（产品名称/类型/单价/宽度/高度/产品单价/备注）**一个都不砍**，
   全部压到刚好放得下；砍掉我自己加的「操作」（删除）列 —— 删除属维护动作，
   手机上不做，桌面端照常。产品名列放开折行。
   桌面端零影响：整块都在 media 里。
   ============================================================ */
@media (max-width:768px){
  /* 🔴 这一页的「筛选」区其实就是**录入区**（产品名/类型/单价/宽/高 + 计算并存档）。
     手机上 .toolbar>.filters 默认是折叠的（要靠 🔍 筛选 展开），
     真折叠了等于老板打开页面看不到任何输入框 —— 所以录入行必须默认展开，
     连它那个「🔍 筛选」开关一起去掉；下面真正用来查历史存档的筛选行保持原样折叠。 */
  body:not(.sm-filters-open) #viewLeather .toolbar.lea-entry>.filters{display:flex}
  #viewLeather .toolbar.lea-entry .sm-filter-toggle{display:none}

  /* 2026-09-24：加了「数量」「残值（元）」两列 → 业务列变 9 个，操作列顺延到第 10 个，宽度预算重排 */
  #viewLeather .grid th:nth-child(10),#viewLeather .grid td:nth-child(10){display:none}
  /* ⚠️ 光给列宽不够：默认 padding 是 9px 10px（一列光内边距就 20px），
     表头还是 nowrap —— 「宽度（米）」这 4 个字就能把列顶到 70px，width 写了也不听。
     所以窄屏必须连 padding、字号、表头折行一起改。 */
  #viewLeather .grid th,#viewLeather .grid td{padding:6px 4px}
  #viewLeather .grid thead th{font-size:11px;white-space:normal;line-height:1.15}
  /* 窄屏下 td 也放开 nowrap：数字列（产品单价 32.844、备注 余0.158）的不可断行宽度
     会顶破列宽预算，剩下那几像素的横滑就是这么来的。放开后列宽说了算。 */
  #viewLeather .grid tbody td{white-space:normal}
  /* 预算（容器 390px）：9 个业务列固定宽合计 286px，剩下的全给「产品名称」这一列 */
  #viewLeather .grid th:nth-child(2),#viewLeather .grid td:nth-child(2){width:30px !important}
  #viewLeather .grid th:nth-child(3),#viewLeather .grid td:nth-child(3){width:42px !important}
  #viewLeather .grid th:nth-child(4),#viewLeather .grid td:nth-child(4){width:28px !important}
  #viewLeather .grid th:nth-child(5),#viewLeather .grid td:nth-child(5){width:28px !important}
  #viewLeather .grid th:nth-child(6),#viewLeather .grid td:nth-child(6){width:26px !important}
  #viewLeather .grid th:nth-child(7),#viewLeather .grid td:nth-child(7){width:44px !important}
  #viewLeather .grid th:nth-child(8),#viewLeather .grid td:nth-child(8){width:46px !important}
  #viewLeather .grid th:nth-child(9),#viewLeather .grid td:nth-child(9){width:42px !important}
  #viewLeather .grid th:nth-child(1),#viewLeather .grid td:nth-child(1){white-space:normal;word-break:break-all}
  /* ⚠️ 上面这行 word-break 是必须的：不加的话「产品名称」这一列的**最小宽度**由最长不可断词决定
     （约 94px，比如「代-40-尼龙」），桌面浏览器把窗口拖到 ~400px（纵向滚动条再吃掉 15px）时
     容器只剩 360px，9 列固定宽 290 + 94 = 384 > 360 → 表格内部冒出一条 24px 横滑。
     允许逐字断行后最小宽度降到 1 个字，任何宽度都能自适应，不用再抠列宽。 */
}
