/* 项目管理页面 */
.projects-page .toolbar { gap: 8px; }
.projects-page .toolbar input[data-project-keyword] { min-width: 240px; }

/* 页面内操作按钮统一蓝底白字按键形式（button 元素）；附件文件名（a）保持文字链接无底色 */
.projects-page button.link-button { display: inline-block; max-width: 260px; padding: 5px 14px; border: 0; border-radius: 6px; background: #2563eb; color: #fff; font-size: 13px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; vertical-align: middle; }
.projects-page button.link-button:hover { background: #1d4ed8; color: #fff; }
/* 删除按钮默认红色底白字 */
.projects-page button.link-button.danger, .projects-page button.link-button.danger:hover { background: #dc2626; color: #fff; }
.projects-page button.link-button.danger:hover { background: #b91c1c; }
/* 附件文件名 = 普通文字链接；表格内可换行，避免撑宽列导致重叠挤压 */
.projects-page a.link-button { display: inline; padding: 0 2px; background: none; color: #2563eb; white-space: normal; word-break: break-all; line-height: 1.6; }
.projects-page a.link-button:hover { color: #1d4ed8; background: none; }
.projects-page .dept-user-table td .link-button { margin: 2px 4px 2px 0; vertical-align: middle; }

/* 区块标题：操作按钮紧挨标题文字右侧 */
.projects-page .detail-section-title .title-left { display: flex; align-items: center; gap: 10px; }
.projects-page .detail-section-title .title-left h3 { margin: 0; }

/* 档案附件上传行：选择文件 + 上传档案并排且尺寸一致 */
.projects-page .upload-row { display: flex; align-items: center; gap: 8px; margin-top: 12px; }
.projects-page .upload-row label.link-button, .projects-page .upload-row .link-button, .projects-page .upload-row .primary { margin-top: 0; flex: 0 0 auto; width: auto; padding: 8px 16px; font-size: 14px; }

/* 测试记录/送样反馈附件：chip 胶囊式展示，自动换行不显乱 */
/* 2026-09-15：送样条目附件区加"附件："标签，让上传/下载入口更易发现（用户反馈找不到） */
.projects-page .att-label { flex: 0 0 auto; color: #667085; font-size: 12px; }
/* 2026-09-15（方案 A）：送样明细内层表格 —— 多产品 × 多次送样，各列对齐便于横向对比 */
.projects-page .sample-sub-table { margin: 6px 0 0; background: #fff; }
.projects-page .sample-sub-table th { font-weight: 600; color: #475467; background: #f9fafb; white-space: nowrap; }
.projects-page .sample-sub-table td { vertical-align: middle; }
/* 2026-09-21（用户："送样次数的操作区域列宽太宽了，备注的列宽太窄了，整体不协调"）：
   旧状实测（容器 1075px）：次数 71 / 日期 88 / 数量 60 / 结果 60 / 反馈内容 191 / 备注 60 / 附件 345 / 操作 149，
   备注被压成"一字一行"、整行高 291px。根因＝app.css 的 `.dept-user-table th,td{overflow-wrap:anywhere}`
   把单元格最小内容宽降到"一个字"，而整表是**自动布局** —— 富余宽度按各列 max-content 回流，
   nowrap 的"附件"（chips＋3 颗按钮）与"操作"（2 颗按钮）内容最宽就越分越宽，长文本的备注列反被挤没。
   修法（≥801px）：固定表布局 + 逐列定宽，**只留"反馈内容"一列不定宽**，由它吃掉全部富余（长文本都在这一列）。
   ⚠️ 选择器必须两段（`.projects-page .sample-sub-table` = 0,2,x）才压得过 `.dept-user-table th,td`（0,1,1）；
   ⚠️ 窄屏（≤800px）刻意保留原自动布局 —— 定宽在手机宽度下每列只剩几十像素，反而更糟。 */
/* 2026-09-21 第二轮（用户："附件和操作两列的间隔可以缩小一半，操作列的宽度缩小，2 个按钮可以上下排列；
   结果宽度加长，现在里面内容单个字排列看着别扭，数量列也是"）：
   ① 数量 48→76px：48px 减去左右内边距（>1280 视口 16＋16）只剩 16px，3 位数量被逐字断成 3 行；
      76px 可容 5 位数（5×7.8＋32≈71）单行；
   ② 结果 68→112px 且 chip 加 nowrap：`.feedback-chip` 是 inline-block、文本可任意断行，68px 里
      "不认可需修改"（11px×6 字＋左右 8px 内边距＝82px）只能一字一行；nowrap 后需 82＋32＝114 才放得下单行，
      故给 112px（≤1280 视口内边距 12＋12 时为 88px 可用，仍够）；
   ③ 附件 196→164px（两条 chips 行 110px、两颗按钮行 128px、明细按钮 46px，加内边距 160px 刚好），
      操作 130→88px 且按钮改上下排列 → 两列之间的空白间隙由约 84px 降到约 48px（≈减半）；
   ④ 操作列按钮上下排列：`.row-actions` 全局是 `white-space:nowrap`，两颗按钮并排要 110px；
      改 flex 纵向后最小宽度降到单颗按钮 50px，故定宽 88px（内容区 >1280 时 56px）。 */
/* 2026-09-21 第三轮（用户："送样明细表里反馈内容和备注两列间隔太大"）：
   第二轮把备注定宽 216px 后，全部富余宽度被"不定宽"的第 5 列独吞 —— 容器 1080px 时反馈内容列
   实测 287px，而里面常常只有一句短摘要（"IC校准数值比第一次大"约 143px），右侧那 140px 空白
   紧贴着备注列左边框，看起来就像"两列间隔太大"（不是 padding 问题，是列宽分配问题）。
   修法：第 5 列也定宽 216px（≈12 个中文字，短摘要单行放得下；过长本来就走 `.sample-summary`
   的 ellipsis ＋「全文」按钮，不受影响），**改由第 6 列「备注」不定宽吸收全部富余**（备注文本
   最长、最需要宽度）→ 反馈内容列右侧不再堆空白，两列之间只剩常规内边距。 */
.projects-page .sample-content-cell { max-width: none; }
.projects-page .sample-summary { display: inline-block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: bottom; }
.projects-page .sample-note-cell { color: #475467; }
.projects-page .sample-att-cell { white-space: normal; }
/* 结果列：chip 不逐字断行（只作用于本表，不影响时间线/未关联产品小节的 .feedback-chip） */
.projects-page .sample-sub-table .feedback-chip { white-space: nowrap; }
/* 明细表里按钮比页面通用按钮更紧凑（padding 5px 14px → 4px 10px）：否则"编辑＋删除"要 144px、
   "＋送样＋反馈＋明细"要 196px，定宽列会把「反馈内容」挤到 170px 以下。只作用于本表，不影响页面其他按钮。 */
.projects-page .sample-sub-table .link-button { padding: 4px 10px; }
/* 操作列「编辑 / 删除」上下排列（原地是并排 + `.row-actions` 的 nowrap） */
.projects-page .sample-sub-table .row-actions { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; white-space: normal; }
/* 全局有 `.row-actions .link-button + .link-button{margin-left:8px}`（0,2,0），纵向排列时要清掉 */
.projects-page .sample-sub-table .row-actions .link-button + .link-button { margin-left: 0; }
@media (min-width: 801px) {
  /* 定宽列合计 792px + "备注"最小 156px → 表最小 948px，再窄由 .table-scroll 横滚兜底 */
  .projects-page .sample-sub-table { table-layout: fixed; min-width: 948px; }
  .projects-page .sample-sub-table th:nth-child(1), .projects-page .sample-sub-table td:nth-child(1) { width: 60px; }
  .projects-page .sample-sub-table th:nth-child(2), .projects-page .sample-sub-table td:nth-child(2) { width: 76px; }
  .projects-page .sample-sub-table th:nth-child(3), .projects-page .sample-sub-table td:nth-child(3) { width: 76px; }
  .projects-page .sample-sub-table th:nth-child(4), .projects-page .sample-sub-table td:nth-child(4) { width: 112px; }
  /* 第 5 列「反馈内容」定宽 216px：短摘要单行、长文本 ellipsis ＋「全文」按钮（第三轮改） */
  .projects-page .sample-sub-table th:nth-child(5), .projects-page .sample-sub-table td:nth-child(5) { width: 216px; }
  /* ⚠️ 关键（第三轮实测）：光给列定宽**锁不住** —— `.sample-summary` 是 `white-space:nowrap`
     的 inline-block，它的"最小内容宽度"＝整句文字宽，fixed 布局下浏览器拿这个当前提下限，
     又会把第 5 列顶开（实测 30 字摘要把 216px 顶到 391px，备注反被压回 67px）。
     必须给摘要一个**像素级 max-width** 才能锁住列宽：
       216(列宽) − 2(td 内边距) − 46(「全文」按钮) = 168 → 取 164 留 4px 余量 ≈ 11 个中文字
     （实测字号 15px、中文字宽 15px）。超长仍由 ellipsis ＋「全文」按钮兜底，
     故 projects.js 里"显示「全文」按钮"的字数阈值同步从 20 收到 10（否则 11~19 字会被截断却没有入口）。 */
  .projects-page .sample-sub-table .sample-summary { max-width: 164px; }
  /* 第 6 列「备注」不定宽 = 吸收全部富余宽度（长备注最需要宽度） */
  .projects-page .sample-sub-table th:nth-child(7), .projects-page .sample-sub-table td:nth-child(7) { width: 164px; }
  .projects-page .sample-sub-table th:nth-child(8), .projects-page .sample-sub-table td:nth-child(8) { width: 88px; }
}
/* ⚠️ ≤1280 视口下 app.css 的断点把单元格内边距从默认 1px 加到 12px（两侧 24px），
   第 5 列可用内容宽只剩 216−24=192 → 摘要上限要同步收窄，否则「摘要＋全文按钮」放不下会换行、行高不齐：
   192 − 46(按钮) = 146 → 取 142 留余量。 */
@media (min-width: 801px) and (max-width: 1280px) {
  .projects-page .sample-sub-table .sample-summary { max-width: 142px; }
}
.projects-page .att-count { display: inline-block; margin-right: 6px; padding: 1px 8px; border-radius: 10px; background: #eef4ff; color: #1d4ed8; font-size: 12px; }
.projects-page .sample-detail-inner > td { background: #fcfcfd; padding: 10px 14px; }
.projects-page .sample-detail-inner .feedback-content { margin: 0 0 6px; }
.projects-page .sample-detail-inner .att-chips { margin-top: 6px; }
.projects-page .sample-add-row { margin-top: 8px; }
.projects-page .sample-empty { padding: 8px 0; }
/* 2026-09-15：送样记录的长段"操作提示"改为标题旁的 ? 图标 —— hover 或点一下展开浮层（移动端可点） */
.projects-page .hint-tip { position: relative; display: inline-flex; align-items: center; margin-left: 6px; cursor: help; }
.projects-page .hint-tip-icon { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; border-radius: 50%; background: #e4e7ec; color: #475467; font-size: 12px; font-weight: 700; line-height: 1; transition: background .15s, color .15s; }
.projects-page .hint-tip:hover .hint-tip-icon,
.projects-page .hint-tip:focus .hint-tip-icon { background: #0b57b7; color: #fff; }
.projects-page .hint-tip-body { display: none; position: absolute; left: 0; top: calc(100% + 8px); z-index: 40; width: min(560px, 86vw); padding: 10px 12px; background: #fff; border: 1px solid #d0d5dd; border-radius: 8px; box-shadow: 0 10px 28px rgba(16, 24, 40, .16); font-size: 13px; font-weight: 400; line-height: 1.7; color: #344054; white-space: normal; text-align: left; }
.projects-page .hint-tip:hover .hint-tip-body,
.projects-page .hint-tip:focus .hint-tip-body,
.projects-page .hint-tip:focus-within .hint-tip-body { display: block; }
@media (max-width: 800px) { .projects-page .hint-tip-body { width: min(420px, 88vw); } }
.projects-page .att-chips { display: flex; flex-wrap: wrap; gap: 6px 8px; align-items: center; }
.projects-page .att-chip { display: inline-flex; align-items: center; gap: 4px; max-width: 300px; min-width: 0; padding: 3px 6px 3px 10px; background: #f2f4f7; border: 1px solid #e4e7ec; border-radius: 14px; font-size: 12px; line-height: 1.5; }
.projects-page .att-chip a { display: block; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #2563eb; text-decoration: none; }
.projects-page .att-chip a:hover { color: #1d4ed8; text-decoration: underline; }
.projects-page .att-chip-del { flex: 0 0 auto; border: 0; background: none; color: #98a2b3; cursor: pointer; font-size: 12px; line-height: 1; padding: 2px 5px; border-radius: 50%; }
.projects-page .att-chip-del:hover { color: #dc2626; background: #fee2e2; }
.projects-page .att-chips .link-button { margin: 0; padding: 4px 12px; font-size: 12px; }

.project-chip {
  display: inline-block;
  padding: 2px 10px;
  border-radius: 999px;
  font-size: 12px;
  line-height: 20px;
  background: #eef2ff;
  color: #4f46e5;
  white-space: nowrap;
}
.project-chip.ongoing { background: #eef2ff; color: #4f46e5; }
.project-chip.completed { background: #ecfdf5; color: #059669; }
.project-chip.archived { background: #f1f5f9; color: #64748b; }

/* 完结审批状态徽标（pending=待审橙 / approved=通过绿 / rejected=驳回红 / none=未提交灰） */
.completion-chip {
  display: inline-block;
  padding: 2px 10px;
  border-radius: 999px;
  font-size: 12px;
  line-height: 20px;
  background: #f1f5f9;
  color: #64748b;
  white-space: nowrap;
}
.completion-chip.pending { background: #fff7ed; color: #c2410c; }
.completion-chip.approved { background: #ecfdf5; color: #059669; }
.completion-chip.rejected { background: #fef2f2; color: #dc2626; }
.completion-summary { display: flex; flex-wrap: wrap; gap: 16px; align-items: baseline; margin-bottom: 8px; }
.completion-summary > div { display: flex; flex-direction: column; gap: 2px; }
.completion-summary span { font-size: 12px; color: #64748b; }
.completion-summary strong { font-size: 14px; }
.completion-summary small { font-size: 12px; color: #94a3b8; }
.completion-summary p { flex: 1 1 100%; margin: 0; }
.completion-actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.completion-flows { margin-top: 10px; }

.result-chip {
  display: inline-block;
  padding: 2px 10px;
  border-radius: 999px;
  font-size: 12px;
  line-height: 20px;
  white-space: nowrap;
}
.result-chip.pass { background: #ecfdf5; color: #059669; }
.result-chip.fail { background: #fef2f2; color: #dc2626; }
.result-chip.pending { background: #fefce8; color: #a16207; }

/* 详情头 */
.project-detail-title {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 12px;
  flex-wrap: wrap;
  margin: 10px 0 16px;
}
.project-detail-title h3 { font-size: 18px; }
.project-actions { display: flex; gap: 8px; flex-wrap: wrap; }
/* 详情头操作按钮（2026-09-12）：.primary 全局 width:100% 会把「移交项目 / 编辑项目」拉满整行，
   这里收回自适应宽度并统一最小宽度，两枚按钮等宽、居中文字 */
.project-actions .primary { width: auto; flex: 0 0 auto; min-width: 96px; justify-content: center; text-align: center; white-space: nowrap; padding: 8px 16px; font-size: 14px; }
/* 项目列表表格（2026-09-13 二次调整）：**对齐"售后管理列表"的做法**——
   不设强制最小宽度、不要求单元格不换行：表格按卡片宽度自适应（`.dept-user-table` 本身 `width:100%`），
   内容多的列自然折行；窄屏仍由外层 `.table-scroll` 兜底横向滚动。
   仅给「项目名称」列一个最小宽度，避免长名字被挤成一字一行。 */
.projects-page .project-list-table { min-width: 0; }
.projects-page .project-list-table th, .projects-page .project-list-table td { vertical-align: middle; }
.projects-page .project-list-table td:nth-child(2) { min-width: 170px; }
.projects-page .project-list-table td .link-button { max-width: 100%; text-align: left; }
/* 项目列表「项目名称」列（2026-09-13 用户反馈："该列没有自动换行调节"）：
   该单元格是 `button.link-button`，而页面按钮统一样式带 `white-space:nowrap + max-width:260px + 省略号`
   （目的是保证"查看/编辑"这类短按钮不被折行拆开）→ 于是项目名永远一行、超出就截断 ✗。
   这里**只针对名称这一列**放开换行：最大宽度随列走（不再 260px 截断）、长名按列宽折行；其余按钮列不受影响。 */
.projects-page .project-list-table td:nth-child(2) .link-button { max-width: 100%; white-space: normal; overflow: visible; text-overflow: clip; word-break: break-word; line-height: 1.5; }

.project-info-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
  gap: 12px 20px;
  margin: 8px 0 4px;
}
.project-info-grid > div { display: flex; flex-direction: column; gap: 2px; }
.project-info-grid span { font-size: 12px; color: #64748b; }
.project-info-grid strong { font-weight: 600; color: #0f172a; }

.project-desc {
  margin-top: 12px;
  padding: 12px;
  background: #f8fafc;
  border-radius: 8px;
  color: #334155;
  font-size: 14px;
  line-height: 1.7;
  white-space: pre-wrap;
}

/* 进度时间线 */
.project-timeline {
  list-style: none;
  margin: 8px 0 0;
  padding: 0;
  position: relative;
}
.project-timeline::before {
  content: '';
  position: absolute;
  left: 8px;
  top: 6px;
  bottom: 6px;
  width: 2px;
  background: #e2e8f0;
}
.project-timeline li {
  position: relative;
  padding: 0 0 16px 30px;
}
.project-timeline li:last-child { padding-bottom: 4px; }
.timeline-dot {
  position: absolute;
  left: 3px;
  top: 6px;
  width: 12px;
  height: 12px;
  border-radius: 50%;
  background: #4f46e5;
  border: 2px solid #fff;
  box-shadow: 0 0 0 2px #c7d2fe;
}
.timeline-body p { margin: 0; color: #1e293b; font-size: 14px; line-height: 1.6; white-space: pre-wrap; }
/* 研发进度每条记录的「编辑 / 删除」（2026-09-12）：与"时间 · 记录人 / 类型"同一行、靠右对齐。
   不要用绝对定位压在右上角——按钮宽度（含内边距）大于预留空间时会与正文叠字。 */
.projects-page .project-timeline .timeline-meta { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.projects-page .project-timeline .timeline-meta .row-actions { margin-left: auto; white-space: nowrap; }
/* 时间线里的按钮收小一档（.link-button 默认 padding 5px 14px 在行内偏重） */
.projects-page .project-timeline .timeline-meta .row-actions .link-button { padding: 3px 10px; font-size: 12px; }
.timeline-body small { color: #94a3b8; font-size: 12px; }

/* 2026-09-22（用户需求）：研发进度 / 测试记录也按「型号 / 规格」分开 —— 小节行（型号 ＋ N 条）。
   进度区用右移的浅底小标题（让时间线仍连通）；测试区用整行浅底分组行，与表头列宽对齐。 */
.projects-page .item-group-name { font-weight: 600; color: #1e293b; margin-right: 8px; }
.projects-page .item-group-row { display: flex; align-items: baseline; gap: 8px; }
.projects-page .item-group-row .muted { font-weight: 400; }
.projects-page .timeline-group > .item-group-row {
  padding: 4px 10px;
  margin: 14px 0 8px;
  background: #f1f5f9;
  border-left: 3px solid #2563eb;
  border-radius: 4px;
  font-size: 13px;
}
.projects-page .timeline-group:first-child > .item-group-row { margin-top: 6px; }
.projects-page table tbody.item-group > tr.item-group-row td {
  background: #f1f5f9;
  border-left: 3px solid #2563eb;
  font-size: 13px;
  padding-top: 5px;
  padding-bottom: 5px;
}

/* 附件 */
.att-list { list-style: none; margin: 8px 0 0; padding: 0; }
.att-list li { padding: 8px 0; border-bottom: 1px dashed #e2e8f0; }
.att-list li:last-child { border-bottom: none; }
.att-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.att-icon { font-size: 14px; }
.upload-row { display: flex; align-items: center; gap: 8px; margin-top: 12px; }
.upload-row input[type="file"] { flex: 1; min-width: 200px; }

/* 阶段 chip */
.phase-chip {
  display: inline-block;
  padding: 2px 10px;
  border-radius: 999px;
  font-size: 12px;
  line-height: 20px;
  background: #eff6ff;
  color: #2563eb;
  white-space: nowrap;
}

/* 阶段进度条 */
.phase-steps {
  display: flex;
  align-items: flex-start;
  gap: 0;
  margin: 4px 0 8px;
  padding: 12px 8px 4px;
  background: #fcfdfe;
  border-radius: 8px;
  overflow-x: auto;
}
.phase-step {
  flex: 1;
  min-width: 72px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  position: relative;
  color: #94a3b8;
}
.phase-step::before {
  content: '';
  position: absolute;
  top: 11px;
  right: 50%;
  width: 100%;
  height: 2px;
  background: #eef2f7;
  border-radius: 2px;
}
.phase-step:first-child::before { display: none; }
/* 阶段圆点（2026-09-14 第 2 版：纯色实心小点，圆里不放 ✓/数字；当前阶段＝更大的点 + 光晕）
   盒子仍是 24×24（布局零回归），靠 border-box + background-clip:content-box 画出 10px / 14px 的实心点。
   注：项目没有全局 box-sizing，这里必须显式写 border-box，否则 padding 会把点撑大。 */
.phase-dot {
  position: relative;
  z-index: 1;
  box-sizing: border-box;
  width: 24px;
  height: 24px;
  border-radius: 50%;
  border: 0;
  padding: 4px;
  background-color: #e9edf3;
  background-clip: content-box;
  box-shadow: none;
  transition: background-color .18s ease, box-shadow .18s ease, padding .18s ease;
}
.phase-label { font-size: 12px; white-space: nowrap; }
/* 阶段可多轮循环（2026-09-12）：阶段条上标 ×N，提示该阶段已进入几次 */
.phase-round { margin-left: 4px; font-size: 11px; font-style: normal; color: #0f55a4; background: #e8f1fb; border-radius: 8px; padding: 0 5px; }
/* 阶段历史（2026-09-12 改版）：改为**流转风格**时间线——直接复用订单「流转记录」的 .flow-timeline
   （样式在 order-detail.css，全局生效：圆点 + 事件名 + 详情 + 时间），此处只补项目侧的小调整。
   卡片本身走标准可折叠（.detail-section[data-collapsible]，折叠逻辑在 app-shell.js 的 [data-collapse]）。 */
.projects-page .flow-timeline li { display: flex; gap: 14px; padding: 14px 0 2px; }
.projects-page .flow-timeline li:last-child { padding-bottom: 0; }
.projects-page .flow-timeline strong { display: inline-flex; align-items: center; }
.projects-page .flow-timeline p { margin: 4px 0; }
/* 最后一条＝当前所处阶段 */
.projects-page .ph-current { display: inline-block; margin-left: 8px; padding: 0 7px; border-radius: 9px; font-size: 11px; font-style: normal; font-weight: 400; line-height: 17px; color: #0f55a4; background: #e8f1fb; border: 1px solid #c9dff5; }
/* 测试记录/送样反馈的「编辑/删除」（2026-09-12） */
.row-actions { white-space: nowrap; }
.row-actions .link-button + .link-button { margin-left: 8px; }
.feedback-head .fb-actions { margin-left: auto; display: inline-flex; gap: 8px; }
/* 送样记录（2026-09-15）：点「送样(N)」就地展开该产品的历次送样 —— 展开行 + 新增入口 + 未关联小节 */
.sample-detail-row > td { background: #fafbfd; padding: 10px 14px; }
.sample-add-row { margin-bottom: 8px; }
.sample-detail-row .feedback-list { margin: 0; }
.sample-unlinked { margin-top: 14px; border-top: 1px dashed #e2e8f0; padding-top: 10px; }
.sample-unlinked h4 { margin: 0 0 8px; font-size: 13px; font-weight: 600; color: #475569; }
/* 测试记录轮次列 */
.project-detail-head ~ .dept-user-table .round-cell, .detail-section .dept-user-table .round-cell { white-space: nowrap; color: #0f55a4; font-size: 12px; }
.phase-step.done { color: #047857; }
.phase-step.done::before { background: linear-gradient(90deg, #34d399, #6ee7b7); border-radius: 2px; }
.phase-step.done .phase-dot { background-color: #10b981; }
.phase-step.current { color: #1d4ed8; font-weight: 600; }
.phase-step.current::before { background: #dbeafe; }
.phase-step.current .phase-dot { background-color: #2563eb; padding: 2px; box-shadow: 0 0 0 4px rgba(37, 99, 235, .15); }
/* 退回阶段入口（2026-09-12）：当前阶段**之前**的阶段可点 → 退回（需选原因）。
   此前项目倒退只能打开「编辑项目」弹窗改「当前阶段」下拉，入口不直观（用户反馈）。 */
.phase-step--back { cursor: pointer; border-radius: 6px; }
.phase-step--back:hover { background: #eef4fc; }

.phase-step--back:hover .phase-label { color: #2563eb; text-decoration: underline; }
.phase-step--back:focus-visible { outline: 2px solid #93c5fd; outline-offset: 2px; }
.phase-hint { font-size: 12px; color: #98a2b3; white-space: nowrap; }
/* 进度条与"推进到下一阶段 / 提交完结"按钮同行（.primary 全局 width:100%，同行内必须收回自适应宽度）。
   2026-09-12：阶段条行新增「提交完结」按钮（未提交完结时出现），窄屏允许换行避免溢出。 */
.phase-bar-row { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin: 4px 0 10px; }
.phase-bar-row .phase-steps { flex: 1; margin: 0; }
.phase-bar-row .primary, .projects-page .detail-section-title .title-left .primary { width: auto; flex: 0 0 auto; white-space: nowrap; padding: 8px 16px; font-size: 14px; }

/* 里程碑 */
.milestone-bar {
  height: 8px;
  border-radius: 999px;
  background: #e2e8f0;
  overflow: hidden;
  margin: 10px 0 12px;
}
.milestone-bar-fill {
  height: 100%;
  border-radius: 999px;
  background: linear-gradient(90deg, #2563eb, #059669);
  transition: width 0.3s ease;
}
.milestone-list { list-style: none; margin: 0; padding: 0; }
.milestone-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 0;
  border-bottom: 1px dashed #e2e8f0;
}
.milestone-item:last-child { border-bottom: none; }
.milestone-item input[type="checkbox"] {
  width: 17px;
  height: 17px;
  accent-color: #059669;
  cursor: pointer;
  flex-shrink: 0;
}
.milestone-item input[type="checkbox"]:disabled { cursor: not-allowed; opacity: 0.6; }
.milestone-label { color: #334155; font-size: 14px; }
.milestone-item.done .milestone-label { color: #059669; text-decoration: line-through; }
.milestone-item small { color: #94a3b8; font-size: 12px; }

/* 进度类型 chip */
.type-chip {
  display: inline-block;
  margin-left: 10px;
  padding: 1px 8px;
  border-radius: 999px;
  font-size: 11px;
  line-height: 18px;
  background: #f1f5f9;
  color: #64748b;
  vertical-align: 1px;
}
.type-chip.type-design { background: #eef2ff; color: #4f46e5; }
.type-chip.type-outsourcing { background: #fefce8; color: #a16207; }
.type-chip.type-test { background: #fff7ed; color: #ea580c; }
.type-chip.type-sample { background: #ecfdf5; color: #059669; }
.type-chip.type-other { background: #f1f5f9; color: #64748b; }

/* 送样反馈 */
.feedback-list { list-style: none; margin: 8px 0 0; padding: 0; }
.feedback-row { border: 1px solid #e2e8f0; border-radius: 8px; padding: 10px 12px; margin-bottom: 10px; background: #fff; }
.feedback-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.feedback-chip { display: inline-block; padding: 1px 8px; border-radius: 999px; font-size: 11px; line-height: 18px; }
.feedback-chip.pending { background: #f1f5f9; color: #64748b; }
.feedback-chip.accepted { background: #ecfdf5; color: #059669; }
.feedback-chip.modify { background: #fefce8; color: #a16207; }
.feedback-chip.rejected { background: #fef2f2; color: #dc2626; }
.feedback-date { font-weight: 600; color: #334155; font-size: 13px; }
.feedback-content { margin: 6px 0 4px; color: #334155; font-size: 14px; line-height: 1.6; }
.feedback-att { margin-top: 6px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }

/* 2026-09-16：项目列表分栏「进行中 / 已完结」——下划线式文字导航（与统计页、售后列表风格一致） */
.project-seg { display: flex; gap: 24px; align-items: center; margin: 14px 0 0; border-bottom: 1px solid #e5e7eb; }
.project-seg-btn { position: relative; border: 0; background: none; padding: 10px 2px 12px; font-size: 15px; color: #667085; cursor: pointer; min-height: 44px; }
.project-seg-btn:hover { color: #0b57b7; }
.project-seg-btn.active { color: #0b57b7; font-weight: 700; }
.project-seg-btn.active::after { content: ''; position: absolute; left: 0; right: 0; bottom: -1px; height: 2px; background: #0b57b7; border-radius: 1px; }
@media (max-width: 800px) { .project-seg { gap: 18px; } .project-seg-btn { font-size: 14px; } }
