:root{
  --blue:#123A6B; --blue2:#1F4E8C; --line:#D8E0EA; --bg:#F4F7FB;
  --ok:#1E7A3C; --warn:#B7791F; --err:#B42318;
  --spare:#E8E8E8; --cable:#D6E4F0; --block:#FCE9B8; --gold:#C9A227;
}
*{box-sizing:border-box}
body{margin:0;font:14px/1.6 "Microsoft YaHei","PingFang SC",system-ui,sans-serif;
  background:var(--bg);color:#1F2A37}

.topbar{display:flex;align-items:center;gap:20px;padding:12px 22px;
  background:linear-gradient(90deg,var(--blue),var(--blue2));color:#fff;flex-wrap:wrap}
.brand{font-weight:700;font-size:16px;letter-spacing:.5px}
.brand span{font-size:11px;vertical-align:super;opacity:.85}
.steps{display:flex;gap:8px;flex:1;flex-wrap:wrap}
.step{padding:4px 12px;border-radius:14px;background:rgba(255,255,255,.16);
  font-size:12px;opacity:.75}
.step.on{background:#fff;color:var(--blue);font-weight:700;opacity:1}
.topright{margin-left:auto}.tip{font-size:12px;opacity:.85}

main{max-width:1180px;margin:20px auto;padding:0 16px}
.card{background:#fff;border:1px solid var(--line);border-radius:12px;
  padding:22px 26px;box-shadow:0 2px 10px rgba(18,58,107,.06);margin-bottom:18px}
.card h2{margin:0 0 16px;font-size:18px;color:var(--blue);
  border-left:4px solid var(--blue);padding-left:10px}
.card h3{margin:22px 0 8px;font-size:15px;color:#33475B}
.hide{display:none !important}

.grid2{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:12px}
.grid4{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-top:10px}
@media(max-width:720px){.grid2,.grid3{grid-template-columns:1fr}}
@media(max-width:980px){.grid4{grid-template-columns:1fr 1fr}}

/* 整理导入：预览里认不出来的行标红，明示会被跳过 */
#impBody tr.bad{background:#FDF2F2}
#impBody tr.bad td{color:#B42318}
#impBody td.d{text-align:right}
#impSetup label{flex-direction:column;align-items:stretch;gap:4px}
#impSetup label select{margin:0}

label{display:flex;flex-direction:column;gap:5px;font-size:13px;color:#475467}
input,select,textarea{padding:8px 10px;border:1px solid var(--line);
  border-radius:7px;font:14px inherit;background:#fff;width:100%}
input:focus,select:focus,textarea:focus{outline:2px solid #BBD3F0;border-color:var(--blue2)}

.hint{color:#667085;font-size:12.5px;margin:8px 0 0}
.btns{display:flex;gap:10px;flex-wrap:wrap;margin-top:16px;align-items:center}
.btn{padding:9px 18px;border:1px solid var(--blue2);background:#fff;color:var(--blue2);
  border-radius:8px;cursor:pointer;font:14px inherit;transition:.15s}
.btn:hover{background:#EAF1FA}
.btn.primary{background:var(--blue2);color:#fff;border-color:var(--blue2)}
.btn.primary:hover{background:var(--blue)}
.btn.ghost{border-color:#C3CEDB;color:#5A6B7D}
.btn.ghost:hover{background:#F0F4F9}
.btn:disabled{opacity:.45;cursor:not-allowed}

table.tb{width:100%;border-collapse:collapse;margin-top:6px;font-size:13.5px}
table.tb th{background:var(--blue);color:#fff;padding:9px 8px;text-align:left;font-weight:600}
table.tb td{border-bottom:1px solid var(--line);padding:6px 8px}
table.tb tbody tr:nth-child(even){background:#F7FAFD}
table.tb td input{padding:5px 7px}
.mini{padding:4px 9px;font-size:12px;border-radius:6px;border:1px solid #D0D9E4;
  background:#fff;cursor:pointer;color:#475467}
.mini:hover{background:#EEF3F9}

.paste{margin-top:14px;padding:14px;border:1px dashed #B6C6DA;border-radius:9px;background:#FBFCFE}
.paste textarea{font-family:Consolas,monospace;font-size:13px}

.plans{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:16px}
@media(max-width:720px){.plans{grid-template-columns:1fr}}
.plan{border:2px solid var(--line);border-radius:10px;padding:14px 16px;cursor:pointer;background:#fff}
.plan:hover{border-color:#9EC0E8}
.plan.sel{border-color:var(--blue2);background:#F2F7FD;box-shadow:0 0 0 3px #DCE8F7}
.plan h4{margin:0 0 6px;font-size:14.5px;color:var(--blue)}
.plan .kv{font-size:12.5px;color:#5A6B7D;display:flex;justify-content:space-between}
.plan .gap{margin-top:8px;font-size:12px;color:var(--ok)}

.modbox{margin-top:16px;border:1px solid var(--line);border-radius:9px;padding:10px 14px;background:#FBFCFE}
.modbox summary{cursor:pointer;font-weight:600;color:var(--blue)}
.modbox summary::marker{color:var(--blue)}
.modbox summary::after{content:' ▾';font-size:11px;color:#8A96A3}
.modbox[open] summary::after{content:' ▴'}
/* 折叠时在标题后附带客户名，一眼知道填的是谁（2026-10-23 老板要可折叠） */
.modbox summary .foldsum{font-weight:400;color:#6B7785;font-size:12.5px;margin-left:8px}
.modlist{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:6px;margin-top:10px}
.modlist label{flex-direction:row;align-items:center;gap:7px;font-size:12.5px}
.tag{font-size:10.5px;padding:1px 6px;border-radius:9px;margin-left:auto}
.tag.auto{background:#E3F2E9;color:var(--ok)}
.tag.opt{background:#F1F3F6;color:#6B7785}

.viewwrap{margin:12px 0;overflow:auto;background:#FBFCFE;border:1px solid var(--line);
  border-radius:10px;padding:12px;text-align:center}
canvas{max-width:100%;background:#fff}

/* 预览切换：主视图 / 全部页面 */
.viewtabs{display:flex;gap:8px;margin-top:10px}
.viewtabs .mini{padding:5px 14px;font-size:13px}
.viewtabs .mini.on{background:#123A6B;border-color:#123A6B;color:#fff}
.viewtabs .mini.on:hover{background:#123A6B}
#pvFrame{width:100%;height:720px;border:1px solid var(--line);
  border-radius:8px;background:#fff;display:block}

/* 已保存方案 */
#planSel{flex:1;min-width:240px;padding:6px 9px;border:1px solid #D0D9E4;
  border-radius:7px;font:13px inherit;background:#fff}

.status{padding:11px 14px;border-radius:8px;font-size:13.5px;margin-bottom:12px}
.status.ok{background:#E9F6EE;color:var(--ok);border:1px solid #B7E0C6}
.status.err{background:#FDECEA;color:var(--err);border:1px solid #F5C6C2}
.status.busy{background:#FFF7E6;color:var(--warn);border:1px solid #F5DFA8}

.gap.warn{background:#FDECEA;color:#B42318;border:1px solid #F5C6C2;font-weight:600}
.restore-bar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  background:#FFF8E6;border:1px solid #F0D9A0;border-radius:9px;
  padding:9px 14px;margin-bottom:14px;font-size:14px;color:#7A5B12}
.restore-bar .mini{padding:4px 10px}
.bkbtn{padding:6px 14px;border-radius:7px;border:1px solid rgba(255,255,255,.55);
  background:rgba(255,255,255,.14);color:#fff;cursor:pointer;font:13px inherit;margin-right:12px}
a.bkbtn{display:inline-block;text-decoration:none;line-height:1.2}
.bkbtn:hover{background:rgba(255,255,255,.28)}
.bkrow{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin:6px 0 4px}
.bkrow input[type=text]{flex:1;min-width:220px}
label.inline{flex-direction:row;align-items:center;gap:6px;white-space:nowrap}
label.inline input[type=checkbox]{width:auto}
label.inline input[type=number]{width:80px}

.toast{position:fixed;left:50%;bottom:34px;transform:translateX(-50%);
  background:#1F2A37;color:#fff;padding:11px 20px;border-radius:8px;font-size:13.5px;
  z-index:99;box-shadow:0 6px 20px rgba(0,0,0,.2)}

/* ---------- 框架选择：三种模式 ---------- */
.modecard{border:1px solid var(--line);border-radius:10px;background:#FBFCFE;
  padding:11px 14px;margin-bottom:10px;transition:border-color .15s,background .15s}
.modecard.on{border-color:var(--blue2);background:#F2F7FD;box-shadow:0 0 0 3px #DCE8F7}
.modeth{flex-direction:row;align-items:center;gap:9px;cursor:pointer;font-size:14px;color:var(--blue)}
.modeth input[type=radio]{width:auto;margin:0}
.modeth .hint{font-weight:400;color:#6B7785;font-size:12.5px;margin:0}
.modecard .grid3,.modecard .grid2{margin-top:11px;margin-bottom:2px}
.modecard #colMaxTip{margin:6px 0 2px}

/* 第3步 模式卡：状态摘要行 + 需注意的提示 */
.stateline{color:#41506B;font-size:12.5px;margin:8px 0 0;line-height:1.6}
.stateline.warn{color:#B42318}
.modecard.on .stateline{color:#123A6B}
.modecard.on .stateline.warn{color:#B42318}
#recReason{color:#667085;font-size:12.5px;margin-left:10px}
#recReason.warn{color:#B42318}

/* ---- 每页顶部快捷按钮条（老板 2026-10-25：不用翻到页面底部） ---- */
.savebar{display:flex;gap:10px;flex-wrap:wrap;align-items:center;
  margin:-4px 0 14px;padding:8px 10px;background:#f4f8fd;
  border:1px solid #d6e4f5;border-radius:8px}
.btn.sm{padding:6px 14px;font-size:13px}

/* ---------------- 排布调整面板（老板 2026-10-25 15:49 搭积木） ---------------- */
.dragpanel{display:flex;gap:14px;align-items:stretch;margin:12px 0 4px;flex-wrap:wrap}
.dp-left{flex:1 1 420px;min-width:320px;padding:10px 12px;background:#f4f8fd;
  border:1px solid #d6e4f5;border-radius:8px}
.dp-right{flex:0 0 260px;min-width:220px;padding:10px 12px;background:#fffdf5;
  border:1px solid #e8dcb8;border-radius:8px;display:flex;flex-direction:column}
.dp-hd{font-weight:700;color:#123A6B;font-size:14px;margin-bottom:8px}
.dp-hd small{font-weight:400;color:#7A8794;font-size:12px}
.dp-tools{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:8px}
.dp-info{font-size:12.5px;color:#33506E;margin:2px 0 6px}
.tray-box{flex:1 1 auto;min-height:96px;max-height:260px;overflow:auto;background:#fff;
  border:1.5px dashed #C9A227;border-radius:6px;padding:8px}
.tray-box.hot{background:#FFF8E1;border-color:#E0A800;border-style:solid}
.tray-empty{color:#9AA5B1;font-size:12.5px;text-align:center;padding:22px 6px;line-height:1.7}
.tray-hole{margin-bottom:8px}
.tray-hd{font-size:12px;color:#8A6D1F;font-weight:700;margin-bottom:4px}
.tray-item{display:flex;justify-content:space-between;align-items:center;gap:8px;
  padding:6px 8px;margin-bottom:4px;background:#F2F6FC;border:1px solid #cfdced;
  border-radius:5px;cursor:pointer;font-size:12.5px}
.tray-item:hover{background:#E3EEFB;border-color:#7FA9D4}
.ti-name{color:#123A6B;font-weight:600}
.ti-size{color:#7A8794;font-size:11.5px}

/* 「确定应用」按钮：有未应用的改动时脉冲提示 */
#btnApply{background:var(--gold);border-color:var(--gold);color:#fff;font-weight:700}
#btnApply:disabled{background:#E3E7EC;border-color:#E3E7EC;color:#A8B0B8;font-weight:400}
#btnApply.pulse{animation:dpPulse 1.1s ease-in-out infinite}
@keyframes dpPulse{0%,100%{box-shadow:0 0 0 0 rgba(201,162,39,.55)}
  50%{box-shadow:0 0 0 7px rgba(201,162,39,0)}}

/* 暂存区里的电缆编号（老板 2026-10-25 16:44：编号要跟着走） */
.tray-item.has-cable{background:#E8F0FA;border-color:#7FA9D4}

/* 暂存区整行卡片（2026-10-25 19:18 改：一行存成一整张卡，可勾选、可拖回）
   .ti-blk 是行内的小块（保持原来的块样式） */
.tray-row{display:flex;flex-wrap:wrap;align-items:center;gap:4px;
  padding:5px 6px;background:#F2F6FC;border:1px solid #cfdced;border-radius:5px;
  margin-bottom:5px;cursor:grab;user-select:none}
.tray-row:hover{background:#E3EEFB;border-color:#7FA9D4}
.tray-row.picked{background:#FFF6DA;border-color:#C9A227;
  box-shadow:0 0 0 2px rgba(201,162,39,.28)}
.tray-row:active{cursor:grabbing}
.ti-h{font-size:11px;color:#8A6D1F;font-weight:700;background:#FCE9B8;
  padding:1px 5px;border-radius:4px;white-space:nowrap}
.ti-blk{display:inline-flex;align-items:center;gap:3px;background:#fff;
  border:1px solid #d7e2ef;border-radius:4px;padding:1px 4px;font-size:11.5px}
.ti-blk.has-cable{background:#E8F0FA;border-color:#7FA9D4}
.ti-blk .ti-name{font-size:11.5px}
.ti-blk .ti-size{font-size:10.5px}
.tray-hd{display:flex;align-items:center;justify-content:space-between;gap:6px}
.tray-all{padding:1px 7px;font-size:11px;border-color:#C9A227;color:#8A6D1F;
  background:#FFF9E8}
.ti-tag{display:inline-block;min-width:26px;text-align:center;padding:1px 5px;
  background:#123A6B;color:#fff;font-weight:700;font-size:11.5px;border-radius:4px;
  letter-spacing:.4px}
.ti-sp{display:inline-block;min-width:26px;text-align:center;padding:1px 5px;
  background:#fff;color:#B8860B;font-weight:700;font-size:11.5px;border-radius:4px;
  border:1px solid #E3D6A8}

/* 画布：显示尺寸必须和 width/height 属性一致，否则点击坐标换算会偏移
   （2026-10-25 修「排布调整选不中」） */
#cv{max-width:100%;height:auto;display:block;margin:0 auto;
    background:#fff;border:1px solid #E3E7EC;border-radius:8px}
.viewwrap{overflow:auto}

/* ===== 计算进度条（2026-10-25 20:48 老板要求：不然不知道是不是死机） ===== */
.prog{position:fixed;left:50%;top:18%;transform:translateX(-50%);z-index:9999;
  width:min(560px,92vw);background:#fff;border:1px solid #D7E2EF;border-radius:12px;
  box-shadow:0 12px 40px rgba(18,58,107,.22);padding:18px 20px 16px;display:none}
.prog.on{display:block}
.prog-hd{display:flex;align-items:center;justify-content:space-between;gap:10px;
  margin-bottom:10px;font-size:14px;color:#123A6B;font-weight:700}
.prog-hd .ph-t{display:flex;align-items:center;gap:8px}
.prog-dot{width:9px;height:9px;border-radius:50%;background:#C9A227;
  animation:progPulse 1s ease-in-out infinite}
@keyframes progPulse{0%,100%{opacity:1;transform:scale(1)}
  50%{opacity:.35;transform:scale(.7)}}
.prog-x{border:0;background:transparent;color:#8A97A8;font-size:18px;line-height:1;
  cursor:pointer;padding:0 2px}
.prog-x:hover{color:#B23A3A}
.prog-bar{height:9px;background:#EAF0F7;border-radius:99px;overflow:hidden;position:relative}
.prog-fill{height:100%;width:0;border-radius:99px;
  background:linear-gradient(90deg,#123A6B,#2E6DB4 60%,#C9A227);
  transition:width .45s ease}
.prog-fill.run{background-image:linear-gradient(90deg,#123A6B,#2E6DB4 60%,#C9A227),
  repeating-linear-gradient(45deg,rgba(255,255,255,.16) 0 8px,transparent 8px 16px);
  background-blend-mode:overlay;background-size:100% 100%,32px 32px;
  animation:progStripe .8s linear infinite}
@keyframes progStripe{from{background-position:0 0,0 0}to{background-position:0 0,32px 0}}
.prog-pct{font-size:12px;color:#5B6B7F;font-weight:600;margin-left:auto}
.prog-step{margin-top:9px;font-size:12.5px;color:#5B6B7F;min-height:18px}
.prog-list{margin-top:10px;display:flex;flex-wrap:wrap;gap:6px}
.prog-list span{font-size:11.5px;padding:2px 9px;border-radius:99px;
  background:#F2F5F9;color:#8A97A8;border:1px solid #E3E9F0}
.prog-list span.done{background:#EAF4E4;color:#3B7A2A;border-color:#CBE4BB}
.prog-list span.now{background:#FFF9E8;color:#8A6D1F;border-color:#E3D6A8;font-weight:700}
.prog-time{margin-top:8px;font-size:11.5px;color:#98A4B3;text-align:right}

/* ===== 计算按钮左侧三步提示（2026-10-25 21:05 老板要求） ===== */
.btn-lead{display:inline-flex;align-items:center;flex-wrap:wrap;gap:5px;
  font-size:12.5px;color:#5B6B7F;background:#F6F9FC;border:1px dashed #C7D6E6;
  border-radius:8px;padding:6px 12px;margin-right:4px;line-height:1.5}
.btn-lead .bl-step{display:inline-flex;align-items:center;justify-content:center;
  width:17px;height:17px;border-radius:50%;background:#123A6B;color:#fff;
  font-size:11px;font-weight:700;margin-right:4px;flex:none}
.btn-lead .bl-arrow{color:#C9A227;font-style:normal;font-weight:700;margin:0 2px}
.btn-lead.done{background:#EAF4E4;border-color:#CBE4BB;color:#3B7A2A}
.btn-lead.done .bl-step{background:#3B7A2A}


/* ===== 替换空孔槽（2026-10-25 23:07 老板要求）===== */
.slot-wrap{display:flex;flex-direction:column;gap:10px;flex:1 1 auto}
.slot-box{background:#fff;border:1.5px dashed #C9A227;border-radius:7px;padding:8px}
.slot-box.full{border-style:solid;border-color:#2FAA5A;background:#F4FBF6}
.slot-box.armed{border-color:#E0A800;border-style:solid;box-shadow:0 0 0 3px rgba(224,168,0,.22)}
.slot-hd{font-size:12.5px;font-weight:700;color:#123A6B;margin-bottom:6px;display:flex;align-items:center;flex-wrap:wrap;gap:4px}
.slot-hd .ord{margin-left:auto;font-size:11px;padding:1px 6px;line-height:16px}
.slot-hd .ok{color:#2FAA5A;margin-left:6px}
/* 2026-10-26 08:01 老板：「宽度是固定的 120」→ 槽宽必须由 JS 按 120:孔净高
   等比算出（竖向，一行 120 正好撑满），这里不许写死 px，否则覆盖 JS 算的值。 */
.slot-board{position:relative;background:#F7F9FC;border:1px solid #cfdced;border-radius:5px;
margin:0 auto;overflow:hidden}
.slot-empty{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:center;
  align-items:center;color:#9AA5B1;font-size:12px;text-align:center;line-height:1.6;padding:6px}
.slot-blk{position:absolute;box-sizing:border-box;border:1px solid #8A939C;background:#fff;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  overflow:hidden;cursor:pointer;font-size:9px;line-height:1.05;color:#000}
.slot-blk.spare{background:#E9ECEF}
.slot-blk.picked{outline:2px solid #C9A227;outline-offset:-2px}
.slot-blk i{font-style:normal;font-weight:700;font-size:10px}
.slot-blk u{text-decoration:none;font-size:8.5px}
/* 2026-10-26 14:02 空余区在【顶部】（槽内模块从底部往上堆），原来写 bottom:0 会压住模块 */
.slot-free{position:absolute;left:0;right:0;top:0;border-bottom:1.5px dashed #2F80ED;
  background:rgba(47,128,237,.07);color:#2F80ED;font-size:11px;
  display:flex;align-items:center;justify-content:center;pointer-events:none}
.slot-ghost{position:absolute;left:0;right:0;bottom:0;border:2.5px dashed #1E9E4E;
  background:rgba(47,170,90,.20);color:#0E7A38;font-weight:700;font-size:11.5px;
  display:flex;align-items:center;justify-content:center;pointer-events:none;z-index:5}
.slot-btns{display:flex;gap:5px;flex-wrap:wrap;margin-top:7px}


/* 2026-10-25 23:20 修：加了替换空孔后 .viewwrap 被挤成 0 高，
   canvas{max-width:100%} 跟着塌成 0 → 点不到、拖不了。
   → viewwrap 给最小高度；dp-right 不再抢高度。 */
.viewwrap{min-height:640px}
.dp-right{flex:0 0 auto}
.slot-board{flex:0 0 auto}
/* 2026-10-26 08:01 槽口径标签（宽 120 / 孔净高），帮老板一眼确认 */
.slot-wtag{margin-top:5px;text-align:center;font-size:11px;color:#7C8794;letter-spacing:.2px}

/* 2026-10-26 11:09 老板：「槽需要横向排我可以直观的看到槽里有什么，一排 3 个槽，
   竖向排不够再转多行」→ 槽容器改 grid，一行 3 个，第 4 个自动换下一行。 */
#slotWrap{
  display:grid;
  grid-template-columns:repeat(3, minmax(0, 1fr));
  gap:10px;
  align-items:start;
}
#slotWrap .slot-box{min-width:0}
@media (max-width:1200px){ #slotWrap{grid-template-columns:repeat(2, minmax(0, 1fr));} }

/* ===================== 客户选择面板 v1（2026-10-27） ===================== */
.cp-wrap{display:none;position:relative;margin-top:10px;background:#fff;border:1px solid #c8d6e8;
  border-radius:10px;box-shadow:0 8px 26px rgba(18,58,107,.14);overflow:hidden;max-width:920px}
.cp-wrap.show{display:block}
.cp-hd{display:flex;align-items:center;gap:8px;padding:9px 10px;background:#123A6B}
.cp-hd .cp-q{flex:1;padding:8px 12px;border:none;border-radius:6px;font-size:13.5px;outline:none}
.cp-hd .cp-cnt{color:#fff;font-size:12px;opacity:.9;white-space:nowrap;min-width:80px;text-align:right}
.cp-hd .cp-x{background:transparent;border:none;color:#fff;font-size:15px;cursor:pointer;padding:2px 6px;opacity:.8}
.cp-hd .cp-x:hover{opacity:1}
.cp-alpha{display:flex;flex-wrap:wrap;gap:3px;padding:7px 9px;background:#f4f8fd;border-bottom:1px solid #e2ebf6}
.cp-alpha button{border:1px solid #d3e0ee;background:#fff;color:#25486f;font-size:11.5px;
  min-width:23px;height:23px;padding:0 5px;border-radius:5px;cursor:pointer;line-height:21px}
.cp-alpha button.wide{min-width:40px}
.cp-alpha button:hover{background:#e8f1fb;border-color:#a9c6e4}
.cp-alpha button.on{background:#C9A227;border-color:#C9A227;color:#fff;font-weight:700}
.cp-list{max-height:330px;overflow-y:auto;padding:2px 0 6px}
.cp-grp{position:sticky;top:0;background:#fff;padding:5px 12px 3px;font-size:11.5px;font-weight:700;
  color:#123A6B;letter-spacing:1px;border-bottom:1px solid #eef4fa;z-index:1}
.cp-item{display:flex;justify-content:space-between;align-items:center;gap:12px;
  padding:7px 14px;cursor:pointer;border-left:3px solid transparent}
.cp-item.on{background:#eaf3fe;border-left-color:#C9A227}
.cp-item:hover{background:#f3f8ff}
.cp-nm{font-size:13px;color:#1d2b3a;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cp-nm mark{background:#fff3b0;color:#8a6d00;padding:0 1px;border-radius:2px}
.cp-sub{font-size:11.5px;color:#7b8b9c;white-space:nowrap;flex-shrink:0}
.cp-tel{color:#123A6B;font-weight:600}
.cp-empty{padding:26px 14px;text-align:center;color:#8b9aab;font-size:13px}
.cp-ft{padding:6px 12px;background:#f8fafc;border-top:1px solid #eef2f7;
  font-size:11px;color:#8b9aab}
.dl-hint.ok{color:#1a7f37}

/* ===== 建议模块型号列（2026-11-04 老板：能看出配得对不对，不合适可改） ===== */
.c-modcell{white-space:nowrap}
.c-mod{width:calc(100% - 46px);font-size:12.5px;padding:3px 4px;border:1px solid #c8d6e8;
  border-radius:4px;background:#fff;color:#1d2b3a;outline:none;vertical-align:middle}
.c-mod.mod-ok{background:#f6fbf7;border-color:#cfe6d5;color:#1a7f37}
.c-mod.mod-bad{background:#fff6f6;border-color:#e5b4b4;color:#b3352f;font-weight:700}
.c-mod.mod-over{background:#fffaf0;border-color:#e8cfa0;color:#9a6b12}
/* 2026-11-04 22:47 老板：「字体不要用白色的」→ 按钮改浅底深字 */
.c-mok{margin-left:3px;padding:2px 6px;font-size:11px;border:1px solid #123a6b;
  border-radius:4px;background:#e8f0fa;color:#123a6b;cursor:pointer;font-weight:600;vertical-align:middle}
.c-mok:hover{background:#d3e2f5;border-color:#0f2f57}
.c-mok.hide{display:none}
.c-nm{max-width:230px}
/* 2026-11-04 22:48 老板：「序号这里没有字」
   根因：序号列只有 71px，输入框 width:100% + 左右 padding 14px + 边框，
   内容区被挤成 0，数字看不见。
   → 序号列专属：另存不收 padding，居中对齐，保证数字能露出来 */
#cabBody .c-seq{padding:5px 3px;text-align:center;font-weight:700;color:#123A6B;
  box-sizing:border-box;min-width:0}

/* ============ 客户操作条（2026-10-27：选择客户 / 新增客户 放在客户资料栏上方） ============ */
.custbar{display:flex;align-items:center;gap:9px;flex-wrap:wrap;
  padding:10px 12px;margin-bottom:10px;background:#f4f8fd;
  border:1px solid #d6e4f5;border-left:4px solid #123A6B;border-radius:8px}
.custbar-t{color:#123A6B;font-size:13.5px;white-space:nowrap}
.custbar-now{font-size:12.5px;color:#8b9aab;max-width:320px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.custbar-now.has{color:#1a7f37;font-weight:600}
#custQuick{flex:1;min-width:240px;padding:7px 11px;border:1px solid #c8d6e8;
  border-radius:6px;font-size:13px;outline:none;background:#fff}
#custQuick:focus{border-color:#C9A227;box-shadow:0 0 0 2px rgba(201,162,39,.15)}
.custbar .btn{white-space:nowrap}


/* ===== 价格管理网格（2026-10-27 老板「都要」） ===== */
/* 2026-11-13 老板：价格框太小填不进去 + 要有原价 → 格子加宽，输入框给足宽度，右侧显示原价 */
.pgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:10px;margin:10px 0 18px}
.pgrid .pitem{display:flex;align-items:center;gap:6px;background:#fafcff;border:1px solid #e2e9f2;border-radius:7px;padding:7px 9px}
.pgrid .pitem>span:first-child{font-size:12.5px;color:#123A6B;font-weight:600;white-space:nowrap;min-width:104px;max-width:118px;overflow:hidden;text-overflow:ellipsis}
.pgrid .pitem input{flex:1 1 auto;width:100%;min-width:96px;padding:5px 8px;border:1px solid #ccd6e0;border-radius:5px;font-size:13px;text-align:right;font-variant-numeric:tabular-nums}
.pgrid .pitem .orig{font-size:11px;color:#8a97a5;white-space:nowrap;flex:0 0 auto}
.pgrid .pitem .orig b{color:#b07d1a;font-weight:600}
.pgrid .pitem input:focus{outline:none;border-color:#123A6B;box-shadow:0 0 0 2px rgba(18,58,107,.12)}
.pgrid .pitem.chg{background:#fff8e6;border-color:#e0c06a}
.pgrid .pitem.chg::after{content:"已改";font-size:10px;color:#C9A227;border:1px solid #e0c06a;border-radius:3px;padding:0 3px;flex:0 0 auto;line-height:1.5}
.pgrid .pgsub{grid-column:1/-1;font-size:12px;color:#666;font-weight:700;margin-top:6px;border-left:3px solid #C9A227;padding-left:7px}
.pgrid .pitem>span.unit{font-size:11px;color:#8a97a5;white-space:nowrap;flex:0 0 auto}

/* 2026-11-02 老板：排布调整面板里加「分布方式」（预览页直接改） */
.dp-dist{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  margin:10px 0 6px;padding:8px 10px;background:#F5F8FC;
  border:1px solid #E3E7EC;border-radius:8px}
.dp-dist b{font-size:13px;color:#123A6B}

/* ===== 常用客户快捷区（2026-11-04 老板：常用客户先出来，最多 10 个） ===== */
.cp-recent{display:flex;flex-wrap:wrap;align-items:center;gap:6px;
  padding:8px 10px;background:#fffdf5;border-bottom:1px solid #f0e6c8}
.cp-rb-t{font-size:11.5px;font-weight:700;color:#8a6d1f;margin-right:2px;white-space:nowrap}
.cp-rb{border:1px solid #e2d3a4;background:#fff;color:#8a5a1f;font-size:12px;
  padding:4px 10px;border-radius:14px;cursor:pointer;max-width:220px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.3}
.cp-rb:hover{background:#fff6dd;border-color:#C9A227;color:#7a4d10}
