* { box-sizing: border-box; }
body { margin: 0; font-family: -apple-system, "Segoe UI", "Microsoft YaHei", sans-serif; background: #f4f6f9; color: #1f2937; }
.screen { min-height: 100vh; }
.hidden { display: none !important; }
.muted { color: #6b7280; font-size: 13px; }
.primary { background: #2563eb; color: #fff; border: 0; padding: 9px 16px; border-radius: 8px; cursor: pointer; font-size: 14px; }
.primary:hover { background: #1d4ed8; }
.ghost { background: transparent; border: 1px solid #cbd5e1; color: #475569; padding: 6px 12px; border-radius: 8px; cursor: pointer; }
.badge { background: #e0e7ff; color: #3730a3; padding: 2px 8px; border-radius: 999px; font-size: 12px; margin-left: 6px; }

/* 登录 */
.auth-card { max-width: 380px; margin: 8vh auto; background: #fff; padding: 28px; border-radius: 14px; box-shadow: 0 8px 30px rgba(0,0,0,.08); }
.auth-card h1 { margin: 0 0 4px; font-size: 22px; }
.sub { color: #6b7280; margin: 0 0 18px; font-size: 13px; }
/* ⭐ 第6项：.tabs / .tab 随注册页签一并移除（登录已无页签）*/
.form { display: flex; flex-direction: column; gap: 10px; }
.form input, .form select { padding: 10px; border: 1px solid #d1d5db; border-radius: 8px; font-size: 14px; }
.msg { font-size: 13px; min-height: 18px; }
.msg.err { color: #dc2626; }
.msg.ok { color: #16a34a; }

/* 顶栏（⭐ 第十轮第10项：高度缩小 —— padding 12px→8px、gap 18px→14px，整栏约 54px→46px） */
/* ⭐ #714：左侧栏右侧的「收起/展开」立牌（#railBtn）宽 18px 停在侧栏右边缘（left:200px），
   与 .app-main 顶栏左内边距 18px 恰好相接 → 顶栏「名称+图标」(#pageTitle) 紧贴立牌。
   左内边距加大到 34px，给名称/图标与立牌之间留出间距（其余三边保持 18px 不变）。 */
.topbar { display: flex; align-items: center; gap: 14px; padding: 8px 18px 8px 34px; background: #fff; border-bottom: 1px solid #e5e7eb; }
/* ⭐ 第十轮第10项：#pageTitle 是 h2 —— 浏览器默认 margin(.75em 0)+24px 字号会把顶栏撑到约 88px（「太高不协调」主因）；
 *   归零 margin 并降到 16.5px，顶栏高度回归内容高（约 46px） */
.topbar h2 { margin: 0; font-size: 16.5px; font-weight: 700; white-space: nowrap; }
/* ⭐ 第十轮第6项：报价页顶栏按钮组（#topActions）此前无任何样式 → 按钮零间距贴死；统一 8px 间距 */
.topbar .actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.brand { font-weight: 700; font-size: 16px; }
.store { display: flex; align-items: center; }
.quota { display: flex; align-items: center; gap: 8px; flex: 1; max-width: 280px; }
.quota-bar { flex: 1; height: 8px; background: #e5e7eb; border-radius: 999px; overflow: hidden; }
.quota-fill { height: 100%; width: 0; background: #16a34a; transition: width .3s; }
.quota-fill.warn { background: #f59e0b; }
.quota-fill.over { background: #dc2626; }
.me { margin-left: auto; display: flex; align-items: center; gap: 10px; }

/* 导航 */
.nav { display: flex; gap: 6px; padding: 10px 20px; background: #fff; border-bottom: 1px solid #e5e7eb; }
.nav-btn { border: 0; background: transparent; padding: 8px 14px; border-radius: 8px; cursor: pointer; color: #475569; }
.nav-btn.active { background: #eef2ff; color: #3730a3; font-weight: 600; }

/* 主区 */
.main { padding: 18px 20px; }
.toolbar { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; flex-wrap: wrap; }
.list { display: flex; flex-direction: column; gap: 10px; }
.card { background: #fff; border: 1px solid #e5e7eb; border-radius: 10px; padding: 14px; display: flex; align-items: center; justify-content: space-between; }
.card .meta { font-size: 12px; color: #6b7280; }
.card .acts { display: flex; gap: 8px; }
/* ⭐ #3/#4：报价模块单容器 + 固定头/滚动中/固定底三段式（替代旧「#quote 面板内再套 #quoteArea」双重容器）
 *   #quote 面板透明无边框（见下方 #quote.panel 覆盖），#quoteArea 为唯一可见容器。 */
.quote-area { display: flex; flex-direction: column; min-height: 0; height: 100%; background: #fff; border: 1px solid var(--line); border-radius: 10px; overflow: hidden; }
.quote-area textarea { width: 100%; min-height: 180px; font-family: monospace; font-size: 13px; padding: 10px; border: 1px solid #d1d5db; border-radius: 8px; }
.grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 12px; }
.tile { background: #fff; border: 1px solid #e5e7eb; border-radius: 10px; padding: 8px; }
.tile img { width: 100%; height: 110px; object-fit: cover; border-radius: 6px; }
.tile .nm { font-size: 12px; color: #374151; margin-top: 6px; word-break: break-all; }
.tile .acts { margin-top: 6px; }

/* 报价编辑器 */
.space-card { background: #fff; border: 1px solid #e5e7eb; border-radius: 10px; padding: 12px; margin-bottom: 14px; }
.space-title { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; flex-wrap: wrap; }
.space-title .sp-name { font-weight: 600; flex: 1; min-width: 120px; padding: 6px 8px; border: 1px solid #d1d5db; border-radius: 8px; }
.space-title .sp-floor, .space-title .sp-jobno { padding: 6px 8px; border: 1px solid #d1d5db; border-radius: 8px; }
.qtable { width: 100%; border-collapse: collapse; font-size: 13px; }
.qtable th, .qtable td { border: 1px solid #e5e7eb; padding: 4px 6px; text-align: center; }
.qtable th { background: #f8fafc; color: #475569; font-weight: 600; white-space: nowrap; }
.qtable td input { width: 100%; min-width: 48px; border: 1px solid #d1d5db; border-radius: 6px; padding: 5px 6px; font-size: 13px; }
.qtable td input[readonly] { background: #f1f5f9; color: #475569; }
.cell-seq { color: #6b7280; }
.totals { display: flex; gap: 22px; align-items: center; padding: 12px 14px; margin: 12px 0; background: #eef2ff; border-radius: 10px; font-size: 15px; flex-wrap: wrap; }
.totals strong { color: #1d4ed8; }
.lock-btn { border: 0; background: transparent; cursor: pointer; font-size: 13px; margin: 0 1px; }
.icon-del { border: 0; background: #fee2e2; color: #b91c1c; width: 24px; height: 24px; border-radius: 6px; cursor: pointer; line-height: 1; }

/* 算价配置 */
.pricing-wrap { display: flex; flex-direction: column; gap: 16px; }
.pcard { background: #fff; border: 1px solid #e5e7eb; border-radius: 10px; padding: 14px; }
.pcard h4 { margin: 0 0 4px; }
.pcfg { width: 100%; border-collapse: collapse; font-size: 13px; margin-top: 8px; }
.pcfg th, .pcfg td { border: 1px solid #e5e7eb; padding: 4px 6px; }
.pcfg th { background: #f8fafc; color: #475569; text-align: left; }
.pcfg td input { width: 100%; border: 1px solid #d1d5db; border-radius: 6px; padding: 5px 6px; }

/* ============ 报价编辑器（对齐本地「下单报价」样式逻辑） ============ */
:root { --ink: #111; --line: #ccc; --muted: #666; }
/* ⭐ #3/#4：三段式子区域 —— 固定顶(标题+填表信息+批量栏+数量合计/当前金额) / 滚动中(空间卡片+备注) / 固定底(操作栏) */
.qe-fixed-top { flex: 0 0 auto; }
.qe-scroll { flex: 1 1 auto; min-height: 0; overflow: auto; padding: 16px; }
.qe-fixed-bottom { flex: 0 0 auto; padding: 6px 16px 10px; }
/* ⭐ #776：合计条 1:1 本地（壳 :166 `#quote .quote-vis-sum`）——蓝底浅蓝框，**不再是**黑底 sticky 顶徽标；
 *   它已随 #776 移入底栏右组 .quote-foot-right，故 position:sticky/z-index 一并去掉。
 *   值语义与本地完全一致，仅作用域限定词从 #quote 沿用（避免影响非报价页同名元素）。 */
#quote .quote-vis-sum { display: inline-flex; gap: 18px; align-items: center; font-size: 13px; font-weight: 600; color: #1f5fa8; background: #e8f1fb; border: 1px solid #c6dcf5; border-radius: 6px; padding: 5px 10px; white-space: nowrap; position: static; z-index: auto; }
/* 数值 <b> 沿用蓝字（去掉原黑底场景下的黄字 #ffd54d，否则压蓝底不可读） */
#quote .quote-vis-sum b { color: #1f5fa8; font-size: 13px; font-weight: 700; }
/* 空间卡片：黑底卡片头 + 金色小计 */
/* ⭐⭐ 宽度对齐：卡片宽度跟随内部表格真实宽度 —— 避免「名称栏(黑色表头)≠ 表格区域」在列宽/缩放时错位。
 *   根因：.items-table 用 table-layout:fixed + colgroup 固定 px 列宽，列总宽超过卡片可用宽时表格会溢出/被裁，
 *   而 .sc-header 仍是卡片宽 → 两者不等宽。
 *   修法（经 headless Edge 实测，见 _probe_cssfix3.js）：
 *     · 卡片 width:max-content（内容最宽处=表格宽）且 min-width:100%（窄表仍铺满）；
 *     · 表格 width:max-content（取 colgroup 列宽之和，作为**固有宽度**而非 100%）+
 *       min-width:100%（窄表时由 min-width 撑满卡片）。
 *   ⚠️ 关键：表格绝不能用 width:100%——shrink-to-fit 父(max-content) + 子 width:100% 在 Edge 触发
 *       循环宽度解析爆炸（卡片宽飙到 1,000,050px）。改用 max-content(固有)+min-width:100%(下限) 打破循环。
 *     · .sc-body 去掉左右 padding（仅留底部），否则 header(卡片直接子元素) 与 table(经 sc-body 内嵌)
 *       的 offsetWidth 相差 24px(sc-body 左右 padding 之和) → 永远不等宽。
 *   结果：表头(100% of 卡片)与表格永远等宽；表格更宽时由 .qe-scroll(overflow:auto) 横向滚动整卡。 */
.space-card { border: 1px solid var(--line); border-radius: 6px; margin-bottom: 14px; background: #fff; overflow: hidden; width: max-content; min-width: 100%; }
.sc-header { display: flex; align-items: center; gap: 10px; padding: 10px 12px; background: #111; border-bottom: 1px solid var(--line); flex-wrap: wrap; }
.sc-header .sc-drag { cursor: grab; color: #bbb; user-select: none; font-size: 14px; line-height: 1; }
.sc-header .sc-drag:hover { color: #fff; }
.sc-header .sc-drag:active { cursor: grabbing; }
.sc-toggle { cursor: pointer; width: 20px; text-align: center; color: #bbb; font-size: 14px; user-select: none; flex-shrink: 0; }
.sc-toggle:hover { color: #fff; }
.sc-num { width: 26px; height: 26px; border-radius: 50%; background: #1e5aa8; color: #fff; display: flex; align-items: center; justify-content: center; font-size: 13px; font-weight: 700; flex-shrink: 0; }
.sc-floor { font-size: 12px; padding: 4px 6px; color: #fff; background: rgba(255,255,255,.16); border: 1px solid transparent; border-radius: 4px; }
.sc-floor option { color: #222; background: #fff; }
.sc-name { font-weight: 600; font-size: 14px; color: #fff; border: 1px solid transparent; background: rgba(255,255,255,.16); padding: 3px 8px; border-radius: 4px; min-width: 90px; max-width: 220px; }
.sc-name:focus { outline: none; border-color: rgba(255,255,255,.65); }
.sc-badge { background: rgba(255,255,255,.18); color: #ddd; border-radius: 10px; padding: 2px 10px; font-size: 12px; white-space: nowrap; }
.sc-jobno-wrap { display: flex; align-items: center; gap: 4px; margin-left: 4px; }
.sc-jobno-label { font-size: 13px; font-weight: 700; color: #ffd54d; }
.sc-jobno { width: 84px; color: #fff; background: rgba(255,255,255,.16); border: 1px solid transparent; border-radius: 4px; padding: 3px 6px; font-size: 12px; }
.sc-jobno:focus { outline: none; border-color: rgba(255,255,255,.65); }
.sc-total { margin-left: auto; font-weight: 700; font-size: 15px; white-space: nowrap; color: #ffd54d; }
.sc-copy { background: transparent; border: 0; color: #e0e0e0; font-size: 15px; line-height: 1; cursor: pointer; padding: 2px 4px; }
.sc-copy:hover { color: #90caf9; }
.sc-del { border: none; background: linear-gradient(180deg,#ef6b6f,#e5484d); color: #fff; width: 24px; height: 24px; border-radius: 6px; font-size: 14px; cursor: pointer; padding: 0; line-height: 1; display: inline-flex; align-items: center; justify-content: center; }
.sc-del:hover { background: linear-gradient(180deg,#f28084,#ec5a5f); }
.space-card.sp-drag-over { outline: 2px dashed #4a90e2; outline-offset: -2px; }
.space-card.sp-dragging { opacity: .5; }
.sc-body { padding: 0 0 12px; }
.space-card.collapsed .sc-body { display: none; }
.sc-actions { display: flex; gap: 8px; margin-top: 10px; flex-wrap: wrap; }
/* ⭐ 第2项：快捷添加空间的 6 个预设按钮 —— 尺寸明显小于「添加数据/5行/10行」，避免喧宾夺主
   ⭐⭐ #818：.sc-actions 是 flex 容器，默认 align-items:stretch 会把同排按钮拉成等高，
   故必须 align-self:center + height:auto，否则只压 padding 看不出高度差。 */
.sc-quick { padding: 3px 9px; font-size: 12px; align-self: center; height: auto; min-height: 0; }
.btn { border: 1px solid var(--ink); background: linear-gradient(180deg,#ffffff,#f1f1f1); color: var(--ink); padding: 6px 14px; font-size: 13px; cursor: pointer; border-radius: 8px; }
.btn:hover { background: linear-gradient(180deg,#f7f7f7,#e9e9e9); }
.btn:disabled { opacity: .5; cursor: not-allowed; }
/* ===== 按钮配色体系（弹窗统一稿 4：深蓝主 / 黑强操作 / 红危险 / 蓝浅操作 / 白取消）=====
   ⛔ 此前 btn primary / deepblue / lightblue / dark / danger / lightred 全部无 CSS，
      导致全站按钮毫无层次（默认 .btn 白底描边）。此处一次补齐，全站生效。 */
.btn.primary { background: linear-gradient(180deg,#2a6dc0,#1e5aa8); color: #fff; border-color: #1a4f96; }
.btn.primary:hover { background: linear-gradient(180deg,#1e5aa8,#1a4f96); }
.btn.dark { background: linear-gradient(180deg,#1f2937,#111827); color: #fff; border-color: #0b1220; }
.btn.dark:hover { background: linear-gradient(180deg,#111827,#0b1220); }
.btn.deepblue { background: linear-gradient(180deg,#2f6fbf,#24589b); color: #fff; border-color: #1d4a83; }
.btn.deepblue:hover { background: linear-gradient(180deg,#24589b,#1d4a83); }
.btn.lightblue { background: linear-gradient(180deg,#eaf2fd,#dbe9fb); color: #1d4f8f; border-color: #a9c8ec; }
.btn.lightblue:hover { background: linear-gradient(180deg,#dbe9fb,#c9ddf7); }
.btn.danger { background: linear-gradient(180deg,#fff5f5,#ffe9e9); color: #b91c1c; border-color: #f0a8a8; }
.btn.danger:hover { background: linear-gradient(180deg,#ffe9e9,#ffd7d7); }
.btn.lightred { background: linear-gradient(180deg,#fff5f5,#ffe9e9); color: #b91c1c; border-color: #f0a8a8; }
.btn.lightred:hover { background: linear-gradient(180deg,#ffe9e9,#ffd7d7); }
.btn.ghost { background: transparent; border-color: #cbd5e1; color: #475569; }
.btn.ghost:hover { background: #f1f5f9; }
/* 明细表：固定列宽 + 仅下边框输入 + 公式列只读虚线 */
.items-table { width: max-content; min-width: 100%; border-collapse: collapse; font-size: 13px; table-layout: fixed; }
.items-table th { font-size: 12px; padding: 4px 3px; white-space: nowrap; background: #fafafa; color: #444; border-bottom: 1px solid var(--line); text-align: center; }
.items-table td { padding: 3px 3px; border-bottom: 1px solid #eee; }
.items-table input { width: 100%; border: none; border-bottom: 1px solid var(--line); padding: 3px 2px; font-size: 12px; background: transparent; color: var(--ink); }
.items-table input:focus { outline: none; border-bottom-color: var(--ink); }
.items-table input[readonly] { background: #fafafa; border-bottom-style: dashed; color: var(--muted); }
.items-table input[type=number] { text-align: right; }
.cell-seq { color: var(--muted); user-select: none; }
.oq-row:hover { background: #f7f9fc; }
.icon-del { border: 0; background: #fee2e2; color: #b91c1c; width: 22px; height: 22px; border-radius: 6px; cursor: pointer; line-height: 1; font-size: 13px; }
.icon-del:hover { background: #fecaca; }
.lock-btn { border: 0; background: transparent; cursor: pointer; font-size: 12px; margin: 0 1px; padding: 0 2px; }
/* 汇总：优惠 / 折扣 / 合计 / 最终金额 / 大写金额 */
.totals-box { border-top: 1px solid var(--line); margin-top: 12px; padding-top: 10px; }
.totals-box .total-row { padding: 5px 0; font-size: 14px; display: flex; align-items: center; gap: 8px; }
.totals-box .total-row label { display: inline-block; min-width: 84px; color: var(--muted); }
.totals-box .total-row b { font-size: 16px; color: var(--ink); }
.totals-box .total-row.final b { color: #b8272f; }
.totals-box .total-row input { width: 120px; border: 1px solid var(--line); border-radius: 6px; padding: 5px 8px; font-size: 13px; }
.totals-box .upper-input { width: 280px; background: #f5f5f5; color: var(--muted); }
/* ⭐ #4：底部操作栏改入固定底区（qe-fixed-bottom），距底间距调小（原 margin-top:14px → 0，外层 padding 已收紧） */
.qe-bottom { background: #fff; border-top: 1px solid var(--line); padding-top: 8px; margin-top: 0; }
.qe-head { margin-bottom: 4px; }

/* ============ #776 底栏 1:1 本地 quote-foot-bar（壳 quotation-module.html:160-165 / 1946-1959）============ */
.qe-fixed-bottom .quote-foot-bar {
  display: flex; justify-content: space-between; align-items: center; gap: 10px;
  flex-wrap: wrap; margin: 10px 0 0; padding: 10px 12px;
  background: #fff; border: 1px solid var(--line); border-radius: 8px;
  box-shadow: 0 -2px 8px rgba(0,0,0,.06);
}
.qe-fixed-bottom .quote-foot-left { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; min-width: 0; }
.qe-fixed-bottom .quote-foot-right { display: flex; gap: 8px; align-items: center; flex-shrink: 0; }
/* 本地 .quote-top-btn：黑底白字（壳 quotation-module.html:163-164） */
.qe-fixed-bottom .quote-top-btn { background: #000 !important; color: #fff !important; border-color: #000 !important; }
.qe-fixed-bottom .quote-top-btn:hover { background: #222 !important; }
/* 本地 .quote-vis-sum 已在本文件上方「合计条」处按 1:1 本地定义（#quote 作用域），此处不重复定义 */
/* 本地 .type-badge：类型数量统计徽章（壳 :526 / part-13:1122-1126），10 色循环 */
.type-badge {
  display: inline-flex; align-items: center; padding: 4px 11px; border-radius: 14px;
  font-size: 12px; font-weight: 600; white-space: nowrap; line-height: 1.4;
  box-shadow: inset 0 0 0 1px rgba(0,0,0,.04);
}
/* 报价信息卡标题（本地 quotation-module.html:1810 <h3>报价信息</h3>） */
.qinfo-panel .qinfo-title { width: 100%; margin: 0 0 2px; font-size: 14px; font-weight: 600; }

/* ============ 左侧栏（可折叠）+ 顶栏全屏 ============ */
/* 一比一：本地 quotation-module.html:69/73/74 —— .main{flex:1;overflow:hidden} .content{flex:1;overflow:auto;padding:20px} .panel{padding:20px}
   即「页面不滚动、只有内容区滚动」。原 min-height:100vh 会把页面撑到内容全高（实测 2480px）导致整页长滚动，与本地不符。
   ⛔ 不要在这里加 overflow:hidden —— 与 .sidebar{transition:width} 叠加会触发侧栏宽度塌陷。 */
#app { display: flex; height: 100vh; width: 100%; align-items: stretch; }
.sidebar { width: 200px; min-width: 200px; flex-shrink: 0; background: #fff; border-right: 1px solid #e5e7eb; display: flex; flex-direction: column; overflow: hidden; transition: width .18s; }
.sidebar.collapsed { width: 58px; min-width: 58px; }
.app-main { flex: 1; min-width: 0; display: flex; flex-direction: column; overflow: hidden; }
.side-head { display: flex; align-items: center; gap: 8px; padding: 12px 12px 8px; }
.icon-toggle { border: 0; background: #eef2ff; color: #3730a3; width: 30px; height: 30px; border-radius: 8px; cursor: pointer; font-size: 15px; flex-shrink: 0; }
.side-title { font-weight: 700; font-size: 15px; white-space: nowrap; }
.side-nav { display: flex; flex-direction: column; gap: 4px; padding: 8px; flex: 1; }
.side-btn { display: flex; align-items: center; gap: 8px; border: 0; background: transparent; padding: 9px 10px; border-radius: 8px; cursor: pointer; color: #475569; font-size: 14px; text-align: left; white-space: nowrap; }
.side-btn:hover { background: #f1f5f9; }
.side-btn.active { background: #eef2ff; color: #3730a3; font-weight: 600; }
.sf-ico { width: 22px; height: 22px; border-radius: 6px; background: #e2e8f0; color: #334155; display: inline-flex; align-items: center; justify-content: center; font-size: 12px; flex-shrink: 0; }
.side-foot { border-top: 1px solid #e5e7eb; padding: 8px; display: flex; flex-direction: column; gap: 4px; }
.side-foot button { display: flex; align-items: center; gap: 8px; border: 0; background: transparent; padding: 8px 10px; border-radius: 8px; cursor: pointer; color: #475569; text-align: left; white-space: nowrap; font-size: 14px; font-family: inherit; }
.side-foot button:hover { background: #f1f5f9; }
.sidebar.collapsed .side-title, .sidebar.collapsed .sf-txt { display: none; }
.sidebar.collapsed .side-btn, .sidebar.collapsed .side-foot button { justify-content: center; }
.sidebar.collapsed .side-head { justify-content: center; padding-left: 0; padding-right: 0; }
.icon-fs { border: 1px solid #cbd5e1; background: #f8fafc; color: #334155; padding: 6px 10px; border-radius: 8px; cursor: pointer; font-size: 13px; }
.icon-fs:hover { background: #eef2ff; color: #3730a3; }

/* ============ 填表信息栏 ============ */
.qinfo-panel { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 10px 12px; margin: 4px 0 12px; background: #fff; border: 1px solid var(--line); border-radius: 6px; }
.qinfo-panel label { font-size: 13px; color: var(--muted); }
.qinfo-panel .fi-in { padding: 5px 8px; border: 1px solid var(--line); border-radius: 6px; font-size: 13px; }
/* ⭐ #784：填表人员 / 标配五金 两个下拉是 .qinfo-panel 的 flex 子项，
 *   无显式宽度时在窄容器里会被 flex-shrink 压窄、选中文字被相邻 label「遮盖」。
 *   给固定宽度（下单报价 / 开始报价两模块共用 renderFillInfo，一处改两处生效）。 */
.qinfo-panel select.fi-in { width: 120px; flex-shrink: 0; }
/* ⭐⭐ #791：填表人员 / 标配五金 改自绘 combo（原生 select 弹层被报价页 overflow:hidden 裁剪）。
 *   .qm-combo 是 position:relative 的 inline-block：隐藏原生 select 仅作取值载体（提醒规则仍读它），
 *   可见部分是一个【可键入】文本框 + .combo-list 下拉面板（与「项目地址」完全同款，故不会被遮盖）。
 *   ⭐ #809：文本框不再是 readonly（用户要求「不能修改」必须能改），并给当前选中项加高亮。 */
.qm-combo { position: relative; display: inline-block; flex-shrink: 0; }
.qm-combo .qm-combo-native { display: none; }
.qm-combo .qm-combo-text { width: 120px; cursor: pointer; text-overflow: ellipsis; }
.qm-combo .combo-list { min-width: 160px; }
.combo-list .combo-item.cur { background: #e8f1fb; font-weight: 600; }

/* ⭐ 第九轮第2项：项目地址组合框下拉（一比一移植本地 quotation-module.html:14-20） */
.combo-list { position: absolute; left: 0; top: calc(100% + 2px); z-index: 50; min-width: 240px; max-height: 260px; overflow: auto; background: #fff; border: 1px solid var(--line, #ccc); border-radius: 6px; box-shadow: 0 4px 14px rgba(0,0,0,.12); }
.combo-list .combo-item { padding: 6px 10px; cursor: pointer; font-size: 13px; line-height: 1.5; border-bottom: 1px solid #f0f0f0; }
.combo-list .combo-item:last-child { border-bottom: none; }
.combo-list .combo-item:hover { background: #f2f6ff; }
.combo-list .combo-item .ci-addr { color: var(--muted, #666); font-size: 12px; margin-left: 6px; }
.combo-list .combo-item.ci-new { color: #1a73e8; font-weight: 600; }
.combo-list .combo-empty { padding: 8px 10px; color: var(--muted, #666); font-size: 12px; }

/* ============ 批量操作栏 ============ */
.batch-bar { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; padding: 8px 10px; margin-bottom: 12px; border: 1px dashed var(--line); border-radius: 6px; background: #fafafa; }
.batch-bar .bb-label { font-size: 12px; color: var(--muted); flex-shrink: 0; }
.batch-bar .bb-sel, .batch-bar .bb-in { padding: 5px 6px; border: 1px solid var(--line); border-radius: 6px; font-size: 12px; }
.batch-bar .bb-in { width: 130px; }
.batch-bar .bb-status { font-size: 12px; flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.batch-bar .btn { padding: 5px 10px; font-size: 12px; }
.batch-bar .btn.danger, .batch-bar .btn.lightred { border-color: #f0a8a8; color: #b03434; background: #fdf2f2; }
/* ⭐ #774（本轮·第1项）：业务表工具条两项微调，全部作用域限定在 #dashBatchBar 内，
   不新增任何全局通配选择器。
   ① .bb-count —— 统计文字「共 N 个工地 · M 份报价」改为 flex:0 0 auto + 自身省略：
      此前它挂 .bb-status（flex:1 1 auto）会 grow 撑满整行，把后面的筛选框/按钮挤换行；
      用户原话「统计文字的长度会根据数据量变多而变长…不要被遮盖住或是覆盖」。
      现在长文本由本元素自身 ellipsis 截断，容器 flex-wrap 换行，后续控件永不被覆盖。
   ② .bb-key —— 关键字筛选输入框（用户原话「筛选输入框不好看」）：此前是裸 input，
      浏览器默认外观，与旁边 12px 按钮明显不同高。现在对齐 .batch-bar 按钮观感。 */
#dashBatchBar .bb-count {
  font-size: 12px; color: var(--muted); flex: 0 0 auto;
  max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
#dashBatchBar .bb-key {
  width: auto; max-width: 200px; box-sizing: border-box;
  height: 27px; line-height: 25px; padding: 0 10px;
  font-family: inherit; color: var(--ink, #1f2937); background: #fff;
  border: 1px solid var(--line); border-radius: 6px;
  transition: border-color .12s, box-shadow .12s;
}
#dashBatchBar .bb-key:focus {
  outline: none; border-color: #2f6fbf;
  box-shadow: 0 0 0 2px rgba(47, 111, 191, .14);
}
#dashBatchBar .bb-key::placeholder { color: #9aa3b2; }

/* ============ 报价备注（多行）+ 汇总 ============ */
.note-totals { display: flex; gap: 14px; align-items: flex-start; margin-top: 12px; flex-wrap: wrap; }
.note-box { flex: 1; min-width: 260px; }
.note-box .nt-label { display: block; font-size: 13px; color: var(--muted); margin-bottom: 6px; }
.note-box .nt-actions { margin-bottom: 6px; display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
.note-box .nt-area { width: 100%; height: 96px; min-height: 60px; padding: 8px 10px; font-size: 13px; line-height: 1.6; resize: vertical; font-family: inherit; border: 1px solid var(--line); border-radius: 6px; box-sizing: border-box; }
/* 第十轮第11项：备注富文本（contenteditable）—— 一比一本地壳 note-editor（v1.62.3+） */
.note-box .nt-area.note-editor { height: auto; min-height: 96px; max-height: 320px; overflow: auto; }
.note-editor:empty:before { content: attr(data-ph); color: var(--muted); }
.note-editor:focus { outline: none; border-color: var(--accent, #2563eb); }
.note-editor img { max-width: 100%; }
.note-img-size { display: inline-flex; align-items: center; gap: 4px; font-size: 12px; color: var(--muted); }
.note-img-size label { margin: 0; color: var(--muted); }
.note-img-size input { width: 54px; padding: 2px 4px; font-size: 12px; }
.note-img-size i { font-style: normal; font-size: 11px; }
.note-totals .totals-box { flex: 0 0 auto; border-top: 0; margin-top: 0; padding-top: 0; }

/* ============ 行插入菜单 / 空间筛选隐藏 ============ */
.row-menu { position: fixed; z-index: 9999; background: #fff; border: 1px solid var(--line); border-radius: 6px; box-shadow: 0 6px 20px rgba(0,0,0,.14); display: flex; flex-direction: column; overflow: hidden; }
.row-menu button { border: 0; background: #fff; padding: 7px 14px; font-size: 13px; text-align: left; cursor: pointer; white-space: nowrap; }
.row-menu button:hover { background: #eef2ff; }
.space-card.filtered-out { display: none; }
.qe-top { gap: 8px; }
.qe-top h3 { margin-right: 6px; }


/* ============ 空间筛选：可搜索下拉（严格对齐本地 quotation-module.html:353-361 .pbt-*）============ */
.pbt-filter { position: relative; flex-shrink: 0; display: inline-block; }
.pbt-panel { position: absolute; top: calc(100% + 4px); left: 0; z-index: 2000; width: 250px; background: #fff; border: 1px solid var(--line); border-radius: 8px; box-shadow: 0 6px 18px rgba(0,0,0,.16); padding: 6px; }
.pbt-panel.hidden { display: none; }
.pbt-panel input[type=text] { width: 100%; box-sizing: border-box; padding: 6px 8px; border: 1px solid var(--line); border-radius: 6px; font-size: 12px; margin-bottom: 6px; color: var(--ink); background: #fff; }
.pbt-panel input[type=text]:focus { outline: none; border-color: var(--ink); }
.pbt-list { max-height: 240px; overflow: auto; }
.pbt-list .pbt-item { display: block; width: 100%; text-align: left; padding: 6px 8px; border: none; background: none; border-radius: 6px; cursor: pointer; font-size: 12px; color: var(--ink); }
.pbt-list .pbt-item:hover { background: #f0f0f0; }
.pbt-list .pbt-item.active { background: var(--ink); color: #fff; }
.pbt-list .pbt-item.active:hover { background: var(--ink); }
.pbt-list .pbt-empty { font-size: 12px; color: var(--muted); padding: 8px; text-align: center; }

/* ============ 单元格框选高亮（严格对齐本地 quotation-module.html:469-471）============ */
#quoteArea td.cell-sel,
#quoteArea td.cell-sel input,
#quoteArea td.cell-sel select { background: rgba(30,90,168,.16) !important; }
#quoteArea td.cell-sel { box-shadow: inset 0 0 0 2px #1e5aa8; }
#quoteArea td.cell-sel input, #quoteArea td.cell-sel select { background: transparent !important; }
#quoteArea td.cell-sel input:focus, #quoteArea td.cell-sel select:focus { background: #fff !important; }
/* 单元格框选时不选中文字（否则拖拽会变成原生文字选择） */
#quoteArea .space-card tbody td { user-select: none; }
#quoteArea .space-card tbody td input { user-select: text; }

/* 全屏按钮激活态 */
.icon-fs.fs-on { background: #eef2ff; color: #3730a3; border-color: #a5b4fc; }

/* ===== 一比一复刻本地 quotation-module.html 的组件样式（侧栏 / 业务表 / 配置表 / 弹窗）===== */
/* ⭐ #912：导航区不再 flex:1 吃满剩余空间（否则背景层无处安放）——
   基准=内容高度，空间不足时可收缩并滚动（导航优先）。 */
.sidebar .nav{flex:0 1 auto; min-height:0; overflow:auto; flex-direction:column; gap:0; padding:0; background:transparent; border-bottom:none;}
/* ⭐ #912：左侧栏背景图承载层 —— 夹在【导航栏下方】与【系统设置按钮上方】之间，
   flex:1 吃掉导航之后的全部剩余空间；background-image 由 applySidebarTheme() 内联注入。
   ⛔ 不含任何子控件 → 与系统设置按钮零重叠。 */
.sidebar .side-bg{flex:1 1 auto; min-height:0; position:relative; background-repeat:no-repeat; background-position:center; background-size:100% 100%;}
.sidebar .nav button{display:block; width:100%; padding:14px 18px; text-align:left; border:none; background:#fff; color:var(--ink); cursor:pointer; font-size:14px; border-left:3px solid transparent; transition:.15s;}
.sidebar .nav button:hover{background:#f0f0f0;}
.sidebar .nav button.active{border-left-color:var(--ink); background:#f7f7f7; font-weight:600;}
.sidebar .nav button .nav-ico{display:inline-flex; align-items:center; justify-content:center; width:16px; height:16px; margin-right:8px; vertical-align:-3px;}
.sidebar .nav button .nav-ico svg{width:16px; height:16px;}
.sidebar .side-head{display:flex; align-items:center; gap:8px; padding:0 18px; border-bottom:1px solid var(--line);}
.sidebar .side-head h1{font-size:18px; padding:18px 0; letter-spacing:1px; margin:0;}
#pageTitle{display:flex; align-items:center; gap:8px;}
#pageTitle .page-ico{display:inline-flex; align-items:center;}
#pageTitle .page-ico svg{width:18px; height:18px;}

.project-list{display:grid; gap:14px;}
.dash-cards{display:grid; grid-template-columns:repeat(4,1fr); gap:10px; margin-bottom:12px;}
.dash-card{border:1px solid var(--line); border-radius:8px; padding:8px 10px 8px 13px; background:#fff; display:flex; flex-direction:column; gap:2px; min-width:0;}
.dash-card .dc-name{font-size:14px; color:#111; line-height:1.4; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;}
.dash-card .dc-val{font-size:18px; font-weight:700; line-height:1.5; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; text-align:left;}
.dash-card .dc-sub{font-size:14px; color:#111; line-height:1.4;}
.project{border:1px solid var(--line); padding:14px; border-radius:10px;}
.project header{display:flex; justify-content:space-between; align-items:center; margin-bottom:10px;}
.project h4{font-size:15px; font-weight:600;}
/* ⭐ #833 业务表项目地址卡片：项目名称行上下留白归零。
   根因不是 .project 数值写错（与本地 quotation-module.html:188-191 逐字符相同），
   而是 SaaS 的全局重置只有 `*{box-sizing:border-box}`、缺本地 :12 的 margin:0/padding:0
   → <h4> 保留浏览器默认 margin:1.33em 0，卡片内上下各凭空多出约 19.95px。
   本地靠 * 重置归零，故此处作用域限定补齐（不动 .project 基础数值，
   避免连带影响复用同一 class 的模板库卡片 app.js:4162）。 */
#projectList .project h4{margin:0;}
#projectList .project header h4 + .muted{margin:0;}
.quote-chip{display:inline-flex; align-items:center; gap:8px; border:1px solid var(--line); padding:6px 10px; margin:0 8px 8px 0; font-size:13px; border-radius:8px;}
.quote-chip .time{font-size:11px; color:var(--muted);}
.q-status{display:inline-flex; align-items:center; padding:2px 9px; border-radius:9px; background:#e2f3e2; color:#1d7a2e; font-size:11px; line-height:1.5; white-space:nowrap; border:1px solid #c4e6c6;}
.q-status.final{background:#fdf3c4; color:#8a6a00; font-weight:600; border-color:#ecdd8e;}
.q-status.amount{background:#e6f4ff; color:#0a6ed1; border-color:#b3d9ff; font-weight:600;}
.cust-sep{margin:0 6px; color:var(--muted);}
.cust-tag{display:inline-block; padding:1px 8px; border-radius:9px; background:#e8f7ec; color:#1d7a2e; border:1px solid #b7e0c2; font-size:12px; margin-left:2px;}
.icon-del{display:inline-flex; align-items:center; justify-content:center; width:24px; height:24px; border:none; border-radius:6px; background:linear-gradient(180deg,#ef6b6f,#e5484d); color:#fff; font-size:14px; line-height:1; cursor:pointer; padding:0; box-shadow:0 1px 2px rgba(0,0,0,.08); transition:.15s; flex-shrink:0;}
.icon-del:hover{background:linear-gradient(180deg,#f28084,#ec5a5f);}
.icon-act{display:inline-flex; align-items:center; justify-content:center; width:24px; height:24px; border:1px solid var(--line); border-radius:6px; background:#fff; color:#5b6472; font-size:13px; line-height:1; cursor:pointer; padding:0; flex-shrink:0; transition:.15s;}
.icon-act:hover{border-color:#4a90e2; color:#2f6fd0; background:#f2f8ff;}

.cfg-nav{display:flex; gap:8px; border-bottom:1px solid var(--line); margin-bottom:16px; flex-wrap:wrap;}

/* ⭐⭐ #833 报价编辑硬锁：他人正在编辑时本端只读 —— 视觉上明确区别于可编辑态
   （浅灰底 + 禁用光标 + 禁用态控件变灰），避免用户以为"能点但存不进去"。 */
.qm-readonly .qtable input, .qm-readonly .qtable textarea, .qm-readonly .qtable select{
  background:#f6f7f9 !important; color:#8a8f98 !important; cursor:not-allowed; border-color:#e4e6ea !important;}
.qm-readonly .qtable button, .qm-readonly .sc-actions button{opacity:.45; cursor:not-allowed;}
.qm-readonly .sc-quick, .qm-readonly .icon-del, .qm-readonly .icon-act{pointer-events:none;}
.cfg-nav button{border:1px solid var(--line); background:#fff; padding:8px 16px; cursor:pointer; font-size:13px; color:var(--ink); border-radius:8px; transition:.15s;}
.cfg-nav button:hover{border-color:var(--ink);}
.cfg-nav button.active{background:var(--ink); color:#fff; border-color:var(--ink);}
/* ⭐⭐ #772：配置表六页签恢复本地【上下分布】布局。
 * 根因：SaaS 的 .card（styles.css:50）带 `display:flex; align-items:center;
 * justify-content:space-between`，而 switchCfg() 把六个面板都建成
 * `class="card cfg-pane"` → 全部继承 flex-direction:row，h3 / batch-bar /
 * table / 添加按钮 被横向排开（用户反馈的「左右排版布局」）。
 * 本地 quotation-module.html:144 的 .card 是**普通块级纵向流**（只有
 * border/padding/margin/background/border-radius，无 display）。
 *
 * ⛔ 修法必须是【作用域限定】而不是改全局 .card —— 全站还有两处依赖
 *    .card 的 flex + space-between：app.js:1011 openQuotes 报价卡片
 *    （左标题右按钮两栏）、app.js:3788 模板库卡片（内联 display:flex）。
 *    这里只把 #config .cfg-pane 拉回块级，两处卡片零影响。 */
#config .cfg-pane {
  display: block;                 /* ← 覆盖 .card 的 flex，回到本地块级纵向流 */
  align-items: stretch;
  justify-content: flex-start;
  margin-top: 16px;
}
/* 本地 quotation-module.html:144 .card 的其余观感（border/padding/bg/radius 沿用全局 .card 即可） */
/* ⭐ #772：产品配置表专属「固定头 + 下方内容独立滚动」整页高度布局。
 *   本地 quotation-module.html:415-417，产品配置表内容很长，必须固定头 + 内容区自滚，
 *   否则批量操作栏会被内容顶出视口。本地只有 products 有这个规则，其余五页是自然流。 */
#config .cfg-pane[data-cfg="products"] {
  display: flex;
  flex-direction: column;
  height: calc(100vh - 190px);
  min-height: 360px;
  padding: 0 20px 16px;
}
#config .cfg-pane[data-cfg="products"] .cfg-fixed { flex-shrink: 0; }
/* ⭐ #772：「配置表格设置」折叠区在 flex 列里也必须不压缩，
 *   否则展开后内容会被 .cfg-scroll 挤扁。本地是自然流故无需此条。 */
#config .cfg-pane[data-cfg="products"] .cfg-tblsettings { flex-shrink: 0; }
#config .cfg-pane[data-cfg="products"] .cfg-scroll { flex: 1 1 auto; overflow: auto; min-height: 0; margin-top: 10px; padding-right: 4px; }
/* ⭐ #772：标题行与右侧按钮组同一行（本地 quotation-module.html:428-429）。
 *   SaaS 此前未定义 .cfg-title-row，h3 与撤销/恢复/到底部按钮组会各占一整行。 */
#config .cfg-title-row { display: flex; align-items: center; gap: 10px; margin: 4px 0 8px; }
#config .cfg-title-row h3 { margin: 0; flex: 1 1 auto; }
/* ⭐ #772：信息提示圈 + 悬停气泡（1:1 本地 quotation-module.html:226-231）。
 *   SaaS 此前完全没有 .info-tip / .tip-bubble 样式，配置表里那 4 处 <i class="info-tip">i</i>
 *   是无样式的裸文字「i」，hover 也弹不出说明气泡。
 *   ⛔ 作用域限定在 #config 内（本地是全局，但 SaaS 其它模块未用此组件，不扩散）。 */
#config .info-tip {
  display: inline-flex; align-items: center; justify-content: center;
  width: 16px; height: 16px; border-radius: 50%; border: 1px solid var(--muted);
  color: var(--muted); font-size: 11px; font-style: normal; font-weight: 600;
  cursor: help; position: relative; background: #fff; vertical-align: middle;
  margin-left: 4px; flex-shrink: 0; user-select: none;
}
#config .info-tip:hover { border-color: var(--ink); color: #fff; background: var(--ink); }
#config .info-tip .tip-bubble {
  display: none; position: absolute; left: -1px; top: 22px; width: 216px;
  background: #333; color: #fff; font-size: 12px; font-weight: 400; font-style: normal;
  line-height: 1.7; padding: 8px 11px; border-radius: 6px; z-index: 60;
  white-space: normal; text-align: left;
}
#config .info-tip:hover .tip-bubble { display: block; }
#config .info-tip.tip-open .tip-bubble { display: block; }
#config .info-tip .tip-bubble::after {
  content: ''; position: absolute; top: -5px; left: 10px;
  border: 5px solid transparent; border-bottom-color: #333; border-top: 0;
}
/* ⭐ #772：批量操作栏上下留白对齐本地（margin:10px 0 4px），全局 .batch-bar 只有 margin-bottom:12px */
#config .cfg-pane > .batch-bar { margin: 10px 0 4px; }
/* ⭐ #772：表格标题下的说明段落（本地各页签统一 p.muted 紧跟 h3） */
#config .cfg-pane > p.muted { margin: 4px 0 8px; font-size: 12.5px; }
/* ⭐ #772：底部「添加行 / 保存配置」按钮行（本地 quotation-module.html:924/939/954 的 margin-top:10px 容器） */
#config .cfg-pane > .cfg-foot-row { margin-top: 10px; display: flex; gap: 8px; flex-wrap: wrap; }
.cfg-scroll{margin-top:10px;}
.cfg-in{width:100%; padding:6px 8px; border:1px solid var(--line); border-radius:6px;}
.pcard{border:1px solid var(--line); border-radius:10px; padding:12px 14px; margin-bottom:12px; background:#fff;}
.pcard h4{font-size:14px; font-weight:600; margin-bottom:6px;}
.cust-table{width:100%; border-collapse:collapse; background:#fff;}
.cust-table th,.cust-table td{border:1px solid var(--line); padding:8px 10px; font-size:13px; text-align:left;}
.cust-table th{background:#f7f7f7; font-weight:600;}
/* ⭐ 第2项：整行可点击 → 悬停高亮 + 手型，明确「点哪都能开」 */
.cust-table tbody tr.cust-row{cursor:pointer; transition:background .12s;}
.cust-table tbody tr.cust-row:hover{background:#eef6ff;}
.cust-table tbody tr.cust-row:hover td{border-color:#c7ddf5;}
.badge{display:inline-block; min-width:20px; text-align:center; padding:1px 7px; border-radius:9px; background:#e6f4ff; color:#0a6ed1; border:1px solid #b3d9ff; font-size:12px;}

/* ===== 弹窗信息卡片（用户拍板 H 稿：前三张深蓝 + 金额卡深桔；等宽等高平分）===== */
.icard-row{display:flex; gap:10px; align-items:stretch;}
.icard{flex:1 1 0; min-width:0; height:68px; border-radius:10px; padding:10px 14px; box-sizing:border-box;
       display:flex; flex-direction:column; justify-content:space-between;
       background:linear-gradient(160deg,#1e5aa8 0%,#17457f 100%); border:1px solid #143c6f;
       box-shadow:0 2px 6px rgba(20,60,111,.18);}
.icard .k{font-size:11.5px; line-height:1.3; color:rgba(255,255,255,.72); white-space:nowrap; overflow:hidden; text-overflow:ellipsis;}
.icard .v{font-size:15px; font-weight:700; line-height:1.3; color:#fff; overflow:hidden; text-overflow:ellipsis;
           display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; word-break:break-all;}
.icard .v.sm{font-size:13px; font-weight:600;}
/* 金额卡：深桔（唯一异色，用于强调） */
.icard.amt{background:linear-gradient(160deg,#a35a1f 0%,#824616 100%); border-color:#6d3a12; box-shadow:0 2px 6px rgba(130,70,22,.22);}
.icard.amt .v{color:#ffe3c2;}

/* ===== 弹窗内联筛选：日期折叠为下拉 + 年度下拉（减少视觉噪音）===== */
.cd-filters{display:flex; gap:10px; align-items:center; flex-wrap:wrap; margin-top:12px; padding-top:12px; border-top:1px dashed var(--line,#ddd);}
.cd-dd{position:relative;}
.cd-dd>button{display:flex; align-items:center; gap:6px; padding:6px 12px; font-size:13px;}
.cd-dd>button.on{background:linear-gradient(180deg,#eaf2fd,#dbe9fb); border-color:#a9c8ec; color:#1d4f8f;}
.cd-dd .cd-pop{position:absolute; top:calc(100% + 6px); left:0; z-index:30; min-width:290px; padding:12px;
               background:#fff; border:1px solid var(--line,#ddd); border-radius:10px; box-shadow:0 10px 28px rgba(0,0,0,.16);}
.cd-dd .cd-pop.hidden{display:none;}
.cd-dd .cd-pop input[type=date]{padding:5px 8px; border:1px solid var(--line,#ddd); border-radius:6px; font-size:13px;}
.cd-dd .cd-pop .cd-row{display:flex; gap:6px; align-items:center; margin-bottom:10px;}
.cd-dd .cd-pop .cd-btns{display:flex; justify-content:flex-end; gap:8px;}

.modal-overlay{position:fixed; inset:0; background:rgba(0,0,0,.45); display:flex; align-items:center; justify-content:center; z-index:2000;}
.modal-overlay.hidden{display:none !important;}
.modal-box{background:#fff; border:1px solid var(--ink); width:900px; max-width:94vw; max-height:88vh; display:flex; flex-direction:column; box-shadow:0 10px 40px rgba(0,0,0,.25); border-radius:14px;}
/* ⭐ 弹窗标题栏统一 36px 高（用户拍板）—— 全系统所有弹窗共用此骨架，改这一处即全局一致。
   算式：padding 8px*2 + line-height 20px = 36px。⛔ 任何弹窗不得再写内联 padding 覆盖 header。 */
.modal-box header{display:flex; justify-content:space-between; align-items:center; height:36px; padding:0 18px; border-bottom:1px solid var(--line); box-sizing:border-box;}
.modal-box header h3{font-size:14px; font-weight:600; line-height:20px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;}
.modal-box .modal-close{cursor:pointer; font-size:18px; line-height:1; color:var(--muted); padding:2px 4px; border-radius:6px; transition:.15s;}
.modal-box .modal-close:hover{background:#f1f1f1; color:var(--ink);}
.modal-box .modal-body{padding:14px 18px; overflow:auto;}
#systemModal .cfg-nav{flex:0 0 auto; z-index:30; background:#fff; padding:12px 18px 8px; margin-bottom:0;}
#systemModal .modal-body{flex:1 1 auto; min-height:0; overflow:auto;}
#systemModal #systemModalBody{padding-top:14px;}
/* ⭐ #7：原 `#systemModalBody .sys-save-footer{position:sticky;bottom:0;…}` 已删除 ——
   保存栏不再内嵌滚动正文，改由弹窗真实页脚 #sysModalFooter 承载（见下方）。
   sticky 嵌在 overflow:auto 的 .modal-body 内正是「被内容越界/重叠」的根因，故彻底移除而非留死规则。 */
.nav-rename-list{margin-top:12px; border:1px solid var(--line); border-radius:8px; overflow:hidden;}
.nav-rename-row{display:flex; align-items:center; gap:10px; padding:8px 12px; border-bottom:1px solid var(--line);}
.nav-rename-row:last-child{border-bottom:none;}
.nav-rename-row .chk-wrap{min-width:130px; display:flex; align-items:center; gap:6px;}
.nav-rename-row input[type=text]{flex:1 1 auto; padding:6px 8px; border:1px solid var(--line); border-radius:6px;}
.sys-pane h3{font-size:15px; font-weight:600; margin-bottom:8px;}
/* ===== ⭐ 第七轮第7项：系统设置面板子卡片体系（对齐本地版 .card style="background:#fafafa"）=====
   所有面板共用；作用域限定 #systemModal 内，不影响其它区域。 */
#systemModalBody .sys-card{background:#fafafa; border:1px solid var(--line); border-radius:8px; padding:12px 14px; margin-top:14px;}
#systemModalBody .sys-card:first-of-type{margin-top:10px;}
#systemModalBody .sys-card h4{font-size:13.5px; font-weight:600; margin:0 0 6px;}
#systemModalBody .sys-tip{margin:0 0 10px; font-size:12.5px; line-height:1.7;}
#systemModalBody .sys-bar{margin-top:12px; align-items:center; gap:10px;}
#systemModalBody .sys-msg{font-size:12.5px;}
#systemModalBody .sys-tip-inline{font-size:12px; margin-left:4px;}
#systemModalBody .sys-ro{font-size:13px; color:var(--muted); align-self:center; margin-right:14px;}
#systemModalBody .sys-ul{margin:2px 0 0 18px; padding:0; font-size:12.5px; line-height:2; color:var(--muted);}
#systemModalBody .sys-color{width:38px; height:30px; padding:2px; cursor:pointer; border:1px solid var(--line); border-radius:6px; background:#fff;}
#systemModalBody .sys-num,#systemModalBody .sys-sel,#systemModalBody .sys-time,#systemModalBody .sys-dt{padding:6px 8px; border:1px solid var(--line); border-radius:6px; font-size:13px;}
#systemModalBody .sys-sel{min-width:110px;}
#systemModalBody .sys-chk{display:inline-flex; align-items:center; gap:5px; font-size:12.5px; color:var(--ink);}
#systemModalBody .sys-img-prev{margin-top:10px; padding:8px; border:1px dashed var(--line); border-radius:6px; background:#fff; text-align:center; min-height:44px; display:flex; align-items:center; justify-content:center;}
#systemModalBody .sys-img-prev img{max-width:100%; max-height:110px; border-radius:4px;}
#systemModalBody .sys-head-grid{display:grid; grid-template-columns:repeat(2, minmax(240px,1fr)); gap:8px 18px; margin-top:10px;}
#systemModalBody .sys-head-row{display:flex; align-items:center; gap:10px;}
#systemModalBody .sys-head-row>label{min-width:72px; font-size:12.5px; color:var(--muted);}
#systemModalBody .sys-head-row>input[type=text],#systemModalBody .sys-head-row>input:not([type]){flex:1; min-width:0; padding:6px 8px; border:1px solid var(--line); border-radius:6px; font-size:13px;}
#systemModalBody .sys-subtabs{margin-top:10px; margin-bottom:4px;}
#systemModalBody .sys-subtabs button{font-size:12.5px;}
/* ===== 系统设置弹窗基础表单构件（.form-row / .chk-wrap / .file-upload-btn / .qt-subtabs）
   ⛔ 作用域严格限定 #systemModal，避免全局 input{} 污染（对齐「禁全局 input{}/body{}」铁律）*/
#systemModal .form-row{display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-top:8px;}
#systemModal .form-row>label{font-size:12.5px; color:var(--muted); white-space:nowrap;}
#systemModal .form-row>input[type=text],#systemModal .form-row>input:not([type]),#systemModal .form-row>select{flex:0 1 auto; min-width:120px; padding:6px 8px; border:1px solid var(--line); border-radius:6px; font-size:13px;}
#systemModal .form-row>input[readonly]{background:#f1f5f9; color:var(--muted);}
#systemModal .form-row>input[type=password]{flex:0 1 auto; min-width:150px; padding:6px 8px; border:1px solid var(--line); border-radius:6px; font-size:13px;}
#systemModal .form-row>input[type=color]{width:38px; height:30px; padding:2px; cursor:pointer; border:1px solid var(--line); border-radius:6px; background:#fff;}
#systemModal .form-row>input[type=number]{padding:6px 8px; border:1px solid var(--line); border-radius:6px; font-size:13px;}
#systemModal .form-row>input[type=time],#systemModal .form-row>input[type=datetime-local]{padding:6px 8px; border:1px solid var(--line); border-radius:6px; font-size:13px;}
#systemModal .chk-wrap{display:inline-flex; align-items:center; gap:8px; font-size:12.5px; cursor:pointer; white-space:nowrap;}
/* ===== ⭐⭐ #911：系统设置弹窗内【所有勾选项】→ 开关按钮（对齐用户提供的参考图：胶囊轨道 + 白色圆钮）
   开 = 深蓝 #1e40af（用户要求：参考图的绿色 → 深蓝色）；关 = 浅灰 #e3e6ec + 白色圆钮在左。
   ⛔ 纯 CSS 实现（appearance:none + ::after 圆钮），零 HTML / 零事件绑定改动：
      勾选态仍由原生 :checked 驱动，所有 onchange / sc() 取值 / 保存逻辑完全不变。
   ⛔ 作用域严格限定 #systemModal —— 配置表页、报价页表格里的行勾选框（.cfg-chk 等）不受影响。 */
#systemModal input[type=checkbox]{
  -webkit-appearance:none; appearance:none;
  width:42px; height:24px; min-width:42px; flex:0 0 auto; margin:0; padding:0;
  border:0; border-radius:999px; background:#e3e6ec; position:relative; cursor:pointer;
  vertical-align:middle; transition:background .22s ease, box-shadow .22s ease;
  box-shadow: inset 0 0 0 1px rgba(15,23,42,.07), inset 0 2px 4px rgba(15,23,42,.10);
}
#systemModal input[type=checkbox]::after{
  content:''; position:absolute; top:2px; left:2px; width:20px; height:20px; border-radius:50%;
  background:#fff; box-shadow:0 1px 3px rgba(15,23,42,.35); transition:left .22s ease;
}
#systemModal input[type=checkbox]:checked{
  background:#1e40af;
  box-shadow: 0 0 0 1px rgba(30,64,175,.55), 0 1px 4px rgba(30,64,175,.38);
}
#systemModal input[type=checkbox]:checked::after{ left:20px; }
#systemModal input[type=checkbox]:focus-visible{ outline:2px solid #93c5fd; outline-offset:2px; }
#systemModal input[type=checkbox]:disabled{ opacity:.5; cursor:not-allowed; }
#systemModal .file-upload-btn{display:inline-flex; align-items:center; justify-content:center; padding:6px 14px; font-size:13px;
  border:1px solid var(--line); border-radius:8px; background:linear-gradient(180deg,#fff,#f1f1f1); color:var(--ink); cursor:pointer; transition:.15s;}
#systemModal .file-upload-btn:hover{background:linear-gradient(180deg,#f7f7f7,#e9e9e9);}
#systemModal .qt-subtabs{display:flex; gap:6px; flex-wrap:wrap; border-bottom:1px solid var(--line); padding-bottom:8px; margin-bottom:10px;}
#systemModal .qt-subtabs .btn{font-size:12.5px; padding:6px 12px;}
#systemModal .qt-subtabs .btn.active{background:var(--ink); color:#fff; border-color:var(--ink);}
/* 空闲锁定遮罩（独立 DOM，不占用业务容器）*/
.idle-lock-ov{position:fixed; inset:0; z-index:3000; background:rgba(15,23,42,.86); display:flex; align-items:center; justify-content:center;}
.idle-lock-box{background:#fff; border-radius:12px; padding:26px 30px; width:420px; max-width:92vw; box-shadow:0 12px 40px rgba(0,0,0,.35);}
.idle-lock-box h3{font-size:16px; font-weight:600; margin:0 0 12px; color:#b42318;}
.idle-lock-box p{font-size:13.5px; line-height:1.7; color:var(--muted); margin:0 0 14px;}
.idle-lock-box input{width:100%; padding:9px 10px; border:1px solid var(--line); border-radius:6px; font-size:13.5px; box-sizing:border-box;}
.content>.panel.hidden{display:none !important;}
/* ⭐ #772：配置表二级导航固定（1:1 本地 quotation-module.html:411 #cfgNav sticky）。
 *   此前只有 position:sticky + 白底，缺 z-index 层级、负边距出血与投影，
 *   页签行在长表格下滚时会被内容盖住一半。 */
#config #cfgNav{position:sticky; top:0; z-index:1000; background:#fff; padding:8px 20px 10px; margin:0 -20px 0; box-shadow:0 2px 6px rgba(0,0,0,.12); border-bottom:1px solid var(--line);}
.content.cfg-mode .cfg-nav{position:sticky; top:0; z-index:20; background:#fff;}
/* ⭐ 第十轮第8项：PDF 预览页顶部工具栏固定 —— 内容滚动时「← 返回 / 选择要显示的列 / 导出 / 打印 / 页数」始终可见。
   滚动发生在 .content（overflow:auto），sticky 相对其 scrollport：top:0 贴可视顶；
   负 margin 抵消 .panel 的 20px 内边距，使工具栏通栏且自带白底遮住滚动内容。 */
#preview .pv-toolbar {
  position: sticky; top: 0; z-index: 30;
  background: #fff;
  margin: -20px -20px 12px; padding: 10px 20px;
  border-bottom: 1px solid var(--line, #e5e7eb);
  box-shadow: 0 2px 6px rgba(15, 23, 42, .05);
}
/* 一比一：本地 quotation-module.html:73-74 —— .content{flex:1;overflow:auto;padding:20px} .panel{background:#fff;border:1px solid var(--line);min-height:100%;padding:20px} */
.content { flex: 1; overflow: auto; padding: 20px; }
.content>.panel { background: #fff; border: 1px solid var(--line); min-height: 100%; padding: 20px; }
/* ⭐ #3/#4：报价面板 = 三段式布局的 flex 根（自身透明无边框、padding:0），精确占满内容区、内部自滚动。
 *   对齐模板页同款 .content:has(>#template...) 手法：报价页激活时 .content 改 flex 且不滚动，面板内部滚动。 */
.content:has(>#quote:not(.hidden)) { display: flex; overflow: hidden; }
#quote.panel { flex: 1; min-width: 0; min-height: 0; box-sizing: border-box; display: flex; flex-direction: column; overflow: hidden; padding: 0; border: 0; background: transparent; }
/* ⭐ #4-A：隐藏全局顶栏 SaaS 文字（整木报价 SaaS / 门店名+版本徽章 / 容量配额）—— 用户要求所有页面隐藏；保留 .me（退出/全屏/头像）。 */
.topbar .brand, .topbar .store, .topbar .quota { display: none !important; }
/* ⭐ #6：备注框高度可调把手（contenteditable 无原生 resize）+ 落库记忆 */
.nt-resize { height: 7px; margin-top: 2px; cursor: row-resize; border-radius: 4px; background: linear-gradient(180deg,#eef1f6,#e2e8f0); }
.nt-resize:hover { background: linear-gradient(180deg,#dbe4f0,#cdd8e6); }
/* ⭐ #7：系统设置弹窗真实页脚（flex 子项，恒在底部，内容永不越界/重叠） */
#systemModal #sysModalFooter { flex: 0 0 auto; border-top: 1px solid var(--line); background: #fff; padding: 12px 18px; display: flex; gap: 10px; align-items: center; }
/* 模板编辑页特殊：面板自身即「整屏三栏工作区」，不随内容长高（本地 .editor-wrap 用 calc(100vh-136px) 达到同一效果）
   ⛔ 不可用 height:100% —— 父级 .content 是 overflow:auto 的 flex 子项，块级 height:100% 会解析失败把面板压成 0 宽。
   改用 flex 撑满 + .content 对 template 单独解除滚动，让内部画布区自己滚。 */
.content:has(>#template:not(.hidden)) { display: flex; overflow: hidden; }
.content>.panel#template { flex: 1; min-width: 0; min-height: 0; box-sizing: border-box; display: flex; flex-direction: column; overflow: hidden; }
/* ⛔ .app-main 的 overflow:hidden 保留（本地 .main 同款），但不要给 #app 加 overflow:hidden */

/* ===== Toast 系统内提示（对齐本地壳 quotation-module.html:434-437）===== */
.sys-toast-wrap{position:fixed; top:14px; left:50%; transform:translateX(-50%); z-index:2100; display:flex; flex-direction:column; align-items:center; gap:8px; pointer-events:none;}
.sys-toast{background:#e3f5e8; color:#17683a; border:1px solid #b7dfc2; padding:10px 24px; font-size:14px; border-radius:10px; box-shadow:0 4px 16px rgba(0,0,0,.18); opacity:0; pointer-events:none; transition:opacity .6s; white-space:nowrap;}
.sys-toast.show{opacity:1;}
.sys-toast.error{background:#f5c542; color:#5c4400; border-color:#d9a300;}

/* ============================================================================
 * 第4项：左侧栏「全部隐藏」+ 右侧立牌按钮
 * 需求原文：「隐藏时左侧栏全部隐藏干净，隐藏展开的按钮在左侧栏的右边，不是在左侧栏里面」
 * 实现：.sidebar.hidden → width:0 / min-width:0 / border:0（彻底消失，不再留 58px 图标条）
 *       .rail-btn 是 #app 的直接子元素（非侧栏内部），absolute 定位于侧栏右边缘外侧，
 *       侧栏归零后 left 变为 0，按钮仍停在屏幕最左。
 * ========================================================================== */
#app { position: relative; }                 /* rail-btn 的定位上下文 */
.sidebar.rail-hidden { width: 0 !important; min-width: 0 !important; border-right: 0 !important; }
.sidebar.rail-hidden * { visibility: hidden; }  /* 宽度归零过程中不残留文字溢出 */
.rail-btn {
  position: absolute; top: 3px; left: 200px; z-index: 40;   /* ⭐ 第十轮第9项：移到顶栏高度中间（顶栏 46px，立牌 40px → top 3px 居中） */
  width: 18px; height: 40px; padding: 0;
  background: #1c2333; color: #fff;
  border: 1px solid #1c2333; border-left: 0;
  border-radius: 0 8px 8px 0;
  cursor: pointer; font-size: 15px; line-height: 1;
  display: flex; align-items: center; justify-content: center;
  transition: left .18s ease, background .15s;
  box-shadow: 2px 0 8px rgba(15, 23, 42, .16);
}
.rail-btn:hover { background: #2a3550; }
.rail-btn::before { content: "\2039"; font-size: 17px; font-weight: 700; }
#app.rail-closed .rail-btn { left: 0; border-radius: 0 8px 8px 0; }
#app.rail-closed .rail-btn::before { content: "\203A"; }

/* ============================================================================
 * 第5项：右上角用户头像 + 下拉菜单（取代原侧栏底部「用户信息」按钮）
 * ========================================================================== */
.avatar-wrap { position: relative; display: inline-flex; align-items: center; }
.avatar-btn {
  width: 30px; height: 30px; border-radius: 50%; padding: 0;
  border: 0; cursor: pointer; overflow: hidden; flex-shrink: 0;
  background: linear-gradient(135deg, #3b82f6, #1d4ed8); color: #fff;
  font-size: 13px; font-weight: 600; font-family: inherit;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 0 0 2px #fff, 0 0 0 3px #dbe4f0;
  transition: box-shadow .15s;
}
.avatar-btn:hover { box-shadow: 0 0 0 2px #fff, 0 0 0 3px #3b82f6; }
.avatar-btn img { width: 100%; height: 100%; object-fit: cover; display: block; }
.avatar-menu {
  position: absolute; top: 38px; right: 0; width: 224px; z-index: 2200;
  background: #fff; border: 1px solid #e3e6ec; border-radius: 11px;
  box-shadow: 0 12px 34px rgba(15, 23, 42, .18);
  overflow: hidden; text-align: left;
}
.avatar-menu.hidden { display: none !important; }
.am-head {
  padding: 13px 14px; border-bottom: 1px solid #eceef3;
  background: linear-gradient(135deg, #f8fafc, #eef2f7);
  display: flex; gap: 10px; align-items: center;
}
.am-head .am-av {
  width: 38px; height: 38px; border-radius: 50%; flex-shrink: 0; overflow: hidden;
  background: linear-gradient(135deg, #3b82f6, #1d4ed8); color: #fff;
  font-size: 15px; font-weight: 600;
  display: flex; align-items: center; justify-content: center;
}
.am-head .am-av img { width: 100%; height: 100%; object-fit: cover; }
.am-head b { font-size: 13px; color: #1f2430; display: block; line-height: 1.3; }
.am-head span { font-size: 11px; color: #6b7280; display: block; margin-top: 1px; word-break: break-all; }
.am-role {
  display: inline-block; font-size: 9.5px; font-weight: 700; letter-spacing: .5px;
  background: #1c2333; color: #fff; border-radius: 20px; padding: 1px 7px; margin-top: 4px;
}
.am-item {
  display: flex; align-items: center; gap: 9px; width: 100%;
  padding: 9px 14px; font-size: 12.5px; color: #374151;
  background: transparent; border: 0; cursor: pointer; text-align: left; font-family: inherit;
}
.am-item:hover { background: #f5f7fa; }
.am-item .am-ic { width: 16px; text-align: center; color: #8a94a6; font-size: 12px; flex-shrink: 0; }
.am-item.danger { color: #b91c1c; }
.am-item.danger .am-ic { color: #b91c1c; }
.am-sep { height: 1px; background: #eceef3; margin: 4px 0; }
.am-store { padding: 8px 14px 10px; font-size: 11.5px; color: #6b7280; border-top: 1px solid #eceef3; background: #fafbfd; }
.am-store b { color: #1f2430; }

/* ============================================================================
 * 第6项：打印 PDF —— @media print 只输出 A4 页面流（隐藏侧栏/顶栏/工具栏）
 * 配合 app.js 的 printQuotePreview()：加 body.printing-pdf 后调 window.print()
 * ========================================================================== */
@media print {
  @page { size: A4 portrait; margin: 0; }
  body { background: #fff !important; }
  /* 隐藏一切非页面流元素 */
  .sidebar, .rail-btn, .topbar, .avatar-menu, .sys-toast-wrap,
  .toolbar, .batch-bar, .modal-overlay, #auth, .content > .panel:not(#preview) {
    display: none !important;
  }
  #app { display: block !important; height: auto !important; overflow: visible !important; }
  .app-main { display: block !important; overflow: visible !important; height: auto !important; }
  .content { overflow: visible !important; padding: 0 !important; height: auto !important; }
  #preview, .content > .panel { border: 0 !important; padding: 0 !important; min-height: 0 !important; }
  #previewBody, .pdf-preview-host { overflow: visible !important; height: auto !important; padding: 0 !important; background: #fff !important; }
  .pdf-page {
    box-shadow: none !important; margin: 0 !important; page-break-after: always; break-after: page;
    width: 100% !important; max-width: none !important;
  }
  .pdf-page:last-child { page-break-after: auto; break-after: auto; }
}
/* 打印期间：屏幕上同样隐藏干扰元素，避免打印预览闪烁 */
body.printing-pdf .sidebar, body.printing-pdf .rail-btn, body.printing-pdf .topbar,
body.printing-pdf .toolbar, body.printing-pdf .sys-toast-wrap { visibility: hidden !important; }

/* ============================================================================
 * ⭐ 第6项：公开注册已取消 —— 门店类型单选组（.radio-row）随注册表单一并移除，其样式不再需要。
 *   作用域本就限定在 .auth-card 内（无全局 input{}/body{}/*{}），移除后对主应用零影响。
 *   新增：登录卡底部「联系管理员开号」说明。
 * ========================================================================== */
.auth-card .auth-foot-note {
  margin: 16px 0 0; padding-top: 13px;
  border-top: 1px solid #eef1f6;
  font-size: 12.5px; color: #8a93a3; text-align: center; line-height: 1.6;
}

/* =============================================================================
 * #775（本轮·第2项）客户管理：工具条 sticky + 统计最右 + 下拉项 hover 背景
 * ---------------------------------------------------------------------------
 * 作用域全部限定在客户管理面板内，⛔ 无任何全局通配选择器（不写 * / 裸 div / body）。
 * 1) .cust-quickbar  —— 添加客户等按钮组置顶固定（本地 quote-part-03:1999 同款 sticky）
 * 2) #custStat       —— 统计文字靠最右，长文本只压缩自身、绝不覆盖左侧按钮
 * 3) .cust-name-item —— 客户名称下拉项 hover 底色（内联 style 无法表达 :hover，故走 class）
 * ============================================================================= */
#customerHost .cust-quickbar { position: sticky; top: -10px; z-index: 8; }
#customerHost #custStat { text-align: right; margin-left: auto; }
#customerHost .cust-name-list .cust-name-item:hover { background: #eef2ff; color: #1d4ed8; }

/* =============================================================================
 * #913 报价「提醒报错规则」命中高亮（红=报错 / 浅蓝=提醒）
 * ---------------------------------------------------------------------------
 * 本地蓝本：modbuild/plain/quote-part-13.txt:374-376 —— 本地是在运行时往页面注入一段
 *   <style>（input/select/textarea 三态 + .sc-name/.sc-jobno 文字色）。SaaS 移植规则引擎时
 *   **漏掉了这段样式**：高亮类 err-hl / zero-hl 能被正常打上，但没有任何 CSS 命中它，
 *   于是表现为「规则已生效（会弹窗拦截）但表格上看不到高亮」——用户本轮报的正是此现象。
 * ⭐ SaaS 结构差异（必须一并处理）：本项目的单元格是「td 套 input / select」两层层级，
 *   且自动列（金额等）的类直接落在 td 上；因此除控件外还要给 td 与 span 着色，
 *   否则白底输入框会把 td 的底色盖掉。另在数据行上加极淡底色，便于整行定位。
 * 作用域：全部靠 .err-hl / .zero-hl 类名限定（⛔ 不写裸标签选择器、不使用通配符），
 *   仅命中被规则标记过的元素，对页面其余部分零影响。
 * ============================================================================= */
input.err-hl, select.err-hl, textarea.err-hl, td.err-hl, span.err-hl,
td.err-hl input, td.err-hl select, td.err-hl textarea {
  background: #fde8e8 !important;
  border-color: #e5484d !important;
  box-shadow: inset 0 0 0 1px #e5484d !important;
}
input.zero-hl, select.zero-hl, textarea.zero-hl, td.zero-hl, span.zero-hl,
td.zero-hl input, td.zero-hl select, td.zero-hl textarea {
  background: #d9ecff !important;
  border-color: #3b8ddd !important;
  box-shadow: inset 0 0 0 1px #3b8ddd !important;
}
/* 卡片头等文字型控件（本地口径：只染文字色） */
.sc-name.err-hl, .sc-jobno.err-hl { color: #b3261e !important; }
.sc-name.zero-hl, .sc-jobno.zero-hl { color: #1d6fb8 !important; }
/* 命中行整行淡底（增强项，便于在长表格里一眼定位） */
.oq-row.err-row > td { background: rgba(229, 72, 77, .06); }
.oq-row.zero-row > td { background: rgba(59, 141, 221, .07); }
