:root{
  --navy:#12283f; --navy2:#1b3a5c; --navy3:#2a4f77;
  --ink:#1c2b39; --ink2:#4a5b6d; --ink3:#7d8b9c;
  --line:#dce3ec; --line2:#eef2f7;
  --bg:#f4f6f9; --card:#ffffff;
  --blue:#2e5a88; --blue-bg:#eaf3ff; --blue-line:#bcd6f2;
  --amber:#a9691a; --amber-bg:#fff6e8; --amber-line:#f0dcbb;
  --green:#245a3d; --green-bg:#e8f5ee;
  --red:#9e2b25; --red-bg:#fdecea;
  --warn:#8a6d1a;
  --mono:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,monospace;
  --sans:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
}
*{box-sizing:border-box}
html,body{height:100%}
body{margin:0;background:var(--bg);color:var(--ink);font:14px/1.5 var(--sans);-webkit-font-smoothing:antialiased}
.num{font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1}
.hidden{display:none!important}

/* ---------- 布局 ---------- */
.app{display:grid;grid-template-columns:236px 1fr;height:100vh;overflow:hidden}
.side{background:linear-gradient(178deg,#142c45 0%,#0e2135 100%);color:#dfe8f2;display:flex;flex-direction:column;border-right:1px solid #0b1a29}
.brand{display:flex;gap:10px;align-items:center;padding:18px 16px 16px;border-bottom:1px solid rgba(255,255,255,.08)}
.mark{width:38px;height:38px;border-radius:9px;background:linear-gradient(140deg,#3b7cc0,#1d4a7a);display:grid;place-items:center;font:700 13px/1 var(--mono);letter-spacing:.5px;color:#fff;box-shadow:0 2px 8px rgba(0,0,0,.35)}
.brand-txt{display:flex;flex-direction:column;line-height:1.25}
.brand-txt b{font-size:14px;font-weight:650;letter-spacing:.3px}
.brand-txt span{font-size:11px;color:#8fa9c4;letter-spacing:.6px}
.nav{flex:1;padding:12px 10px;overflow:auto}
.nav-g{font-size:10px;letter-spacing:1.6px;color:#6f8aa8;padding:12px 8px 6px;text-transform:uppercase}
/* ★v1.9.12 多窗口：导航行 = 链接 + 「⧉ 新窗口」按钮；按钮平时隐身，悬停这一行才出现 */
.nav-row{display:flex;align-items:stretch;gap:4px;margin-bottom:2px}
.nav-row a{flex:1;margin-bottom:0}
.nav-new{flex:none;width:22px;border:0;border-radius:6px;background:transparent;color:#7f9cba;font-size:13px;line-height:1;cursor:pointer;opacity:0;transition:opacity .12s}
.nav-row:hover .nav-new,.nav-new:focus{opacity:1}
.nav-new:hover{background:rgba(255,255,255,.1);color:#fff}
.nav a{display:flex;align-items:center;gap:9px;padding:9px 10px;border-radius:7px;color:#c3d3e4;font-size:13.5px;text-decoration:none;cursor:pointer;border-left:2px solid transparent}
.nav a i{font:400 11px/1 var(--mono);color:#7f9cba;background:rgba(255,255,255,.07);border-radius:4px;padding:3px 5px;min-width:22px;text-align:center}
.nav a:hover{background:rgba(255,255,255,.06);color:#fff}
.nav a.on{background:linear-gradient(90deg,rgba(59,124,192,.32),rgba(59,124,192,.06));color:#fff;border-left-color:#63a4e8;font-weight:600}
.nav a.on i{background:rgba(99,164,232,.28);color:#d5e8ff}
.side-foot{padding:12px;border-top:1px solid rgba(255,255,255,.08)}
.conn{display:flex;gap:9px;align-items:flex-start;background:rgba(255,255,255,.05);border-radius:8px;padding:9px 10px}
.dot{width:8px;height:8px;border-radius:50%;background:#6d7f92;margin-top:5px;flex:none}
.dot.ok{background:#4ade80;box-shadow:0 0 0 3px rgba(74,222,128,.16)}
.dot.err{background:#f87171;box-shadow:0 0 0 3px rgba(248,113,113,.16)}
.conn-txt{display:flex;flex-direction:column;line-height:1.3;min-width:0}
.conn-txt b{font-size:12.5px;font-weight:600;color:#eef4fa;overflow:hidden;text-overflow:ellipsis}
.conn-txt span{font-size:11px;color:#8fa9c4;font-family:var(--mono)}
.side-note{margin-top:8px;font-size:10.5px;color:#6f8aa8;text-align:center;letter-spacing:.4px}

.main{display:flex;flex-direction:column;overflow:hidden}
.top{display:flex;justify-content:space-between;align-items:flex-end;gap:16px;padding:14px 20px 12px;background:var(--card);border-bottom:1px solid var(--line)}
.top-t h1{margin:0;font-size:18px;font-weight:650;letter-spacing:.3px}
.top-t p{margin:3px 0 0;font-size:12px;color:var(--ink3)}
.top-a{display:flex;align-items:center;gap:8px;flex:none}
.pill{font-size:11.5px;padding:4px 9px;border-radius:20px;background:var(--line2);color:var(--ink2);border:1px solid var(--line);font-family:var(--mono);white-space:nowrap}
.pill.ro{background:var(--green-bg);border-color:#bfe3cd;color:var(--green);font-family:var(--sans);font-weight:600}
.view{flex:1;overflow:auto;padding:16px 20px 40px}

/* ---------- 通用控件 ---------- */
.btn{font:600 12.5px/1 var(--sans);padding:8px 13px;border-radius:6px;border:1px solid var(--line);background:#fff;color:var(--ink);cursor:pointer;white-space:nowrap}
.btn:hover{border-color:#b9c6d6;background:#fbfcfe}
.btn.pri{background:var(--navy);border-color:var(--navy);color:#fff}
.btn.pri:hover{background:var(--navy2)}
.btn.ghost{background:transparent;border-color:transparent;color:var(--ink2)}
.btn.ghost:hover{background:var(--line2);color:var(--ink)}
.btn.amber{background:var(--amber);border-color:var(--amber);color:#fff}
.btn.sm{padding:5px 9px;font-size:12px}
.btn[disabled]{opacity:.5;cursor:not-allowed}
.seg{display:inline-flex;border:1px solid var(--line);border-radius:6px;overflow:hidden;background:#fff}
.seg button{font:500 12.5px/1 var(--sans);padding:7px 11px;border:0;background:#fff;color:var(--ink2);cursor:pointer;border-right:1px solid var(--line2)}
.seg button:last-child{border-right:0}
.seg button:hover{background:var(--line2)}
.seg button.on{background:var(--navy);color:#fff;font-weight:600}

.filters{background:var(--card);border:1px solid var(--line);border-radius:9px;padding:13px 15px;margin-bottom:14px;display:flex;flex-wrap:wrap;gap:15px 22px;align-items:flex-end}
.f{display:flex;flex-direction:column;gap:5px;min-width:0}
.f>label{font-size:11px;color:var(--ink3);letter-spacing:.6px;font-weight:600}
.f select,.f input[type=text],.f input[type=date],.f input[type=number],.f input[type=password]{
  font:13px/1.4 var(--sans);padding:7px 9px;border:1px solid var(--line);border-radius:6px;background:#fff;color:var(--ink);min-width:130px;outline:none}
.f select:focus,.f input:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(46,90,136,.1)}
.f .w-wide{min-width:210px}
.f .w-s{min-width:70px;width:96px}
.chk{display:flex;align-items:center;gap:7px;font-size:13px;color:var(--ink2);cursor:pointer;padding:6px 0}
.chk input{accent-color:var(--blue);width:14px;height:14px}
.f-sp{flex:1}

/* 门店多选 */
.ms{position:relative}
.ms-btn{display:flex;align-items:center;gap:7px;padding:7px 10px;border:1px solid var(--line);border-radius:6px;background:#fff;cursor:pointer;font:13px/1 var(--sans);color:var(--ink);min-width:150px;justify-content:space-between}
.ms-btn:hover{border-color:#b9c6d6}
.ms-btn b{font-weight:600}
.ms-btn i{color:var(--ink3);font-style:normal;font-size:10px}
.ms-pop{position:absolute;z-index:60;top:calc(100% + 5px);left:0;width:330px;background:#fff;border:1px solid var(--line);border-radius:8px;box-shadow:0 12px 32px rgba(18,40,63,.16);padding:10px;display:none}
.ms-pop.on{display:block}
.ms-pop .ms-hd{display:flex;gap:6px;margin-bottom:8px}
.ms-pop input[type=text]{flex:1;font:13px var(--sans);padding:6px 8px;border:1px solid var(--line);border-radius:5px;outline:none}
.ms-list{max-height:290px;overflow:auto;border-top:1px solid var(--line2);padding-top:6px}
.ms-g{font-size:10.5px;letter-spacing:1px;color:var(--ink3);font-weight:700;padding:7px 2px 3px;text-transform:uppercase}
.ms-i{display:flex;align-items:center;gap:8px;padding:4px 4px;border-radius:5px;font-size:12.5px;color:var(--ink)}
.ms-i:hover{background:var(--line2)}
.ms-i input{accent-color:var(--blue)}
.ms-i span.n{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ms-i span.c{font:11px var(--mono);color:var(--ink3)}

/* ---------- 卡片/KPI ---------- */
.cards{display:grid;gap:10px;margin-bottom:14px}
.c4{grid-template-columns:repeat(4,minmax(0,1fr))}
.c5{grid-template-columns:repeat(5,minmax(0,1fr))}
.c6{grid-template-columns:repeat(6,minmax(0,1fr))}
.card{background:var(--card);border:1px solid var(--line);border-radius:9px;padding:12px 14px;position:relative;overflow:hidden}
.card::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--blue)}
.card.k::before{background:var(--amber)}
.card.g::before{background:var(--green)}
.card-t{font-size:11.5px;color:var(--ink3);letter-spacing:.5px;display:flex;justify-content:space-between;align-items:center;gap:6px}
.card-v{font:650 22px/1.15 var(--sans);margin-top:5px;letter-spacing:-.3px;font-variant-numeric:tabular-nums}
.card-v small{font-size:12px;font-weight:500;color:var(--ink3);margin-left:3px}
.card-s{font-size:11.5px;color:var(--ink2);margin-top:4px}
.card-s b{font-family:var(--mono);font-weight:600}
.panel{background:var(--card);border:1px solid var(--line);border-radius:9px;margin-bottom:14px;overflow:hidden}
.panel-hd{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:11px 14px;border-bottom:1px solid var(--line2);background:linear-gradient(180deg,#fff,#fbfcfe)}
.panel-hd h3{margin:0;font-size:14px;font-weight:650;letter-spacing:.2px}
.panel-hd .sub{font-size:11.5px;color:var(--ink3);margin-top:2px}
.panel-bd{padding:12px 14px}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.grid3{display:grid;grid-template-columns:2fr 1fr;gap:14px}
.chart{height:290px;width:100%}

/* ---------- 表格 ---------- */
.tw{overflow:auto;max-height:none;position:relative;contain:paint}
table.t{border-collapse:separate;border-spacing:0;font-size:12.5px;width:max-content;min-width:100%}
table.t th,table.t td{border-right:1px solid var(--line2);border-bottom:1px solid var(--line2);padding:5px 8px;white-space:nowrap;background:#fff}
table.t thead th{position:sticky;top:0;z-index:6;background:#f0f4f9;color:var(--ink2);font-weight:650;font-size:11.5px;letter-spacing:.3px;border-bottom:1px solid var(--line);text-align:center}
table.t thead tr:nth-child(2) th{top:29px;background:#f6f8fc;font-weight:600}
table.t thead tr:nth-child(3) th{top:57px;background:#fafbfd;font-weight:500;color:var(--ink3);font-size:11px}
table.t td.n,table.t th.n{text-align:right;font-variant-numeric:tabular-nums;font-family:var(--mono);font-size:12px}
table.t th.n{font-family:var(--sans);font-size:11.5px;padding-right:8px}
table.t td.l{text-align:left}
table.t tbody tr:hover td{background:#f5f9ff}
table.t tbody tr.zebra td{background:#fcfdff}
table.t tbody tr.zebra:hover td{background:#f5f9ff}
table.t tr.grp td{background:var(--blue-bg);border-top:1px solid var(--blue-line);border-bottom:1px solid var(--blue-line);font-weight:650;color:#1d3d5f}
table.t tr.sub td{background:var(--green-bg);font-weight:650;color:var(--green)}
table.t tr.tot td{background:#fff6d9;font-weight:700;border-top:2px solid #e0b860;position:sticky;bottom:0;z-index:5}
table.t td.st{background:var(--blue-bg)!important;font-weight:650;color:#1d3d5f}
table.t td.sl{background:var(--amber-bg)!important;font-weight:650;color:#7d4c11}
/* 进货汇总条（v1.9.0，方案 A）：F4 的 6 个进货数不再占矩阵冻结列（原来 6 列 498px，
   把 1366×768 门店机的门店列全挤没），改成表上方一条绿色汇总条，只显示本分类的 6 个总合计。
   绿色系沿用 F4：区别于 蓝=库存 / 橙红=销量；net = 进货−退货 的净进货，底色加重。neg = 期间退货大于进货。 */
.purbar{display:flex;flex-wrap:wrap;align-items:center;gap:7px;background:var(--green-bg);border:1px solid #bfe3cd;border-radius:9px;padding:8px 12px;margin-bottom:12px;font-size:12px;color:#1c4a32}
.purbar .pb-t{font-weight:650;letter-spacing:.2px}
.purbar .pb-sc{color:var(--ink3);font-size:11.5px;line-height:1.5;flex:1 1 260px}
.purbar .pb-sc b{font-family:var(--mono);font-weight:650}
.purbar .pb-k{font-family:var(--mono);font-weight:650;font-variant-numeric:tabular-nums;background:#fff;border:1px solid #bfe3cd;border-radius:6px;padding:4px 9px;white-space:nowrap}
.purbar .pb-k i{font-style:normal;font-family:var(--sans);font-weight:500;font-size:11px;color:var(--ink3);margin-right:5px}
.purbar .pb-k.net{background:#d6ecdf;border-color:#a9d6bd}
.purbar .pb-k.neg{background:#fff5f2;border-color:#f0c9bf;color:var(--red)}
.purbar.off{background:var(--line2);border-color:var(--line);color:var(--ink3)}
.purbar.off .pb-sc{color:var(--ink3)}
.sticky{position:sticky;z-index:4;background:#fff}
thead .sticky{z-index:8;background:#f0f4f9}
.sticky.g2{background:var(--blue-bg)}
table.t tbody tr:hover .sticky{background:#f5f9ff}
table.t tr.grp .sticky,table.t tr.tot .sticky{background:inherit}
td.heat1{background:#fbeeca!important}
td.heat2{background:#f7ddb0!important}
td.heat3{background:#f0c98d!important;font-weight:700}
td.stock1{background:#e8f1fe!important}
td.stock2{background:#d5e7fd!important}
td.stock3{background:#bfd9f8!important;font-weight:700}
td.zero{color:#c7d0da}
td.neg{color:var(--red)!important;font-weight:600}
.tw-tbl{max-height:calc(100vh - 380px);overflow:auto;border:1px solid var(--line);border-radius:8px}
.tbl-note{font-size:11.5px;color:var(--ink3);padding:8px 10px;background:var(--line2);border-radius:6px;margin-bottom:10px}
.pager{display:flex;gap:8px;align-items:center;justify-content:flex-end;padding:10px 2px;font-size:12.5px;color:var(--ink2)}
.pager b{font-family:var(--mono);color:var(--ink)}
.badge{display:inline-block;font-size:10.5px;padding:2px 6px;border-radius:10px;background:var(--line2);color:var(--ink2);border:1px solid var(--line);font-weight:600}
.badge.hq{background:#e7f0fb;border-color:#c3d8f0;color:#25527f}
.badge.jm{background:#fbeeda;border-color:#e0bf8d;color:#7a4a0d}
.empty{padding:44px;text-align:center;color:var(--ink3);font-size:13px}
.empty b{display:block;font-size:15px;color:var(--ink2);margin-bottom:6px}

/* ---------- 设置页 ---------- */
.set{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);gap:14px;align-items:start}
.kv{display:grid;grid-template-columns:112px 1fr;gap:7px 10px;font-size:12.5px}
.kv dt{color:var(--ink3)}
.kv dd{margin:0;font-family:var(--mono);color:var(--ink);word-break:break-all}
.field{margin-bottom:11px}
.field label{display:block;font-size:11.5px;color:var(--ink3);font-weight:600;margin-bottom:4px;letter-spacing:.4px}
.field input,.field select{width:100%;font:13px var(--sans);padding:8px 10px;border:1px solid var(--line);border-radius:6px;outline:none}
.field input:focus,.field select:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(46,90,136,.1)}
.row2{display:grid;grid-template-columns:2fr 1fr;gap:10px}
.hint{font-size:11.5px;color:var(--ink3);margin-top:5px;line-height:1.5}
.vt-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:2px 10px}
.test{margin-top:10px;padding:10px 12px;border-radius:7px;font-size:12.5px;border:1px solid var(--line)}
.test.ok{background:var(--green-bg);border-color:#bfe3cd;color:var(--green)}
.test.err{background:var(--red-bg);border-color:#f3c9c5;color:var(--red)}
.test .mono{font-family:var(--mono);font-size:11.5px;margin-top:4px;color:var(--ink2);white-space:pre-wrap}
.warnbox{background:#fff8e6;border:1px solid #f0dca8;border-radius:8px;padding:11px 13px;font-size:12.5px;color:#6b5416;line-height:1.65;margin-bottom:14px}
.warnbox b{color:#5a4410}

/* ---------- 其他 ---------- */
.toast{position:fixed;right:20px;bottom:20px;z-index:200;display:flex;flex-direction:column;gap:8px}
.toast div{background:var(--navy);color:#fff;padding:10px 14px;border-radius:8px;font-size:12.5px;box-shadow:0 8px 24px rgba(0,0,0,.22);animation:in .18s ease-out}
.toast div.err{background:#8f2a24}
.toast div.ok{background:#1d5b3a}
@keyframes in{from{transform:translateY(8px);opacity:0}to{transform:none;opacity:1}}
.modal{position:fixed;inset:0;background:rgba(12,26,40,.42);z-index:300;display:grid;place-items:center;padding:24px}
.modal-box{background:#fff;border-radius:10px;max-width:880px;width:100%;max-height:82vh;display:flex;flex-direction:column;box-shadow:0 24px 60px rgba(0,0,0,.3)}
.modal-hd{display:flex;justify-content:space-between;align-items:center;padding:13px 16px;border-bottom:1px solid var(--line)}
.modal-hd b{font-size:14.5px}
.x{border:0;background:transparent;font-size:22px;line-height:1;color:var(--ink3);cursor:pointer}
.modal-bd{padding:14px 16px;overflow:auto}
.loading{position:fixed;inset:0;background:rgba(244,246,249,.72);z-index:400;display:grid;place-items:center;gap:0}
.loading .spin{width:30px;height:30px;border:3px solid var(--line);border-top-color:var(--blue);border-radius:50%;animation:sp .8s linear infinite;margin:0 auto 10px}
.loading{place-content:center;text-align:center}
.loading span{font-size:12.5px;color:var(--ink2)}
@keyframes sp{to{transform:rotate(360deg)}}
.legend{display:flex;gap:12px;font-size:11.5px;color:var(--ink3);align-items:center}
.legend i{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:4px;vertical-align:middle}
@media (max-width:1180px){.grid2,.grid3,.set{grid-template-columns:1fr}.c6,.c5{grid-template-columns:repeat(3,minmax(0,1fr))}.c4{grid-template-columns:repeat(2,minmax(0,1fr))}}

/* ---------- 交叉表细节 ---------- */
.vh{writing-mode:vertical-rl;text-orientation:mixed;font-weight:600;font-size:11px;letter-spacing:.4px;color:#25527f;height:88px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;justify-content:center}
table.t td.code{cursor:pointer;color:var(--blue);font-weight:600;font-family:var(--mono);font-size:11.5px}
table.t td.code:hover{text-decoration:underline}
.sub2{font-size:10.5px;color:var(--ink3);margin-top:1px;max-width:170px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
table.t thead th[colspan],table.t thead th[rowspan]{background:#e7eef8}

/* ---------- 颜色圆点 / 折叠 / code ---------- */
.cdot{display:inline-block;width:9px;height:9px;border-radius:50%;background:var(--c,#b9c3cd);border:1px solid rgba(0,0,0,.2);margin-right:6px;vertical-align:middle}
table.t tr.grp{cursor:pointer}
table.t tr.grp td:first-child::before{content:"▾ ";color:#4a7fb5;font-size:10px}
table.t tr.grp.collapsed td:first-child::before{content:"▸ "}
code{font-family:var(--mono);font-size:12px;background:rgba(0,0,0,.06);padding:1px 4px;border-radius:3px}
#modal-body table.t{width:100%}
#modal-body .kv dt{color:var(--ink3)}

/* ---------- 门店存销矩阵 ---------- */
table.t thead th.mh1{background:#2e5a88;color:#fff;height:26px;font-size:11.5px;font-weight:650;letter-spacing:.2px;padding:2px 4px;border-right:1px solid rgba(255,255,255,.35);max-width:92px;white-space:normal;word-break:break-word;line-height:1.18;overflow:hidden}
table.t thead th.mh1.jm{background:#a9691a}
table.t thead th.mh2{height:24px;font-size:11px;padding:0 3px}
table.t thead th.mh2.stock-h{background:#3d6e9e;color:#e8f1fb}
table.t thead th.mh2.sale-h{background:#b3692a;color:#fff4e6}
/* v1.9.27：表头「各门店库存合计／销量合计」两行已删（与新的「各店合计」行、表体「全部合计」行重复），
   原先给这两行的 5 条样式一并清除；已确认这组类名只有 F1 矩阵在用，不是别处共用的。 */
table.t tr.bgrp td{background:#fff2a8;color:#6b5410;border-top:1px solid #e0c86a;border-bottom:1px solid #e0c86a;font-weight:700}
table.t tr.bgrp td.st{background:#fdeea0;color:#6b5410}
table.t tr.bgrp td.sl{background:#fbe68f;color:#6b5410}
table.t tr.bgrp{cursor:pointer}
table.t tr.bgrp td:first-child::before{content:"▾ ";color:#8a6d1a;font-size:10px}
table.t tr.bgrp.collapsed td:first-child::before{content:"▸ "}
table.t tr.bgrp:hover td{background:#ffe98f}
table.t tr.sku td{background:#eef4fb;font-weight:600}
table.t tr.sku{cursor:pointer}
table.t tr.sku td:first-child::before{content:"▾ ";color:#4a7fb5;font-size:10px}
table.t tr.sku.collapsed td:first-child::before{content:"▸ "}
table.t tr.sku:hover td{background:#e2ecf8}
td.code2{font-family:var(--mono);font-size:11.5px;color:var(--blue)}
table.t td.sale{color:#9e2b25}
table.t tr.clr td{font-size:12.5px}
table.t tr.clr:hover td{background:#fbfdff}
table.t tr.tot td.sale{color:#8f2a1c}

/* ---------- 主操作条 + 分类选择器 ---------- */
.filters.primary{align-items:flex-end;gap:12px 18px}
.filters.primary .f>label{font-size:11.5px}
.btn.big{padding:11px 22px;font-size:14px;font-weight:700;letter-spacing:2px;border-radius:7px;box-shadow:0 2px 8px rgba(18,40,63,.18)}
.btn.big:hover{transform:translateY(-1px);box-shadow:0 4px 12px rgba(18,40,63,.22)}
.f.grow{flex:1 1 260px;min-width:230px}
.catpick{position:relative;min-width:230px}
.cp-btn{display:flex;align-items:center;gap:8px;width:100%;padding:9px 11px;border:1px solid var(--line);border-radius:6px;background:#fff;cursor:pointer;font:600 13.5px/1.3 var(--sans);color:var(--ink);text-align:left}
.cp-btn:hover{border-color:var(--blue);box-shadow:0 0 0 3px rgba(46,90,136,.08)}
.cp-btn .cp-txt{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cp-btn .cp-txt.all{color:var(--ink3);font-weight:500}
.cp-btn i{color:var(--ink3);font-style:normal;font-size:10px}
.cp-pop{position:absolute;z-index:80;top:calc(100% + 5px);left:0;width:430px;max-width:78vw;background:#fff;border:1px solid var(--line);border-radius:8px;box-shadow:0 14px 34px rgba(18,40,63,.2);padding:9px;display:none}
/* v1.9.37 searchSelect 在 modal 内：绝对定位弹层会被 .modal-bd 的 overflow:auto 裁掉、
   z-index 也压不过 modal —— 给 modal 内的选择器开「内联模式」：点开直接在原地展开列表（占满字段宽度），
   视觉与弹层一致但不会被裁。JS 侧：searchSelect 检测祖先有 .modal-bd 时加 .cp-inline。 */
.cp-inline .cp-pop{position:static;width:auto;max-width:none;box-shadow:none;border-style:dashed;margin-top:6px}

.cp-pop.on{display:block}
.cp-pop>input{width:100%;font:13px var(--sans);padding:8px 10px;border:1px solid var(--line);border-radius:6px;outline:none;margin-bottom:6px}
.cp-pop>input:focus{border-color:var(--blue)}
.cp-list{max-height:330px;overflow:auto}
.cp-i{display:flex;align-items:center;gap:8px;padding:5px 10px;border-radius:5px;font-size:13px;color:var(--ink);cursor:pointer;white-space:nowrap}
.cp-i:hover{background:var(--line2)}
.cp-i.on{background:#e7f0fb;color:#1d4a7a;font-weight:650}
.cp-i .cp-n{margin-left:auto;font:11px var(--mono);color:var(--ink3);background:var(--line2);border-radius:9px;padding:1px 7px}
/* 可搜索单选（v1.9.18：F5「要货加盟店」、F6「销售/收货加盟店」用）：选项文字省略号 + 更窄的弹层 */
.cp-i .cp-txt{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis}
.catpick.cp-narrow{min-width:250px}          /* v1.9.24：门店改用完整名，按钮加宽，别一上来就省略号 */
.catpick.cp-narrow .cp-pop{width:360px}
.cp-empty{padding:16px;text-align:center;color:var(--ink3);font-size:12.5px}
.more-toggle{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--blue);cursor:pointer;user-select:none;padding:9px 0}
.more-toggle b{font-weight:600}
.filters.more{margin-top:-6px;border-top:0;border-top-left-radius:0;border-top-right-radius:0;background:#fbfcfe}
.last-query{font-size:11.5px;color:var(--ink3);padding:0 2px 8px;display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.last-query b{color:var(--ink2);font-family:var(--mono);font-weight:600}
.last-query .lk{color:var(--blue);cursor:pointer;text-decoration:underline dotted}

/* ---------- 登录页 / 当前用户 ---------- */
.login{position:fixed;inset:0;z-index:500;display:grid;place-items:center;padding:24px;
  background:radial-gradient(1200px 600px at 20% -10%,#2a4f77 0%,#14283d 45%,#0b1a29 100%)}
.login-card{width:min(430px,100%);background:#fff;border-radius:12px;padding:26px 26px 20px;box-shadow:0 24px 64px rgba(0,0,0,.4)}
.login-brand{display:flex;gap:11px;align-items:center;margin-bottom:6px}
.login-brand .mark{width:40px;height:40px;border-radius:9px;background:linear-gradient(140deg,#3b7cc0,#1d4a7a);display:grid;place-items:center;color:#fff;font:700 13px/1 var(--mono)}
.login-brand b{display:block;font-size:15px;letter-spacing:.3px}
.login-brand span{display:block;font-size:11px;color:var(--ink3);letter-spacing:.8px}
.login-sub{font-size:12.5px;color:var(--ink2);margin:2px 0 16px;padding-left:51px}
#login-form label{display:block;font-size:12px;font-weight:600;color:var(--ink2);margin:12px 0 5px}
#login-form label b{float:right;font-weight:400;color:var(--ink3);font-size:11px}
#login-form input{width:100%;padding:10px 11px;border:1px solid var(--line);border-radius:7px;font:14px var(--sans);outline:none;background:#fbfcfe}
#login-form input:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(46,90,136,.12);background:#fff}
.login-err{min-height:18px;margin:10px 0 2px;font-size:12.5px;color:var(--red)}
.login-err:not(.on){visibility:hidden}
#login-btn{width:100%;margin-top:4px}
.login-tip{margin-top:16px;padding:11px 12px;background:var(--line2);border-radius:8px;font-size:11.5px;line-height:1.75;color:var(--ink2)}
.login-tip b{color:var(--ink)}
.login-foot{margin-top:12px;text-align:center;font:11px var(--mono);color:var(--ink3)}
.who{display:flex;align-items:center;gap:8px;background:rgba(255,255,255,.05);border-radius:8px;padding:8px 10px;margin-bottom:8px}
.who-i{min-width:0;flex:1}
.who-i b{display:block;font-size:12.5px;color:#eef4fa;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.who-r{display:block;font-size:10.5px;color:#8fa9c4}
.btn-logout{border:1px solid rgba(255,255,255,.18);background:transparent;color:#c3d3e4;font:600 11.5px var(--sans);padding:5px 9px;border-radius:6px;cursor:pointer}
.btn-logout:hover{background:rgba(255,255,255,.12);color:#fff}

/* ---------- 尺码行 / 负库存 ---------- */
table.t tr.sz td{background:#fcfdff;font-size:12px;color:#3c4b5c}
table.t tr.sz td.sticky{background:#fcfdff}
table.t tr.sz:hover td{background:#f4f8fd}
table.t tr.sz .tree{color:#b9c4d0;margin-right:5px;font-family:var(--mono)}
table.t tr.sz .sznm{font-weight:600;color:#2f4a6b;font-size:12px}
table.t tr.clr.has-sz{cursor:pointer}
table.t tr.clr.has-sz td:nth-child(3)::after{content:" ▾";color:#93a3b5;font-size:9px}
table.t tr.clr.has-sz.collapsed td:nth-child(3)::after{content:" ▸"}
.szn{margin-left:6px;font:10px var(--mono);color:var(--ink3);background:var(--line2);border-radius:8px;padding:1px 6px}
td.neg, table.t td.neg{color:var(--red)!important;background:#fdecea!important;font-weight:700}
td.zero-neg{color:var(--red)}
.neg-tag{display:inline-block;margin-left:6px;font-size:10.5px;color:var(--red);background:#fdecea;border:1px solid #f3c9c5;border-radius:9px;padding:0 6px}

/* ---------- 商品图片（F1）：一款一图，缩略图 + 点开看大图 ---------- */
/* 缩略图刻意做大到 68px（列宽 76px、单元格内边距收到 2px），款行会变高，但客户要「尽量大、清楚」 */
table.t th.img-h{text-align:center}
table.t td.img{text-align:center;padding:2px}
table.t tr.sku td.img{background:#fff}
.pthumb-w{position:relative;display:inline-block;width:68px;height:68px;line-height:0;cursor:zoom-in;
  border-radius:6px;overflow:hidden;border:1px solid var(--line);background:#f7f9fc;vertical-align:middle}
.pthumb{width:68px;height:68px;object-fit:cover;display:block;background:#fff}
.pthumb-w:hover{border-color:var(--blue);box-shadow:0 0 0 2px rgba(46,90,136,.18)}
.pthumb-w:hover .pzoom{opacity:1}
.pzoom{position:absolute;right:2px;bottom:2px;font:600 11px/1 var(--sans);color:#fff;
  background:rgba(18,40,63,.74);border-radius:4px;padding:2px 4px;opacity:0;transition:opacity .12s;pointer-events:none}
.padd{display:inline-block;width:68px;height:68px;line-height:64px;text-align:center;
  border:1px dashed #b9c6d6;border-radius:6px;color:#a8b6c6;font-size:22px;cursor:pointer;
  background:#fbfcfe;vertical-align:middle;-webkit-user-select:none;user-select:none}
.padd:hover{border-color:var(--blue);color:var(--blue);background:var(--blue-bg)}
.pnone{color:#c7d0da;font-size:12px}
/* ============ v1.9.7 拖拽上传 ============ */
/* 拖到「图片」格 / 灯箱上时高亮那一个投放目标（只亮目标格，避免用户不知道会传到哪一款） */
.drop-on{outline:3px dashed var(--blue)!important;outline-offset:-3px;background:var(--blue-bg)!important;box-shadow:0 0 0 4px rgba(46,90,136,.18)}
.padd.drop-on,.pthumb-w.drop-on{border-color:var(--blue)!important}
.imgbox.drop-on .imgbox-bd{outline:4px dashed var(--blue);outline-offset:-6px}
/* F6 图文识别的整块投放区 */
.dropzone{position:relative;border:2px dashed transparent;border-radius:10px;padding:12px;transition:border-color .12s,background .12s}
.dropzone .dz-hint{font-size:12px;color:var(--ink3);margin-bottom:8px}
.dropzone:hover{border-color:var(--line)}
.dropzone.dropzone-on{border-color:var(--blue);background:var(--blue-bg)}
.dropzone.dropzone-on .dz-hint{color:var(--blue);font-weight:650}

/* 大图灯箱 */
.imgbox{position:fixed;top:0;right:0;bottom:0;left:0;z-index:60;display:none;
  background:rgba(10,18,28,.78);padding:22px}
.imgbox.on{display:flex;align-items:center;justify-content:center}
body.imgbox-open{overflow:hidden}
.imgbox-bd{display:flex;flex-direction:column;width:96vw;max-width:1180px;max-height:94vh;
  background:var(--card);border-radius:12px;box-shadow:0 18px 60px rgba(0,0,0,.45);overflow:hidden}
.imgbox-bar{display:flex;align-items:center;justify-content:space-between;gap:14px;flex-wrap:wrap;
  padding:11px 14px;border-bottom:1px solid var(--line);background:#fafbfd}
.imgbox-info{font-size:13px;color:var(--ink);min-width:0}
.imgbox-info .dim{color:var(--ink3);font-size:12px}
.imgbox-act{display:flex;gap:7px;flex:none}
.imgbox-stage{flex:1;min-height:0;display:flex;align-items:center;justify-content:center;
  background:#f4f6f9;padding:14px;overflow:auto;cursor:zoom-out}
.imgbox-stage img{max-width:100%;max-height:calc(94vh - 140px);object-fit:contain;display:block;
  border-radius:4px;background:#fff;box-shadow:0 2px 14px rgba(0,0,0,.16)}
.imgbox-err{color:var(--red);font-size:13px;background:var(--red-bg);
  border:1px solid #f3c9c5;border-radius:7px;padding:10px 14px}
.imgbox-tip{padding:7px 14px;border-top:1px solid var(--line);font-size:11.5px;color:var(--ink3);background:#fafbfd}
/* 批量上传图片面板（v1.9.29）：外壳复用 .imgbox，里面换成「文件 → 对到哪款」清单 + 进度条 */
.bulk-bd{max-width:1040px}
.bulk-bd .imgbox-bar{position:sticky;top:0;z-index:2}
.bulk-stage{align-items:flex-start;justify-content:flex-start;padding:0;background:var(--card);cursor:default}
.bulk-list{width:100%;max-height:calc(94vh - 250px);overflow:auto;font-size:12.5px}
.bulk-row{display:grid;grid-template-columns:36px minmax(140px,2.1fr) 56px minmax(170px,2fr) minmax(120px,1.3fr);
  gap:8px;align-items:center;padding:6px 14px;border-bottom:1px solid var(--line)}
.bulk-row:nth-child(even){background:#fcfdfe}
.bulk-row.skip{background:#fdf6f5}
.bulk-row.skip:nth-child(even){background:#fbf2f0}
.bulk-row .bn{color:var(--ink3);font:600 11px/1.35 var(--mono);text-align:right}
.bulk-row .bf{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.bulk-row .bsz{color:var(--ink3);font-size:11px;text-align:right;font-family:var(--mono)}
.bulk-row .bj{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bulk-row .bj b{font-family:var(--mono);font-size:12px}
.bulk-row .bs{font-size:11.5px;color:var(--ink3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bulk-prog{position:relative;height:22px;border-top:1px solid var(--line);background:#fafbfd;overflow:hidden}
.bulk-prog i{position:absolute;left:0;top:0;bottom:0;width:0;background:var(--blue-bg);
  border-right:2px solid var(--blue);transition:width .18s linear}
.bulk-prog span{position:relative;display:block;padding:4px 14px;font-size:11.5px;color:var(--ink2)}
.bulk-bd .imgbox-tip code{font-family:var(--mono);font-size:11px;background:#fff;padding:0 3px;
  border:1px solid var(--line);border-radius:3px}
@media (max-width:820px){
  .bulk-row{grid-template-columns:26px minmax(90px,1.6fr) minmax(120px,1.6fr);padding:5px 9px}
  .bulk-row .bsz{display:none}
  .bulk-row .bs{grid-column:2/-1}
}
.btn.danger{background:#fff;border-color:#eec3bd;color:var(--red)}
.btn.danger:hover{background:var(--red-bg)}

/* ---------- 次品库（F2）：库存数字右上角的次品角标 + 划转对话框 ---------- */
.dim{color:var(--ink3)}
/* 有次品角标的格子必须是定位上下文；门店列的 td 本来不是 sticky，所以要显式加 */
table.t td.hasdf{position:relative}
.dfb{position:absolute;top:1px;left:1px;min-width:8px;height:10px;line-height:10px;padding:0 2px;
  font:700 7.5px/10px var(--mono);color:#fff;background:var(--red);border-radius:4px;
  text-align:center;pointer-events:none;box-shadow:none;opacity:.92}
/* 管理员可点「存」格登记次品 */
table.t td.dfclick{cursor:copy}
table.t td.dfclick:hover{box-shadow:inset 0 0 0 2px var(--red);background:#fff5f4!important}
table.t td.dfq{font-weight:700;color:var(--red);background:var(--red-bg)!important}
table.t td.dfnote{max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pill.dfp,.pill.dfo,.pill.dfi{font-family:var(--sans);font-weight:600}
.pill.dfp{background:var(--red-bg);border-color:#f3c9c5;color:var(--red)}
.pill.dfo{background:#ffece9;border-color:#f0c4bd;color:#8f2a1c}
.pill.dfi{background:var(--green-bg);border-color:#bfe3cd;color:var(--green)}

/* 划转对话框（复用灯箱的遮罩 .imgbox，只换内层） */
.dfbox-bd{display:flex;flex-direction:column;width:96vw;max-width:660px;max-height:92vh;
  background:var(--card);border-radius:12px;box-shadow:0 18px 60px rgba(0,0,0,.45);overflow:hidden}
.dfbox-body{padding:13px 16px 16px;overflow:auto}
.df-goods{font-size:13px;margin-top:3px}
.df-goods .dim{font-size:12px}
.df-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:10px;font-size:13px}
.df-row>label{color:var(--ink2);font-size:12.5px;min-width:38px}
.df-row.act{justify-content:flex-end;gap:9px;margin-top:14px}
.df-row.have{background:#fff8f7;border:1px solid #f3d9d4;border-radius:7px;padding:7px 10px;margin-bottom:11px}
.df-row.have .d{color:var(--red);font-weight:650}
.df-msg{min-height:20px;font-size:12.5px;margin-top:4px}
.df-msg.ok{color:var(--green);font-weight:600}
.df-msg.err{color:var(--red);font-weight:600}
.df-note{font-size:11.5px;line-height:1.65;margin-top:12px;padding-top:10px;border-top:1px dashed var(--line)}

/* ============================================ F3 批量配货（view-dist.js） */
/* 状态条：ok=可写 / warn=只读或未开启 / err=出错。配色沿用既有变量，不另起一套 */
.note{border-radius:8px;padding:10px 13px;font-size:12.5px;line-height:1.7;margin-bottom:12px;border:1px solid var(--line);background:var(--line2);color:var(--ink2)}
.note b{color:var(--ink)}
.note.ok{background:var(--green-bg);border-color:#bfe3cd;color:var(--green)}
.note.ok b{color:#1b4530}
.note.warn{background:var(--amber-bg);border-color:var(--amber-line);color:var(--amber)}
.note.warn b{color:#7a4a10}
.note.err{background:var(--red-bg);border-color:#f3c9c5;color:var(--red)}
.note.err b{color:#7d201b}

/* 门店页签：一次只在一家店的尺码表上填数，切页签不丢已填内容（存在 DIST.cells） */
.tabs{display:flex;flex-wrap:wrap;gap:6px}
.tab{font:600 12.5px/1 var(--sans);padding:8px 13px;border:1px solid var(--line);border-radius:20px;background:#fff;color:var(--ink2);cursor:pointer;display:inline-flex;align-items:center;gap:7px;transition:.12s}
.tab:hover{background:var(--line2);color:var(--ink)}
.tab.on{background:var(--blue);border-color:var(--blue);color:#fff}
.tab.on b.badge{background:rgba(255,255,255,.24);color:#fff;border-color:transparent}
.tab b.badge{font:700 10.5px/1 var(--mono);background:var(--amber-bg);color:var(--amber);border:1px solid var(--amber-line);border-radius:9px;padding:2px 6px}
.pill.k{background:var(--blue-bg);border-color:var(--blue-line);color:var(--blue);font-family:var(--sans);font-weight:600}
.pill.warn{background:var(--amber-bg);border-color:var(--amber-line);color:var(--amber);font-family:var(--sans);font-weight:600}

/* 配货数量输入格（在「配」栏里）：placeholder 显示该码还能配多少（本部可配余量），本部仓实有看单元格悬浮提示 */
td.c{padding:0 !important;background:#fff}
.dist-in{width:56px;min-width:56px;height:28px;padding:0 5px;border:0;outline:0;background:transparent;text-align:center;
  font:600 12.5px/1 var(--mono);color:var(--ink);cursor:text}
.dist-in::placeholder{color:#c3ccd7;font-weight:500}
.dist-in:focus{background:#fffbe9;box-shadow:inset 0 0 0 2px var(--amber)}
.dist-in:hover{background:#f5f9ff}
td.c:hover{background:#f5f9ff}
/* 超出本部仓实有：红底红框 + 输入框右侧留白给「超」字提示 */
td.ovr{background:var(--red-bg) !important}
td.ovr .dist-in{background:transparent;color:var(--red);font-weight:800;box-shadow:inset 0 0 0 2px #f3c9c5}
td.ovr .dist-in:focus{background:#fff;box-shadow:inset 0 0 0 2px var(--red)}
td.ovr::after{content:"超";position:absolute;right:2px;top:2px;font:700 9px/1 var(--sans);color:#fff;background:var(--red);border-radius:3px;padding:1px 3px}
td.ovr{position:relative}
table.dist .n.strong{font-weight:800;color:var(--blue)}
@media (max-width:900px){
  .dist-in{width:46px;min-width:46px}
  .tab{padding:7px 10px;font-size:12px}
}

/* ============================================ F6 图文识别（view-recognize.js） */
.szcell{display:inline-flex;align-items:center;gap:3px;margin:1px 6px 1px 0;white-space:nowrap}
.szcell select{font:600 12px/1 var(--sans);padding:3px 2px;border:1px solid var(--line);border-radius:4px;background:#fff;color:var(--ink)}
.qtyin{width:52px;height:26px;padding:0 4px;border:1px solid var(--line);border-radius:4px;text-align:center;font:600 12.5px/1 var(--mono);color:var(--ink)}
.qtyin:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(46,90,136,.1);outline:0}
#rc-body select{max-width:210px}
#rc-body tr.dim{opacity:.45}
.seg button.on{background:var(--blue);color:#fff}

/* ============================================ F3 矩阵式配货表（v1.8.2 起；v1.9.3 每个尺码拆成「存｜配」两栏） */
/* 存＝当前页签这家加盟店的现有库存（只读，蓝底，与门店存销矩阵的「存」同一套视觉）；配＝本次要配的数量输入框。
   本部实有/可配的完整口径在单元格 title 悬浮提示里，不再单列一列（用户 2026-09-18 要求）。
   v1.9.19：存/销两栏都收到 34px（2~3 位数够用；真出现 4 位数会让那一列自然变宽 —— 尺码列在冻结列**之后**，
   自然变宽不会牵动 sticky 的 left 偏移，所以是安全的）。「配」那格是输入框，48px 保持不动。 */
table.t.dist td.d-st{width:34px;min-width:34px;background:var(--blue-bg)!important;font:700 12px/1.3 var(--mono);color:#1d3d5f;text-align:center;padding:4px 2px}
table.t.dist td.d-st.neg{color:var(--red)}
table.t.dist td.d-fill{width:48px;min-width:48px}
table.t.dist td.d-fill .dist-in{width:100%;min-width:0}
table.t.dist tr.sub2 th.st-h{background:var(--blue-bg);color:#1d3d5f}
table.t.dist tr.sub2 th.fill-h{background:#fffdf5;color:#7d4c11}
/* v1.9.18：「存｜配」中间插入「销」＝当前页签这家加盟店该款色码在所选窗口（默认近 30 天）的净销量。*/
table.t.dist td.sticky span.neg{color:var(--red);font-weight:800}
table.t.dist td.d-sale{width:34px;min-width:34px;background:#eff6f0!important;font:700 12px/1.3 var(--mono);color:#2c5e3a;text-align:center;padding:4px 2px}
table.t.dist td.d-sale .zero{color:#9fb0a3;font-weight:500}
table.t.dist tr.sub2 th.sale-h{background:#eff6f0;color:#2c5e3a}
table.t.dist tr.sub2 th.sale-h.off{background:#f6f9fd;color:var(--ink3)}
/* ============ v1.9.19：F3 冻结列按**实测内容宽度**重排（用户报障「列宽太宽，右边的配货区被挤没」） ============
   实测根因不是哪一列设大了，而是三条一起：
   ① 表头下那行 sub2 的长说明（117 字 + 全表 white-space:nowrap + colspan=6）把 6 个冻结列撑到 **1226px**，
      比可视宽（1366 屏上 .tw 只有 1045px）还宽 → 尺码区整个被推出屏幕，「配」根本看不见；
   ② 「图片」列内容是 68×68 的缩略图（.pthumb-w/.padd），真实需要 85px，却声明成 64px；
   ③ 「颜色」最长 4 汉字（51px）声明 58、「零售价」最长 8 字符（59px）声明 56 —— 声明值＜自然宽时，
      浏览器按**自然宽**排列，而 sticky 的 left 偏移是按**声明宽**累加的 → 冻结列与列边界错位（横向滚动时撕开）。
   修法：说明文字移出表格（表格上方 #dist-sub 里本来就有完整一份）；宽度按全量档案实测最大值重声明；
   并给冻结格加省略号兜底，万一出现更长的档案也不会再把列撑开（详见 HANDOVER §6.25）。
   ★缩略图在 F3 里缩到 40px（F1 矩阵仍 68px，那里列宽够用）。 */
table.t.dist td.sticky,table.t.dist thead th.sticky{max-width:0;overflow:hidden;text-overflow:ellipsis}
table.t.dist .pthumb-w,table.t.dist .padd{width:40px;height:40px;line-height:38px}
table.t.dist .pthumb{width:40px;height:40px}
table.t.dist tr.sub2 th.fxsub{white-space:normal;text-align:left;font-weight:600;letter-spacing:.2px}
/* 整手配货：最右一列，点一下＝该行（款×色）**每个码各 +1 件**＝一手；点几下加几手，点「N手」减一手 */
table.t.dist td.d-hand{padding:3px 5px !important;text-align:center;white-space:nowrap}
table.t.dist .hbtn{font:700 11.5px/1 var(--sans);padding:6px 8px;border:1px solid #bcd3ea;border-radius:6px;
  background:#eef4fb;color:#1d4a7a;cursor:pointer;white-space:nowrap}
table.t.dist .hbtn:hover{background:#dceafa;border-color:var(--blue)}
table.t.dist .hbtn:active{transform:translateY(1px)}
table.t.dist .hn{display:inline-block;min-width:16px;font:700 11px/1.6 var(--mono);color:#1c6b3a;cursor:pointer;margin-right:3px}
/* v1.9.33 返厂退货模式：颜色行/款行的「全退」按钮（视觉与配货表「+1手」同一家族，红色系示区分退货） */
table.t.mxtbl .mrt-all{font:700 11.5px/1 var(--sans);padding:6px 8px;border:1px solid #f0c9bf;border-radius:6px;
  background:#fdeeea;color:#a3331f;cursor:pointer;white-space:nowrap}
table.t.mxtbl .mrt-all:hover{background:#f9ddd6;border-color:#e0a89c}
table.t.mxtbl .mrt-all:active{transform:translateY(1px)}
table.t.dist .hn:hover{text-decoration:underline}
tr.sub2 th,tr.sub2 td{background:#f6f9fd;color:var(--ink3);font-weight:600;font-size:11px;padding:2px 6px;border-bottom:1px solid var(--line2)}
.dim{opacity:.72}
#dist-tabs{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
#dist-stores select,.filters select{font:500 13px/1 var(--sans);padding:7px 9px;border:1px solid var(--line);border-radius:6px;background:#fff;color:var(--ink);min-width:190px}
#dist-stores select:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(46,90,136,.1);outline:0}

/* ============================================ v2.0.0 F1 矩阵「配货模式」（matrix-alloc.js） ============
   每家门店由「存｜销」两子列变「存｜销｜配」三子列；颜色行的配格里放「整手」；冻结列换成
   M_ALLOC（去掉金额三列、加「本部可配」）。★所有规则都以 table.t.mxalloc 限定作用域 ——
   不开配货模式时这张表一个像素都不变（HANDOVER §6.23/§6.25 那条血泪教训：表格排版只加不改）。 */
/* 冻结列：声明宽度是权威值 —— 加省略号兜底，万一出现比声明更长的档案也不会把列撑开而错乱 sticky 偏移（§6.25 的坑） */
table.t.mxalloc td.sticky,table.t.mxalloc thead th.sticky{max-width:0;overflow:hidden;text-overflow:ellipsis}
/* 门店的「存 / 销」两格收紧到 38px，给「配」腾地方（每家门店 38+38+52=128px；三家店 384px + 冻结 636px = 1020px，
   1366×768 可视 1028px → 三家店刚好不用横向滚。数字更大时列会自然变宽，只影响门店区、不影响冻结列偏移） */
table.t.mxalloc td.mx-st,table.t.mxalloc td.mx-sl{width:38px;min-width:38px}
/* v2.0.2 配货模式「售空/退回」标记（存格 0 时代替圆点；两个都成立时并排，10px 字够看清且不撑列宽） */
.zmk{display:inline-block;min-width:14px;padding:0 1px;margin:0 1px;text-align:center;font:700 10px/14px var(--mono);border-radius:3px;color:#fff}
.zmk.mk-sold{background:#d9534f}      /* 售＝卖空过 → 可再配（红＝动销） */
.zmk.mk-ret{background:#7c5cd6}       /* 退＝退回过本部 → 慎配（紫＝退仓） */
table.t.mxalloc td.mx-fill{width:52px;min-width:52px;padding:2px 3px;text-align:center}
table.t.mxalloc td.mx-fill.hqcol{background:#fbfcfe;color:var(--ink3)}
table.t.mxalloc td.mx-fill .dist-in{width:100%;min-width:0;height:26px;padding:0 3px}
table.t.mxalloc td.mx-fill.ovr{background:var(--red-bg)!important}
table.t.mxalloc td.mx-fill.ovr .dist-in{background:transparent;color:var(--red);font-weight:800;box-shadow:inset 0 0 0 2px #f3c9c5}
table.t.mxalloc td.mx-hand{text-align:center;white-space:nowrap;padding:2px 3px!important}
table.t.mxalloc td.mx-hand .hbtn{font:700 10.5px/1 var(--sans);padding:5px 5px;border:1px solid #bcd3ea;border-radius:5px;background:#eef4fb;color:#1d4a7a;cursor:pointer;white-space:nowrap}
table.t.mxalloc td.mx-hand .hbtn:hover{background:#dceafa;border-color:var(--blue)}
table.t.mxalloc td.mx-hand .hbtn:active{transform:translateY(1px)}
table.t.mxalloc td.mx-hand .hn{display:inline-block;min-width:14px;margin-right:2px;font:700 10.5px/1.6 var(--mono);color:#1c6b3a;cursor:pointer}
table.t.mxalloc td.mx-hand .hn:hover{text-decoration:underline}
table.t.mxalloc th.mh2.fill-h{background:#fffdf5;color:#7d4c11}
table.t.mxalloc .mx-colsum{font:700 11.5px/1 var(--mono);color:var(--blue)}
/* 冻结列「本部可配」：琥珀底，与「库存件数」蓝、「销量」橙红区分开；负数（草稿占用超过实有）标红 */
table.t.mxalloc td.sticky.rm{background:#fff8ec!important;font:700 11.5px/1.3 var(--mono);color:#7d4c11}
table.t.mxalloc td.sticky.rm.neg{color:var(--red)}
#m-alloc-wrap{white-space:nowrap}
#m-alloc-panel .ms-btn{min-width:260px}

/* v1.9.25：F1 矩阵（普通模式与配货模式都算）的冻结列一律「**声明宽＝权威值**」＋省略号兜底。
   原来内容超过声明宽时浏览器会把列撑宽（颜色列声明 84 / 实测 122），而 sticky 的 left 偏移是按声明宽累加的
   → 右边所有冻结列的偏移与真实列边界错位，横向滚动时被撕开一行。加了这条后声明宽说了算，超长内容省略号 + title 看全文。 */
table.t.mxtbl td.sticky,table.t.mxtbl thead th.sticky{max-width:0;overflow:hidden;text-overflow:ellipsis}

/* v1.9.26：门店名表头里的「存/销/配」合计（用户要求放在表头、跟着门店名一起横滚，比表头下面那两行合计直观）
   配（本次已填）是实时数，MXA.refreshSums() 只改这一段文字，不重建表头。 */
/* ★「各店合计」专用行：门店名下面、「存/销/配」标签上面（v1.9.26）。
   合计不再挤在门店名格子里——用户看图后说「这种很丑」，要求单独一行、数字对准下面各自的列。
   背景比下面的标签色浅一档，让 存/销/配 三列各自成一组；sticky top＝26（行1 高度）。 */
/* ★居中（用户 2026-09-20 看图后要求）：三个合计数字原来右对齐，压在列的右边缘上；居中后正好落在
   下面「存／销／配」标签的正中间，一列一个数，看着整齐。padding 两侧对称，免得居中反而贴边。 */
table.t thead tr.totrow th{position:sticky;top:26px;z-index:4;height:22px;padding:0 4px;text-align:center;
  font:700 12px/1 var(--mono);letter-spacing:.2px;border-bottom:1px solid var(--blue-line)}
table.t thead tr.totrow th.st{background:#dbe9f8;color:#123c63}
table.t thead tr.totrow th.sl{background:#f8e3d3;color:#8f3a1c}
table.t thead tr.totrow th.fl{background:#fff3dc;color:#7d4c11}
table.t thead tr.totrow th .mx-colsum{font-weight:800}
table.t thead tr.totrow th .zero{color:var(--ink3);font-weight:500}
/* 插了合计行后，「存/销/配」标签行落在 thead 第 3 行，会吃到通用规则 tr:nth-child(3) th{font-weight:500}，
   这里按 class 补回原来的粗细（只补 font-weight，不碰背景——背景由 .stock-h/.sale-h/.fill-h 各自决定） */
table.t.mxtbl thead th.mh2{font-weight:650}

/* v1.9.26：分类弹层的一级分类（2023／2024／2025／2026／2027年…）＝分组起点，加粗＋一条分隔线，
   看起来就像软件里那棵树；子类靠 padding-left 逐级缩进（每级 13px）。 */
.cp-i.g{font-weight:700;margin-top:3px;border-top:1px solid var(--line2);padding-top:7px;padding-bottom:7px}
/* 悬停/选中沿用通用的 .cp-i:hover / .cp-i.on，不另开一套颜色，免得不存在的变量把底色顶掉 */

/* ============ v1.9.26 系统更新公告（notice.js / public-changelog.json） ============ */
/* ③ 左下角数据库连接参数下面的版本号：点它随时再看公告 */
#conn-ver{display:block;margin-top:4px;font:600 10.5px/1.3 var(--mono);color:#9fc3e4;cursor:pointer;letter-spacing:.3px}
#conn-ver:hover{color:#fff;text-decoration:underline;text-decoration-style:dotted}

/* ① 登录卡上的公告卡（未登录也能看，方便门店在输密码前就知道这版改了什么） */
.login-notice{display:none}
.login-notice.on{display:block;margin-top:14px;border:1px solid #d8e5f6;border-radius:9px;overflow:hidden;
  background:linear-gradient(180deg,#f6faff,#edf4fd)}
.login-notice .ln-hd{display:flex;align-items:center;gap:8px;padding:8px 12px;background:#e3edfa;
  border-bottom:1px solid #d8e5f6;font-size:12px;font-weight:700;color:#1d4a7a;letter-spacing:.3px}
.login-notice .ln-hd b{font:700 11.5px var(--mono);color:#fff;background:#2e5a88;border-radius:9px;padding:1px 8px}
.login-notice .ln-hd span{margin-left:auto;font:11px var(--mono);color:#5b7ea6;font-weight:500}
.login-notice .ln-t{padding:9px 12px 0;font-size:12.5px;font-weight:650;color:var(--ink)}
.login-notice .ln-pts{margin:5px 12px 9px;padding-left:16px;font-size:11.5px;line-height:1.7;color:var(--ink2);max-height:132px;overflow:auto}
.login-notice .ln-pts li{margin:1px 0}
.login-notice .ln-pts li::marker{color:#2e5a88}
.login-notice #ln-all{margin:0 12px 11px}

/* ② 公告弹层（复用 index.html 那个通用 #modal；.wn-over 让它能盖住登录遮罩 z-index 500） */
.modal.wn-over{z-index:600}
.modal.wn-over .modal-box{max-width:640px}
.wn-vers{display:flex;flex-wrap:wrap;gap:6px;padding-bottom:10px;margin-bottom:12px;border-bottom:1px solid var(--line)}
.wn-chip{font:600 11.5px var(--mono);color:var(--ink2);background:var(--line2);border:1px solid var(--line);
  border-radius:14px;padding:2px 10px;cursor:pointer}
.wn-chip:hover{border-color:#9db9d9;color:#1d4a7a}
.wn-chip.on{background:#2e5a88;border-color:#2e5a88;color:#fff}
.wn-item .wn-h{display:flex;align-items:baseline;gap:9px;font:700 16px/1.3 var(--sans);color:#12324f}
.wn-item .wn-h .wn-d{font:11.5px var(--mono);color:var(--ink3);font-weight:500}
.wn-item .wn-t{margin-top:3px;font-size:13px;font-weight:650;color:#20507c}
.wn-pts{margin:9px 0 0;padding-left:18px;font-size:12.8px;line-height:1.9;color:var(--ink2)}
.wn-pts li{margin:2px 0}
.wn-pts li::marker{color:#2e5a88}
.wn-foot{margin-top:14px;padding-top:10px;border-top:1px dashed var(--line);font-size:11.5px;color:var(--ink3);line-height:1.7}
.wn-warn{margin:0 0 11px;padding:8px 11px;border:1px solid #f0d79a;background:#fff8e6;border-radius:7px;
  font-size:11.8px;line-height:1.7;color:#7a5600}
.wn-empty{padding:16px 0;font-size:12.5px;color:var(--ink3)}

/* ============ v1.9.27 F3 顶部「矩阵里也能配货」提醒（用户要求醒目）============
   要醒目但不能盖过操作区：蓝色带 + 左侧粗竖条，标题加粗，正文 12.8px 两行半左右；
   按钮用主色实心（本页唯一一个 pri 按钮，视觉第一落点）。 */
.dist-also{margin:0 0 11px;padding:11px 14px 12px;border:1px solid #cfe0f5;border-left:5px solid #2e5a88;
  border-radius:9px;background:linear-gradient(90deg,#eaf3ff 0%,#f7fbff 62%,#fff 100%)}
.dist-also .da-t{font-size:14.5px;font-weight:800;color:#12324f;letter-spacing:.2px}
.dist-also .da-t b{color:#0f4c92}
.dist-also .da-d{margin-top:4px;font-size:12.8px;line-height:1.85;color:#2b4257}
.dist-also .da-d b{color:#12324f;font-weight:700}
.dist-also .da-a{margin-top:9px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
