* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: "Microsoft YaHei", "PingFang SC", system-ui, sans-serif; background: #f4f6f9; color: var(--color-text); font-size: 14px; }
/* ========================================================================
   外壳：顶部工具条 + 左侧可折叠侧边栏（2026-09-23 Phase 2）
   布局约定（改动前先看这四条）：
     · 顶栏与侧栏都用 `position:sticky`，**页面整体滚动** —— 不造嵌套滚动容器
       （本文件有条约定：`main` 不得设 `overflow`，见 _test_embed_scroll.js）
     · `main{min-width:0}` **必加**：flex 子项默认 `min-width:auto`，宽表格会把横向布局顶破
     · 导航项仍是 `class="tab" data-tab="X"` —— 换 class 会让 activateTab / 权限过滤静默失效
     · 手机（≤768px）侧栏变抽屉：`.side-open` 滑出；底部快捷键保留
   ======================================================================== */
.topbar { position: sticky; top: 0; z-index: 60; background: var(--color-surface); color: var(--color-text); border-bottom: 1px solid var(--color-border); padding: 0 16px; display: flex; align-items: center; gap: 12px; height: 56px; }
.topbar-spacer { flex: 1 1 auto; }
/* 品牌 logo（2026-10-26 从顶栏挪到侧栏顶部；2026-10-28 文案对齐新 UI）：主色小方块 + 标题，下边分隔线 */
.brand { flex: 0 0 auto; display: flex; align-items: center; gap: 10px; padding: 16px 16px 14px; border-bottom: 1px solid var(--color-border-light); min-width: 0; }
.brand-dot { flex: 0 0 auto; width: 12px; height: 12px; border-radius: 3px; background: var(--color-primary); }
.brand-text { min-width: 0; font-weight: 600; font-size: 14px; color: var(--color-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tb-icon { flex: 0 0 auto; width: 34px; height: 34px; display: inline-flex; align-items: center; justify-content: center; border: 0; border-radius: var(--radius-sm); background: transparent; color: var(--color-text); font-size: 18px; line-height: 1; cursor: pointer; transition: background .12s, color .12s; }
.tb-icon:hover { background: var(--color-surface-3); color: var(--color-primary); }
.tb-icon .icon { width: 18px; height: 18px; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; fill: none; }
/* 当前所在模块（面包屑）—— 内容由 app.js 的 activateTab() 写入，文案取自侧栏 */
.crumb { font-size: 13px; color: var(--color-text-secondary); padding-left: 12px; border-left: 1px solid var(--color-border-strong); white-space: nowrap; }
.crumb:empty { display: none; }

/* ===== 顶栏用户区（2026-10-28 从侧栏底部挪到顶栏右侧）===== */
.topbar-user { display: flex; align-items: center; gap: 8px; }
.dropdown { position: relative; }
.role-switcher { display: inline-flex; align-items: center; gap: 8px; height: 34px; padding: 0 12px; font-size: 13px; font-family: inherit; border: 1px solid var(--color-border-strong); border-radius: var(--radius-sm); background: var(--color-surface); color: var(--color-text); cursor: pointer; transition: border-color .12s, color .12s; }
.role-switcher:hover { border-color: var(--color-primary); color: var(--color-primary); }
.role-switcher .icon { width: 14px; height: 14px; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; fill: none; color: var(--color-text-muted); }
.role-tag { display: inline-flex; align-items: center; height: 20px; padding: 0 8px; font-size: 12px; font-weight: 600; border-radius: var(--radius-pill); background: var(--color-primary-weak); color: var(--color-primary); }
.role-tag:empty { display: none; }
.role-name { font-size: 13px; color: var(--color-text); white-space: nowrap; }
.role-name:empty { display: none; }
.dropdown-menu { position: absolute; top: calc(100% + 6px); right: 0; min-width: 160px; padding: 6px; background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-md); box-shadow: var(--shadow-lg); z-index: 500; display: none; }
.dropdown.is-open .dropdown-menu { display: block; }
.menu-item { display: flex; align-items: center; gap: 10px; width: 100%; padding: 9px 12px; font-size: 13px; font-family: inherit; text-align: left; border: 0; background: none; border-radius: var(--radius-sm); color: var(--color-text); cursor: pointer; transition: background .12s, color .12s; }
.menu-item:hover { background: var(--color-surface-3); color: var(--color-primary); }
.menu-item .icon { width: 16px; height: 16px; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; fill: none; }
.avatar { width: 30px; height: 30px; border-radius: 50%; background: var(--color-primary-weak); color: var(--color-primary); display: flex; align-items: center; justify-content: center; font-size: 13px; font-weight: 600; }
.icon-btn { width: 34px; height: 34px; display: inline-flex; align-items: center; justify-content: center; border: 0; border-radius: var(--radius-sm); background: transparent; color: var(--color-text-secondary); cursor: pointer; transition: background .12s, color .12s; }
.icon-btn:hover { background: var(--color-surface-3); color: var(--color-primary); }
.icon-btn .icon { width: 18px; height: 18px; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; fill: none; }

.app-body { display: flex; align-items: flex-start; min-height: calc(100vh - 56px); }
.sidebar {
  flex: 0 0 240px; width: 240px; box-sizing: border-box;
  position: sticky; top: 56px; height: calc(100vh - 56px);
  display: flex; flex-direction: column; overflow: hidden;
  background: var(--color-surface); border-right: 1px solid var(--color-border);
  transition: flex-basis .16s ease, width .16s ease, opacity .16s ease;
}
/* 收起：折叠到 64px，只留图标（2026-10-28 由"归零"改为"留图标"）。
   ⚠️ 手机端要在媒体查询里重置，否则抽屉会被压成 64px */
body.side-collapsed .sidebar { flex-basis: 64px; width: 64px; border-right: 1px solid var(--color-border); overflow: hidden; }
body.side-collapsed .brand { justify-content: center; padding: 16px 0 14px; }
body.side-collapsed .brand-text { display: none; }
body.side-collapsed .side-glabel { display: none; }
body.side-collapsed .tab { justify-content: center; padding: 0; }
body.side-collapsed .tab span { display: none; }
body.side-collapsed .sidebar-foot { display: none; }
/* 侧栏三段式：logo（顶，固定）/ 导航（中，可滚）/ 版本（底，固定） */
.sidebar .tabs { flex: 1 1 auto; min-height: 0; overflow-y: auto; display: block; padding: 8px 0 12px; }
.side-group { padding-bottom: 4px; }
.side-glabel { font-size: 11px; color: var(--color-text-hint); letter-spacing: .08em; text-transform: uppercase; padding: 12px 16px 4px; user-select: none; }
/* 导航项：侧栏竖排条目，线性 SVG 图标 + 文字；左侧 3px 竖条表示当前项 */
.tab { display: flex; align-items: center; gap: 10px; width: 100%; height: 40px; text-align: left; background: transparent; border: 0; border-left: 3px solid transparent; color: var(--color-text); padding: 0 16px 0 13px; cursor: pointer; font-size: 14px; font-family: inherit; white-space: nowrap; overflow: hidden; transition: background .12s, color .12s; }
.tab .nav-icon { flex: 0 0 auto; width: 18px; height: 18px; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; fill: none; }
.tab span { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.tab:hover { background: var(--color-primary-weak); color: var(--color-primary); }
.tab.active { background: var(--color-primary-weak); color: var(--color-primary); font-weight: 600; border-left-color: var(--color-primary); }
.sidebar-foot { flex: 0 0 auto; padding: 12px 16px; font-size: 11px; color: var(--color-text-hint); border-top: 1px solid var(--color-border-light); white-space: nowrap; text-align: center; }
.side-mask { display: none; }

/* ⚠️ 内容区宽度暂时保持 1180px —— 与改造前完全一致，避免"换外壳顺带改了每页的排版观感"。
   侧栏吃掉 200px 后，1366 这类屏上内容区会略窄（1180 → 1130），仍在 grid2 双列范围内。
   要不要放宽到 1400、以及逐页要不要重排，留到 Phase 3 单独判。 */
main { flex: 1 1 auto; min-width: 0; padding: 18px 9px; }
/* 🚨 顶栏是 sticky 的（54px）—— 页面内跳转 / 程序 `scrollIntoView` 时会给内容留出空间，
   否则目标会被顶栏盖住（2026-09-23 实测：把报价明细滚到顶时，卡片第一行"监测类别"被压在栏底下）。 */
main [id], main .card { scroll-margin-top: 66px; }
.view { display: none; }
.view.active { display: block; }
/* 空态（2026-09-23）：与各模块页的 `.empty` 同一口径。
   壳页此前**没有这个类**，所以「报价记录」的空态只能用内联样式硬编码灰色
   —— 既不跟随主题令牌（用户后面给视觉参考时要改色就漏了它），也和别处长得不一样。 */
.empty { color: var(--color-text-hint); font-size: 13px; padding: 12px 0; }
td.empty { text-align: center; }
.card { background: var(--color-surface); border-radius: var(--radius-lg); padding: 18px; margin-bottom: 18px; box-shadow: 0 1px 3px rgba(0,0,0,.08); }
.card-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; gap: 10px; flex-wrap: wrap; }
h2 { font-size: 15px; color: var(--color-primary); margin-bottom: 12px; }
.card-head h2 { margin-bottom: 0; }
.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 12px 18px; }
.grid3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 12px 18px; margin-bottom: 12px; }
label { display: flex; flex-direction: column; font-size: 13px; color: var(--color-text-secondary); gap: 4px; }
label.span2 { grid-column: span 2; }
.fee-section { margin-top: 14px; }
.fee-section h3 { font-size: 13px; color: var(--color-primary); margin-bottom: 6px; display: flex; align-items: center; gap: 8px; }
.fee-section table { margin-bottom: 4px; }
/* 费用区折叠（工程师/交通/住宿/其他 可选） */
.fee-group { margin-top: 14px; border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: 10px 14px; background: var(--color-surface-2); }
.fee-group summary { cursor: pointer; font-size: 13px; color: var(--color-primary); font-weight: 600; user-select: none; }
.fee-group[open] summary { margin-bottom: 4px; }

/* 报价单信息 — 分层改造（2026-09-13）：单据 / 客户 / 卖方 三段，卖方默认收起 */
.form-section { margin-top: 14px; }
/* 仅第一段（单据信息，div）贴紧卡片标题；客户/卖方是 details，仍保留 14px 段间距（2026-10-27） */
div.form-section:first-of-type { margin-top: 0; }
.form-section-title {
  font-size: 12px; font-weight: 600; color: var(--color-text-secondary);
  letter-spacing: .5px; margin-bottom: 8px; padding-left: 8px;
  border-left: 3px solid var(--color-primary); line-height: 1.2;
}
details.form-section.is-collapsible { border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: 10px 14px; background: var(--color-surface-2); }
details.form-section.is-collapsible > summary {
  cursor: pointer; font-size: 12px; color: var(--color-text-secondary); font-weight: 600;
  letter-spacing: .5px; user-select: none; list-style: none;
  display: flex; align-items: center; gap: 6px;
}
details.form-section.is-collapsible > summary::-webkit-details-marker { display: none; }
details.form-section.is-collapsible > summary::before {
  content: '▸'; font-size: 11px; color: var(--color-primary); transition: transform .18s; display: inline-block;
}
details.form-section.is-collapsible[open] > summary { color: var(--color-primary); }
details.form-section.is-collapsible[open] > summary::before { transform: rotate(90deg); }
details.form-section.is-collapsible[open] > summary { margin-bottom: 10px; }
.seller-hint { font-size: 11px; color: var(--color-text-secondary); font-weight: 400; }
/* 折叠卡片标题旁的「关键信息摘要」（2026-10-27）：客户=委托单位名，卖方=机构公司名。
   颜色用主色让它和灰色标题区分开，长名称截断省略，避免把标题顶破。 */
.section-summary {
  margin-left: auto; font-size: 11px; color: var(--color-primary); font-weight: 500;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 46%;
}
/* 报价页左右分栏（2026-10-26）：左栏表单 + 右栏汇总 sticky，小屏退回堆叠。
   左栏自适应（1fr，minmax(0,…) 防宽表格顶破），右栏固定 340px（原 320px，稍加宽
   让汇总明细行不至于太挤、数值也有呼吸空间）；
   右栏 sticky 顶部偏移 72px = 顶栏 54px + main 内边距 18px。 */
.quote-layout { display: grid; grid-template-columns: minmax(0, 1fr) 340px; gap: 18px; align-items: start; }
.quote-main { min-width: 0; }
.quote-aside { position: sticky; top: 72px; min-width: 0; }
.quote-aside .card { margin-bottom: 0; }
/* 右栏较窄（340px），操作按钮纵向通栏：act-group 也改竖排、去掉组间左侧分隔线，按钮通栏居中 */
.quote-aside .actions { flex-direction: column; align-items: stretch; }
.quote-aside .act-group { flex-direction: column; align-items: stretch; }
.quote-aside .act-group + .act-group { border-left: none; padding-left: 0; margin-left: 0; }
.quote-aside .actions .btn { width: 100%; justify-content: center; }
/* 编辑页「清空」：次要位置的小字 danger 按钮，不占满整行，居中即可 */
.quote-aside .actions .btn-danger-text { width: auto; align-self: center; margin-top: 2px; }
/* 小屏（≤900px）：退回上下堆叠，汇总卡回到表单下方、不再 sticky */
@media (max-width: 900px) {
  .quote-layout { grid-template-columns: 1fr; }
  .quote-aside { position: static; }
  .quote-aside .card { margin-bottom: 18px; }
}
.summary { background: var(--color-surface); }
.summary-line { display: flex; justify-content: space-between; padding: 6px 0; border-bottom: 1px dashed var(--color-border-light); }
.summary-line span:first-child { color: var(--color-text-secondary); }
.summary-line span:last-child { font-weight: 600; color: var(--color-text); }
.summary-line.total { border-top: 1px solid #cdd9e8; border-bottom: none; margin-top: 4px; padding-top: 8px; font-size: 15px; }
.summary-line.total span:first-child { color: var(--color-primary); }
.summary-line.total span:last-child { color: var(--color-danger); }
.summary-line.grand { border-top: 2px solid var(--color-primary); margin-top: 4px; padding-top: 8px; font-size: var(--fs-xl); }
.summary-line.grand span:first-child { color: var(--color-primary); font-weight: 700; }
.summary-line.grand span:last-child { color: var(--color-danger); font-weight: 700; }

/* 汇总区重设（2026-09-13）：明细区 + 最终价大字卡片 */
.summary-detail { margin-bottom: 4px; }
/* 增值税税率徽标（嵌在标签里，替代原先错位的「金额位置显示 6%」） */
.vat-rate {
  font-style: normal; font-size: 11px; font-weight: 600;
  color: var(--color-primary); background: var(--color-primary-weak);
  border: 1px solid var(--color-primary-weak-2); border-radius: 4px;
  padding: 0 5px; margin-left: 6px;
}
/* 最终价格：大字卡片，视觉焦点 */
.final-card {
  margin-top: 14px; padding: 16px 20px; border-radius: var(--radius-lg);
  background: linear-gradient(135deg, var(--color-primary) 0%, #00463a 100%);
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
  box-shadow: 0 4px 14px rgba(0, 89, 73, .22);
}
.final-card-label { color: #cfe4dc; font-size: 13px; font-weight: 600; letter-spacing: 1px; display: flex; flex-direction: column; gap: 3px; }
.final-card-hint { color: #cfe4dc; font-size: 11px; font-weight: 400; letter-spacing: 0; }
.final-card-value { color: #fff; font-weight: 700; line-height: 1; white-space: nowrap; }
.final-card-value .cur { font-size: 18px; margin-right: 3px; opacity: .85; }
.final-card-value #sumFinalPrice { font-size: 32px; font-variant-numeric: tabular-nums; }
@media (max-width: 620px) {
  .final-card { flex-direction: column; align-items: flex-start; gap: 8px; }
  .final-card-value #sumFinalPrice { font-size: 26px; }
}
input, select { padding: 7px 9px; border: 1px solid #d4dbe5; border-radius: var(--radius-sm); font-size: 13px; font-family: inherit; background: var(--color-surface); }
input:focus, select:focus { outline: none; border-color: var(--color-primary); }
.table-wrap { overflow-x: auto; margin-top: 6px; }

/* ===== 项目名称模糊搜索控件（2026-09-13）=====
 * 结构：.proj-cell 里同时放「隐藏 select」+「可见 input」+「下拉候选层」
 *   .proj-hidden  —— 隐藏的数据载体（collectQuote 仍读它的 selectedOptions）
 *   .proj-input   —— 用户输入的可见框
 *   .proj-drop    —— 绝对定位的候选列表
 */
.proj-cell { position: relative; min-width: 160px; }
.proj-hidden {
  position: absolute !important; width: 1px !important; height: 1px !important;
  padding: 0 !important; margin: -1px !important; overflow: hidden !important;
  clip: rect(0 0 0 0) !important; white-space: nowrap !important; border: 0 !important;
}
.proj-input { width: 100%; }
.proj-input:disabled { background: #f1f5f9; color: #94a3b8; cursor: not-allowed; }
.proj-drop {
  position: absolute; top: calc(100% + 2px); left: 0; z-index: 400;
  min-width: 100%; max-width: 380px; max-height: 280px; overflow-y: auto;
  background: var(--color-surface); border: 1px solid var(--color-border-strong);
  border-radius: var(--radius-md); box-shadow: 0 8px 24px rgba(15,23,42,.16);
  padding: 4px;
}
/* 🚨 Portal 模式（2026-09-13）：
   下拉在显示时被 JS 挂到 <body> 上并用 position:fixed 定位，
   以脱离 .table-wrap 的 overflow 裁剪（overflow-x:auto 会隐式让 overflow-y 也算 auto，
   导致下拉超出表格容器时被裁掉）。
   这里只调视觉：浮层阴影更重、层级更高。坐标全部由 JS 内联控制。 */
.proj-drop.proj-drop-portal {
  z-index: 1200;
  max-width: 420px;
  box-shadow: 0 12px 32px rgba(15, 23, 42, .22), 0 2px 8px rgba(15, 23, 42, .12);
  border-color: var(--color-border-strong);
}
.proj-drop-item {
  display: flex; align-items: center; gap: 8px; padding: 6px 8px;
  font-size: 13px; border-radius: var(--radius-sm); cursor: pointer;
  white-space: nowrap;
}
.proj-drop-item:hover, .proj-drop-item.active { background: var(--color-primary-weak); }
.proj-drop-name { flex: 1; color: var(--color-text); overflow: hidden; text-overflow: ellipsis; }
.proj-drop-item.active .proj-drop-name { color: var(--color-primary); font-weight: 600; }
.proj-drop-cat {
  font-size: 11px; color: var(--color-primary); background: var(--color-primary-weak);
  border: 1px solid var(--color-primary-weak-2); border-radius: 4px; padding: 0 5px; flex-shrink: 0;
}
.proj-drop-price { font-size: 12px; color: var(--color-text-secondary); flex-shrink: 0; }
.proj-drop-empty { padding: 10px 8px; font-size: 13px; color: var(--color-text-secondary); text-align: center; }
table { width: 100%; border-collapse: collapse; font-size: 13px; }
th, td { border: 1px solid var(--color-border-light); padding: 7px 8px; text-align: left; }
th { background: #eef3fa; color: var(--color-primary); font-weight: 600; white-space: nowrap; }
tbody tr:nth-child(even) { background: var(--color-surface); }
.btn { background: #eef3fa; border: 1px solid #cdd9e8; border-radius: var(--radius-sm); padding: 7px 14px; cursor: pointer; font-size: 13px; color: var(--color-primary); }
.btn:hover { background: #e2ebf6; }
.btn.primary { background: var(--color-primary); color: var(--color-surface); border-color: var(--color-primary); }
.btn.primary:hover { background: #007a63; }
.btn.ghost { background: var(--color-surface); color: #888; }
/* 次要危险文字按钮（收敛后：编辑页「清空」、详情弹窗「作废」走这种小字 danger 样式） */
.btn-danger-text, .danger-text { background: none; border: none; color: var(--color-danger-text); font-size: 12px; padding: 4px 8px; }
.btn-danger-text:hover, .danger-text:hover { background: var(--color-danger-bg); }
.btn.sm { padding: 4px 9px; font-size: 12px; }
.total-bar { display: flex; align-items: center; gap: 20px; margin-top: 14px; flex-wrap: wrap; }
.total-bar label { flex: 1; min-width: 240px; }
.total-amount { font-size: var(--fs-xl); font-weight: 700; color: var(--color-danger); white-space: nowrap; }
.actions { margin-top: 16px; display: flex; gap: 10px; flex-wrap: wrap; }
.act-group { display: flex; gap: 8px; align-items: center; }
.act-group + .act-group { border-left: 1px solid var(--color-border-light); padding-left: 12px; margin-left: 4px; }
.toast { position: fixed; bottom: 24px; left: 50%; transform: translateX(-50%); background: #2c3e50; color: var(--color-surface); padding: 10px 20px; border-radius: var(--radius-md); opacity: 0; transition: opacity .3s; pointer-events: none; z-index: 99; }
.toast.show { opacity: 1; }
.row-del { color: var(--color-danger); cursor: pointer; border: none; background: none; font-size: var(--fs-xl); }
.item-input { width: 100%; }

/* 检测项目明细表格：紧凑布局，尽量显示所有列 */
#itemsTable { min-width: 960px; }
#itemsTable th, #itemsTable td { padding: 5px 6px; font-size: 12px; }
#itemsTable input, #itemsTable select { padding: 5px 6px; font-size: 12px; width: 100%; box-sizing: border-box; }
#itemsTable .method { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* ---------- 行内详情抽屉（2026-09-13）----------
   低频字段（检测方法等）默认收起，窄屏 1366 无需横向滚动看单价/合计。
   这些字段仍留在同一 tr 内，collectQuote() 的 $('.method', tr) 照常命中。 */
#itemsTable .row-tools { display: flex; align-items: center; gap: 2px; justify-content: flex-end; }
#itemsTable .row-detail {
  border: none; background: none; cursor: pointer; color: var(--color-text-secondary);
  font-size: 15px; line-height: 1; padding: 2px 3px; border-radius: var(--radius-sm);
  transition: background .15s, color .15s;
}
#itemsTable .row-detail:hover { background: var(--color-primary-weak); color: var(--color-primary); }
#itemsTable .row-detail.open { color: var(--color-primary); background: var(--color-primary-weak); }
#itemsTable .detail-row > td { padding: 0 !important; border-top: none; }
#itemsTable .detail-cell {
  background: var(--color-surface-2, #f8fafc);
  border-left: 3px solid var(--color-primary);
  padding: 10px 12px !important;
}
#itemsTable .detail-grid { display: grid; grid-template-columns: 1fr; gap: 8px; }
#itemsTable .detail-field { display: flex; align-items: center; gap: 8px; }
#itemsTable .detail-field > span {
  flex-shrink: 0; width: 62px; font-size: 12px;
  color: var(--color-text-secondary); text-align: right;
}
#itemsTable .detail-field > input { flex: 1; }
/* 主行若有详情展开，给个视觉提示 */
#itemsTable tr.has-detail > td { background: var(--color-primary-weak-2, #cfe4dc); }

/* ---------- 回填异常提示（2026-09-13）----------
   历史单据类别不在项目库中时，给 select 一个警示色，提示人工重选；
   项目名被模糊匹配规范化过时，给输入框橙色左侧条，提示「与原单据写法不同」。 */
#itemsTable select.cat-unmatched {
  border-color: #f59e0b !important;
  background: #fffbeb;
  box-shadow: 0 0 0 2px rgba(245, 158, 11, .15);
}
#itemsTable input.proj-matched {
  border-color: #f59e0b !important;
  background: #fffbeb;
}


/* 弹层 / 模态框 */
.modal { display: none; position: fixed; inset: 0; background: rgba(15,30,50,.55); z-index: 200; align-items: flex-start; justify-content: center; padding: 28px 16px; overflow: auto; }
.modal.open { display: flex; }
.modal-box { background: var(--color-surface); border-radius: var(--radius-xl); width: 840px; max-width: 100%; box-shadow: 0 12px 40px rgba(0,0,0,.3); overflow: hidden; }
.modal-bar { display: flex; align-items: center; justify-content: space-between; padding: 12px 18px; border-bottom: 1px solid var(--color-border-light); background: var(--color-surface); }
.modal-title { font-weight: 700; color: var(--color-primary); font-size: 15px; }
.modal-actions { display: flex; gap: 8px; }
.modal-body { padding: 18px; }
.modal-body label { margin-bottom: 12px; }
.preview-box { width: 920px; }
.preview-scroll { padding: 22px 30px; max-height: 80vh; overflow: auto; background: #e9edf3; }
.preview-page { background: var(--color-surface); padding: 28px 34px; box-shadow: 0 2px 10px rgba(0,0,0,.12); min-height: 900px; }
.preview-page table { width: 100%; border-collapse: collapse; font-size: 13px; }
.preview-page th, .preview-page td { border: 1px solid var(--color-text); padding: 6px; }
.preview-page .ph { display: flex; justify-content: space-between; margin-bottom: 4px; }
.preview-page .title { text-align: center; font-size: 20px; font-weight: 700; margin: 6px 0 12px; }
.preview-page .meta { font-size: 13px; line-height: 1.9; }

/* 打印区 */
.print-area { display: none; }

/* 🚨 通用兜底（2026-09-28）：`.view` 里的直接 iframe 一律撑满 ——
   下面那几组是**逐个 id 枚举**的，新加视图忘了加一条就会渲染成 0 尺寸小框（走查时真踩到）。
   带提示条的页面（flow/field）有更高特异性的规则在后面，不受影响。 */
.view > iframe { width: 100%; height: 100%; border: none; background: var(--color-surface); border-radius: var(--radius-lg); }
.view:has(> iframe) { height: calc(100vh - 110px); }

/* 合同生成模块（iframe 嵌入） */
#tab-contract { height: calc(100vh - 110px); }
#contractFrame { width: 100%; height: 100%; border: none; background: var(--color-surface); border-radius: var(--radius-lg); }

/* 任务单生成模块（iframe 嵌入，镜像合同模块） */
#tab-taskorder { height: calc(100vh - 110px); }
#taskorderFrame { width: 100%; height: 100%; border: none; background: var(--color-surface); border-radius: var(--radius-lg); }

/* 其余 iframe 嵌入模块（工作台/现场室/检测室/人员/设备/方法/报告/物料）：统一撑满可用高度
   2026-11-05：去掉 #tab-flow —— index.html 已无该容器/iframe，ADMIN_ALL_TABS 里也已移除。
   独立页 flow.html 走自己的 flow-styles.css，不受这里影响。 */
#tab-dashboard, #tab-field, #tab-lab, #tab-person, #tab-equipment, #tab-equipgroups, #tab-method, #tab-report, #tab-material, #tab-client { height: calc(100vh - 110px); }
#tab-dashboard iframe, #tab-field iframe, #tab-lab iframe, #tab-person iframe, #tab-equipment iframe, #tab-equipgroups iframe, #tab-method iframe, #tab-report iframe, #tab-material iframe, #tab-client iframe { width: 100%; height: 100%; border: none; background: var(--color-surface); border-radius: var(--radius-lg); }

/* 带顶部提示条的 iframe 页（现场室）：提示条占一行，iframe 自适应剩余高度 */
/* ⚠️ 必须限定 .active：否则 ID 选择器(特异性100) 会压过 .view{display:none}(特异性10)。 */
#tab-field.active { display: flex; flex-direction: column; gap: 8px; }
#tab-field .frame-hint { flex: 0 0 auto; display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 7px 12px; background: #f6f8fb; border: 1px solid var(--color-border); border-radius: var(--radius-md); font-size: var(--fs-base); color: #5a6b7f; }
#tab-field .frame-hint + iframe { flex: 1 1 auto; min-height: 0; height: auto; }
#tab-field .m-entry { color: var(--color-primary); font-weight: 600; text-decoration: none; white-space: nowrap; }
#tab-field .m-entry:hover { text-decoration: underline; }

@page { size: A4; margin: 12mm; }
@media print {
  /* 隐藏非打印区域（display:none 不占版面，避免多出空白页） */
  .topbar, .sidebar, .mobile-nav, .side-mask, main, .modal, .toast { display: none !important; }
  body { background: var(--color-surface); }
  #printArea {
    display: block !important;
    position: static !important;
    left: auto; top: auto;
    width: 100%; padding: 0; margin: 0;
  }
  .print-area table { width: 100%; border-collapse: collapse; font-size: 13px; }
  .print-area th, .print-area td { border: 1px solid var(--color-text); padding: 6px; }
  .print-area .ph { display: flex; justify-content: space-between; margin-bottom: 4px; }
  .print-area .title { text-align: center; font-size: 20px; font-weight: 700; margin: 6px 0 12px; }
  .print-area .meta { font-size: 13px; line-height: 1.9; }
}

/* ========== 智能识别面板 ========== */
/* 2026-10-26：把面板里散落的 style="…" 硬编码抽成 class，统一到 tokens 体系。
   仅保留 display:none（JS 显隐切换用）与表格列宽等纯布局内联。 */
.recognize-panel {
  margin-bottom: 12px; padding: 14px;
  background: var(--color-surface-2);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
}
.recog-tabs { display: flex; gap: 8px; margin-bottom: 10px; flex-wrap: wrap; }
.recog-input, .recog-textarea {
  width: 100%; padding: 8px;
  border: 1px solid var(--color-border-strong);
  border-radius: var(--radius-sm); font-size: var(--fs-base);
  box-sizing: border-box;
}
.recog-textarea { resize: vertical; }
.recog-textarea.sm { font-size: var(--fs-sm); }
.recog-actions { margin-top: 8px; display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.recog-actions-sm { margin-top: 6px; }
.recog-msg { font-size: var(--fs-sm); color: var(--color-text-muted); }
.recog-filename { margin-left: 8px; font-size: var(--fs-sm); color: var(--color-text-muted); }
.recog-preview { margin-top: 12px; }
.upload-label {
  display: inline-block; padding: 20px 32px;
  border: 2px dashed var(--color-border-strong); border-radius: var(--radius-md);
  cursor: pointer; text-align: center; color: var(--color-text-muted); font-size: var(--fs-base);
}
.upload-hint { font-size: var(--fs-xs); color: var(--color-text-hint); }
.recog-src-details { margin-top: 8px; }
.recog-src-summary { font-size: var(--fs-sm); color: var(--color-text-muted); cursor: pointer; }
.recog-src-help { font-size: var(--fs-xs); color: var(--color-text-hint); margin: 6px 0; }
.recog-tab { background:#f1f5f9;color:var(--color-text-secondary);border:1px solid var(--color-border); }
.recog-tab.active { background:var(--color-primary);color:var(--color-surface);border-color:var(--color-primary); }
.recog-tab:hover { opacity:.85; }
.upload-label:hover { border-color:var(--color-primary) !important; color:var(--color-primary) !important; }
#recognizePanel { animation: fadeIn .2s ease; }
@keyframes fadeIn { from{opacity:0;transform:translateY(-4px)} to{opacity:1;transform:none} }

/* 报价页卡片头右侧操作按钮组（智能识别 / 添加项目） */
.card-head-actions { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
/* 表单里的 checkbox 行（最终价格取整），label 默认纵向排列，这里改横排 */
.check-label { flex-direction: row; align-items: center; gap: 8px; }
/* 参考数据加载失败提示条（2026-09-22）—— 接入 warning tokens */
.ref-data-warn {
  margin: 0 0 10px; padding: 10px 12px;
  background: var(--color-warning-bg);
  border: 1px solid var(--color-warning-border);
  border-radius: var(--radius-md); color: var(--color-warning-text); font-size: var(--fs-base);
}
.ref-data-warn .btn { margin-left: 8px; }

/* ========== 登录 / 退出 ========== */
.login-overlay { position: fixed; inset: 0; background: var(--color-border-light); display: flex; align-items: center; justify-content: center; z-index: 1000; padding: 20px; }
.login-box { width: 100%; max-width: 360px; background: var(--color-surface); border-radius: var(--radius-xl); padding: 28px 24px; box-shadow: 0 8px 30px rgba(20,40,80,.12); }
.login-brand { font-size: var(--fs-xl); font-weight: 600; color: var(--color-primary); text-align: center; }
.login-sub { font-size: 13px; color: #8893a4; text-align: center; margin: 6px 0 20px; }
.login-box input { width: 100%; margin-bottom: 12px; padding: 11px 12px; font-size: 15px; border: 1px solid #cdd9e8; border-radius: var(--radius-md); box-sizing: border-box; }
.login-box input:focus { outline: none; border-color: var(--color-primary); }
#loginBtn { width: 100%; padding: 11px; font-size: 15px; font-weight: 600; }
.login-msg { min-height: 18px; margin-top: 10px; font-size: 13px; color: var(--color-danger); text-align: center; }

/* Excel 导入/模板链接 */
.tpl-link { display: inline-flex; align-items: center; border: 1px solid var(--color-primary-weak-2); background: var(--color-primary-weak); color: var(--color-primary-text); padding: 7px 12px; border-radius: var(--radius-sm); font-size: 13px; text-decoration: none; cursor: pointer; white-space: nowrap; }
.tpl-link:hover { background: var(--color-primary-weak); }

/* ===== 移动端导航（≤768px）=====
   2026-09-23 Phase 2：侧栏变抽屉（`.side-open` 滑出），底部快捷键保留；
   原「更多」底部抽屉已下线 —— 「更多」直接滑出整条侧栏（模块清单只有一份数据源）。 */
.mobile-nav { display: none; }

@media (max-width: 768px) {
  .topbar { padding: 8px 12px; gap: 8px; }
  .crumb { padding-left: 8px; font-size: 12px; }

  /* 侧栏 → 抽屉 */
  .sidebar {
    position: fixed; left: 0; top: 0; bottom: 0; height: 100%;
    width: 78vw; max-width: 300px; flex-basis: auto;
    z-index: 1001; padding: 0; overflow: hidden;
    border-right: 1px solid var(--color-border);
    transform: translateX(-102%); transition: transform .2s ease;
    box-shadow: 2px 0 16px rgba(0,0,0,.16);
  }
  body.side-open .sidebar { transform: translateX(0); }
  /* ⚠️ 桌面那条「收起=64px 留图标」在手机上必须被重置，否则抽屉会被压成 64px 且文字隐藏 */
  body.side-collapsed .sidebar { width: 78vw; max-width: 300px; flex-basis: auto; padding: 0; overflow: hidden; opacity: 1; border-right: 1px solid var(--color-border); }
  body.side-collapsed .brand { justify-content: flex-start; padding: 16px 16px 14px; }
  body.side-collapsed .brand-text { display: block; }
  body.side-collapsed .side-glabel { display: block; }
  body.side-collapsed .tab { justify-content: flex-start; padding: 0 16px 0 13px; }
  body.side-collapsed .tab span { display: inline; }
  body.side-collapsed .sidebar-foot { display: block; }
  .side-mask { display: none; }
  body.side-open .side-mask { display: block; position: fixed; inset: 0; background: rgba(0,0,0,.42); z-index: 1000; }

  .mobile-nav { display: flex; position: fixed; left: 0; right: 0; bottom: 0; z-index: 999; background: var(--color-surface); border-top: 1px solid var(--color-border); box-shadow: 0 -2px 8px rgba(0,0,0,.06); }
  .mobile-nav .m-tab { flex: 1; border: 0; background: none; padding: 9px 2px; font-size: 12px; color: var(--color-text-muted); cursor: pointer; white-space: nowrap; overflow: hidden; font-family: inherit; }
  .mobile-nav .m-tab.active { color: var(--color-primary); font-weight: 600; }
  .mobile-nav .m-more { flex: 0 0 52px; }
  main { padding-bottom: 64px; }
  table { display: block; overflow-x: auto; white-space: nowrap; }
}

/* ===== 移动端通用响应式 ===== */
@media (max-width: 768px) {
  /* 🚨 同上：用 minmax(0,1fr) 而不是 1fr —— 1fr 的列不能小于 min-content，
     报价页的输入框/长下拉会把列顶破（这与另外 12 个模块样式文件保持同一口径） */
  .grid2, .grid3 { grid-template-columns: minmax(0, 1fr); }
  label.span2 { grid-column: auto; }
  input, select, textarea { font-size: var(--fs-xl); }
  .card { padding: 12px; }
  .btn { padding: 9px 14px; font-size: 14px; }
}

/* ---------- 列表分页条（2026-09-23 价格库分页；放在 .table-wrap 外面，不跟着表格滚） ---------- */
.pgbar { display: flex; align-items: center; gap: 8px; justify-content: flex-end; flex-wrap: wrap;
  margin-top: 12px; font-size: 13px; color: var(--color-text-muted, #5a6b7f); }
.pgbar .pg-info { margin-right: auto; }
.pg-btn { border: 1px solid var(--color-border-strong, #d5dde8); background: var(--color-surface, #fff);
  color: var(--color-text, #374151); border-radius: 6px; padding: 5px 12px; font-size: 13px;
  cursor: pointer; font-family: inherit; }
.pg-btn:hover:not(:disabled) { border-color: var(--color-primary, #005949); color: var(--color-primary, #005949); }
.pg-btn:disabled { opacity: .5; cursor: not-allowed; }
@media (max-width: 768px) {
  .pgbar { justify-content: center; }
  .pgbar .pg-info { margin-right: 0; width: 100%; text-align: center; }
  .pg-btn { padding: 8px 14px; }   /* 手机上手指点得着 */
}

/* ---------- 报价「接单状态」统计条 + 已结束折叠区（2026-09-28） ----------
   口径：数字由服务端 /api/quotes/stats 给（接到率分母不含在跟），这里只管排版。
   手机端：grid auto-fit 自动变两列，不会溢出。 */
.qstats { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  gap: 12px; margin-bottom: 14px; }
.qstat { background: var(--color-surface-2, #fafbfd); border: 1px solid var(--color-border, #e8ecf2);
  border-radius: 10px; padding: 10px 14px; display: flex; align-items: baseline; gap: 6px; }
.qstat .k { font-size: 12px; color: var(--color-text-muted, #6b7688); }
.qstat .v { font-size: 22px; font-weight: 500; color: var(--color-text-strong, #1f2329); margin-left: auto; }
.qstat .u { font-size: 12px; color: var(--color-text-muted, #6b7688); }
.qstats .qn { grid-column: 1 / -1; font-size: 12px; color: var(--color-text-hint, #9aa7b4); }
.qtag { display: inline-block; padding: 1px 8px; border-radius: 999px; font-size: 12px;
  background: var(--color-surface-3, #eef1f6); color: var(--color-text-secondary, #556); }
.qtag.won { background: #e7f6f0; color: #0e8f6f; border: 1px solid #bfe5d8; }
.qtag.lost { background: #fdeceb; color: #c0392b; border: 1px solid #f2c8c4; }
.qtag.open { background: #e3efeb; color: #005949; border: 1px solid #cfe4dc; }
.qbtn-won { color: #0e8f6f; }
.qbtn-lost { color: #c0392b; }
.qclosed { margin-top: 14px; border: 1px solid var(--color-border, #e8ecf2); border-radius: 10px;
  background: var(--color-surface-2, #fafbfd); padding: 10px 14px; }
.qclosed > summary { cursor: pointer; font-size: 14px; color: var(--color-text-strong, #1f2329); }
.qclosed .qclosed-sub { color: var(--color-text-hint, #9aa7b4); font-size: 12px; }
.qclosed[open] > summary { margin-bottom: 10px; }
@media (max-width: 768px) {
  .qstat .v { font-size: 19px; }
  .qclosed .table-wrap { overflow-x: auto; }
}

/* 记录页三页签（2026-10-03：报价记录 / 合同记录 / 任务单记录） */
.rcd-tabs { display: flex; gap: 6px; margin-bottom: 12px; border-bottom: 1px solid var(--color-border, #e8ecf2); }
.rcd-tab { border: none; background: transparent; padding: 8px 14px; font-size: 14px; color: var(--color-text-secondary, #556);
  cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px; font-family: inherit; }
.rcd-tab:hover { color: var(--color-primary, #005949); }
.rcd-tab.on { color: var(--color-primary, #005949); font-weight: 600; border-bottom-color: var(--color-primary, #005949); }
.rcd-pane { min-height: 80px; }

/* 记录详情弹窗 + 任务单按合同分组（2026-10-03） */
.rd-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px 18px; }
.rd-grid .rd-item { display: flex; flex-direction: column; gap: 2px; font-size: 13px; }
.rd-grid .rd-item b { color: var(--color-text-muted, #6b7688); font-weight: 500; font-size: 12px; }
.rd-grid .rd-item span { color: var(--color-text-strong, #1f2329); }
.rd-grid .rd-item.span2 { grid-column: 1 / -1; }
.rd-sub { margin: 16px 0 8px; font-size: 13px; color: var(--color-primary, #005949); font-weight: 600; }
.rd-table { font-size: 13px; }
.rd-table th, .rd-table td { padding: 7px 8px; border-bottom: 1px solid var(--color-border-light, #eef1f6); text-align: left; }
/* 报价详情弹窗·次要操作工具条（收敛后：导出/复制/生成合同/生成任务单/作废 都收在这里） */
.rd-actions { margin-top: 16px; padding-top: 12px; border-top: 1px dashed var(--color-border-light, #eef1f6); display: flex; gap: 8px; flex-wrap: wrap; }
.rd-actions .qd-del { margin-left: auto; }
#taskorderRecordsTable .grp-row td { background: var(--color-surface-2, #f2f6fb); padding: 8px 10px; border-bottom: 1px solid var(--color-border, #e8ecf2); }
#taskorderRecordsTable .grp-no { font-weight: 700; color: var(--color-primary, #005949); }
#taskorderRecordsTable .grp-client { margin-left: 10px; color: var(--color-text-secondary, #556); }
#taskorderRecordsTable .grp-cnt { margin-left: 10px; font-size: 12px; color: var(--color-text-muted, #6b7688); }
@media (max-width: 768px) { .rd-grid { grid-template-columns: 1fr; } }

/* 任务单记录·组头折叠箭头（2026-10-03 晚） */
#taskorderRecordsTable .grp-arrow { display: inline-block; width: 16px; color: var(--color-text-muted, #6b7688); font-size: 12px; transition: transform .12s; }
#taskorderRecordsTable .grp-row:hover { filter: brightness(.97); }

/* 任务单阶段标签 + 进场采样标签（2026-10-04 统一到 qtag 的胶囊+border 风格，颜色走主题令牌） */
.stage-tag, .span-tag { display: inline-block; padding: 1px 8px; border-radius: 999px; font-size: 12px; white-space: nowrap; border: 1px solid transparent; }
.stage-tag.st-todo { background: var(--color-surface-3, #eef1f6); color: var(--color-text-muted, #6b7688); border-color: var(--color-border, #e8ecf2); }
.stage-tag.st-wait { background: var(--color-primary-weak, #e3efeb); color: var(--color-primary, #005949); border-color: var(--color-primary-weak-2, #cfe4dc); }
.stage-tag.st-sampling { background: var(--color-warning-bg, #fdf1e3); color: var(--color-warning, #b45309); border-color: var(--color-warning-border, #f5d9b4); }
.stage-tag.st-testing { background: #f0e8ff; color: #6b3fa0; border-color: #e3d6f5; }
.stage-tag.st-done { background: var(--color-success-bg, #e7f6f0); color: var(--color-success-text, #0e8f6f); border-color: var(--color-success-border, #bfe5d8); }
.span-tag.soon { background: var(--color-warning-bg, #fdf1e3); color: var(--color-warning, #b45309); border-color: var(--color-warning-border, #f5d9b4); font-weight: 600; }
.span-tag.expire { background: var(--color-primary-weak, #e3efeb); color: var(--color-primary, #005949); border-color: var(--color-primary-weak-2, #cfe4dc); }

/* 记录页三页签搜索框（2026-10-14 志明） */
.rcd-search { margin: 10px 0 6px; }
.rcd-search input { width: 100%; max-width: 340px; padding: 8px 12px; border: 1px solid #d0d7e2; border-radius: 8px; font-size: 14px; box-sizing: border-box; }
.rcd-search input:focus { border-color: var(--brand, #005949); outline: none; }

/* iframe 重载 loading 遮罩（2026-10-19：根治「点录入闪现旧列表」） */
.frame-loading-mask {
  position: absolute; inset: 0; z-index: 6;
  background: #f5f7fb; display: flex; align-items: center; justify-content: center;
}
.frame-loading-mask::after {
  content: ''; width: 38px; height: 38px; border-radius: 50%;
  border: 3.5px solid #d9e1ee; border-top-color: #005949;
  animation: flmspin .8s linear infinite;
}
@keyframes flmspin { to { transform: rotate(360deg); } }

/* 报价明细表底部「＋添加项目」按钮（2026-10-29：项目多时不用拉回顶部） */
.items-add-row { margin-top: 10px; display: flex; align-items: center; }

/* 报价预览正式版（2026-10-29 对齐 Excel 导出模板版式：logo 横幅 + 标题 + 信息区 + 明细 + 费用 + 签字区） */
.qp-paper { color: var(--color-text); }
.qp-banner { display: block; width: 240px; height: auto; margin-bottom: 10px; }
.qp-head { display: flex; justify-content: space-between; align-items: flex-end; margin-bottom: 12px; }
.qp-title { font-size: 24px; font-weight: 700; line-height: 1.2; }
.qp-headno { text-align: right; font-size: 13px; line-height: 1.8; }
.qp-info { display: flex; border: 1px solid var(--color-text); margin-bottom: 12px; }
.qp-info-col { flex: 1; padding: 8px 12px; line-height: 1.9; font-size: 13px; }
.qp-info-col + .qp-info-col { border-left: 1px solid var(--color-text); }
.qp-table { margin-bottom: 10px; }
.qp-table th { background: #f2f4f7; font-weight: 700; }
.qp-r { text-align: right !important; }
.qp-b { font-weight: 700; }
.qp-remark { font-size: 14px; font-weight: 700; margin: 10px 0 18px; }
.qp-sign { display: flex; margin-bottom: 10px; }
.qp-sign-col { flex: 1; display: flex; align-items: center; font-size: 13px; }
.qp-sign-col + .qp-sign-col { margin-left: 60px; }
.qp-sign-line { flex: 1; border-bottom: 1px solid var(--color-text); margin-left: 6px; min-width: 80px; }

/* ==========================================================================
   报价明细表滚动区（2026-11-04）
   背景：项目一多整页往下滚，顶部「添加项目」会滚出视野；底部加行条也容易被挤走。
   做法：只让明细表内部滚动（表头吸顶），备注/合计与底部「＋添加项目」始终可见。
   作用域：仅 .nui-items-scroll（.nui-table-wrap 另有 4 个页面在用，不能全局改）。
   ========================================================================== */
.nui-items-scroll { max-height: 306px; overflow-y: auto; overflow-x: auto; }
.nui-items-scroll > #itemsTable > thead > tr > th {
  position: sticky; top: 0; z-index: 3;
  background: var(--color-card, #fff);
  box-shadow: 0 1px 0 var(--color-border, #dfe8e5);
}
.nui-items-scroll::-webkit-scrollbar { width: 8px; height: 8px; }
.nui-items-scroll::-webkit-scrollbar-thumb { background: #cfdcd7; border-radius: 4px; }
.nui-items-scroll::-webkit-scrollbar-thumb:hover { background: #b9cbc4; }
/* ==========================================================================
   报价明细：定位搜索条 + 类别分组组头（2026-11-04）
   组头是按录入顺序插入的（run-based），不重排数据行；点组头折叠/展开。
   ========================================================================== */
.items-tools { display: flex; align-items: center; gap: 10px; padding: 0 0 8px; }
.items-tools .items-search { max-width: 300px; height: 32px; font-size: 13px; }
.items-tools-hint { font-size: 12px; color: var(--color-text-muted, #7c929b); }

#itemsBody tr.items-grp { cursor: pointer; }
#itemsBody tr.items-grp > td.g-cell {
  background: #f3f8f6; border-top: 1px solid var(--color-border, #dfe8e5);
  border-bottom: 1px solid var(--color-border, #dfe8e5);
  font-size: 12.5px; color: #4a6670; padding: 7px 10px; user-select: none;
}
#itemsBody tr.items-grp .g-caret { color: #7c929b; margin-right: 6px; font-size: 10px; }
#itemsBody tr.items-grp b { color: #1b262b; font-weight: 600; }
#itemsBody tr.items-grp .g-count { color: #7c929b; margin-left: 8px; }
#itemsBody tr.items-grp .g-sub { margin-left: 12px; font-family: var(--font-mono, monospace); color: #1b262b; }
#itemsBody tr.items-grp:hover > td.g-cell { background: #eaf3ef; }
