* { box-sizing: border-box; }
:root {
  --bg: #F5F5FF;
  --panel: #ffffff;
  --line: #dbe7ff;
  --line-strong: #cdd5e0;
  --text: #1b2330;
  --muted: #6b7688;
  --primary: #0033CC;          /* v1.6 换肤：官网主蓝 #0033CC（第 11 条：UI 参照官网设计语言） */
  --primary-soft: #e8efff;
  --cat-blue: #0019AA;         /* v4.11b 产品库配色（蔡总截图定死）：大类=蓝 RGB(0,25,170) */
  --cat-green: #19E14B;        /* 小类=绿 RGB(25,225,75)，均白字 */
  --cat-row: #e8efff;          /* 大类所在行的浅蓝底 */
  --danger: #c8362f;
  --ok: #1a8a52;
  --warn: #b5730f;
  --radius: 8px;

  /* ---------- v0.6.0 设计令牌：统一字号 / 灰阶 / 间距，消灭散落的硬编码色值 ---------- */
  --fs-xs: 11px;      /* 极小字：角标、辅助 */
  --fs-sm: 12px;      /* 小字：表格内容、标签说明 */
  --fs-md: 13px;      /* 正文 */
  --fs-lg: 15px;      /* 区块标题 */
  --fs-xl: 19px;      /* 关键数字 */
  --fs-xxl: 24px;     /* 摘要卡大数 */

  --ink-1: #1b2330;   /* 主文字 */
  --ink-2: #3d4757;   /* 次级文字 */
  --ink-3: #6b7688;   /* 说明文字（= muted） */
  --ink-4: #98a2b3;   /* 占位 / 弱化 */

  --sp-1: 4px; --sp-2: 8px; --sp-3: 12px; --sp-4: 16px; --sp-5: 20px;

  --card-pad: 16px;
  --row-gap: 14px;
  --shadow-1: 0 1px 2px rgba(16, 24, 40, .04);
  --shadow-2: 0 4px 14px rgba(16, 24, 40, .07);
}
html, body { height: 100%; }
body {
  margin: 0; background: var(--bg); color: var(--text);
  font-family: "Microsoft YaHei", "微软雅黑", "PingFang SC", system-ui, sans-serif;
  font-size: 13px; overflow: hidden;
}
#app { display: flex; height: 100vh; }

/* ---------- 侧栏 ---------- */
aside {
  width: 208px; flex: 0 0 208px; background: #F5F5FF; border-right: 1px solid var(--line);
  display: flex; flex-direction: column;
}
.brand { padding: 14px 16px 12px; border-bottom: 1px solid var(--line); }
.brand b { font-size: 14px; letter-spacing: .5px; display: block; }
.brand span { font-size: 11px; color: var(--muted); }
/* v4.61（蔡总 2026-10-15）：品牌位用公司注册 logo 图替换写死文字，比原文字大更显眼
   v4.62：内部浅底显示蓝版；对外深蓝侧栏直接用泛白版（透明底），**不加任何衬底**（蔡总：加底色很丑）
   v4.63（蔡总 2026-10-15）：品牌位分 4 行排（logo / 徽章+客服中心大字 / 会员名 / ERP工作平台小字），不再扎堆 */
.brand-logo { display: none; height: 32px; width: auto; max-width: 176px; object-fit: contain; margin-bottom: 8px; }
.brand-logo.blue { display: block; }
body.portal .brand-logo.blue { display: none; }
body.portal .brand-logo.white { display: block; height: 38px; max-width: 190px; }
.brand-line2 { display: flex; align-items: center; gap: 9px; margin-bottom: 4px; }
.brand-name { font-size: 17px; font-weight: 700; letter-spacing: .5px; color: #12233f; line-height: 1.2; }
.brand-cust { font-size: 12px; color: #4a5768; line-height: 1.35; margin-bottom: 3px;
  word-break: break-all; }
.brand-sub { font-size: 10.5px; color: var(--muted); line-height: 1.3; letter-spacing: .3px; }
body.portal .brand-name { color: #fff; }
body.portal .brand-cust { color: #cfe0fa; }
body.portal .brand-sub { color: #9fb6e0; }
nav { padding: 8px; overflow-y: auto; flex: 1; }
nav .grp { font-size: 11px; color: var(--muted); padding: 10px 8px 4px; }
nav a {
  display: flex; align-items: center; gap: 8px; padding: 8px 10px; border-radius: 6px;
  color: var(--text); text-decoration: none; font-size: 13px; margin-bottom: 2px; cursor: pointer;
}
nav a:hover { background: #e8efff; }
nav a.on { background: var(--primary-soft); color: var(--primary); font-weight: 600; }
nav a .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--line-strong); }
nav a.on .dot { background: var(--primary); }
/* v3.57（蔡总 2026-10-10）：菜单 / 分组名称自定义 —— 平时藏起来，鼠标移到那一行才出现「✎」 */
nav a { position: relative; }
nav a .nav-t { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
nav .grp { display: flex; align-items: center; gap: 6px; }
nav .grp .grp-tt { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.navpen { opacity: 0; flex: 0 0 auto; font-size: 12px; line-height: 1; color: var(--muted); cursor: pointer;
  padding: 2px 3px; border-radius: 4px; transition: opacity .15s, background .15s; }
nav a:hover .navpen, nav .grp:hover .navpen { opacity: .8; }
.navpen:hover { opacity: 1; background: #dbe7ff; color: var(--primary); }
nav .navlabel { padding: 8px 4px 2px; }
nav .navlabel button { width: 100%; }
/* 改名弹窗：左列默认名、右列新名 */
.nl-list { max-height: 52vh; overflow-y: auto; border: 1px solid var(--line); border-radius: 8px; }
.nl-row { display: flex; align-items: center; gap: 10px; padding: 6px 10px; border-bottom: 1px solid var(--line); }
.nl-row:last-child { border-bottom: 0; }
.nl-row.g { background: #F5F5FF; }
.nl-row.g .nl-def { font-weight: 700; color: #33405a; }
.nl-def { flex: 0 0 190px; font-size: 12px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nl-row input { flex: 1; min-width: 0; }
aside .foot { padding: 10px 14px; border-top: 1px solid var(--line); font-size: 11px; color: var(--muted); }

/* ---------- v3.96（蔡总 2026-10-12 02:13）：侧栏底部「当前登录人」卡片 ----------
   v4.63（蔡总 2026-10-15）：改分行版 —— ①兔/商徽章+名字 ②档位·职责 */
.sideme { padding: 8px 10px; margin-bottom: 8px;
  background: rgba(255,255,255,.6); border: 1px solid var(--line); border-radius: 10px; }
.sideme-row { display: flex; align-items: center; gap: 7px; min-width: 0; }
.sm-badge { display: inline-flex; align-items: center; justify-content: center; width: 20px; height: 20px;
  border-radius: 50%; font-size: 11px; font-weight: 700; line-height: 1; flex: none;
  background: #19E14B; color: #0d1424; }
.sm-badge.portal { background: #0033CC; color: #fff; }
.sm-name { font-size: 12.5px; color: #1d2a3d; font-weight: 600; min-width: 0;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sm-role { font-size: 11px; color: var(--muted); margin-top: 2px; padding-left: 27px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
body.portal .sideme { background: rgba(255,255,255,.08); border-color: rgba(255,255,255,.18); }
body.portal .sm-name { color: #e8efff; }
body.portal .sm-role { color: #cfe0fa; }
body.portal .sm-badge { background: #0033CC; color: #fff; }

/* ---------- 主区 ---------- */
main { flex: 1; display: flex; flex-direction: column; min-width: 0; }
header {
  height: 52px; flex: 0 0 52px; background: var(--panel); border-bottom: 1px solid var(--line);
  display: flex; align-items: center; padding: 0 18px; gap: 12px;
}
header h1 { font-size: 15px; margin: 0; font-weight: 600; }
header .sub { font-size: 12px; color: var(--muted); }
header .spacer { flex: 1; }
section.body { flex: 1; overflow: auto; padding: 16px 18px 40px; }

/* ---------- 组件 ---------- */
.card { background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius); margin-bottom: 14px; }
.card > h3 { margin: 0; padding: 11px 14px; font-size: 13px; border-bottom: 1px solid var(--line); display: flex; align-items: center; gap: 8px; }
.card > h3 .spacer { flex: 1; }
.card .in { padding: 14px; }
.row { display: flex; gap: 12px; flex-wrap: wrap; }
.col { flex: 1; min-width: 180px; }
label.f { display: block; font-size: 12px; color: var(--muted); margin-bottom: 4px; }
input, select, textarea {
  width: 100%; padding: 7px 9px; border: 1px solid var(--line-strong); border-radius: 6px;
  font-family: inherit; font-size: 13px; background: #fff; color: var(--text);
}
/* v3.99（蔡总 2026-10-12 10:18「创建内部账号弹窗很乱」）：复选框/单选框绝不被 width:100% 拉伸 */
input[type="checkbox"], input[type="radio"] { width: auto; flex: 0 0 auto; padding: 0; }
/* v3.99：.frm 弹窗表单（此前从未定义，标签默认 inline 挤在输入框之间） */
.frm > label { display: block; font-size: 12px; color: var(--muted); margin: 10px 0 4px; }
.frm > label:first-child { margin-top: 0; }
.frm .chk-row { display: flex; align-items: center; gap: 7px; font-size: 13px; padding: 5px 0; cursor: pointer; color: var(--text); }
input:focus, select:focus, textarea:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 2px var(--primary-soft); }
input[readonly] { background: #F5F5FF; color: var(--muted); }
textarea { resize: vertical; min-height: 62px; line-height: 1.5; }

button {
  padding: 7px 14px; border-radius: 6px; border: 1px solid var(--line-strong); background: #fff;
  color: var(--text); font-family: inherit; font-size: 13px; cursor: pointer;
}
button:hover { background: #e8efff; }
button.pri { background: var(--primary); border-color: var(--primary); color: #fff; }
button.pri:hover { background: #0033CC; }
button.dgr { color: var(--danger); border-color: #f0c9c6; }
button.dgr:hover { background: #fdeceb; }
button.sm { padding: 4px 9px; font-size: 12px; }
button:disabled { opacity: .5; cursor: not-allowed; }

table.t { width: 100%; border-collapse: collapse; }
table.t th, table.t td { border-bottom: 1px solid var(--line); padding: 7px 9px; text-align: left; font-size: 12.5px; vertical-align: middle; }
table.t th { background: #F5F5FF; color: var(--muted); font-weight: 600; white-space: nowrap; }
table.t tbody tr:hover { background: #F5F5FF; }
table.t td.r, table.t th.r { text-align: right; }
table.t td.c, table.t th.c { text-align: center; }
.empty { padding: 36px; text-align: center; color: var(--muted); }

.tag { display: inline-block; padding: 1px 7px; border-radius: 10px; font-size: 11px; border: 1px solid var(--line-strong); background: #F5F5FF; color: var(--muted); }
.tag.b { background: var(--primary-soft); color: var(--primary); border-color: #dbe7ff; }
.tag.g { background: #e6f7ed; color: var(--ok); border-color: #c6e6d4; }
.tag.y { background: #fffaf0; color: var(--warn); border-color: #f0dcb4; }
.tag.r { background: #fdeceb; color: var(--danger); border-color: #f0c9c6; }

.kpis { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 12px; margin-bottom: 14px; }
.kpi { background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius); padding: 14px; }
.kpi .n { font-size: 24px; font-weight: 700; letter-spacing: -.5px; }
.kpi .l { font-size: 12px; color: var(--muted); margin-top: 2px; }

/* ---------- 弹窗 ---------- */
.mask { position: fixed; inset: 0; background: rgba(20,28,40,.42); display: flex; align-items: flex-start; justify-content: center; padding: 48px 16px; z-index: 60; overflow: auto; }
.modal { background: var(--panel); border-radius: 10px; width: 100%; max-width: 720px; box-shadow: 0 18px 48px rgba(16,24,40,.22); }
.modal.wide { max-width: 1080px; }
.modal.narrow { max-width: 460px; }
.modal > h3 { margin: 0; padding: 13px 16px; border-bottom: 1px solid var(--line); font-size: 14px; display: flex; align-items: center; }
.modal > h3 .spacer { flex: 1; }
.modal .in { padding: 16px; max-height: 66vh; overflow: auto; }
.modal .bar { padding: 12px 16px; border-top: 1px solid var(--line); display: flex; gap: 8px; justify-content: flex-end; }
.x { border: none; background: none; font-size: 18px; line-height: 1; cursor: pointer; color: var(--muted); padding: 2px 6px; }

.hint { font-size: 11.5px; color: var(--muted); margin-top: 4px; line-height: 1.5; }
.banner { padding: 9px 12px; border-radius: 6px; font-size: 12.5px; margin-bottom: 12px; line-height: 1.6; }
.banner.i { background: var(--primary-soft); color: #0033CC; border: 1px solid #cfe0fa; }
.banner.w { background: #fffaf0; color: #b5730f; border: 1px solid #f0dcb4; }
.banner.e { background: #fdeceb; color: #c8362f; border: 1px solid #f0c9c6; }

.order-items { border: 1px solid var(--line); border-radius: 6px; overflow: auto; }
.order-items table { width: 100%; border-collapse: collapse; min-width: 1100px; }
.order-items th, .order-items td { border-bottom: 1px solid var(--line); padding: 5px 6px; font-size: 12px; text-align: left; }
.order-items th { background: #F5F5FF; color: var(--muted); font-weight: 600; white-space: nowrap; position: sticky; top: 0; z-index: 2; }
.order-items tr.svc { background: #F5F5FF; }
.order-items tr.svc td { color: #33425a; }
.order-items input, .order-items select { padding: 4px 6px; font-size: 12px; }
.order-items .num { text-align: right; }

.totals { display: flex; justify-content: flex-end; gap: 26px; padding: 12px 4px 0; font-size: 13px; }
.totals .k { color: var(--muted); }
.totals .v { font-weight: 600; min-width: 96px; text-align: right; }
.totals .big .v { font-size: 17px; color: var(--primary); }

.split { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
@media (max-width: 900px) { .split { grid-template-columns: 1fr; } }

/* ================= v0.6.0 订单编辑器 / 详情页 视觉重排 ================= */

/* ---------- ① 项目摘要条：一屏最顶部，关键信息一眼看全 ---------- */
.sumbar {
  background: linear-gradient(135deg, #F5F5FF 0%, #F5F5FF 100%);
  border: 1px solid var(--line); border-left: 4px solid var(--primary);
  border-radius: var(--radius); margin-bottom: var(--row-gap);
  padding: var(--sp-4) var(--sp-5); box-shadow: var(--shadow-1);
}
.sumbar-top { display: flex; align-items: flex-start; gap: var(--sp-3); flex-wrap: wrap; }
.sumbar-title { font-size: var(--fs-lg); font-weight: 700; color: var(--ink-1); line-height: 1.4; }
.sumbar-sub { font-size: var(--fs-sm); color: var(--ink-3); margin-top: 3px; line-height: 1.5; }
.sumbar-metrics { display: flex; gap: var(--sp-5); margin-top: var(--sp-3); flex-wrap: wrap; align-items: flex-end; }
.sumbar-m { min-width: 92px; }
.sumbar-m .k { font-size: var(--fs-xs); color: var(--ink-3); margin-bottom: 2px; }
.sumbar-m .v { font-size: var(--fs-xl); font-weight: 700; letter-spacing: -.4px; line-height: 1.2; }
.sumbar-m .v.sm { font-size: var(--fs-lg); }
.sumbar-m .v.ok { color: var(--ok); }
.sumbar-m .v.warn { color: var(--warn); }
.sumbar-m .v.dgr { color: var(--danger); }
.sumbar-m .v.pri { color: var(--primary); }
.sumbar-prog { margin-top: var(--sp-3); padding-top: var(--sp-3); border-top: 1px dashed var(--line); }

/* ---------- ② 分区卡片：浅色标题条 + 统一内边距 ---------- */
.card > h3 {
  margin: 0; padding: 11px var(--card-pad); font-size: var(--fs-md); font-weight: 600;
  border-bottom: 1px solid var(--line); display: flex; align-items: center; gap: var(--sp-2);
  background: #F5F5FF; border-radius: var(--radius) var(--radius) 0 0;
}
.card > h3 .spacer { flex: 1; }
.card > h3 .step {
  display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px;
  border-radius: 5px; background: var(--primary-soft); color: var(--primary);
  font-size: var(--fs-xs); font-weight: 700; flex: 0 0 auto;
}
.card .in { padding: var(--card-pad); }

/* ---------- ③ 描述列表：替代裸 table，行对齐更整齐 ---------- */
.dl { display: grid; grid-template-columns: auto 1fr; gap: 0; }
.dl > dt, .dl > dd {
  padding: 7px var(--card-pad); border-bottom: 1px solid var(--line); margin: 0;
  font-size: var(--fs-sm); line-height: 1.6;
}
.dl > dt { color: var(--ink-3); white-space: nowrap; background: #F5F5FF; }
.dl > dd { color: var(--ink-1); }
.dl > dt:last-of-type, .dl > dd:last-of-type { border-bottom: none; }
.dl dd.money { font-variant-numeric: tabular-nums; font-weight: 600; }
.dl dd.num { text-align: right; font-variant-numeric: tabular-nums; }
.dl.cols2 { grid-template-columns: auto 1fr auto 1fr; }
@media (max-width: 980px) { .dl.cols2 { grid-template-columns: auto 1fr; } }

/* ---------- ④ 金额条：详情页金额区，主次分明 ---------- */
.amt-hero {
  display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-3);
  padding: var(--sp-4) var(--card-pad); background: var(--primary-soft); border-bottom: 1px solid var(--line);
}
.amt-hero .k { font-size: var(--fs-sm); color: #0033CC; }
.amt-hero .v { font-size: 26px; font-weight: 700; color: var(--primary); letter-spacing: -.8px; }
.amt-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); }
.amt-g {
  padding: var(--sp-3) var(--card-pad); border-bottom: 1px solid var(--line); border-right: 1px solid var(--line);
}
.amt-g .k { font-size: var(--fs-xs); color: var(--ink-3); margin-bottom: 3px; }
.amt-g .v { font-size: var(--fs-lg); font-weight: 600; font-variant-numeric: tabular-nums; }
.amt-g .v.ok { color: var(--ok); }
.amt-g .v.warn { color: var(--warn); }
.amt-g .v.dgr { color: var(--danger); }
.amt-note { padding: 10px var(--card-pad); font-size: var(--fs-xs); color: var(--ink-3); background: #F5F5FF; }

/* ---------- ⑤ 表单分组：编辑器里把字段按语义分小标题 ---------- */
.fgrp { margin-bottom: var(--sp-4); }
.fgrp:last-child { margin-bottom: 0; }
.fgrp-t {
  font-size: var(--fs-xs); font-weight: 700; color: var(--ink-3); letter-spacing: .5px;
  margin-bottom: var(--sp-2); padding-bottom: 5px; border-bottom: 1px solid var(--line);
  display: flex; align-items: center; gap: 6px;
}
.fgrp-t::before { content: ''; width: 3px; height: 11px; background: var(--primary); border-radius: 2px; }

/* ---------- ⑥ 表格统一：表头固定、斑马纹、行距更松 ---------- */
table.t { width: 100%; border-collapse: collapse; }
table.t th, table.t td { border-bottom: 1px solid var(--line); padding: 8px 10px; text-align: left; font-size: var(--fs-sm); vertical-align: middle; }
table.t th { background: #F5F5FF; color: var(--ink-3); font-weight: 600; white-space: nowrap; }
table.t tbody tr:nth-child(even) { background: #F5F5FF; }
table.t tbody tr:hover { background: #F5F5FF; }
table.t td.r, table.t th.r { text-align: right; font-variant-numeric: tabular-nums; }
table.t td.c, table.t th.c { text-align: center; }
table.t thead.sticky th { position: sticky; top: 0; z-index: 3; box-shadow: inset 0 -1px 0 var(--line); }
.empty { padding: 36px; text-align: center; color: var(--ink-3); }

/* ---------- ⑦ 折叠区：标题条更克制，展开后与卡片连成一体 ---------- */
.foldcard {
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius);
  margin-bottom: var(--row-gap); overflow: hidden; box-shadow: var(--shadow-1);
}
.foldcard > summary {
  list-style: none; cursor: pointer; padding: 11px var(--card-pad); display: flex; align-items: center; gap: var(--sp-2);
  font-size: var(--fs-md); background: #F5F5FF;
}
.foldcard > summary::-webkit-details-marker { display: none; }
.foldcard > summary::before { content: '▸'; color: var(--ink-4); font-size: var(--fs-xs); }
.foldcard[open] > summary { border-bottom: 1px solid var(--line); }
.foldcard[open] > summary::before { content: '▾'; }
.foldcard > summary b { font-size: var(--fs-md); font-weight: 600; }
.foldcard > .in { padding: var(--card-pad); }

/* 主卡片：加一点极淡阴影，避免整页糊成一片 */
.card { background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius); margin-bottom: var(--row-gap); box-shadow: var(--shadow-1); }
.card.plain { box-shadow: none; }

/* ================= v0.6.0/0.6.1 工作台看板 · 项目卡片网格 =================
   v0.6.1：一行两列（更宽更好读）；卡片主题改为「进度 + 状态 + 重要级别」，
   金额与收款收进可折叠区，需要时再展开。
   v2.6（蔡总定案）：一行 3 列（电脑端）/ 手机端 1 列；卡片支持展开查看详情。 */
.pcard-grid {
  display: grid; gap: 10px; padding: 12px 14px 4px;
  grid-template-columns: repeat(3, minmax(0, 1fr));
}
@media (max-width: 1400px) { .pcard-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 900px) { .pcard-grid { grid-template-columns: 1fr; padding: 10px 10px 4px; } }
.grp-foot { padding: 4px 14px 12px; }

.pcard {
  border: 1px solid var(--line); border-radius: 8px; background: #fff;
  padding: 10px 12px 8px; display: flex; flex-direction: column; gap: 6px;
  transition: box-shadow .15s, border-color .15s;
}
.pcard:hover { border-color: #dbe7ff; box-shadow: var(--shadow-2); }
.pcard.due { border-color: #f0dcb4; background: #fffaf0; }
.pcard.term { opacity: .62; background: #F5F5FF; }
.pcard.alldone { border-left: 3px solid var(--ok); }

/* ① 项目名 + 进度徽标 */
.pc-top { display: flex; align-items: flex-start; gap: 8px; }
/* v3.44：项目名 + 4 节点进度（进度挪到名字后面，一眼看到卡在哪个节点） */
.pc-titlewrap { flex: 1; min-width: 0; display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.pc-title {
  min-width: 0; font-size: var(--fs-md); font-weight: 700; color: var(--ink-1); line-height: 1.35;
  overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
}
.pc-prog-inline { flex: 0 0 auto; }
.pc-prog-inline .ps { height: 20px; padding: 0 7px; font-size: 10.5px; border-radius: 9px; flex: 0 0 auto; }
.pc-prog-inline .ps .psn { max-width: 56px; }
/* 已归档 / 已终止：进度只读（小圆片） */
.psmini {
  font-size: 10.5px; padding: 1px 7px; border-radius: 9px; line-height: 1.6;
  border: 1px solid var(--line); background: #F5F5FF; color: var(--ink-4);
}
.psmini.done { background: #e6f7ed; border-color: #c6e6d4; color: #1a8a52; font-weight: 600; }
.pc-progtag {
  flex: 0 0 auto; font-size: var(--fs-xs); font-weight: 700; font-variant-numeric: tabular-nums;
  color: var(--primary); background: var(--primary-soft); border-radius: 10px; padding: 1px 8px; line-height: 1.6;
}
.pc-progtag.ok { color: #fff; background: var(--ok); }

/* v3.44：服务项目清单（M1–M9）；外派白子兔标红 */
.pc-svc { display: flex; align-items: center; gap: 5px; flex-wrap: wrap; margin-top: 2px; }
.svc-chip {
  font-size: 11px; font-weight: 700; letter-spacing: .3px; border-radius: 5px; padding: 1px 7px; line-height: 1.7;
  border: 1px solid #dbe7ff; background: #F5F5FF; color: #0033CC; font-variant-numeric: tabular-nums;
}
.svc-chip.out { border-color: #f0c9c6; background: #fdeceb; color: #c8362f; }
.svc-out-dot { display: inline-block; width: 5px; height: 5px; border-radius: 50%; background: #c8362f; margin-left: 4px; vertical-align: middle; }
.svc-none { font-size: 11px; color: var(--ink-4); }
.pc-date { font-size: var(--fs-xs); color: var(--ink-4); }

/* ② 状态行：项目状态（就地改）+ 重要级别 */
.pc-state { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.pc-status {
  width: auto; min-width: 118px; padding: 2px 6px; font-size: var(--fs-sm); line-height: 1.6; font-weight: 600;
  border-radius: 5px; border: 1px solid var(--line); background: #F5F5FF; color: var(--ink-2);
}
.pc-status:focus { border-color: var(--primary); }
.pc-status.serving { background: #F5F5FF; border-color: #dbe7ff; color: #0033CC; }
.pc-status.pending { background: #fffaf0; border-color: #f0dcb4; color: #b5730f; }
.pc-status.done { background: #F5F5FF; border-color: var(--line); color: var(--ink-3); }
.pc-imp {
  font-size: var(--fs-xs); padding: 1px 7px; border-radius: 10px;
  border: 1px solid var(--line); background: #F5F5FF; color: var(--ink-3);
}
.pc-imp.hi { background: #fdeceb; border-color: #f0c9c6; color: var(--danger); font-weight: 600; }
.pc-imp.md { background: #fffaf0; border-color: #f0dcb4; color: var(--warn); font-weight: 600; }
.pc-imp.lo { color: var(--ink-4); background: #F5F5FF; }

.pc-meta { font-size: var(--fs-xs); color: var(--ink-4); line-height: 1.5; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.pc-due { color: var(--danger); font-weight: 600; }

/* ③ 进度条：5 段色块连成一条，颜色即状态，整条可点 */
.psbar { display: flex; gap: 3px; }
.ps {
  flex: 1 1 0; min-width: 0; height: 28px; padding: 0 2px; border-radius: 5px;
  border: 1px solid var(--line); background: #F5F5FF; color: var(--ink-4);
  font-size: 11px; line-height: 1; cursor: pointer; overflow: hidden;
  display: flex; align-items: center; justify-content: center;
  transition: background .12s, color .12s, border-color .12s;
}
.ps .psn { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ps:hover { border-color: var(--primary); color: var(--primary); background: var(--primary-soft); }
.ps.done { background: var(--ok); border-color: var(--ok); color: #fff; font-weight: 600; }
.ps.done:hover { background: #1a8a52; border-color: #1a8a52; color: #fff; }
.ps.next { background: #fff; border-color: var(--primary); color: var(--primary); font-weight: 700;
  box-shadow: inset 0 0 0 1px var(--primary-soft); }
.ps.next:hover { background: var(--primary); color: #fff; }
.ps:disabled { opacity: .5; cursor: progress; }

.pc-progmeta { display: flex; align-items: center; font-size: var(--fs-xs); color: var(--ink-4); margin-top: 3px; }
.pc-progmeta .spacer { flex: 1; }
.pc-next { color: var(--ink-2); }
.pc-next b { color: var(--primary); }
.pc-next.done { color: var(--ok); font-weight: 600; }

/* ④ 折叠区：金额 / 收款（次要信息，默认收起） */
.pc-money { border-top: 1px dashed var(--line); }
.pc-money > summary {
  list-style: none; cursor: pointer; display: flex; align-items: center; gap: 8px;
  padding: 5px 0 1px; font-size: var(--fs-xs); color: var(--ink-4);
}
.pc-money > summary::-webkit-details-marker { display: none; }
.pcm-l { color: var(--ink-4); }
.pcm-v { font-weight: 700; color: var(--ink-2); font-variant-numeric: tabular-nums; }
.pcm-v.dgr { color: var(--ink-4); font-weight: 600; }
.pcm-warn { color: var(--warn); font-weight: 600; }
.pcm-ok { color: var(--ok); }
.pcm-caret { margin-left: auto; color: var(--ink-4); transition: transform .15s; }
.pc-money[open] .pcm-caret { transform: rotate(180deg); }
.pcm-body { padding-top: 8px; }
.pcm-pay { margin-top: 8px; padding-top: 7px; border-top: 1px dashed var(--line); }

/* 金额三数：收 / 待收 / 净利 */
.pc-nums { display: grid; grid-template-columns: repeat(3, 1fr); gap: 4px; }
.pc-n { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.pc-n .k { font-size: var(--fs-xs); color: var(--ink-4); }
.pc-n b { font-size: var(--fs-sm); font-weight: 700; font-variant-numeric: tabular-nums;
  color: var(--ink-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pc-n b.ok { color: var(--ok); }
.pc-n b.warn { color: var(--warn); }
.pc-n b.dgr { color: var(--danger); }

/* ⑤ 底部：详情 / 跟进 */
.pc-foot { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }
.pc-foot .spacer { flex: 1; }
.pc-foot .payq { margin-top: 0; }
.pc-foot .payq .sm { padding: 3px 7px; font-size: var(--fs-xs); }
.pc-foot > .sm { padding: 3px 9px; font-size: var(--fs-xs); }

/* ================= v2.6 看板卡片：三态配色 + 展开详情 =================
   颜色即状态：潜在=琥珀黄 / 服务进行=蓝 / 服务结束=绿 / 项目终止=红 */
.pcard.st-pending  { border-left: 3px solid #b5730f; background: #fffaf0; }
.pcard.st-serving  { border-left: 3px solid #0033CC; }
.pcard.st-done     { border-left: 3px solid #1a8a52; background: #e6f7ed; }
.pcard.st-terminated { border-left: 3px solid #c8362f; background: #fdeceb; }

/* 卡片状态徽标（文字+颜色，一眼分清） */
.pc-stbadge {
  font-size: var(--fs-xs); font-weight: 700; border-radius: 10px; padding: 1px 8px; line-height: 1.7;
  white-space: nowrap; border: 1px solid transparent;
}
.pc-stbadge.pending { background: #fffaf0; border-color: #f0dcb4; color: #b5730f; }
.pc-stbadge.serving { background: #e8efff; border-color: #dbe7ff; color: #0033CC; }
.pc-stbadge.done { background: #e6f7ed; border-color: #c6e6d4; color: #1a8a52; }
.pc-stbadge.terminated { background: #fdeceb; border-color: #f0c9c6; color: #c8362f; }

/* 用时 / 开始结束时间 徽标 */
.pc-days {
  font-size: var(--fs-xs); color: #3d4757; background: #F5F5FF; border-radius: 8px;
  padding: 0 6px; line-height: 1.7; white-space: nowrap; font-variant-numeric: tabular-nums;
}
.pc-addr { font-size: var(--fs-xs); color: var(--ink-4); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* 展开详情区（点卡片「展开」按钮或卡片空白处） */
.pc-exp { display: none; border-top: 1px dashed var(--line); margin-top: 2px; padding-top: 8px; }
.pcard.expanded .pc-exp { display: block; }
.pc-exp-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 4px 10px; }
.pc-exp-grid .k { font-size: var(--fs-xs); color: var(--ink-4); }
.pc-exp-grid .v { font-size: var(--fs-sm); color: var(--ink-2); word-break: break-all; }
.pc-exp-full { grid-column: 1 / -1; }
.pc-exp-reason {
  grid-column: 1 / -1; background: #fdeceb; border: 1px solid #f0c9c6; border-radius: 6px;
  padding: 5px 8px; font-size: var(--fs-xs); color: #c8362f; line-height: 1.6;
}
.pc-exp-pend {
  grid-column: 1 / -1; background: #fffaf0; border: 1px solid #f0dcb4; border-radius: 6px;
  padding: 5px 8px; font-size: var(--fs-xs); color: #b5730f; line-height: 1.6;
}
.pc-carets { font-size: 10px; color: var(--ink-4); }

/* 归档区年份筛选 */
.arch-years { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; padding: 8px 14px 0; }
.arch-years .lab { font-size: var(--fs-xs); color: var(--ink-4); }
.arch-years button { border: 1px solid var(--line-strong); background: #fff; color: #33405a;
  border-radius: 12px; padding: 3px 10px; font-size: var(--fs-xs); cursor: pointer; }
.arch-years button.on { border-color: #0033CC; background: #e8efff; color: #0033CC; font-weight: 700; }

/* ================= v2.6 新建订单 · 第一步「项目建档」页 =================
   右下角固定动作条：取消 / 仅保存为潜在订单 / 下一步 → 工作制单 */
.build-foot {
  position: sticky; bottom: 0; z-index: 12;
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 12px 16px; margin: 12px -2px -2px;
  background: linear-gradient(180deg, rgba(255,255,255,.86), #fff 42%);
  border-top: 1px solid var(--line); border-radius: 0 0 10px 10px;
  backdrop-filter: blur(6px);
}
.build-foot .sm, .build-foot .pri { padding: 8px 16px; font-size: var(--fs-md); }
.build-foot #bfNext { font-weight: 700; }
@media (max-width: 640px) {
  .build-foot { position: fixed; left: 0; right: 0; bottom: 0; border-radius: 0; margin: 0; padding: 10px 12px;
    box-shadow: 0 -6px 18px rgba(20,32,58,.08); }
  .build-foot #bfTip { display: none; }
  .build-foot .sm, .build-foot .pri { flex: 1 1 auto; }
}

/* 结束 / 终止 表单里的必选项 */
.settle-box { background: #e6f7ed; border: 1px solid #c6e6d4; border-radius: 8px; padding: 10px 12px; margin: 4px 0; }
.settle-box.term { background: #fdeceb; border-color: #f0c9c6; }
.settle-chk { display: flex; align-items: center; gap: 8px; font-size: var(--fs-sm); font-weight: 600; color: #1a8a52; }
.settle-chk input[type=checkbox] { width: 16px; height: 16px; accent-color: #1a8a52; }
.settle-chk.danger { color: #c8362f; }
.settle-chk.danger input[type=checkbox] { accent-color: #c8362f; }
.pend-chk { display: inline-flex; align-items: center; gap: 5px; font-size: var(--fs-xs); color: #b5730f;
  background: #fffaf0; border: 1px solid #f0dcb4; border-radius: 12px; padding: 2px 9px; cursor: pointer; white-space: nowrap; }
.pend-chk input[type=checkbox] { width: 13px; height: 13px; accent-color: #b5730f; }
.fgrp-t .pend-chk { margin-left: 8px; font-weight: 400; }

/* 派单预览：供应商卡片（替代裸 div 内联样式） */
.supcard { border: 1px solid var(--line); border-radius: 8px; overflow: hidden; margin-bottom: 12px; background: #fff; }
.supcard:last-of-type { margin-bottom: 8px; }
.supcard-h { display: flex; align-items: center; gap: 8px; padding: 9px var(--card-pad); background: #F5F5FF; border-bottom: 1px solid var(--line); flex-wrap: wrap; }
.supcard-h b { font-size: var(--fs-md); color: var(--ink-1); }

/* 编辑器内明细表：卡片里收紧上下留白，让表格贴住标题条 */
.card > .in > .order-items { border: 1px solid var(--line); border-radius: 6px; overflow: auto; }
.card .in[style*="padding:0 12px 12px"] { padding: 0 12px 12px !important; }
/* ===== v3.37 制单页分区折叠（蔡总 2026-10-08）：第 1 块常显，其余「没填信息的」默认收起、有内容自动展开 ===== */
.card.collapsible > h3 { cursor: pointer; user-select: none; }
.card.collapsible > h3 .fold-caret { color: var(--muted); font-size: 11px; transition: transform .15s; display: inline-block; }
.card.collapsible.collapsed > h3 .fold-caret { transform: rotate(-90deg); }
.card.collapsible.collapsed > h3 { border-bottom: none; }
.card.collapsible.collapsed > h3 .step { opacity: .5; }
.card.collapsible.collapsed > .in { display: none; }

ol.flow { margin: 0; padding-left: 18px; line-height: 1.9; font-size: 12.5px; }
code.k { background: #e8efff; padding: 1px 5px; border-radius: 4px; font-size: 12px; }

/* ---------- 工作台 · 财务主数字（营业额大字 + 其余折叠） ---------- */
.hero-fin {
  background: var(--panel); border: 1px solid var(--line); border-left: 4px solid var(--primary);
  border-radius: var(--radius); margin-bottom: var(--row-gap); box-shadow: var(--shadow-1); overflow: hidden;
}
.hf-main { padding: var(--sp-4) var(--sp-5) 12px; }
.hf-k { font-size: var(--fs-sm); color: var(--ink-3); }
.hf-k .hf-sub { font-size: var(--fs-xs); color: var(--ink-4); }
.hf-v { font-size: 30px; font-weight: 700; color: var(--primary); letter-spacing: -.8px; line-height: 1.25; font-variant-numeric: tabular-nums; }
.hf-more { border-top: 1px dashed var(--line); }
.hf-more > summary {
  list-style: none; cursor: pointer; padding: 8px var(--sp-5); font-size: var(--fs-sm); color: var(--ink-3);
  display: flex; align-items: center; gap: 6px; background: #F5F5FF;
}
.hf-more > summary::-webkit-details-marker { display: none; }
.hf-more > summary:hover { background: #F5F5FF; color: var(--primary); }
.hf-more-t { font-weight: 600; }
.hf-caret { transition: transform .15s; }
.hf-more[open] .hf-caret { transform: rotate(180deg); }
.hf-grid { display: grid; grid-template-columns: repeat(3, 1fr); border-top: 1px solid var(--line); }
.hf-g { padding: 12px var(--sp-5); border-right: 1px solid var(--line); }
.hf-g:last-child { border-right: none; }
.hf-g .k { font-size: var(--fs-xs); color: var(--ink-3); margin-bottom: 2px; }
.hf-g .v { font-size: var(--fs-xl); font-weight: 700; font-variant-numeric: tabular-nums; }
.hf-g .v.ok { color: var(--ok); }
.hf-g .v.warn { color: var(--warn); }
.hf-g .v.dgr { color: var(--danger); }

/* ---------- 工作台 · 指标卡 ---------- */
.kpis.small { grid-template-columns: repeat(auto-fit, minmax(132px, 1fr)); }
.kpis.fin { grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); }
.kpi .n2 { font-size: 18px; font-weight: 700; margin-top: 4px; letter-spacing: -.3px; }
.kpi.hot { border-color: #f0c9c6; background: #fdeceb; }
.kpi.warm { border-color: #f0dcb4; background: #fffaf0; }
/* 询价 / 跟进中：弱化成灰调，与「已成交」的实数字区分开，避免被当成营业额 */
.kpi.plain-inq { background: #F5F5FF; border-style: dashed; }
.kpi .hint { margin-top: 2px; }

/* ---------- 项目看板 ---------- */
.scrollx { overflow-x: auto; }
table.kanban { width: 100%; border-collapse: collapse; min-width: 1400px; }
table.kanban th, table.kanban td { border-bottom: 1px solid var(--line); padding: 7px 8px; font-size: 12px; vertical-align: top; text-align: left; }
table.kanban th { background: #F5F5FF; color: var(--muted); font-weight: 600; white-space: nowrap; position: sticky; top: 0; z-index: 2; }
table.kanban td.r, table.kanban th.r { text-align: right; }
table.kanban td.c, table.kanban th.c { text-align: center; }
table.kanban tbody tr:hover { background: #F5F5FF; }
table.kanban tr.due { background: #fffaf0; }
table.kanban tr.due:hover { background: #fffaf0; }
table.kanban tr.term { opacity: .55; }
table.kanban tfoot td { background: #F5F5FF; font-weight: 600; border-top: 2px solid var(--line-strong); }
.cellclip { max-width: 150px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--muted); }
.dotc { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 6px; vertical-align: middle; }

/* ---------- 看板：按项目状态分组 ---------- */
.grp-bar { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin: 0 0 12px; }
.grp-chip { border: 1px solid var(--line-strong); background: #fff; color: #33405a; border-radius: 16px;
  padding: 5px 12px; font-size: 12px; cursor: pointer; transition: all .15s; }
.grp-chip:hover { border-color: var(--primary); color: var(--primary); }
.grp-chip b { font-weight: 700; margin-left: 3px; }
.grp-chip.pending { border-color: #b5730f; background: #fffaf0; color: #b5730f; }
.grp-chip.serving { border-color: #0033CC; background: #F5F5FF; color: #0033CC; }
.grp-chip.closing { border-color: #b5730f; background: #fffaf0; color: #b5730f; }
.grp-chip.done { border-color: #1a8a52; background: #e6f7ed; color: #1a8a52; }
.grp-chip.terminated { border-color: #c8362f; background: #fdeceb; color: #c8362f; }
.grp-chip.archive { border-color: var(--line); background: #f7f8fa; color: var(--muted); }

/* 视图切换（只看在办 / 含历史归档） */
.grp-view { display: inline-flex; gap: 0; border: 1px solid var(--line-strong); border-radius: 8px; overflow: hidden; }
.grp-view .sm { border: none; border-radius: 0; padding: 6px 14px; background: #fff; }
.grp-view .sm.pri { background: var(--primary); color: #fff; }
.grp-view .sm:first-child { border-right: 1px solid var(--line); }

/* 归档分组：年份归档用蓝色系，与在办的黄 / 蓝 / 橙区分开 */
.grp.archive { border-left: 4px solid #8a96a8; }
.grp.archive .grp-head { background: #F5F5FF; }
.grp.archive .grp-n { background: #8a96a8; }
.grp.archive .grp-name { color: #3d4757; }


.grp { border: 1px solid var(--line); border-radius: 8px; margin-bottom: 12px; overflow: hidden; background: #fff; }
.grp-head { display: flex; align-items: center; gap: 10px; padding: 10px 14px; cursor: pointer;
  background: #F5F5FF; border-bottom: 1px solid transparent; user-select: none; }
.grp.open .grp-head { border-bottom-color: var(--line); }
.grp-head:hover { background: #e8efff; }
.grp-caret { color: var(--muted); font-size: 12px; width: 12px; }
.grp-name { font-weight: 700; font-size: 13px; color: #22314d; white-space: nowrap; }
.grp-n { font-size: 12px; color: #fff; background: #8a96a8; border-radius: 10px; padding: 1px 9px; white-space: nowrap; }
.grp-desc { font-size: 12px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.grp-sum { font-size: 12px; color: #3d4757; white-space: nowrap; }
.grp-sum b { color: #22314d; }
.grp-sum b.warn { color: #b5730f; }

/* 分组主题色：左侧色条 + 标题栏底色 + 数字徽标 */
.grp.pending  { border-left: 4px solid #b5730f; }
.grp.pending  .grp-head { background: #fffaf0; }
.grp.pending  .grp-n { background: #b5730f; }
.grp.serving  { border-left: 4px solid #0033CC; }
.grp.serving  .grp-head { background: #F5F5FF; }
.grp.serving  .grp-n { background: #0033CC; }
.grp.closing  { border-left: 4px solid #b5730f; }
.grp.closing  .grp-head { background: #fffaf0; }
.grp.closing  .grp-n { background: #b5730f; }
.grp.done     { border-left: 4px solid #1a8a52; }
.grp.done     .grp-head { background: #e6f7ed; }
.grp.done     .grp-n { background: #1a8a52; }
.grp.terminated { border-left: 4px solid #c8362f; }
.grp.terminated .grp-head { background: #fdeceb; }
.grp.terminated .grp-n { background: #c8362f; }

.grp .grp-body { display: none; }
.grp.open .grp-body { display: block; }

/* 阶段节点方格（订单详情里用） */
.stages { display: flex; flex-wrap: wrap; gap: 4px; }
.stg {
  display: inline-block; padding: 2px 7px; border-radius: 4px; font-size: 11px; cursor: pointer;
  border: 1px solid var(--line-strong); background: #fff; color: var(--muted); white-space: nowrap; user-select: none;
}
.stg:hover { border-color: var(--primary); color: var(--primary); }
.stg.ok { background: #e6f7ed; border-color: #c6e6d4; color: #1a8a52; font-weight: 600; }
.stg.run { background: var(--primary-soft); border-color: #dbe7ff; color: var(--primary); }
.stg.na { background: #f4f5f7; border-color: #dbe7ff; color: #a3abb8; text-decoration: line-through; }
.stages.big .stg { padding: 5px 10px; font-size: 12px; }

/* ---------- 工作台「项目进度」一键点选（v0.5.9） ---------- */
.milestones { display: flex; align-items: center; gap: 0; flex-wrap: wrap; }
.ms {
  display: inline-flex; align-items: center; gap: 5px; padding: 3px 7px; border: none; background: none;
  cursor: pointer; border-radius: 6px; color: var(--muted); font-size: 12px; white-space: nowrap;
}
.ms:hover { background: var(--primary-soft); color: var(--primary); }
.ms .msd {
  width: 14px; height: 14px; border-radius: 50%; border: 2px solid var(--line-strong);
  background: #fff; flex: 0 0 auto; position: relative;
}
.ms.done { color: var(--ok); font-weight: 600; }
.ms.done .msd { border-color: var(--ok); background: var(--ok); }
.ms.done .msd::after {
  content: '✓'; position: absolute; left: 0; top: -2px; width: 100%; text-align: center;
  color: #fff; font-size: 10px; line-height: 16px;
}
.ms.next { color: var(--primary); font-weight: 600; }
.ms.next .msd { border-color: var(--primary); box-shadow: 0 0 0 3px var(--primary-soft); }
.ms:disabled { opacity: .5; cursor: progress; }
.msline { width: 16px; height: 2px; background: var(--line); flex: 0 0 auto; }
.ms.big { padding: 6px 12px; font-size: 13px; }
.ms.big .msd { width: 17px; height: 17px; }
.ms.big .msd::after { font-size: 12px; line-height: 18px; top: -2px; }
.milestones.big { gap: 2px; }

/* 第 4 列：下一步 + 收款快捷切换 */
.nx { font-size: 12px; color: #3d4757; line-height: 1.5; }
.nx b { color: #22314d; }
.payq { display: flex; gap: 4px; margin-top: 6px; flex-wrap: wrap; }
.payq .sm { padding: 2px 7px; font-size: 11.5px; }
.cellsel { padding: 3px 6px; font-size: 12px; }

/* ---------- 项目阶段（5 大阶段 + 可开关子项） ---------- */
.stagebox { border: 1px solid var(--line); border-radius: 8px; margin-bottom: 8px; background: #fff; overflow: hidden; }
.stagebox > summary { list-style: none; cursor: pointer; padding: 8px 10px; display: flex; align-items: center; gap: 8px; background: #F5F5FF; }
.stagebox > summary::-webkit-details-marker { display: none; }
.stagebox > summary::before { content: '▸'; color: var(--muted); font-size: 11px; }
.stagebox[open] > summary::before { content: '▾'; }
.stagebox > summary b { font-size: 12.5px; }
.subwrap { padding: 6px 10px 10px 26px; display: flex; flex-direction: column; gap: 6px; }
.subrow { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; font-size: 12px; }
.subrow.off { opacity: .55; }
.subrow .subl { min-width: 84px; color: #3d4757; }
.subrow .sw { display: inline-flex; align-items: center; gap: 5px; font-size: 12px; color: var(--muted); min-width: 158px; }
.subrow .sw input[type="checkbox"] { width: auto; }
.subrow button.sm { padding: 3px 9px; font-size: 11.5px; }

/* ---------- 下拉：预设档案 / 自定义手动输入 ---------- */
.cs select, .cs input { width: 100%; }
.cs input { margin-top: 6px; }

/* ---------- 日程表 ---------- */
/* 日历自适应：不写死像素宽高，跟随父容器与窗口尺寸自动伸缩；格子内日程过多时局部滚动 */
.calwrap { padding: 10px 12px 14px; display: flex; flex-direction: column;
  height: calc(100vh - 52px - 56px); min-height: 360px; }
.calhead { display: grid; grid-template-columns: repeat(7, 1fr); gap: 6px; margin-bottom: 6px; flex: 0 0 auto; }
.calcell-head { text-align: center; font-size: 12px; color: var(--muted); padding: 4px 0; background: #F5F5FF; border-radius: 6px; }
.calgrid { display: grid; grid-template-columns: repeat(7, 1fr); grid-auto-rows: minmax(64px, 1fr); gap: 6px;
  flex: 1 1 auto; min-height: 0; }
/* v4.49：月历响应式 —— 平板(≤1024)按钮打开按 7 列保留但允许横向滚动；手机(≤720)降为 7 列滚动条。 */
@media (max-width: 1024px) { .calgrid { overflow-x: auto; grid-template-columns: repeat(7, minmax(82px, 1fr)); } }
@media (max-width: 720px) { .calgrid { grid-template-columns: repeat(7, minmax(64px, 1fr)); grid-auto-rows: minmax(54px, 1fr); } }
.calcell { min-height: 0; overflow: hidden; border: 1px solid var(--line); border-radius: 8px; padding: 6px; background: #fff; display: flex; flex-direction: column; }
.calcell.out { background: #F5F5FF; opacity: .7; }
.calcell.today { border-color: var(--primary); box-shadow: 0 0 0 2px var(--primary-soft); }
.caldate { display: flex; align-items: center; justify-content: space-between; font-size: 12px; font-weight: 600; color: var(--text); margin-bottom: 4px; flex: 0 0 auto; }
.calcell.today .caldate { color: var(--primary); }
.caladd { border: none; background: #e8efff; width: 18px; height: 18px; line-height: 1; border-radius: 4px; font-size: 12px; color: var(--muted); padding: 0; }
.caladd:hover { background: var(--primary); color: #fff; }
.calitems { display: flex; flex-direction: column; gap: 3px; overflow-y: auto; flex: 1 1 auto; min-height: 0; }
.calitem { border-left: 3px solid #98a2b3; background: #F5F5FF; border-radius: 4px; padding: 3px 5px; font-size: 11.5px; line-height: 1.35; cursor: pointer; }
.calitem:hover { background: #e8efff; }
.calitem .ct { display: block; font-size: 10px; color: var(--muted); }
.calitem.done { text-decoration: line-through; color: #a3abb8; background: #f4f5f7; }
.calitem .lk { display: inline-block; margin-left: 4px; font-size: 10px; color: var(--primary); border: 1px solid #dbe7ff; border-radius: 3px; padding: 0 3px; }
.legend { display: flex; flex-wrap: wrap; gap: 14px; flex: 0 0 auto; }
.legend .lg { font-size: 12px; color: var(--muted); display: inline-flex; align-items: center; gap: 5px; }
.legend .lg i { width: 10px; height: 10px; border-radius: 2px; display: inline-block; }

/* ---------- 订单编辑器：低频信息折叠区 ---------- */
.foldcard {
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius); margin-bottom: 14px;
}
.foldcard > summary {
  list-style: none; cursor: pointer; padding: 11px 14px; display: flex; align-items: center; gap: 8px;
  font-size: 13px; background: #F5F5FF; border-radius: var(--radius);
}
.foldcard > summary::-webkit-details-marker { display: none; }
.foldcard > summary::before { content: '▸'; color: var(--muted); font-size: 11px; }
.foldcard[open] > summary { border-bottom: 1px solid var(--line); border-radius: var(--radius) var(--radius) 0 0; }
.foldcard[open] > summary::before { content: '▾'; }
.foldcard > summary b { font-size: 13px; }

/* ---------- 选品弹窗：分类页签 + 网格图库 ---------- */
.picker { display: flex; flex-direction: column; gap: 10px; }
.picker-bar { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
.picker-tabs { display: flex; gap: 6px; flex-wrap: wrap; flex: 1; }
.pk-tab { border: 1px solid var(--line); background: #fff; border-radius: 999px; padding: 5px 13px; font-size: 12.5px; cursor: pointer; color: #3d4757; display: inline-flex; align-items: center; gap: 6px; }
.pk-tab:hover { border-color: var(--primary); color: var(--primary); }
.pk-tab.on { background: var(--primary); border-color: var(--primary); color: #fff; font-weight: 600; }
.pk-tab .n { font-size: 11px; opacity: .72; }
.picker-search { width: 240px; }
.picker-search input { width: 100%; }
.picker-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(158px, 1fr)); gap: 10px; max-height: 58vh; overflow: auto; padding: 2px; }
.pk-card { border: 1px solid var(--line); border-radius: 8px; background: #fff; cursor: pointer; overflow: hidden; display: flex; flex-direction: column; transition: box-shadow .12s, border-color .12s, transform .12s; position: relative; }
.pk-card:hover { border-color: var(--primary); box-shadow: 0 6px 16px rgba(30,99,216,.16); transform: translateY(-1px); }
.pk-img { height: 104px; display: flex; align-items: center; justify-content: center; background: #F5F5FF; border-bottom: 1px solid var(--line); position: relative; }
.pk-img img { max-width: 92%; max-height: 92px; object-fit: contain; }
.pk-img .noimg { color: var(--muted); font-size: 11.5px; }
.pk-info { padding: 7px 9px 4px; flex: 1; }
.pk-name { font-size: 12.5px; font-weight: 600; color: #1b2330; line-height: 1.35; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; min-height: 34px; }
.pk-code { font-size: 11px; color: var(--muted); margin-top: 2px; }
.pk-sub { font-size: 11px; color: #6b7688; margin-top: 2px; height: 15px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
/* v3.67（蔡总 2026-10-10）：第二行规格 —— 芯片品牌 · 驱动电源（没填就不渲染这一行） */
.pk-sub2 { font-size: 11px; color: #0033CC; margin-top: 2px; height: 15px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
.pk-price { font-size: 12.5px; font-weight: 600; color: #b5730f; margin-top: 4px; }
/* v3.68：选品弹窗按系列分组（系列卡头 + 型号网格） */
.picker-grid.grouped { display: block; }
.pk-grid-inner { display: grid; grid-template-columns: repeat(auto-fill, minmax(158px, 1fr)); gap: 10px; padding: 2px; }
.pk-series { margin-bottom: 12px; }
.pk-series-hd { font-size: 12.5px; font-weight: 700; color: #0033CC; background: #F5F5FF; border: 1px solid #dbe7ff; border-radius: 8px; padding: 5px 10px; margin-bottom: 8px; }
.pk-series-hd .n { font-weight: 500; color: #6b7688; font-size: 11.5px; margin-left: 6px; }
.pk-optn { margin-left: 6px; font-size: 10.5px; color: #1a8a52; background: #e6f7ed; border-radius: 20px; padding: 1px 7px; font-weight: 600; }
/* 配装选择器 */
.combo-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 10px; }
.combo-card { border: 1px solid var(--line); border-radius: 10px; padding: 12px; cursor: pointer; background: #fff; transition: border-color .12s, box-shadow .12s, transform .12s; }
.combo-card:hover { border-color: var(--primary); box-shadow: 0 6px 16px rgba(30,99,216,.16); transform: translateY(-1px); }
.combo-nm { font-size: 14px; font-weight: 700; color: #1b2330; }
.combo-pr { font-size: 12.5px; color: #b5730f; margin-top: 6px; }
.combo-pr b { color: #c8362f; }
.combo-tip { font-size: 11px; color: var(--muted); margin-top: 6px; }
.pk-card .pk-img .cert-3c { position: absolute; top: 5px; right: 5px; z-index: 2; }
/* v3.68：配装标签（客户单 / 订单行显示「什么芯片 + 什么电源」） */
.opt-tag { display: inline-block; margin-left: 6px; font-size: 11px; color: #1a8a52; background: #e6f7ed; border: 1px solid #c6e6d4; border-radius: 20px; padding: 1px 8px; vertical-align: middle; white-space: nowrap; }
/* v3.68：资料库（引用选择器 / 类型页签计数） */
.lib-bar .sm .n { font-size: 11px; opacity: .6; margin-left: 4px; }
.ap-grid { border: 1px solid var(--line); border-radius: 10px; padding: 6px; background: #fff; }
.ap-row { display: flex; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 8px; cursor: pointer; }
.ap-row:hover { background: var(--primary-soft); }
.ap-row input[type=checkbox] { width: 16px; height: 16px; flex: 0 0 auto; }
.ap-ttl { flex: 1 1 auto; min-width: 0; font-size: 13px; color: #1b2330; font-weight: 600; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
.ap-ref { flex: 0 0 auto; font-size: 11px; color: #8a96a8; }
.pk-add { background: var(--primary-soft); color: #0033CC; text-align: center; font-size: 11.5px; padding: 5px 0; border-top: 1px solid var(--line); }
.pk-card:hover .pk-add { background: var(--primary); color: #fff; }
/* ---------- 选品弹窗：常用产品快选区 ---------- */
.picker-foot { font-size: 11.5px; color: var(--muted); }
.picker-fav { border: 1px solid #f0dcb4; background: #fffaf0; border-radius: 8px; padding: 8px 10px; }
.picker-fav:empty { display: none; }
.fav-head { font-size: 12px; font-weight: 700; color: #b5730f; margin-bottom: 6px; }
.fav-head .hint { font-weight: 400; color: var(--muted); }
.fav-empty { font-size: 12px; color: #b5730f; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.fav-row { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 8px; }
.fav-card { position: relative; border: 1px solid #f0dcb4; background: #fff; border-radius: 7px; padding: 7px 9px; cursor: pointer; transition: all .12s; }
.fav-card:hover { border-color: var(--primary); box-shadow: 0 4px 12px rgba(30,99,216,.15); }
.fav-name { font-size: 12px; font-weight: 600; color: #22314d; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding-right: 16px; }
.fav-code { font-size: 11px; color: var(--muted); margin-top: 1px; }
.fav-price { font-size: 12px; font-weight: 700; color: #c8362f; margin-top: 3px; }
.fav-star { position: absolute; right: 6px; top: 5px; color: #b5730f; font-size: 13px; line-height: 1; cursor: pointer; }
.fav-star:hover { transform: scale(1.2); }

/* 产品卡右上角常用星标 */
.pk-star { position: absolute; right: 5px; top: 4px; z-index: 3; color: #c2c8d2; font-size: 15px; line-height: 1; cursor: pointer; text-shadow: 0 1px 2px rgba(255,255,255,.9); }
.pk-star:hover { transform: scale(1.2); color: #b5730f; }
.pk-star.on { color: #b5730f; }
.pk-card.is-fav { border-color: #b5730f; }



/* ---------- 产品分类：大类卡片 ---------- */
.cat-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(268px, 1fr)); gap: 12px; }
.cat-card { border: 1px solid var(--line); border-radius: 10px; background: #fff; padding: 14px 16px 12px; cursor: pointer; transition: box-shadow .12s, border-color .12s, transform .12s; }
.cat-card:hover { border-color: var(--primary); box-shadow: 0 8px 20px rgba(30,99,216,.14); transform: translateY(-2px); }
.cat-head { display: flex; align-items: center; gap: 8px; }
.cat-name { font-size: 15px; font-weight: 700; color: #1b2330; flex: 1; }
/* v3.57：子类名字可直接点改 —— 名字上带个小铅笔，hover 时提示 */
.cat-rename { cursor: text; border-radius: 5px; padding: 1px 4px; margin: -1px -4px; transition: background .15s; }
.cat-rename:hover { background: #e8efff; }
.cat-rename .cat-pen { font-style: normal; font-size: 12px; font-weight: 400; color: var(--primary); opacity: 0; margin-left: 5px; transition: opacity .15s; }
.cat-card:hover .cat-rename .cat-pen { opacity: .75; }
.cat-rename:hover .cat-pen { opacity: 1; }
.cat-num { font-size: 30px; font-weight: 700; color: var(--primary); line-height: 1.2; margin: 8px 0 2px; }
.cat-num span { font-size: 12px; font-weight: 400; color: var(--muted); margin-left: 4px; }
.cat-meta { font-size: 11.5px; color: var(--muted); margin-bottom: 10px; }
.cat-ops { display: flex; gap: 6px; padding-top: 10px; border-top: 1px solid var(--line); }
.cat-ops .sm { flex: 1; }

/* ---------- 产品分类 / 产品库 层级导航 ---------- */
/* v4.10（蔡总 2026-10-12）：产品库改「鱼骨横排」——
   大类为骨（每行行首一块），它下面的子类横向排在右边（刺）。一整块白卡包起来。 */
.lib-fish { background: #fff; border: 1px solid var(--line); border-radius: 12px; padding: 5px 9px; margin-bottom: 10px; }
.fish-row { display: flex; align-items: flex-start; gap: 10px; padding: 7px 5px; border-radius: 9px; }
.fish-row + .fish-row { border-top: 1px dashed var(--line); }
.fish-row.on { background: var(--cat-row); }
.fish-big { flex: 0 0 116px; justify-content: flex-start; border: 1px solid var(--line); background: #fff; border-radius: 9px; padding: 9px 12px; cursor: pointer; font-size: 13.5px; font-weight: 600; color: #3d4757; display: inline-flex; align-items: center; gap: 7px; transition: border-color .12s, color .12s, background .12s; text-align: left; }
.fish-big:hover { border-color: var(--cat-blue); color: var(--cat-blue); }
.fish-big.on { background: var(--cat-blue); border-color: var(--cat-blue); color: #fff; }
.fish-big .n { font-size: 11px; font-weight: 400; opacity: .7; }
.fish-subs { display: flex; flex-wrap: wrap; gap: 7px; flex: 1; padding-top: 1px; }
.fish-subs .cat-tab { padding: 8px 14px; font-size: 12.5px; }
.fish-subs .cat-tab:hover { border-color: var(--cat-green); color: #1a8a52; }
.fish-subs .cat-tab.on { background: var(--cat-green); border-color: var(--cat-green); color: #fff; }
.fish-empty { margin: 7px 0 0; }
/* v3.63：产品库合并入口后的**一级「大类」**页签（旧版，已由鱼骨横排取代，保留兼容） */
.lib-bigs { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 9px; }
.lib-big { border: 1px solid var(--line); background: #fff; border-radius: 10px; padding: 10px 18px; cursor: pointer; font-size: 14px; font-weight: 500; color: #3d4757; display: inline-flex; align-items: center; gap: 8px; transition: border-color .12s, color .12s, background .12s; }
.lib-big:hover { border-color: var(--primary); color: var(--primary); }
.lib-big.on { background: var(--primary); border-color: var(--primary); color: #fff; font-weight: 600; }
.lib-big .n { font-size: 11.5px; opacity: .7; }
.cat-tab-add { border-style: dashed; color: var(--muted); }
.cat-tab-add:hover { color: var(--primary); border-color: var(--primary); }
.cat-tabs { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 10px; }
.cat-tab { border: 1px solid var(--line); background: #fff; border-radius: 8px; padding: 9px 16px; cursor: pointer; font-size: 13px; color: #3d4757; display: inline-flex; align-items: center; gap: 7px; }
.cat-tab:hover { border-color: var(--primary); color: var(--primary); }
.cat-tab.on { background: var(--primary); border-color: var(--primary); color: #fff; font-weight: 600; }
.cat-tab .n { font-size: 11.5px; opacity: .8; }
/* v3.57b：子类栏页签上也挂改名铅笔（hover 显形，点它即改名；点页签本体仍只切换） */
.cat-tab .cat-pen { font-style: normal; font-size: 11px; font-weight: 400; color: var(--primary); opacity: 0; transition: opacity .15s; }
.cat-tab:hover .cat-pen { opacity: .6; }
.cat-tab.on .cat-pen { color: #fff; opacity: .7; }
.cat-tab .cat-pen:hover { opacity: 1 !important; }
/* v3.57c：页签上的「调顺序 / 改名 / 删除」图标槽 —— **固定占宽**，非 hover 只透明，
   这样鼠标移上移下页签宽度不变，不会左右跳动。 */
.cat-tab .tab-ops { display: inline-flex; align-items: center; gap: 6px; width: 42px; justify-content: flex-end; margin-left: 1px; }
.cat-tab .cat-mv { font-style: normal; font-size: 10px; font-weight: 400; color: var(--primary); opacity: 0; cursor: pointer; transition: opacity .15s; }
.cat-tab:hover .cat-mv { opacity: .55; }
.cat-tab.on .cat-mv { color: #fff; opacity: .7; }
.cat-tab .cat-mv:hover { opacity: 1 !important; }
.cat-tab .cat-mv.off { visibility: hidden; }
/* 分类卡片上的 ◀ ▶（和「✎ 改名」并排） */
.cat-mv-wrap { display: inline-flex; align-items: center; gap: 2px; }
.cat-mv { font-style: normal; font-size: 11px; color: var(--primary); opacity: .45; cursor: pointer; padding: 0 2px; border-radius: 4px; transition: opacity .15s, background .15s; }
.cat-card:hover .cat-mv { opacity: .7; }
.cat-mv:hover { opacity: 1 !important; background: #e8efff; }
.cat-mv.off { visibility: hidden; }
/* 「子类设置」小框里的删除区 */
.cr-danger { margin-top: 12px; border-top: 1px dashed var(--line); padding-top: 10px; }
.cr-danger-t { font-size: 12px; font-weight: 700; color: #c8362f; margin-bottom: 2px; }
.crumb { font-size: 12px; color: var(--muted); margin-bottom: 8px; }
.crumb a { color: var(--primary); cursor: pointer; text-decoration: none; }
.crumb a:hover { text-decoration: underline; }

/* ---------- 产品库：网格卡片 / 列表切换 ---------- */
.lib-bar { display: flex; gap: 8px; align-items: center; margin-bottom: 10px; flex-wrap: wrap; }
.lib-bar .sm.on { background: var(--primary); border-color: var(--primary); color: #fff; }
.lib-bar #libCount { margin-left: auto; }
.lib-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(176px, 1fr)); gap: 10px; }
.lib-card { border: 1px solid var(--line); border-radius: 8px; background: #fff; overflow: hidden; display: flex; flex-direction: column; transition: box-shadow .12s, border-color .12s; }
.lib-card:hover { border-color: var(--primary); box-shadow: 0 6px 16px rgba(30,99,216,.14); }
.lib-img { height: 118px; display: flex; align-items: center; justify-content: center; background: #F5F5FF; border-bottom: 1px solid var(--line); cursor: pointer; }
.lib-img img { max-width: 94%; max-height: 106px; object-fit: contain; }
.lib-img .noimg { color: var(--muted); font-size: 11.5px; }
.lib-info { padding: 8px 10px 6px; flex: 1; }
.lib-name { font-size: 12.5px; font-weight: 600; color: #1b2330; line-height: 1.35; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; min-height: 34px; }
.lib-code { font-size: 11px; color: var(--muted); margin-top: 2px; }
.lib-sub { font-size: 11px; color: #6b7688; margin-top: 3px; height: 15px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
/* v3.67（蔡总 2026-10-10）：第二行规格 —— 芯片品牌 · 驱动电源（没填就不渲染这一行） */
.lib-sub2 { font-size: 11px; color: #0033CC; margin-top: 2px; height: 15px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
.lib-price { font-size: 12px; color: #b5730f; margin-top: 5px; }
.lib-price b { font-size: 13.5px; }
.lib-cost { color: var(--muted); font-size: 11px; margin-left: 4px; }
/* v3.68（蔡总 2026-10-10）：系列标签 + 3C 认证 + 同系列折叠条 */
.lib-seriesname { font-size: 11px; color: #1a8a52; margin-top: 2px; }
.cert-3c { display: inline-block; background: #e6f7ed; color: #1a8a52; border: 1px solid #c6e6d4; border-radius: 4px; font-size: 10.5px; font-weight: 700; padding: 0 5px; line-height: 16px; vertical-align: middle; }
.lib-img { position: relative; }
.lib-img .cert-3c { position: absolute; top: 6px; right: 6px; box-shadow: 0 1px 3px rgba(0,0,0,.08); }
.lib-series { margin-top: 5px; }
.lib-series-tog { padding: 2px 8px; font-size: 11px; border-radius: 20px; background: #F5F5FF; border: 1px solid #dbe7ff; color: #0033CC; cursor: pointer; }
.lib-series-box { margin-top: 4px; border-top: 1px dashed var(--line); padding-top: 4px; }
.lib-sib-row { display: flex; align-items: center; gap: 6px; padding: 3px 4px; border-radius: 6px; cursor: pointer; font-size: 11.5px; }
.lib-sib-row:hover { background: var(--primary-soft); }
.lib-sib-nm { flex: 1 1 auto; min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; color: #33475f; }
.lib-sib-cd { flex: 0 0 auto; color: var(--muted); font-size: 10.5px; }
.lib-sib-pr { flex: 0 0 auto; color: #b5730f; font-weight: 600; }
.cert-box { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 12px; padding: 4px 0; }
.cert-ck { font-size: 12.5px; color: #33475f; display: inline-flex; align-items: center; gap: 4px; }
.cert-ck input[type=checkbox] { width: 15px; height: 15px; }
.sermgr-list { border: 1px solid var(--line); border-radius: 10px; max-height: 46vh; overflow: auto; padding: 6px; background: #fff; }
.sermgr-row { display: flex; align-items: center; gap: 6px; padding: 5px 8px; border-radius: 8px; cursor: pointer; }
.sermgr-row.on { background: var(--primary-soft); outline: 1px solid #dbe7ff; }
.sermgr-nm { flex: 1 1 auto; min-width: 0; font-size: 13px; font-weight: 600; color: #1b2330; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
.sermgr-row .sm { padding: 2px 7px; }
.lib-sup { font-size: 11px; color: #6b7688; margin-top: 3px; height: 15px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
.lib-ops { display: flex; gap: 6px; padding: 6px 10px 8px; border-top: 1px solid var(--line); background: #F5F5FF; }
.lib-ops .sm { flex: 1; white-space: nowrap; padding-left: 4px; padding-right: 4px; }

/* ---------- v4.14 产品「一键上架推送」 ---------- */
/* 卡片上的上架状态徽标：商城 / 官网 / 未标价 —— 一眼看出哪款还没推出去 */
.lib-pub { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; }
.lib-pub .pb { display: inline-block; padding: 1px 6px; border-radius: 9px; font-size: 10.5px; line-height: 16px;
  border: 1px solid var(--line-strong); background: #F5F5FF; color: var(--muted); white-space: nowrap; }
.lib-pub .pb.on { background: #e6f7ed; color: var(--ok); border-color: #c6e6d4; font-weight: 600; }
.lib-pub .pb.warn { background: #fffaf0; color: var(--warn); border-color: #f0dcb4; }
td .lib-pub { margin-top: 0; }
/* 推送按钮：金色系，跟「编辑/复制/删除」区分开 */
button.pub { background: #fffaf0; border-color: #f0dcb4; color: #b5730f; }
button.pub:hover { background: #f0dcb4; border-color: #f0dcb4; }

/* ---------- 产品图片 ---------- */
.thumb { width: 44px; height: 44px; object-fit: contain; border: 1px solid var(--line); border-radius: 6px; background: #fff; }
.thumb-big { width: 120px; height: 120px; object-fit: contain; border: 1px solid var(--line); border-radius: 8px; background: #fff; }
.empty-img { display: flex; align-items: center; justify-content: center; color: var(--muted); font-size: 12px; background: #F5F5FF; }
.imgbox { display: flex; gap: 12px; align-items: flex-start; }

/* ---------- 其他 ---------- */
.terms { border: 1px solid var(--line); background: #F5F5FF; border-radius: 6px; padding: 9px 11px; font-size: 12px; line-height: 1.7; color: #3d4757; }
.modal .in input[type="file"] { padding: 4px; }

/* ---------------- v1.5 客户工作台（商城选型卡） ---------------- */
.shopgrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 12px; }
.shopcard { display: flex; flex-direction: column; gap: 6px; background: var(--panel); border: 1px solid var(--line);
  border-radius: var(--radius); padding: 12px; font-size: 13px; }
.shopcard .shopimg { height: 92px; display: flex; align-items: center; justify-content: center;
  background: #F5F5FF; border-radius: 8px; overflow: hidden; }
.shopcard .shopimg img { max-width: 100%; max-height: 100%; object-fit: contain; }
.shopcard .btn { margin-top: auto; }
.tbl { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.tbl th, .tbl td { border: 1px solid var(--line); padding: 6px 8px; text-align: center; }
.tbl th { background: #F5F5FF; }

/* ---------- v1.6 手机适配（第 12 条）：左侧菜单默认折叠，☰ 展开 ---------- */
.menu-toggle {
  display: none; align-items: center; justify-content: center;
  width: 34px; height: 34px; border: 1px solid var(--line-strong); border-radius: 8px;
  background: #fff; font-size: 17px; cursor: pointer; flex: 0 0 34px; padding: 0;
}
.sidebar-mask { display: none; }
@media (max-width: 900px) {
  aside {
    position: fixed; left: 0; top: 0; bottom: 0; z-index: 900;
    transform: translateX(-105%); transition: transform .22s ease;
    box-shadow: 8px 0 30px rgba(16, 24, 40, .16);
  }
  body.sidebar-open aside { transform: translateX(0); }
  body.sidebar-open .sidebar-mask {
    display: block; position: fixed; inset: 0; z-index: 890;
    background: rgba(16, 24, 40, .35);
  }
  .menu-toggle { display: inline-flex; }
  header { padding: 0 12px; }
  section.body { padding: 12px 12px 40px; }
  /* 表格横向滚动兜底（手机上看宽表格不挤爆） */
  .tbl-wrap, .card .in { max-width: 100%; }
  table { display: block; overflow-x: auto; }
  /* v2.5（蔡总：杜绝低级错乱）：看板分组汇总条一行放不下就换行，不许溢出屏幕 */
  .grp-head { flex-wrap: wrap; row-gap: 4px; }
  .grp-sum { white-space: normal; flex: 1 1 100%; }
  .grp-desc { display: none; }  /* 手机上分组说明让位给金额 */
}

/* v4.61（蔡总 2026-10-15）：平板 768~1024 页头一行塞不下 → 收起长副标题、账号名限宽（原只有 <640 才收） */
@media (max-width: 1024px) {
  header .sub { display: none; }
  .whoami { max-width: 170px; }
}

/* ---------- v1.7 手机适配加强（第 13 条硬性要求）：弹层全屏化，手机上就是"操作页" ---------- */
@media (max-width: 640px) {
  .mask { padding: 0; align-items: stretch; }
  .modal, .modal.wide, .modal.narrow { max-width: 100%; width: 100%; min-height: 100vh; border-radius: 0; }
  .modal > h3 { position: sticky; top: 0; background: var(--panel); z-index: 3; }
  .modal .in { max-height: none; padding: 14px 14px 20px; }
  .modal .bar { position: sticky; bottom: 0; background: var(--panel); border-top: 1px solid var(--line); z-index: 3; }
  .modal .bar .btn { flex: 1; text-align: center; }
  .frm label { font-size: 12.5px; }
  .frm input, .frm select, .frm textarea { font-size: 15px; }   /* ≥16px 以下 iOS 才不缩放输入框 */
  select, input, textarea { font-size: 15px; }
  .sheet-mode .in { padding-bottom: 80px; }
  .shopgrid { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); }
  header h1 { font-size: 15px; }
  header .sub { display: none; }
  /* v3.44：窄屏下进度芯片换行显示，避免挤压项目名 */
  .pc-titlewrap { flex-direction: column; align-items: flex-start; gap: 4px; }
  .pc-prog-inline { max-width: 100%; flex-wrap: wrap; }
}

/* ---------- v1.8 密码可见（蔡总：输错看不见，不知道错在哪） ----------
   .pwd-wrap 包住 input，眼睛按钮绝对定位在右侧，input 右侧留出 42px 空间。 */
.pwd-wrap { position: relative; display: block; }
.pwd-wrap > input { padding-right: 42px !important; }
.pwd-eye {
  position: absolute; right: 6px; top: 50%; transform: translateY(-50%);
  width: 30px; height: 30px; display: flex; align-items: center; justify-content: center;
  border: 0; background: transparent; color: #98a2b3; font-size: 15px; line-height: 1;
  cursor: pointer; border-radius: 6px; padding: 0; user-select: none;
}
.pwd-eye:hover { background: #e8efff; color: #3d4757; }
.pwd-eye.on { color: var(--primary); }

/* ---------- v3.42 主从翻转（蔡总 2026-10-09）：网站后台作壳、ERP 作模块 ----------
   本系统被后台以 iframe 嵌入时（?embed=1）—— 收起自己的品牌栏与页脚，只留导航 + 内容，
   避免与后台外壳「双重嵌套」。（旧「网站管理」iframe 样式已随该功能一并移除） */
body.embed .brand { display: none; }
body.embed aside .foot { display: none; }
body.embed aside { padding-top: 6px; }
body.embed header { box-shadow: none; }

/* ---------- v1.7 客户工作台独立视觉（与内部界面一眼区分） ---------- */
body.portal aside {
  background: linear-gradient(180deg, #000A41 0%, #001a8c 100%);
  border-right-color: #000A41;
}
body.portal .brand { border-bottom-color: rgba(255, 255, 255, .14); }
body.portal .brand b { color: #fff; }
body.portal .brand span { color: #cfe0fa; }
body.portal nav .grp { color: #0044ee; }
body.portal nav a { color: #dbe7ff; }
body.portal nav a:hover { background: rgba(255, 255, 255, .10); }
body.portal nav a.on { background: #0033CC; color: #fff; }
body.portal nav a .dot { background: #0044ee; }
body.portal .foot { color: #cfe0fa; }
body.portal .foot a { color: #cfe0fa !important; }
body.portal header { border-bottom: 2px solid #0033CC; }
body.portal header h1 { color: #000A41; }
.ptag {
  display: none; align-items: center; gap: 5px; font-size: 11.5px; font-weight: 600;
  background: #e8efff; color: #0033CC; border: 1px solid #dbe7ff; border-radius: 999px;
  padding: 3px 10px; margin-right: 8px; white-space: nowrap;
}
body.portal .ptag { display: inline-flex; }

/* v3.44（蔡总 2026-10-09）：顶栏「当前登录者」身份徽标 */
.whoami {
  display: none; align-items: center; gap: 6px; font-size: 12px; font-weight: 600;
  background: #e8efff; color: #12233f; border: 1px solid #dbe7ff; border-radius: 999px;
  padding: 4px 12px; white-space: nowrap; max-width: 320px; overflow: hidden; text-overflow: ellipsis;
}
.whoami.on { display: inline-flex; }
.whoami .wi-ico { font-size: 13px; }
.whoami .wi-role {
  font-weight: 500; font-size: 11px; color: #0033CC; background: #dbe7ff;
  border-radius: 999px; padding: 1px 7px;
}
.whoami .wi-sub { font-weight: 400; color: #6b7688; font-size: 11px; }
body.portal .whoami { background: #e8efff; border-color: #cfe0fa; color: #000A41; }
body.portal .whoami .wi-role { color: #0033CC; background: #cfe0fa; }
@media (max-width: 760px) { .whoami { max-width: 150px; } .whoami .wi-sub { display: none; } }

/* v4.15 全系统配色统一：客户工作台与内部同用主蓝 #0033CC */
body.portal { --primary: #0033CC; --primary-soft: #e8efff; }

/* ===== v3.28 P6：三节点收款标识 + 内部风控标示 ===== */
.pns { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; margin: 6px 0 2px; }
.pns .pn {
  display: inline-flex; align-items: center; gap: 5px; font-size: 12px; line-height: 1;
  padding: 4px 9px; border-radius: 999px; border: 1px solid var(--line, #dbe7ff);
  background: #fff; color: #8a96a8; cursor: pointer;
}
.pns .pn .pn-d { width: 8px; height: 8px; border-radius: 50%; border: 1.5px solid currentColor; display: inline-block; }
.pns .pn.on { border-color: #1a8a52; color: #1a8a52; background: #e6f7ed; }
.pns .pn.on .pn-d { background: #1a8a52; border-color: #1a8a52; }
.pns.all { background: #e6f7ed; border-radius: 10px; padding: 3px 8px; }
.pns .pn-line { width: 10px; height: 1px; background: #cfd6e0; display: inline-block; }
.pns .pn-sum { font-size: 11px; color: #8a96a8; margin-left: 6px; }

/* ===== v3.44：锚定小浮层（收款登记等就近弹出，轻量不挡屏） ===== */
.popover {
  position: absolute; z-index: 60; min-width: 250px; max-width: 320px;
  background: #fff; border: 1px solid var(--line, #dbe7ff); border-radius: 10px;
  box-shadow: 0 8px 28px rgba(24, 40, 72, .16); overflow: hidden;
}
.popover .pop-h {
  padding: 7px 12px; font-size: 12.5px; font-weight: 700; color: var(--ink-1, #1f2733);
  background: #F5F5FF; border-bottom: 1px solid var(--line, #dbe7ff);
}
.popover .pop-b { padding: 10px 12px 12px; }
.pop-frm { display: block; }
.pop-frm > label { display: block; font-size: 12px; color: var(--ink-3, #55627a); margin: 6px 0 3px; }
.pop-frm > label:first-child { margin-top: 0; }
.pop-frm input, .pop-frm select { width: 100%; padding: 6px 8px; font-size: 13px; }
.pop-hint { color: #b5730f; font-weight: 600; margin-left: 4px; }
.pop-rule { font-size: 11px; color: var(--ink-4, #8a96a8); line-height: 1.5; margin-top: 8px; }
.pop-actions { margin-top: 10px; text-align: right; }
.pop-actions .btn { min-width: 76px; }

/* ===== v3.44：项目动态栏（⑦⑧ 筛选栏退场，待办 + 动态双栏） ===== */
.dyn-in { display: flex; gap: 18px; align-items: flex-start; }
.dyn-col { flex: 1; min-width: 0; }
.dyn-sep { width: 1px; align-self: stretch; background: var(--line, #dbe7ff); }
.dyn-h { font-size: 12.5px; font-weight: 700; color: var(--ink-2, #3d4757); margin-bottom: 8px; }
.dyn-todo {
  display: flex; align-items: baseline; gap: 6px; font-size: 12.5px; line-height: 1.55;
  padding: 4px 8px; border-radius: 7px; background: #F5F5FF; margin-bottom: 4px;
}
.dyn-todo:hover { background: #F5F5FF; }
.dyn-go { color: #98a2b3; cursor: pointer; text-decoration: none; flex: 0 0 auto; }
a.dyn-go:hover { color: var(--primary, #0033CC); }
.dyn-empty { font-size: 12.5px; color: var(--ink-4, #8a96a8); padding: 6px 0; }
.dyn-item {
  display: flex; align-items: baseline; gap: 8px; font-size: 12.5px; line-height: 1.6;
  padding: 2px 0; border-bottom: 1px dashed #dbe7ff;
}
.dyn-item:last-child { border-bottom: 0; }
.dyn-date { flex: 0 0 auto; font-size: 11px; color: var(--ink-4, #8a96a8); font-variant-numeric: tabular-nums; }
.dyn-dot { flex: 0 0 auto; width: 7px; height: 7px; border-radius: 50%; background: #cfe0fa; align-self: center; }
.dyn-dot.pay { background: #1a8a52; }
.dyn-dot.ok { background: #0033CC; }
.dyn-dot.bad { background: #c8362f; }
.dyn-dot.new { background: #b5730f; }
.dyn-txt { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--ink-2, #3d4757); }
@media (max-width: 900px) { .dyn-in { flex-direction: column; } .dyn-sep { width: auto; height: 1px; align-self: stretch; } }
.pc-tailwarn {
  margin: 6px 0; padding: 6px 10px; border-radius: 8px; font-size: 12px; font-weight: 600;
  background: #fdeceb; color: #c8362f; border: 1px solid #f0c9c6;
}
.pc-risk { margin: 5px 0; padding: 5px 10px; border-radius: 8px; font-size: 12px; font-weight: 600; }
.pc-risk.r { background: #fdeceb; color: #c8362f; border: 1px solid #f0c9c6; }
.pc-risk.y { background: #fffaf0; color: #b5730f; border: 1px solid #f0dcb4; }

/* ===== v3.29：订单页精简 + 物料清单行内参数 ===== */
.base-sum { display: flex; flex-wrap: wrap; gap: 6px 8px; align-items: center; }
.base-sum .bs {
  display: inline-flex; align-items: center; gap: 6px; font-size: 13px; line-height: 1.4;
  padding: 5px 10px; border-radius: 8px; background: #F5F5FF; color: #1f2a3a; border: 1px solid #dbe7ff;
}
.base-sum .bs b { font-weight: 500; color: #8a96a8; font-size: 12px; }
.base-sum .bs.miss { background: #fffaf0; border-color: #f0dcb4; color: #b5730f; }
.base-sum .bs.miss b { color: #b5730f; }

.order-items .param-in { display: flex; align-items: center; gap: 5px; flex-wrap: wrap; }
.order-items .param-in .pin {
  width: 68px; min-width: 0; font-size: 12px; padding: 5px 7px; border-radius: 6px;
  border: 1px solid var(--line); background: #fff;
}
.order-items .param-in .pin.wide { flex: 1 1 150px; width: auto; min-width: 140px; }
.order-items .param-in .pin::placeholder { color: #a9b3c2; }
.order-items .sm.mini { padding: 4px 8px; font-size: 12px; line-height: 1; border-radius: 6px; }
.order-items tr.matmore > td { background: #F5F5FF; border-top: none; padding-top: 0; }
.order-items .param-more-grid { display: flex; flex-wrap: wrap; gap: 8px 14px; padding: 6px 2px; }
.order-items .param-more-grid label { display: inline-flex; align-items: center; gap: 5px; font-size: 12px; color: #6b7688; }
.order-items .param-more-grid input {
  width: 100px; font-size: 12px; padding: 4px 7px; border-radius: 6px; border: 1px solid var(--line); background: #fff;
}

/* ---------- v3.30 智能面板 · 按空间编排 ---------- */
.space { border: 1px solid var(--line); border-radius: 10px; background: #fff; margin: 10px 0; overflow: hidden; }
.space-h { display: flex; align-items: center; gap: 8px; padding: 8px 12px; background: #F5F5FF; border-bottom: 1px solid var(--line); flex-wrap: wrap; }
.space-lab { font-size: 12px; color: var(--muted); }
.space-name { width: 190px; padding: 5px 9px; border: 1px solid var(--line-strong); border-radius: 6px; font-size: 13px; font-weight: 500; color: var(--ink-1); background: #fff; }
.space-n { font-size: 12px; color: var(--muted); }
.dev { border-bottom: 1px dashed var(--line); padding: 10px 12px; }
.dev:last-child { border-bottom: none; }
.dev-h { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.dvtag { font-size: 11px; padding: 2px 8px; border-radius: 999px; background: var(--primary-soft); color: var(--primary); border: 1px solid #dbe7ff; }
.dvtag.host { background: #fffaf0; color: #b5730f; border-color: #f0dcb4; }
.dvname { font-weight: 500; font-size: 13px; color: var(--ink-1); max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dvcode { font-size: 12px; color: var(--muted); }
.dvf { display: inline-flex; align-items: center; gap: 4px; font-size: 12px; color: var(--muted); }
.dvf input, .dvf select { padding: 4px 6px; border: 1px solid var(--line-strong); border-radius: 6px; font-size: 12px; background: #fff; }
.dvf input.num { width: 78px; text-align: right; }
.dvsum { margin-left: auto; font-weight: 500; color: var(--primary); font-size: 13px; }
.slots { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; }
.slot { display: inline-flex; align-items: center; gap: 5px; padding: 4px 6px; border: 1px solid var(--line); border-radius: 8px; background: #F5F5FF; }
.slot.isdup { background: #fffaf0; border-color: #f0dcb4; }
.sl-l { font-size: 11px; font-weight: 500; color: #fff; background: var(--primary); border-radius: 5px; padding: 2px 6px; min-width: 26px; text-align: center; }
.sl-l.off { background: #dbe7ff; color: #8a96a8; }
/* v3.31g/h：L 标是按钮——点一下清空（不接线），再点恢复 */
.sl-l[data-nc] { cursor: pointer; user-select: none; transition: filter .12s, border-color .12s, color .12s; }
.sl-l[data-nc]:not(.isnc):hover { filter: brightness(1.22); outline: 2px solid #cfe0fa; }
.sl-l.isnc { background: transparent; border: 1px dashed #cfe0fa; color: #aab6c8; }
.sl-l.isnc:hover { border-color: #93a9d4; color: #7c8aa3; background: #F5F5FF; }
.sl-sel { max-width: 152px; padding: 3px 6px; border: 1px solid var(--line-strong); border-radius: 6px; font-size: 12px; background: #fff; }
.slot.isdup .sl-sel { border-color: #f0dcb4; }
.sl-wl { display: inline-flex; align-items: center; gap: 3px; font-size: 11px; color: #0033CC; cursor: pointer; white-space: nowrap; }
.sl-dup { font-style: normal; font-size: 11px; color: #b5730f; background: #fffaf0; border-radius: 5px; padding: 1px 6px; }
.ctrl-empty { padding: 18px 12px; color: var(--muted); font-size: 13px; text-align: center; border: 1px dashed var(--line-strong); border-radius: 10px; }
.ctrl-foot { margin-top: 10px; display: flex; justify-content: flex-end; }

/* ---------- v3.31 情景设定表（出厂前设定 · 可随生产单发工厂） ---------- */
.scene-wrap { margin-top: 10px; border: 1px solid #dbe7ff; border-radius: 10px; background: #F5F5FF; overflow: hidden; }
.scene-hint .scene-cap { border-bottom: none; }
.scene-hint .muted { flex: 1; min-width: 200px; }
/* v3.31f 主机出厂设定（唤醒词/欢迎语/离开播报/主灯） */
/* v3.31j：主机出厂设定块——统一两列网格 + 标签在上，整体更规整 */
.hostcfg { margin-top: 10px; border: 1px solid #f0dcb4; border-radius: 10px; background: #fffaf0; overflow: hidden; }
.hostcfg-cap { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; padding: 8px 12px; background: #fffaf0; border-bottom: 1px solid #f0dcb4; font-size: 12.5px; color: var(--ink-1); }
.hostcfg-cap b { color: #b5730f; font-size: 13px; }
.hostcfg-cap .muted { font-size: 11.5px; color: var(--muted); font-weight: 400; }
.hostcfg-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px 14px; padding: 12px; align-items: start; }
.hostcfg-grid .hg-wide { grid-column: 1 / -1; }
.hostcfg-grid .hg-item { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.hg-lab { display: flex; align-items: center; gap: 5px; font-size: 11.5px; color: var(--ink-2); }
.hg-lab .req { font-style: normal; font-size: 10px; color: #c8362f; border: 1px solid #f0c9c6; background: #fdeceb; border-radius: 6px; padding: 0 5px; }
.hostcfg-grid input, .hostcfg-grid select { width: 100%; min-width: 0; padding: 6px 9px; border: 1px solid #f0dcb4; border-radius: 7px; font-size: 12.5px; background: #fff; box-sizing: border-box; }
.hostcfg-grid textarea { width: 100%; padding: 6px 9px; border: 1px solid #f0dcb4; border-radius: 7px; font-size: 12.5px; line-height: 1.55; background: #fff; box-sizing: border-box; resize: vertical; font-family: inherit; }
.hostcfg-grid input:focus, .hostcfg-grid textarea:focus, .hostcfg-grid select:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(0, 51, 204, .08); }
@media (max-width: 760px) { .hostcfg-grid { grid-template-columns: 1fr; } }
/* v3.31c 整行文字说明 */
.sc-note-btn { margin-left: 6px; padding: 1px 7px; font-size: 10.5px; border: 1px solid #dbe7ff; border-radius: 8px; background: #fff; color: var(--muted); cursor: pointer; }
.sc-note-btn:hover { color: var(--primary); border-color: var(--primary); }
.sc-note-btn.on { background: var(--primary); border-color: var(--primary); color: #fff; }
.sc-noterow td { padding: 4px 8px; }
.sc-note-in { width: 100%; box-sizing: border-box; padding: 5px 9px; border: 1px solid #dbe7ff; border-radius: 8px; font-size: 12.5px; background: #fffaf0; }
.sc-note-in:focus { outline: none; border-color: var(--primary); }
.scene-cap { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 7px 12px; background: #e8efff; border-bottom: 1px solid #dbe7ff; font-size: 12.5px; color: var(--ink-1); }
.scene-cap b { color: var(--primary); }
.scene-cap .muted { font-size: 11.5px; color: var(--muted); font-weight: 400; }
.scene-scroll { overflow-x: auto; padding: 8px 10px; }
table.scene-tbl { border-collapse: collapse; font-size: 12px; }
table.scene-tbl th, table.scene-tbl td { border: 1px solid #dbe7ff; padding: 3px 6px; text-align: center; white-space: nowrap; }
/* v3.31e：所有列宽恒定，调光格不再撑宽整列（蔡总：选调光后右边电视/空调被挤出屏幕） */
table.scene-tbl tr:first-child th:not(.sc-0), table.scene-tbl td.sc-cell { width: 86px; min-width: 86px; max-width: 86px; box-sizing: border-box; overflow: hidden; }
table.scene-tbl tr:first-child th { background: #F5F5FF; color: var(--ink-1); font-weight: 500; }
table.scene-tbl th.sc-0 { background: #F5F5FF; color: var(--ink-1); font-weight: 500; text-align: left; position: sticky; left: 0; z-index: 1; }
.sc-cell { padding: 3px 4px; }
.sc-sel { padding: 2px 4px; border: 1px solid var(--line-strong); border-radius: 5px; font-size: 12px; background: #fff; max-width: 76px; box-sizing: border-box; }
.sc-dim { display: flex; flex-direction: column; align-items: stretch; gap: 2px; margin-top: 3px; }
.sc-dim[hidden] { display: none; }
.sc-dk { display: flex; align-items: center; justify-content: center; gap: 2px; font-size: 9.5px; color: var(--muted); cursor: pointer; }
.sc-dk i { font-style: normal; color: var(--ink-2); white-space: nowrap; }
.sc-dk em { font-style: normal; font-size: 9.5px; }
.sc-num { width: 32px; flex: 0 0 32px; padding: 1px 2px; border: 1px solid var(--line-strong); border-radius: 4px; font-size: 11px; text-align: center; background: #fff; box-sizing: border-box; }
.sc-dim i, .sc-dim em { font-style: normal; color: var(--muted); font-size: 9.5px; }

/* ============ v3.32（蔡总 2026-10-08）制单页 / 建档页重排 ============ */

/* 顶部摘要条：标题放大 + 三个大按钮 + 只留总价 */
.sumbar-title { font-size: 24px; font-weight: 800; letter-spacing: -.5px; line-height: 1.3; }
.sumbar-sub { font-size: var(--fs-md); }
.sumbar-head { flex: 1 1 320px; min-width: 240px; }
.sumbar-acts { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
button.lg { padding: 10px 20px; font-size: var(--fs-md); font-weight: 600; border-radius: 8px; }
button.pri.lg { font-weight: 700; }
.sumbar-total { display: flex; align-items: baseline; gap: 12px; margin-top: var(--sp-3);
  padding-top: var(--sp-3); border-top: 1px dashed var(--line); }
.sumbar-total .k { font-size: var(--fs-sm); color: var(--ink-3); }
.sumbar-total .v { font-size: 30px; font-weight: 800; color: var(--primary); letter-spacing: -1px; font-variant-numeric: tabular-nums; }

/* 建档页 / 基础信息：规整网格 */
.bgrid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px 12px; }
.bcell { min-width: 0; }
.bcell .f { display: block; margin-bottom: 4px; }
.bcell-in { display: flex; gap: 8px; align-items: center; }
.bcell-in input { flex: 1; min-width: 0; }
.bcell .pflag { font-style: normal; font-size: 11px; color: #b5730f; background: #fffaf0;
  border: 1px solid #f0dcb4; border-radius: 4px; padding: 0 5px; margin-left: 4px; }
.build-meta { display: flex; gap: 22px; flex-wrap: wrap; margin-top: 14px; padding-top: 12px;
  border-top: 1px dashed var(--line); font-size: var(--fs-sm); color: var(--ink-3); }
.build-meta b { color: var(--ink-1); font-weight: 600; }
@media (max-width: 720px) {
  .bgrid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .bcell[style*="span 2"] { grid-column: span 2 !important; }
  .sumbar-title { font-size: 19px; }
  .sumbar-total .v { font-size: 24px; }
  .sumbar-acts button { flex: 1 1 auto; }
}

/* 商务与折扣：两块规整网格 */
.bizgrid { display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr); gap: 14px; }@media (max-width: 860px) { .bizgrid { grid-template-columns: 1fr; } }
.bizbox { border: 1px solid var(--line); border-radius: 10px; padding: 12px 14px; background: #F5F5FF; }
.bizbox-t { font-weight: 700; font-size: var(--fs-md); color: var(--ink-1); margin-bottom: 10px;
  padding-left: 9px; position: relative; }
.bizbox-t::before { content: ''; position: absolute; left: 0; top: 2px; width: 3px; height: 13px;
  background: var(--primary); border-radius: 2px; }
.bizrow { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; flex-wrap: wrap; }
.bizrow .bk { flex: 0 0 78px; font-size: var(--fs-sm); color: var(--ink-2); }
.bizrow .bk.req::after { content: ' *'; color: var(--danger); font-weight: 700; }
.bizrow input, .bizrow select { padding: 6px 8px; }
.w90 { width: 90px; } .w120 { width: 120px; } .w160 { width: 160px; }
.w200 { width: 200px; } .w220 { width: 220px; }
.bhint { font-size: var(--fs-xs); color: var(--ink-3); line-height: 1.5; }
.biztbl { width: 100%; border-collapse: collapse; margin-top: 10px; }
.biztbl th { text-align: left; font-size: var(--fs-xs); color: var(--ink-3); font-weight: 600;
  padding: 4px 6px; border-bottom: 1px solid var(--line); }
.biztbl td { padding: 5px 6px; border-bottom: 1px solid var(--line); font-size: var(--fs-sm); vertical-align: middle; }
.biztbl input { width: 92px; padding: 5px 7px; text-align: right; font-variant-numeric: tabular-nums; }
.biztbl .bdesc { color: var(--ink-3); font-size: var(--fs-xs); }

/* v4.16（蔡总 2026-10-12）：商务折扣卡 = 琥珀暗卡「仅内部」
   与客户报价单的蓝标题分家：深墨底 + 琥珀强调 —— 一眼看出此卡涉钱、客户不在时才打开；
   不做文字提示，全靠颜色。此卡只存在于制单编辑页；打印 / 导出的客户版报价单本就不含编辑 UI。 */
.bizbox.amber { background: #0d1424; border: 1px solid #2b3a55; }
.bizbox.amber .bizbox-t { color: #f0dcb4; }
.bizbox.amber .bizbox-t::before { background: #b5730f; }
.bizbox.amber .bizrow .bk { color: #98a2b3; }
.bizbox.amber .bizrow .bk.req::after { color: #f0c9c6; }
.bizbox.amber .bhint, .bizbox.amber .biztbl .bdesc { color: #8a96a8; }
.bizbox.amber .bizrow input, .bizbox.amber .bizrow select,
.bizbox.amber .biztbl input { background: #1b2330; border: 1px solid #3a4a55; color: #f5f5ff; }
.bizbox.amber .bizrow input[readonly] { color: #98a2b3; }
.bizbox.amber .biztbl th { color: #98a2b3; border-bottom-color: #2b3a55; }
.bizbox.amber .biztbl td { color: #e8efff; border-bottom-color: #2b3a55; }

/* 金额区：两段式 + 一口价 */
.totals.big2 { display: flex; flex-direction: column; gap: 12px; align-items: stretch;
  border-top: 2px solid var(--primary-soft); margin-top: 12px; padding-top: 14px; }
.totals.big2 .big { display: flex; align-items: baseline; justify-content: flex-end; gap: 12px; }
.totals.big2 .big .k { font-size: var(--fs-md); color: var(--ink-2); font-weight: 600; }
.totals.big2 .big .v { font-size: 30px; font-weight: 800; color: var(--primary); letter-spacing: -1px;
  font-variant-numeric: tabular-nums; }
.deal { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; justify-content: flex-end;
  padding-top: 10px; border-top: 1px dashed var(--line); }
.deal .bk { font-size: var(--fs-sm); color: var(--ink-2); font-weight: 600; }
.deal input { width: 190px; padding: 7px 9px; text-align: right; font-variant-numeric: tabular-nums; }
.t table.t tr.sep td { border-top: 1px solid var(--line-strong); padding-top: 8px; }

/* v3.32 智能面板：空间块折叠 + 出厂设定折叠 + 添加主机/面板两按钮 */
.space-h { cursor: default; }
.sp-toggle { flex: 0 0 auto; width: 24px; height: 24px; padding: 0; line-height: 1; border-radius: 6px;
  border: 1px solid var(--line-strong); background: #fff; color: var(--ink-1); font-size: 12px; }
.sp-toggle:hover { background: var(--primary-soft); border-color: var(--primary); color: var(--primary); }
.sp-caret { display: inline-block; width: 12px; color: var(--ink-3); font-size: 11px; }
.hostcfg-cap { cursor: pointer; user-select: none; }
.hostcfg-cap:hover b { text-decoration: underline dotted; }
.space-body { border-top: 1px solid var(--line); }
.space-h + .space-body { padding-bottom: 4px; }
.ctrl-foot { display: flex; gap: 8px; flex-wrap: wrap; padding: 10px 2px 2px; }

/* v3.32 物料清单：辅料 / 灯带 参数控件（下拉 + 更多参数★） */
.param-in select.pin { padding: 4px 6px; border: 1px solid var(--line-strong); border-radius: 6px;
  font-size: 12px; background: #fff; color: var(--ink-1); max-width: 116px; }
.param-more-grid label .req { color: var(--danger); font-style: normal; font-weight: 700; }
.param-more-grid label { display: flex; flex-direction: column; gap: 3px; font-size: 11.5px; color: var(--ink-3); }

/* v3.32 产品两级分类：大类分组 */
.cat-group { margin-bottom: 16px; }
.cat-group-t { display: flex; align-items: center; gap: 8px; font-size: var(--fs-md); font-weight: 700;
  color: var(--ink-1); margin: 0 0 8px; }
.cat-group-t .cg-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--primary); display: inline-block; }

/* v3.33 面板定制行（勾定制才展开 · 两列：潘通色号 | 材质铝合金） */
.dvf.sw { display: inline-flex; align-items: center; gap: 5px; font-size: 12px; color: var(--ink-2); cursor: pointer; }
.dvf select[data-devcolor] { min-width: 74px; }
.custrow2 { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 14px; margin: 6px 0 2px;
  padding: 8px 10px; background: #fffaf0; border: 1px dashed #f0dcb4; border-radius: 8px; }
.custrow2 .c2f { display: flex; align-items: center; gap: 8px; font-size: 12px; }
.custrow2 .c2lab { color: var(--ink-3); white-space: nowrap; }
.custrow2 .c2f input, .custrow2 .c2f select { flex: 1; min-width: 0; padding: 4px 8px; border: 1px solid #f0dcb4; border-radius: 6px; font-size: 12px; background: #fff; }
.custrow2 .c2note { grid-column: 1 / -1; font-size: 12px; color: var(--ink-2); }
.custrow2 .c2note .cprice { color: var(--danger, #c8362f); }

/* ==========================================================================
   v3.47（蔡总 2026-10-09）看板一体化改造
   A 状态机配色 / D 卡片版面重排 / I 三块折叠板 / H 点节点不跳顶 / #52 服务清单双色
   ========================================================================== */

/* ---- 三块折叠板：横排标题栏，服务中蓝 / 意向单黄 / 归档灰 ---- */
.grp-bar .grp-hint { font-size: 12px; color: var(--ink-4); }
.grp-hint { font-size: 12px; color: var(--ink-4); }
.grp.archive-wrap { border-left: 4px solid #8a96a8; }
.grp.archive-wrap .grp-head { background: #F5F5FF; }
.grp.archive-wrap .grp-n { background: #8a96a8; }
.grp.archive-wrap .grp-name { color: #3d4757; }

/* ---- 卡片第一行：主操作（开始服务 / 服务结束 / 终止）---- */
.pc-acts { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; padding-bottom: 2px; }
.pc-acts .spacer { flex: 1; }
.pc-acts .pc-stbadge { font-size: 11px; }
.act-main { background: var(--primary, #0033CC); border-color: var(--primary, #0033CC); color: #fff; font-weight: 700; }
.act-main:hover { background: #001a8c; border-color: #001a8c; color: #fff; }
.act-done { background: #1a8a52; border-color: #1a8a52; color: #fff; font-weight: 700; }
.act-done:hover { background: #1a8a52; border-color: #1a8a52; color: #fff; }
.act-term { border-color: #f0c9c6; color: #c8362f; background: #fdeceb; }
.act-term:hover { background: #fdeceb; border-color: #c8362f; color: #c8362f; }
/* v4.70（蔡总 2026-10-15）：意向拿货单「选接单人 / 跳过」+ 接单人徽标 */
.pc-asg { font-size: 11.5px; color: #1a8a52; background: #e6f7ed; border: 1px solid #c7ecd8; border-radius: 999px; padding: 3px 10px; flex: none; }
.pc-asg.none { color: #8a96a8; background: #F5F6F8; border-color: #e2e6ee; }
.pc-asg b { font-weight: 700; }
.act-asg { border-color: #bfd4f5; color: #0033CC; background: #F2F6FF; }
.act-asg:hover { background: #e6eeff; border-color: #0033CC; color: #0033CC; }
.act-asgskip { border-color: #e2e6ee; color: #5a6a85; background: #FAFBFD; }
.act-asgskip:hover { background: #F2F4F8; color: #334155; }
.pc-arch.badge { font-size: 11px; color: var(--ink-4); background: #F5F5FF; border: 1px solid var(--line); border-radius: 10px; padding: 2px 9px; }

/* ---- 卡片分区块：基础信息 / 项目进度 / 付款进度 ---- */
.pc-block { border-top: 1px dashed var(--line); padding-top: 7px; margin-top: 3px; }
.pc-block-h {
  display: flex; align-items: center; gap: 8px; font-size: 11.5px; font-weight: 700;
  color: var(--ink-2); margin-bottom: 6px;
}
.pc-block-hint { font-weight: 400; color: var(--ink-4); font-size: 11px; }
.pc-base-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 4px 10px; }
.pc-base-grid .k { font-size: 11px; color: var(--ink-4); }
.pc-base-grid .v { font-size: 12.5px; color: var(--ink-1); word-break: break-all; }
.pc-base-grid .pc-exp-full { grid-column: 1 / -1; }

/* 项目进度条：放大一点，便于点击推进 */
.psbar-lg { display: flex; gap: 5px; margin: 2px 0 4px; }
.psbar-lg .ps { height: 30px; border-radius: 7px; font-size: 12px; }

/* 订单号（卡片顶部右侧） */
.pc-no { font-size: 11.5px; color: var(--ink-4); font-variant-numeric: tabular-nums; white-space: nowrap; flex: 0 0 auto; }

/* 意向单 / 已归档 / 废单 卡片整体弱化（服务中才是重点面板） */
.pcard.dim { background: #F5F5FF; }
.pcard.dim .pc-title { color: var(--ink-3); }
.pcard.dim .pc-acts { opacity: .9; }
.pcard.dim .pc-block { opacity: .88; }

/* ---- 付款进度（只读两条线：定金 / 尾款）---- */
.pns2 { display: flex; flex-direction: column; gap: 5px; }
.pn-row { display: flex; align-items: center; gap: 8px; font-size: 12px; }
.pn-lab { flex: 0 0 32px; color: var(--ink-3); font-weight: 600; }
.pn-bar { flex: 1 1 auto; min-width: 60px; height: 7px; background: #dbe7ff; border-radius: 5px; overflow: hidden; }
.pn-bar i { display: block; height: 100%; border-radius: 5px; transition: width .2s; }
.pn-val { flex: 0 0 auto; font-size: 11.5px; color: var(--ink-3); font-variant-numeric: tabular-nums; }
.pn-val b { color: var(--ink-1); }
.pn-sub { color: var(--ink-4); font-size: 10.5px; margin-left: 3px; }
.pn-total { font-size: 11.5px; color: var(--ink-3); border-top: 1px dashed var(--line); padding-top: 5px; }
.pn-total b { color: var(--ink-1); }
.pn-total b.warn { color: var(--warn); }
.pn-total b.ok, .pn-total .ok { color: var(--ok); }
.pn-warn { font-size: 11.5px; color: #c8362f; background: #fdeceb; border: 1px solid #f0c9c6; border-radius: 6px; padding: 4px 8px; line-height: 1.5; }

/* ---- 节点收款确认弹窗小表 ---- */
.paysum { display: grid; grid-template-columns: repeat(2, 1fr); gap: 6px 12px; background: #F5F5FF; border: 1px solid var(--line); border-radius: 8px; padding: 10px 12px; }
.paysum > div { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; font-size: 12.5px; }
.paysum .k { color: var(--ink-3); }
.paysum b { color: var(--ink-1); font-variant-numeric: tabular-nums; }

/* ---- 项目动态：条目带单号，可点 ---- */
.dyn-no { color: var(--primary, #0033CC); font-size: 11px; font-weight: 700; margin-left: 4px; font-variant-numeric: tabular-nums; }
.dyn-item .dyn-go { white-space: nowrap; }   /* v3.53：旧样式 width:12px 是当年小箭头遗物，会让「去处理」竖排 */
.dyn-todo .dyn-go, .dyn-item .dyn-go { flex: 0 0 auto; }

/* ---- v3.47 #52：服务清单双色（白子兔=红 关键 / 甲方=黑）---- */
.svc-chip { border-color: #dbe7ff; background: #f6f7f9; color: #2b3445; }
.svc-chip.out { border-color: #f0c9c6; background: #fdeceb; color: #c8362f; font-weight: 800; }
.svc-out-dot { background: #c8362f; }

/* ===== v3.47（蔡总 2026-10-09 #53）：客户侧返点折叠卡（一行多列，不持续提醒）===== */
.rebate-fold { border-left: 4px solid #0033CC; }.rebate-fold > summary {
  list-style: none; cursor: pointer; display: flex; align-items: center; gap: 14px;
  padding: 11px 14px; flex-wrap: wrap;
}
.rebate-fold > summary::-webkit-details-marker { display: none; }
.rebate-fold .rf-t { font-size: 14px; font-weight: 700; color: #1b2330; }
.rebate-fold .rf-grid { display: flex; gap: 20px; flex-wrap: wrap; flex: 1 1 auto; }
.rebate-fold .rf-grid > span { display: flex; flex-direction: column; gap: 1px; }
.rebate-fold .rf-grid i { font-style: normal; font-size: 11px; color: #8a96a8; }
.rebate-fold .rf-grid b { font-size: 13px; color: #1b2330; font-variant-numeric: tabular-nums; }
.rebate-fold .rf-caret { color: #8a96a8; transition: transform .15s; }
.rebate-fold[open] .rf-caret { transform: rotate(180deg); }
.rebate-fold .rf-body { padding: 0 14px 14px; border-top: 1px dashed var(--line, #dbe7ff); padding-top: 12px; }

/* ===== v3.47b（蔡总 2026-10-09 20:05）：建档页重排 —— 分块横排 + 去待定 =====
   蔡总原话：「非必填项那个待定就不需要点了，不填就完事；下面这些必填/非必填能不能变成三列，打横来，太乱了」 */
.bgrid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }

/* 分组头：编号圆点 + 标题 + 右侧标签（必填 3 项 / 可留空） */
.fgrp-h {
  display: flex; align-items: center; gap: 8px;
  font-size: var(--fs-sm, 13px); font-weight: 700; color: var(--ink-1, #1b2330);
  margin-bottom: 10px; padding-bottom: 7px; border-bottom: 1px solid var(--line, #dbe7ff);
}
.fgrp-no {
  display: inline-flex; align-items: center; justify-content: center;
  width: 18px; height: 18px; border-radius: 50%; flex: none;
  background: #0033CC; color: #fff; font-size: 11px; font-weight: 700;
}
.fgrp-tag {
  font-size: 11px; font-weight: 500; color: #7b8798; background: #e8efff;
  border: 1px solid #dbe7ff; border-radius: 10px; padding: 1px 8px; margin-left: 2px;
}
.fgrp-tag.req { color: #c8362f; background: #fdeceb; border-color: #f0c9c6; }
.fgrp-cols { margin-bottom: 20px; }

/* 必填星号（红） */
.bcell .f .req { font-style: normal; color: #c8362f; font-weight: 700; }
.bcell .f { font-size: 12px; color: #56637a; font-weight: 500; }

@media (max-width: 980px) {
  .bgrid-3 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 720px) {
  .bgrid-3 { grid-template-columns: repeat(1, minmax(0, 1fr)); }
}

/* ===== v3.48（蔡总 2026-10-09 20:07）：客户信息一键识别栏（建档页顶部）===== */
.ai-paste {
  border: 1px solid #dbe7ff; background: linear-gradient(180deg, #F5F5FF 0%, #ffffff 100%);
  border-radius: 10px; padding: 12px 14px; margin-bottom: 18px;
}
.ai-paste-h { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin-bottom: 8px; }
.ai-paste-h b { font-size: 13px; color: #0033CC; }
.ai-paste-tip { font-size: 12px; color: #7b8798; }
.ai-paste-body { display: flex; gap: 10px; align-items: stretch; }
.ai-paste-body textarea {
  flex: 1; min-width: 0; resize: vertical; font-size: 13px; line-height: 1.5;
  border: 1px solid #dbe7ff; border-radius: 8px; padding: 8px 10px; font-family: inherit;
}
.ai-paste-body textarea:focus { outline: none; border-color: #0044ee; box-shadow: 0 0 0 3px rgba(74,125,255,.12); }
.ai-paste-body button { flex: none; align-self: stretch; min-width: 88px; }
.ai-paste-msg { font-size: 12px; margin-top: 8px; min-height: 0; }
.ai-paste-msg.ok { color: #1a8a52; }
.ai-paste-msg.warn { color: #b5730f; }
.ai-paste-msg.err { color: #c8362f; }
.ai-paste-msg:empty { display: none; }

/* 识别后高亮填入的字段 */
.ai-hit { animation: aiHit 1.6s ease-out; }
@keyframes aiHit {
  0% { background: #f0dcb4; box-shadow: 0 0 0 2px #f0dcb4 inset; }
  70% { background: #f0dcb4; box-shadow: 0 0 0 2px #f0dcb4 inset; }
  100% { background: transparent; box-shadow: none; }
}
@media (max-width: 720px) {
  .ai-paste-body { flex-direction: column; }
  .ai-paste-body button { align-self: flex-start; }
}

/* ===== v3.49（蔡总 2026-10-09 20:35）：看板卡片降噪 + 单号重点 + 发货倒计时 =====
   蔡总口述要点：
   ① 待办/动态条目整行可点直达订单；② 单号要重点色（不要灰色，否则找不到）；
   ③ 意向单节点不可点（先开始服务）；④ 基础信息默认折叠（服务中不需要看）；
   ⑤ 加发货倒计时「还需 N 天 / 已延时 N 天 / 今天到期」；⑥ 意向单极简（只留单号+总额）。 */

/* ① 待办 / 动态条目：整行可点（手型 + 悬停高亮） */
.dyn-todo.dyn-click, .dyn-item.dyn-click { cursor: pointer; }
.dyn-todo.dyn-click:hover, .dyn-item.dyn-click:hover {
  background: #e8efff; border-radius: 6px;
  box-shadow: inset 0 0 0 1px #dbe7ff;
}
.dyn-todo.dyn-click:hover .dyn-txt, .dyn-item.dyn-click:hover .dyn-txt { color: var(--primary, #0033CC); }

/* ② 卡片单号：重点色 + 可点（不再是灰色小字） */
.pc-no {
  font-size: 12.5px; font-weight: 800; color: #0033CC;
  background: #e8efff; border: 1px solid #dbe7ff; border-radius: 6px;
  padding: 1px 8px; cursor: pointer; letter-spacing: .2px;
  font-variant-numeric: tabular-nums; white-space: nowrap; flex: 0 0 auto;
}
.pc-no:hover { background: #0033CC; color: #fff; border-color: #0033CC; }

/* ④ 卡片内一行式折叠块（基础信息 / 意向单付款进度）——默认收起 */
.pc-fold {
  border-top: 1px dashed var(--line, #dbe7ff); margin-top: 4px; padding-top: 5px;
}
.pc-fold > summary {
  list-style: none; cursor: pointer; display: flex; align-items: center; gap: 8px;
  font-size: 11.5px; color: var(--ink-3, #5a6577); padding: 2px 0; user-select: none;
}
.pc-fold > summary::-webkit-details-marker { display: none; }
.pc-fold .pcf-t { font-weight: 700; color: var(--ink-2, #384456); }
.pc-fold .pcf-sum {
  color: var(--ink-4, #8a96a8); font-size: 11px; overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap; max-width: 62%;
}
.pc-fold .pcf-caret { color: var(--ink-4, #8a96a8); transition: transform .15s; font-size: 10px; }
.pc-fold[open] .pcf-caret { transform: rotate(180deg); }
.pc-fold > summary:hover .pcf-t { color: var(--primary, #0033CC); }
.pc-fold .pc-base-grid { margin-top: 6px; }
.pc-fold-body { padding-top: 6px; }

/* ⑤ 发货倒计时条 */
.pc-ship {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  font-size: 12px; border-radius: 7px; padding: 5px 9px; margin-top: 5px;
  border: 1px solid var(--line, #dbe7ff); background: #F5F5FF; color: var(--ink-2, #384456);
}
.pc-ship .ship-req { color: var(--ink-4, #8a96a8); font-size: 11px; }
.pc-ship b { font-variant-numeric: tabular-nums; }
.pc-ship.plan { background: #F5F5FF; }
.pc-ship.done { background: #e6f7ed; border-color: #c6e6d4; }
.pc-ship.urgent { background: #fffaf0; border-color: #f0dcb4; color: #b5730f; }
.pc-ship.late { background: #fdeceb; border-color: #f0c9c6; color: #c8362f; }
.ship-left { color: #0033CC; }
.ship-today { color: #b5730f; }
.ship-late { color: #c8362f; }
.ship-early { color: #1a8a52; }
.ship-ontime { color: #1a8a52; }

/* ③ 意向单节点：静态不可点（锁形视觉） */
.ps.locked {
  cursor: not-allowed; opacity: .62; background: #e8efff;
  border-color: #dbe7ff; color: #97a1b2; font-weight: 600;
}
.ps.locked:hover { border-color: #dbe7ff; color: #97a1b2; background: #e8efff; }
.ps.locked.done { background: #dbe7ff; border-color: #dbe7ff; color: #6d829a; }

/* ⑥ 意向单极简卡 */
.pcard.minimal .pc-acts { padding-bottom: 4px; }
.pc-pmoney {
  display: flex; align-items: baseline; gap: 8px; margin-top: 5px;
  padding: 7px 10px; border-radius: 8px; background: #fffaf0; border: 1px solid #f0dcb4;
}
.pc-pmoney .k { font-size: 11.5px; color: #b5730f; }
.pc-pmoney b { font-size: 19px; color: #b5730f; font-variant-numeric: tabular-nums; }
.pc-pmoney-tag { font-size: 11px; color: #b5730f; margin-left: auto; }
.pc-minfoot { margin-top: 6px; }
.pc-exp-extra { border-bottom: 1px dashed var(--line, #dbe7ff); padding-bottom: 8px; margin-bottom: 4px; }
.pc-exp-extra:last-child { border-bottom: 0; }

/* ===== v3.50（蔡总 2026-10-09 21:46 手绘版式）：卡片单栏纵排 =====
   蔡总给了版式截图：① 头部左=单号+状态徽标+项目名+开始/已服务；右=主操作按钮+「下一步」大字
   ② M 清单 ③ 进度 4 节点 ④ 提醒行（跟进到期｜发货倒计时）⑤ 付款进度+警示 ⑥ 金额/收款
   卡面不再出现基础信息；「展开」区 = 建档三块（项目基本/客户/发货）。 */
.pc-head { display: flex; align-items: flex-start; gap: 12px; }
.pc-head-l { flex: 1; min-width: 0; }
.pc-head-r { flex: 0 0 auto; text-align: right; display: flex; flex-direction: column; align-items: flex-end; gap: 6px; }
.pc-headrow { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.pc-acts2 { display: flex; gap: 6px; }
.pc-nextbig { line-height: 1.15; }
.pc-nextbig .lab { display: block; font-size: 11.5px; color: var(--ink-3, #55627a); }
.pc-nextbig b { font-size: 20px; font-weight: 800; color: #0033CC; letter-spacing: 1px; }
.pc-alertrow { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 2px 0; }
.pc-alertrow .spacer { flex: 1; }
.pc-progrow { padding: 2px 0; }
.pc-exp-sec { padding: 6px 0 2px; border-bottom: 1px dashed var(--line, #dbe7ff); }
.pc-exp-sec:last-child { border-bottom: 0; }
.pc-exp-sec .pc-block-h { margin-bottom: 4px; }
@media (max-width: 640px) {
  .pc-head { flex-direction: column; }
  .pc-head-r { align-items: flex-start; text-align: left; }
}

/* ===== v3.49c（蔡总 2026-10-09 20:55）：跟进小浮层 =====
   蔡总原话：「跟进弹窗没问题，就是别弹在屏幕中间上端；弹在『跟进』字下方一点，框小一点就行。」
   → 复用 openPopover 锚定浮层，收敛宽度、紧凑内边距（不收窄输入可用性）。 */
.popover { min-width: 218px; max-width: 268px; }
.popover .pop-b { padding: 9px 11px 11px; }
.pop-frm > label { margin: 6px 0 2px; }
.pop-frm input, .pop-frm select { padding: 5px 7px; font-size: 12.5px; }
.pop-rule { font-size: 10.5px; margin-top: 7px; }
.pop-actions { margin-top: 8px; }
.pop-actions .btn { min-width: 62px; padding: 5px 10px; font-size: 12.5px; }

/* ===== v3.49d（蔡总 2026-10-09 20:59）：点待办/动态 → 看板内定位卡片 =====
   蔡总原话：「点一下不是到订单详情，是弹到项目看板列表里那个卡片那个位置，
             我要能快速盯着这个卡片；动态也是，不是弹到详情那一页去。」
   → 点条目不再跳详情页，而是滚动到该卡片 + 闪烁高亮，提示「就是这张」。 */
@keyframes pcFocusFlash {
  0%   { box-shadow: 0 0 0 0 rgba(0,51,204,.55); border-color: #0033CC; background: #e8efff; }
  25%  { box-shadow: 0 0 0 4px rgba(0,51,204,.28); border-color: #0033CC; background: #e8efff; }
  60%  { box-shadow: 0 0 0 6px rgba(0,51,204,.10); border-color: #0044ee; }
  100% { box-shadow: 0 0 0 0 rgba(0,51,204,0); border-color: inherit; background: inherit; }
}
.pcard.focus-flash { animation: pcFocusFlash 1.6s ease-out 1; border-color: #0033CC !important; }
@media (prefers-reduced-motion: reduce) { .pcard.focus-flash { animation: none; border-color: #0033CC !important; } }

/* 条目可点提示更明确（v3.47 起整行可点，这里给左侧色条 + 手型） */
.dyn-todo.dyn-click, .dyn-item.dyn-click { cursor: pointer; }
.dyn-todo.dyn-click:hover, .dyn-item.dyn-click:hover { background: #e8efff; box-shadow: inset 3px 0 0 #0033CC; }

/* ===== v3.50b（蔡总 2026-10-09 22:00）：跟进日期三态常显 ===== */
.pc-imp.fd { background: #e8efff; border-color: #dbe7ff; color: #0033CC; font-weight: 600; }

/* ===== v3.54（蔡总 2026-10-09 23:33）：客户工作台「工作总表 · 我的项目清单」 =====
   蔡总：「工作总表……网格里面有每个项，就像网格状一样每个项目一个小卡片」 */
.pgrp { border: 1px solid #dbe7ff; border-radius: 12px; margin-bottom: 10px; overflow: hidden; }
.pgrp-head { display: flex; align-items: center; gap: 10px; padding: 9px 12px; background: #F5F5FF; cursor: pointer; flex-wrap: wrap; }
.pgrp.serving .pgrp-head { background: #e8efff; }
.pgrp.draft .pgrp-head { background: #fffaf0; }
.pgrp.arch .pgrp-head { background: #F5F5FF; }
.pgrp-caret { color: #6b7688; font-size: 12px; }
.pgrp-name { font-weight: 600; }
.pgrp-n { font-size: 12px; color: #0033CC; background: #fff; border: 1px solid #dbe7ff; border-radius: 10px; padding: 1px 8px; }
.pgrp-desc { font-size: 12px; color: #98a2b3; }
.pgrp-body { display: none; padding: 12px; }
.pgrp.open .pgrp-body { display: block; }
.pprj-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 12px; }
.pprj { border: 1px solid #dbe7ff; border-radius: 12px; padding: 12px; background: #fff; cursor: pointer; transition: box-shadow .15s, transform .15s; }
.pprj:hover { box-shadow: 0 4px 14px rgba(16,42,90,.10); transform: translateY(-1px); }
.pprj.serving { border-left: 4px solid #0033CC; }
.pprj.draft { border-left: 4px solid #b5730f; }
.pprj.arch { border-left: 4px solid #98a2b3; }
.pprj-h { display: flex; align-items: center; gap: 8px; }
.pprj-no { font-weight: 600; font-size: 13px; color: #1b2330; }
.pprj-t { margin-top: 8px; font-size: 14px; font-weight: 600; }
.pprj-m { margin-top: 4px; font-size: 12px; color: #8b95a6; }
.pprj-f { margin-top: 8px; display: flex; justify-content: space-between; font-size: 12.5px; color: #5b6474; }
.pprj-f b { color: #0033CC; }
.pprj-a { margin-top: 10px; }

/* ---------- v3.64（蔡总 2026-10-10）：产品库「⚙ 管理分类」弹窗 ----------
   左栏改大类、右栏改子类；平时页面无按钮可误触，改名 / 排序 / 增删都在这儿一次做完。 */
.catmgr { display: flex; gap: 12px; align-items: stretch; }
.catmgr-col { flex: 1 1 0; min-width: 0; border: 1px solid var(--line); border-radius: 10px; overflow: hidden; background: #fff; }
.catmgr-hd { display: flex; align-items: center; gap: 8px; padding: 8px 10px; background: #F5F5FF; border-bottom: 1px solid var(--line); }
.catmgr-list { max-height: 46vh; overflow: auto; padding: 8px; }
.catmgr-row { display: flex; align-items: center; gap: 6px; padding: 4px 6px; border-radius: 8px; }
.catmgr-row.on { background: var(--primary-soft); outline: 1px solid #dbe7ff; }
.catmgr-row .cm-in { flex: 1 1 0; min-width: 0; height: 30px; }
.catmgr-row .cm-sel { flex: 0 0 160px; height: 30px; }
.catmgr-row .sm { padding: 3px 8px; flex: 0 0 auto; }
@media (max-width: 760px) {
  .catmgr { flex-direction: column; }
  .catmgr-row .cm-sel { flex-basis: 120px; }
}

/* ---------- v3.64：产品编辑页「参数分块折叠」 ----------
   面板参数 / 灯具-灯带-型材可变参数 / 下单可选属性 各成一块，按类型自动展开，其余可点开。 */
.pblock { border: 1px solid var(--line); border-radius: 10px; background: #fff; margin-top: 12px; overflow: hidden; }
.pblock > summary { cursor: pointer; padding: 10px 14px; font-weight: 600; font-size: 13.5px; background: #F5F5FF; list-style: none; }
.pblock > summary::-webkit-details-marker { display: none; }
.pblock > summary::before { content: '▸'; margin-right: 8px; color: var(--muted); display: inline-block; }
.pblock[open] > summary::before { content: '▾'; }
.pblock > summary:hover { background: #e8efff; }
.pblock-in { padding: 14px; border-top: 1px solid var(--line); }
/* v4.39（蔡总 2026-10-14）：产品编辑页 参数①~⑦ / 系列 / 附件 / 认证 折叠条 → 三列网格，展开占整行，少滚动 */
.pbgrid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; margin-top: 12px; align-items: start; }
.pbgrid > .pblock { margin-top: 0; }
.pbgrid > .pblock > summary { padding: 12px 14px; font-size: 13px; }
.pbgrid > .pblock:not([open]) > summary { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pbgrid > .pblock:not([open]) > summary .hint { display: none; }
.pbgrid > .pblock[open] { grid-column: 1 / -1; }
@media (max-width: 1180px) { .pbgrid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 760px) { .pbgrid { grid-template-columns: 1fr; } }

/* v3.66（蔡总 2026-10-10）：产品图 / LOGO 支持粘贴 —— 「粘贴图片」按钮 + 粘贴框 */
button.ok { color: var(--ok); border-color: #c6e6d4; background: #e6f7ed; }
button.ok:hover { background: #e6f7ed; border-color: #c6e6d4; }
.imgbtns { display: flex; gap: 6px; margin-top: 6px; flex-wrap: wrap; }
.pastezone {
  margin-top: 10px; min-height: 190px; display: flex; align-items: center; justify-content: center;
  border: 1.5px dashed var(--line-strong); border-radius: 10px; background: #F5F5FF;
  cursor: pointer; outline: none; padding: 12px; transition: border-color .15s, background .15s;
}
.pastezone:focus, .pastezone:hover { border-color: var(--primary); background: #F5F5FF; }
.pz-hint { color: var(--muted); font-size: 13px; text-align: center; line-height: 1.9; }
.pz-img { max-width: 100%; max-height: 320px; object-fit: contain; border-radius: 8px; background: #fff; }

/* v3.69 选品三步 */
.pk-step-t { font-weight: 500; font-size: 13px; margin: 12px 0 6px; }
.pk-step-t .hint { font-weight: 400; margin-left: 6px; }
.combo-card.on { border: 2px solid #0033CC; background: #e8efff; }
.combo-card.on .combo-nm { color: #0033CC; }
table.t tbody tr.on td { background: #e8efff; }

/* v3.95（蔡总 2026-10-12）：发单人头像行 —— 看板卡片标题下显示谁发的单 */
.pc-subrow { display: block; margin: 2px 0 4px; font-size: 12.5px; color: var(--ink-3, #6b7688); }
.pc-subrow b { color: var(--ink-2, #3c4a5c); font-weight: 600; }
/* v3.98：发单人两行式（行1 名字+档位；行2 公司·联系人·电话） */
.pc-subcol { display: flex; flex-direction: column; gap: 2px; }
.pc-subline { display: inline-flex; align-items: center; gap: 6px; }
.pc-subline2 { padding-left: 26px; font-size: 11.5px; color: var(--ink-3, #8593a6); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.td-cus { display: inline-flex; align-items: center; gap: 6px; }
/* v3.98：订单列表客户格两行式 */
.td-cus .cus2 { flex-direction: column; align-items: flex-start; gap: 1px; line-height: 1.25; }
.td-cus .cus2-sub { font-size: 10.5px; color: #8593a6; }

/* v4.02（蔡总 2026-10-12）产品库「定价」块 + 白掌柜「定价参考区」 */
.price-ref { margin-top: 12px; padding: 10px 12px; border: 0.5px dashed #cfe0fa; border-radius: 10px; background: #F5F5FF; }
.price-ref .pr-h { font-size: 12.5px; font-weight: 600; color: #3a4a63; }
.pr-tiers { display: flex; gap: 10px; flex-wrap: wrap; margin-top: 8px; }
.pr-t { display: flex; align-items: center; gap: 8px; padding: 6px 12px; border-radius: 8px; background: #fff; border: 0.5px solid #dbe7ff; font-size: 13px; }
.pr-t .k { color: #5a6675; }
.pr-t .d { color: #8a96a8; font-size: 12px; }
.pr-t b { color: #1d2b3f; font-size: 14px; }
.pr-t.best { border-color: #dbe7ff; background: #F5F5FF; }
.pr-t.best b { color: #0033CC; }
.pr-t .tag { font-size: 11px; padding: 1px 6px; border-radius: 6px; background: #0033CC; color: #fff; }
.pr-t.low { border-color: #f0c9c6; background: #fdeceb; }
.pr-t.low b { color: #c8362f; }
.pr-t .warn { font-size: 11px; color: #c8362f; }

/* v4.03（蔡总 2026-10-12）看板「利润点」小眼睛 —— 默认藏数字，点开才亮；仅白掌柜渲染 */
.hf-profit { margin-top: 6px; }
.hfp-eye { border: 0.5px solid #cfe0fa; background: #fff; color: #5a6675; font-size: 12px; padding: 3px 10px; border-radius: 8px; cursor: pointer; }
.hfp-eye:hover { background: #F5F5FF; border-color: #dbe7ff; color: #0033CC; }
.hfp-val { display: inline-flex; align-items: center; gap: 8px; margin-left: 8px; font-size: 13px; }
.hfp-val .k { color: #8a96a8; }
.hfp-val b { color: #1a8a52; font-size: 16px; }
.hfp-val .rate { color: #1a8a52; font-size: 12px; }
.hfp-val.hidden { display: none; }
.pc-profit { display: flex; align-items: center; gap: 8px; margin: 6px 0 0; }
.pc-profit .eye { border: 0.5px solid #cfe0fa; background: #fff; color: #5a6675; font-size: 12px; padding: 2px 8px; border-radius: 6px; cursor: pointer; line-height: 1.4; }
.pc-profit .eye:hover { background: #F5F5FF; border-color: #dbe7ff; }
.pc-profit .pcf-val { font-size: 12.5px; color: #1a8a52; }
.pc-profit .pcf-val .rate { color: #1a8a52; font-size: 11.5px; }
.pc-profit .pcf-val.low { color: #c8362f; }
.pc-profit .pcf-val.low .rate { color: #c8362f; }
.pc-profit .pcf-val.hidden { display: none; }

/* ==================================================================
   v4.40（蔡总 2026-10-14 定案）· 全站列表「卡片式」统一
   · 蔡总要求：菜单里的列表页不要再"一行一行"，改成卡片网格（一行 3~5 个），
     好看、好点、好管理。全站所有列表页复用下面这套基础类。
   · .cgrid  = 卡片网格容器（自动填充列，窄屏自动降级）
   · .ccard  = 单张卡片（标题 + 元信息 + 底部按钮）
   · 用法：<div class="cgrid"><div class="ccard">…</div>…</div>
   ================================================================== */
.cgrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(268px, 1fr)); gap: 12px; }
.cgrid.wide { grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); }
.cgrid.tight { grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 10px; }
.ccard {
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 12px 14px; display: flex; flex-direction: column; gap: 7px;
  box-shadow: var(--shadow-1); transition: box-shadow .16s, border-color .16s, transform .16s;
  position: relative; min-width: 0;
}
.ccard:hover { box-shadow: var(--shadow-2); border-color: #c3d6ff; }
.ccard.sel { border-color: var(--primary); box-shadow: 0 0 0 2px var(--primary-soft); }
.ccard h4 { margin: 0; font-size: 14px; line-height: 1.45; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; word-break: break-word; }
.ccard h4 .spacer { flex: 1; }
/* v4.76（蔡总 2026-10-15）：客户卡片像名片 —— 「先人后公司」。人名放最上、字号 1.5 倍（14→21px）为主角；
   次要信息（职位/电话/公司/归属）依次向下排列。 */
.ccard h4.cname { font-size: 21px; font-weight: 700; line-height: 1.3; letter-spacing: .3px; }
.ccard .cmeta.cpos { font-size: 12.5px; color: var(--text); font-weight: 500; }
.ccard .cmeta { font-size: 12px; color: var(--muted); line-height: 1.75; word-break: break-word; }
.ccard .cmeta b, .ccard .cmeta strong { color: var(--text); font-weight: 600; }
.ccard .crow { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; font-size: 12px; }
.ccard .cstat { font-size: 12px; color: var(--muted); }
.ccard .cnum { font-size: 17px; font-weight: 700; color: var(--text); font-variant-numeric: tabular-nums; letter-spacing: .2px; }
.ccard .cthumb { width: 100%; height: 132px; object-fit: contain; background: #f7f9ff; border: 1px solid var(--line); border-radius: 6px; }
.ccard .cbtns { margin-top: auto; display: flex; gap: 6px; flex-wrap: wrap; padding-top: 9px; border-top: 1px dashed var(--line); }
.ccard .cbtns .spacer { flex: 1; }
.ccard .ctag-tr { position: absolute; top: 10px; right: 10px; }
.cgrid-empty { grid-column: 1 / -1; }
@media (max-width: 720px) {
  .cgrid, .cgrid.wide, .cgrid.tight { grid-template-columns: 1fr; }
}

/* ================= v4.47（蔡总 2026-10-15）权限勾选 · 三大后台卡片 =================
   · .pcard  = 权限分组卡片（ERP后台/网站后台/商城后台各一张，方方正正、紧致）
   · .pgrid  = 卡片内勾选项网格（自动填充，窄屏降级）
   · .pchk   = 单个勾选项（方框+文字，紧致）
   · .rt-tab = 角色模板编辑的tab
   ================================================================== */
.pcard { background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius); padding: 10px 12px; }
.pcard + .pcard { margin-top: 8px; }
.pcard-h { font-size: 12.5px; font-weight: 700; color: var(--text); margin-bottom: 8px; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.pcard-h .ph-sub { font-weight: 400; color: var(--muted); font-size: 11.5px; }
.pgrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(152px, 1fr)); gap: 4px 8px; }
.pchk { display: flex; align-items: center; gap: 6px; padding: 5px 8px; border: 1px solid var(--line); border-radius: 6px; font-size: 12px; line-height: 1.3; cursor: pointer; background: #fff; transition: border-color .14s, background .14s; }
.pchk:hover { border-color: #c3d6ff; background: #f7f9ff; }
.pchk input { margin: 0; flex: none; }
.pchk span { flex: 1; word-break: break-word; }
.pchk.wm { font-size: 11.5px; padding: 4px 7px; }
.rt-tabs { display: flex; gap: 4px; margin-bottom: 8px; }
.rt-tab { padding: 6px 14px; border: 1px solid var(--line); border-radius: 6px; background: #fff; font-size: 12.5px; cursor: pointer; }
.rt-tab.on { border-color: var(--primary); background: var(--primary-soft); color: var(--primary); font-weight: 600; }
@media (max-width: 720px) { .pgrid { grid-template-columns: 1fr 1fr; } }

/* ================= v4.48（蔡总 2026-10-15）兔/商 中心圆徽章 =================
   兔=品牌绿圆+墨字（内部侧栏浅底）；商=白底圆+主蓝字（客户侧侧栏深蓝底 → 反白） */
/* v4.58（蔡总 2026-10-15）：中心标识只在侧栏顶部一个大圆徽章 —— 内部「兔」品牌绿 / 对外「商」主蓝。
   （旧的逐项菜单小徽章样式已全部撤销，菜单名恢复干净） */
.brand-top { display: flex; align-items: center; gap: 9px; }
.brand-badge { display: inline-flex; align-items: center; justify-content: center; width: 34px; height: 34px; border-radius: 50%; font-size: 15px; font-weight: 700; line-height: 1; flex: none; background: #19E14B; color: #0d1424; }
.brand-badge.portal { background: #0033CC; color: #fff; }
body.portal .brand-badge { background: #0033CC; color: #fff; }
