/* ═══════════════════════════════════════════════════════════════
   项目协同（PM）· 项目级布局样式（Aurora 令牌驱动）
   ───────────────────────────────────────────────────────────────
   通用组件（按钮/输入/标签/进度/表格/弹窗/分段…）一律用 css/aurora-ui.css
   （au- 前缀）。此处仅保留典范未覆盖的项目专属布局：
   任务表格单元格、微标题、甘特条、指派联想、评论/记录线程、子任务卡片、
   派发弹窗分组。为避免全局泄漏，页面级规则统一挂在 .pmv / .pm-dispatch 下。
   颜色/圆角/阴影统一取 themes.css 令牌，禁止硬编码色值。
   ═══════════════════════════════════════════════════════════════ */

/* ── 页面骨架：纵向堆叠 + Aurora 组合件覆盖 ── */
.pmv { display: flex; flex-direction: column; gap: 1rem; }
.pmv > .pm-detail-view { margin-top: 0; }

/* ── 微标题（分组小标签，Aurora 规范字号/字距） ── */
.pm-eyebrow {
  display: flex; align-items: center; gap: .5rem;
  font-size: var(--fs-1); font-weight: 600; color: var(--text-4);
  text-transform: uppercase; letter-spacing: .16em; margin-bottom: .75rem;
}
.pm-eyebrow .au-req { margin-left: .125rem; }

/* ── 贴边面板（表格容器）：内边距交给单元格 ── */
.pm-flush { padding: 0; overflow: hidden; }
.pm-flush:hover { transform: none; }
.pm-flush-head { padding: 1rem 1.125rem .75rem; margin-bottom: 0; border-bottom: 1px solid var(--border); }
.pm-table-wrap { overflow-x: auto; }

/* ── 筛选区 ── */
.pm-filter-grid { display: flex; align-items: flex-end; gap: .875rem; flex-wrap: wrap; }
.pm-filter-grid .au-field { flex: 1 1 16rem; margin: 0; }
.pm-filter-acts { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; }

/* ── 工具条 ── */
.pm-ml-auto { margin-left: auto; }

/* ── 图文行内图标：随字号缩放，颜色跟随 currentColor ── */
.pm-ico { display: inline-flex; align-items: center; justify-content: center; vertical-align: -.125em; }
.pm-ico svg { width: 1em; height: 1em; flex: none; }
.pmv .au-panel-title > svg { width: .9375rem; height: .9375rem; flex: none; color: var(--accent); }
.pm-title-acts { margin-left: auto; display: inline-flex; align-items: center; gap: .5rem; text-transform: none; letter-spacing: 0; }
/* ::after 的 flex:1 会先吃光剩余空间，导致 .pm-title-acts 的 margin-left:auto 失效、按钮贴死标题，有操作区时让线收起 */
.au-panel-title:has(.pm-title-acts)::after { display: none; }
.pm-dispatch .au-btn.au-is-loading .pm-ico { display: none; }

/* ── 任务表格行 ── */
.pm-task-row { cursor: pointer; }
.pm-task-row.pm-greyed { opacity: .55; }
.pm-task-row.pm-greyed:hover { opacity: .9; }
.pm-task-row.pm-mine { background: var(--accent-soft); }
.pm-task-row.pm-mine:hover { background: var(--accent-line); }
.pm-cell-name { font-size: var(--fs-2); font-weight: 600; color: var(--text-1); line-height: 1.4; }
.pm-cell-tags { display: flex; align-items: center; gap: .375rem; flex-wrap: wrap; margin-top: .375rem; }
.pm-cell-person { display: flex; align-items: center; gap: .5rem; font-size: var(--fs-2); color: var(--text-2); white-space: nowrap; }
.pm-cell-time { font-family: var(--font-mono); font-size: var(--fs-1); color: var(--text-3); white-space: nowrap; }
.pm-cell-arrow { color: var(--text-4); margin: 0 .3125rem; }
.pm-cell-sub { font-size: var(--fs-1); color: var(--text-4); margin-top: .3125rem; }
.pm-task-progress { width: 100%; }

/* ── 头像（带接收状态色） ── */
.pm-ava-stack { display: flex; }
.pm-ava { width: 1.625rem; height: 1.625rem; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; color: var(--surface); font-size: var(--fs-1); font-weight: 600; margin-left: -.375rem; border: 2px solid var(--surface); }
.pm-ava:first-child { margin-left: 0; }
.pm-ava.wait { background: var(--text-4); }
.pm-ava.ok { background: var(--success); }
.pm-ava.no { background: var(--danger); }
.pm-ava.more { background: var(--surface-3); color: var(--text-2); }

/* ── 表内骨架堆叠（回退方案） ── */
.pm-sk-stack { display: flex; flex-direction: column; gap: .625rem; padding: 1.125rem; }
.pm-sk-stack .au-skeleton { height: .875rem; border-radius: var(--r-sm); }
.pm-sk-stack .au-skeleton:nth-child(2) { width: 72%; }
.pm-sk-stack .au-skeleton:nth-child(3) { width: 46%; }

/* ── 详情 ── */
.pm-detail-view { animation: au-fadeUp .3s var(--ease-out); }
.pm-detail-nav { display: flex; align-items: center; justify-content: space-between; gap: .75rem; flex-wrap: wrap; padding: .75rem 1rem; position: sticky; top: 0; z-index: 5; }
.pm-detail-nav:hover { transform: none; }
.pm-nav-actions { margin-bottom: 0; display: flex; gap: .5rem; flex-wrap: wrap; }
.pm-detail-page { margin-top: 1rem; }
.pm-detail-main { min-width: 0; display: flex; flex-direction: column; gap: 1.25rem; }
.pm-detail-side { display: flex; flex-direction: column; gap: 1.25rem; }
.pm-detail-main > .au-panel + .au-panel, .pm-detail-side > .au-panel + .au-panel { margin-top: 0; }
.pm-head-tags { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; flex: none; }
.pm-desc-full { grid-column: 1 / -1; }
.pm-desc-text { font-weight: 500; line-height: 1.65; white-space: pre-wrap; word-break: break-word; }
.pm-detail-progress { height: .5625rem; margin-top: .5rem; }
.pm-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: .4375rem; }
.pm-list li { display: flex; align-items: flex-start; gap: .5rem; font-size: var(--fs-2); line-height: 1.55; color: var(--text-2); }
.pm-list li .pm-ico { color: var(--accent); margin-top: .125rem; }
.pm-list-risk li { color: var(--warning); }
.pm-list-risk li .pm-ico { color: var(--warning); }
.pm-li-empty { color: var(--text-4); }
.pm-sub-summary { margin-top: .25rem; padding: .625rem .75rem; background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--r-md); font-size: var(--fs-2); color: var(--text-1); }
.pm-sub-summary b { color: var(--success); font-size: var(--fs-2); }

/* ── 子任务状态总览 ── */
.pm-substat-bar { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; margin-bottom: .875rem; }
.pm-substat-total { margin-left: auto; font-size: var(--fs-1); color: var(--text-4); }
.pm-substat-list { display: flex; flex-direction: column; gap: .625rem; margin-bottom: 1.125rem; }
.pm-substat-item { display: flex; gap: .75rem; align-items: flex-start; background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--r-md); padding: .75rem .875rem; }
.pm-substat-idx { min-width: 1.5rem; width: auto; padding: 0 .3125rem; height: 1.5rem; border-radius: var(--r-sm); flex-shrink: 0; display: grid; place-items: center; font-size: var(--fs-1); font-weight: 700; background: var(--accent-soft); color: var(--accent-text); }
.pm-substat-main { flex: 1; min-width: 0; }
.pm-substat-row1 { display: flex; align-items: center; justify-content: space-between; gap: .5rem; }
.pm-substat-title { font-weight: 600; font-size: var(--fs-2); color: var(--text-1); }
.pm-substat-row2 { display: flex; align-items: center; justify-content: space-between; gap: .625rem; flex-wrap: wrap; margin-top: .4375rem; font-size: var(--fs-1); color: var(--text-3); }
.pm-substat-ass { display: flex; align-items: center; gap: .375rem; flex-wrap: wrap; }
.pm-substat-time { display: inline-flex; align-items: center; gap: .3125rem; color: var(--text-4); white-space: nowrap; }
.pm-substat-time .pm-ico { color: var(--text-4); font-size: var(--fs-2); }
.pm-progress-sm { height: .3125rem; margin: .5rem 0 0; }

/* ── 子任务卡片（详情页） ── */
.pm-sub-card { background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--r-md); padding: .875rem 1rem; margin-bottom: .625rem; transition: border-color var(--dur-2); }
.pm-sub-card:hover { border-color: var(--accent-line); }
.pm-sub-card.pm-greyed { opacity: .6; filter: grayscale(.4); }
.pm-sub-head { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; }
.pm-sub-title { flex: 1; font-weight: 600; color: var(--text-1); min-width: 10rem; display: flex; align-items: center; gap: .375rem; }
.pm-sub-title > .pm-sub-no { flex-shrink: 0; }
.pm-sub-title > .pm-subtask-title-input { flex: 1 1 auto; min-width: 0; width: auto; height: 2rem; padding: 0 .5rem; font-size: var(--fs-2); font-weight: 600; }
/* ── 多级任务树（层级树导轨）：每级一个 --ptu 导轨单元，竖线随整行高贯通（跨行间距靠 --ptx 桥接）；
   横线一律对准「标题行中心」--pth —— 卡片是变高块，只有首行的几何是确定的 ── */
.pm-tree-row { --ptu: 2.25rem; --pth: 1.875rem; --ptc: .75rem; --ptx: 0rem; --ptg: .5rem; display: flex; align-items: flex-start; gap: var(--ptg); }
.pm-tree-row--edit { --ptc: 1.5rem; }
.pm-tree-row--stat { --ptu: 1.625rem; --pth: 1.5rem; --ptx: .625rem; --ptc: .75rem; }
.pm-tree-row--gantt { --ptu: 1rem; --pth: 1.0625rem; --ptx: .5rem; --ptg: .375rem; --ptc: .75rem; }
/* 甘特标签列总宽不变：导轨吃掉的正是标题可用宽（--d 由行上给出，导轨与标签共用） */
.pm-tree-row--gantt .pm-gantt-label { width: calc(9rem - var(--d) * var(--ptu) - var(--ptc)); min-width: 3.5rem; padding-left: 0; }
.pm-tree-row--gantt .pm-tree-branch { right: calc(-1 * var(--ptg) + .25rem); }
.pm-tree-rail { position: relative; flex: 0 0 auto; align-self: stretch; width: calc(var(--d) * var(--ptu) + var(--ptc)); }
.pm-tree-rail i { position: absolute; top: 0; bottom: calc(-1 * var(--ptx)); width: 1px; background: var(--border-strong); left: calc((var(--k) - 1) * var(--ptu) + .71875rem); }
/* 该级子树到此为止 → 竖线只走到枝干处，收成 └ */
.pm-tree-rail i.pm-tree-stop { bottom: auto; height: var(--pth); }
/* 本级往下挂下级的竖线：从本级标题行起，不走到行首 */
.pm-tree-rail i.pm-tree-down { top: var(--pth); }
.pm-tree-branch { position: absolute; left: calc((var(--d) - 1) * var(--ptu) + .75rem); top: var(--pth); right: calc(-1 * var(--ptg)); height: 1px; background: var(--border-strong); }
.pm-tree-cell { position: absolute; top: calc(var(--pth) - .75rem); left: calc((var(--k) - 1) * var(--ptu)); width: 1.5rem; height: 1.5rem; }
.pm-tree-caret { position: relative; z-index: 1; display: inline-flex; align-items: center; justify-content: center; gap: .125rem; width: 1.5rem; height: 1.5rem; padding: 0; background: var(--surface-3); border: 1px solid var(--border); border-radius: var(--r-sm); color: var(--text-3); font-size: var(--fs-1); cursor: pointer; }
.pm-tree-caret:hover { border-color: var(--accent-line); color: var(--accent); }
.pm-tree-n { font-weight: 600; color: var(--text-3); font-size: var(--fs-1); }
.pm-sub-no { font-family: var(--font-mono); font-weight: 500; font-size: var(--fs-1); color: var(--text-4); }
.pm-sub-lvl { font-weight: 500; font-size: var(--fs-1); flex-shrink: 0; }
/* 汇总节点（父卡）要有「我是父节点」的分量：3px 实色左边框，枝干正落在该边中点 */
.pm-sub-card--node { border-left: 3px solid var(--accent-line); }
.pm-sub-card--node > .pm-sub-head > .pm-sub-title > .pm-subtask-title-input { font-weight: 700; }
.pm-detail-counts { margin-top: .375rem; }
.pm-detail-counts b { color: var(--accent); font-size: var(--fs-2); }
.pm-count-num { font-family: var(--font-mono); font-weight: 600; font-size: var(--fs-2); color: var(--text-1); }
.pm-sub-prog { display: inline-flex; align-items: center; gap: .5rem; }
.pm-inline-sel { width: auto; min-width: 6rem; height: 2rem; padding: 0 1.75rem 0 .625rem; font-size: var(--fs-1); }
.pm-inline-num { width: 4.5rem; height: 2rem; padding: 0 .5rem; font-size: var(--fs-1); }
.pm-sub-assignees { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; margin: .5rem 0; font-size: var(--fs-1); }
.pm-s-label { color: var(--text-4); }
.pm-chip-empty { color: var(--text-4); font-style: italic; }
.pm-sub-time { display: flex; align-items: center; gap: .3125rem; font-size: var(--fs-1); color: var(--text-4); }
/* 实际完成时间（v255 超时三态的判据）：与计划时间并排，靠图标+浅色区分，不抢主信息 */
.pm-sub-done-at { display: inline-flex; align-items: center; gap: .25rem; margin-left: .5rem; white-space: nowrap; }
.pm-sub-done-at .pm-ico { width: .875rem; height: .875rem; color: var(--success); }
.pm-sub-desc { margin-top: .5rem; font-size: var(--fs-2); color: var(--text-2); white-space: pre-wrap; word-break: break-word; }
.pm-sub-assignee { display: inline-flex; align-items: center; gap: .25rem; }
.pm-add-sub { text-align: center; margin-top: .5rem; }
.pm-add-sub .au-btn { width: 100%; }

/* ── 附件 ── */
.pm-file-row { display: flex; align-items: center; gap: .5rem; margin-top: .375rem; }
.pm-file-link { display: inline-flex; align-items: center; gap: .3125rem; color: var(--accent-text); font-size: var(--fs-2); min-width: 0; }
.pm-file-link span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pm-file-link:hover { text-decoration: underline; }
.pm-file-size { color: var(--text-4); font-size: var(--fs-1); }
.pm-file-up { margin-top: .5rem; }
.pm-file-in { height: 2.25rem; padding: 0 .5rem; font-size: var(--fs-1); }
.pm-file-in::file-selector-button {
  height: 1.75rem; margin-right: .625rem; padding: 0 .75rem;
  border: 1px solid var(--accent-line); border-radius: var(--r-sm);
  background: var(--accent-soft); color: var(--accent-text);
  font-size: var(--fs-1); font-weight: 600; cursor: pointer;
  transition: background-color var(--dur-2) var(--ease-out), border-color var(--dur-2);
}
.pm-file-in::file-selector-button:hover { background: var(--accent-line); border-color: var(--accent); }
.pm-sub-files { margin-top: .625rem; }

/* ── 讨论 / 评论线程 ── */
.pm-sub-cmt-toggle { margin-top: .625rem; }
.pm-sub-comments { margin-top: .5rem; }
.pm-cmt-row { display: flex; gap: .625rem; padding: .625rem 0; border-bottom: 1px solid var(--border); }
.pm-cmt-row:last-child { border-bottom: none; }
.pm-cmt-body { flex: 1; min-width: 0; }
.pm-cmt-head { display: flex; align-items: center; gap: .5rem; font-size: var(--fs-1); color: var(--text-3); flex-wrap: wrap; }
.pm-cmt-head b { color: var(--text-1); font-size: var(--fs-2); }
.pm-cmt-time { color: var(--text-4); font-size: var(--fs-1); }
.pm-cmt-text { margin: .25rem 0 .375rem; font-size: var(--fs-2); color: var(--text-1); line-height: 1.5; white-space: pre-wrap; word-break: break-word; }
.pm-cmt-acts { display: flex; align-items: center; gap: .25rem; font-size: var(--fs-1); margin-left: -.5rem; }
.pm-cmt-reply-box { margin: .375rem 0 .25rem; display: flex; flex-direction: column; gap: .375rem; }
.pm-cmt-add { display: flex; flex-direction: column; gap: .5rem; margin-top: .625rem; }

/* ── 执行记录 ── */
.pm-rec-count { color: var(--text-4); font-weight: 400; font-size: var(--fs-2); }
.pm-rec-row { display: flex; gap: .625rem; padding: .625rem 0; border-bottom: 1px dashed var(--border); }
.pm-rec-row:last-child { border-bottom: none; }
.pm-rec-row.reply { margin-left: 2.125rem; }
.pm-rec-body { flex: 1; min-width: 0; }
.pm-rec-head { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; font-size: var(--fs-2); color: var(--text-3); }
.pm-rec-head b { color: var(--text-1); }
.pm-rec-type { padding: .0625rem .5rem; border-radius: var(--r-full); font-size: var(--fs-1); font-weight: 600; }
.pm-rec-type.feedback { background: var(--accent-soft); color: var(--accent-text); }
.pm-rec-type.reply { background: var(--success-soft); color: var(--success); }
.pm-rec-sub { font-size: var(--fs-1); color: var(--text-3); background: var(--surface-3); padding: .0625rem .5rem; border-radius: var(--r-full); }
.pm-rec-content { font-size: var(--fs-2); color: var(--text-1); margin-top: .25rem; white-space: pre-wrap; word-break: break-word; }
.pm-rec-time { margin-left: auto; font-size: var(--fs-1); color: var(--text-4); }
.pm-rec-replies { margin-top: .125rem; border-left: 2px solid var(--border); padding-left: .5rem; }
.pm-rec-add { margin-top: .75rem; background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--r-md); padding: .75rem; display: flex; flex-direction: column; gap: .5rem; }
.pm-rec-add-row { display: flex; gap: .5rem; flex-wrap: wrap; }
.pm-rec-add-row .au-select { flex: 1; min-width: 8rem; max-width: 11.25rem; }
.pm-rec-reply-box { margin: .375rem 0 .25rem; display: flex; flex-direction: column; gap: .375rem; }

/* ── 成员接收状态 ── */
.pm-member-row { display: flex; align-items: center; gap: .625rem; padding: .5rem 0; border-bottom: 1px dashed var(--border); }
.pm-member-row:last-child { border-bottom: none; }
.pm-member-info { flex: 1; min-width: 0; }
.pm-member-name { font-size: var(--fs-2); font-weight: 600; color: var(--text-1); }
.pm-me-tag { font-size: var(--fs-1); background: var(--accent); color: var(--surface); border-radius: var(--r-xs); padding: .0625rem .3125rem; margin-left: .25rem; }
.pm-member-st { font-size: var(--fs-1); margin-top: .125rem; }
.pm-member-st.ok { color: var(--success); }
.pm-member-st.no { color: var(--danger); }
.pm-member-st.wait { color: var(--text-4); }

/* ── 甘特图 ── */
.pm-gantt-row { display: flex; align-items: center; min-height: 2.125rem; margin-bottom: .5rem; }
.pm-gantt-label { width: 9rem; flex-shrink: 0; font-size: var(--fs-1); color: var(--text-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding-right: .75rem; }
.pm-gantt-track { position: relative; flex: 1; height: 1.5rem; background: var(--surface-3); border: 1px solid var(--border); border-radius: var(--r-sm); overflow: hidden; }
.pm-gantt-bar { position: absolute; top: .1875rem; height: 1.125rem; border-radius: var(--r-xs); min-width: .375rem; transition: width var(--dur-3) var(--ease-out); }
.pm-bar--todo { background: var(--text-4); opacity: .55; }
.pm-bar--active { background: var(--warning); box-shadow: 0 0 0 1px var(--warning-soft); }
.pm-bar--done { background: var(--success); }

/* ── 派发弹窗（全局 showModal 内容区）：分组卡片 / AI 面板 ── */
/* 弹窗宽度由 js/project.js openDispatchModal 的 width:'78rem' 单一来源控制（内联 max-width），此处只负责排布 */
.pm-dispatch { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1.125rem; align-items: start; }
.pm-dispatch > .pm-req-card, .pm-dispatch > .pm-ai-card { grid-column: 1 / -1; }
@media (max-width: 64rem) { .pm-dispatch { grid-template-columns: minmax(0, 1fr); } }
/* 工期推算：勾选项 + 后端回读的只读结果条 */
.pm-span-opt { display: flex; flex-wrap: wrap; gap: .5rem 1.5rem; margin-top: .875rem; }
.pm-span-result { margin-top: .75rem; padding: .5rem .75rem; font-size: var(--fs-2); color: var(--text-1); background: var(--surface-3); border: 1px dashed var(--border-strong); border-radius: var(--r-sm); }
.pm-span-result b { color: var(--accent-text); font-weight: 700; }
.pm-span-sub { display: block; margin-top: .125rem; font-size: var(--fs-1); color: var(--text-4); }
.pm-span-msg { color: var(--text-4); }
.pm-span-err { color: var(--danger); }
.pm-modal-card { background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--r-md); padding: 1.125rem; }
.pm-modal-card > .au-field + .au-field, .pm-modal-card > .au-form-grid + .au-field, .pm-modal-card > .pm-span-result + .au-field { margin-top: 1rem; }
.pm-modal-card .au-form-grid { margin-top: 1rem; }
.pm-modal-card .pm-eyebrow .pm-ico { color: var(--accent); }
.pm-textarea { min-height: 5rem; resize: vertical; }
.pm-textarea-sm { min-height: 3.75rem; resize: vertical; font-size: var(--fs-1); }
.pm-ai-card { background: linear-gradient(135deg, var(--accent-soft), var(--info-soft)); border-color: var(--accent-line); }
.pm-ai-head { display: flex; align-items: flex-start; gap: .875rem; margin-bottom: 1rem; }
.pm-ai-t { flex: 1; min-width: 0; }
.pm-ai-t b { font-size: var(--fs-2); color: var(--text-1); display: block; margin-bottom: .25rem; }
.pm-ai-t span { font-size: var(--fs-2); color: var(--text-2); line-height: 1.5; }
/* 规划前的「补全以上信息」提示条：紧贴说明行，与按钮之间留一档间距 */
.pm-ai-card > .pm-ai-head + .pm-hint { margin-top: 0; }
.pm-ai-card > .pm-hint + .au-btn { margin-top: 1rem; }
.pm-ai-result { margin-top: 1.25rem; }
.pm-count { font-size: var(--fs-1); font-weight: 600; background: var(--accent-soft); color: var(--accent-text); padding: .0625rem .4375rem; border-radius: var(--r-full); margin-left: .25rem; }
.pm-tab-content { background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-md); padding: 1rem; margin-top: 1rem; }
.pm-tab-panel { display: none; }
.pm-tab-panel.au-is-active { display: block; animation: au-fadeUp .25s var(--ease-out); }

.pm-subtask-card { background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--r-md); margin-bottom: .75rem; overflow: hidden; }
.pm-subtask-card:last-of-type { margin-bottom: 0; }
.pm-subtask-header { display: flex; align-items: center; gap: .75rem; padding: .75rem 1rem; background: var(--surface-3); border-bottom: 1px solid var(--border); }
.pm-subtask-index { width: 1.75rem; height: 1.75rem; border-radius: .5rem; display: grid; place-items: center; font-size: var(--fs-2); font-weight: 700; background: linear-gradient(135deg, var(--grad-a), var(--grad-b)); color: var(--surface); flex-shrink: 0; }
.pm-subtask-title-row { flex: 1; display: flex; align-items: center; gap: .5rem; min-width: 0; }
.pm-subtask-body { padding: 1rem; display: flex; flex-direction: column; gap: .75rem; }
.pm-subtask-body .pm-grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: .75rem; }
.pm-placeholder-text { color: var(--text-4); font-size: var(--fs-2); font-style: italic; }
.pm-sub-assignee-selector { position: relative; }
.pm-sub-assignee-display { display: flex; align-items: center; gap: .5rem; min-height: 2.5rem; padding: .5rem .75rem; background: var(--field-bg); border: 1px solid var(--border); border-radius: var(--r-sm); margin-bottom: .5rem; }
.pm-sub-assignee-chip { display: inline-flex; align-items: center; gap: .375rem; background: var(--accent-soft); border: 1px solid var(--accent-line); border-radius: var(--r-full); padding: .25rem .625rem .25rem .25rem; font-size: var(--fs-2); color: var(--text-1); }
.pm-sub-assignee-remove { display: inline-flex; cursor: pointer; opacity: .6; color: var(--text-3); transition: opacity var(--dur-1), color var(--dur-1); }
.pm-sub-assignee-remove svg { width: .75rem; height: .75rem; }
.pm-sub-assignee-remove:hover { opacity: 1; color: var(--danger); }
.pm-add-subtask-row { margin-top: 1.25rem; }

/* ── 指派下拉 ── */
.pm-assignee-field { position: relative; }
.pm-assignee-wrap { display: flex; flex-wrap: wrap; gap: .3125rem; align-items: center; background: var(--field-bg); border: 1px solid var(--border); border-radius: var(--r-sm); padding: .3125rem .5625rem; min-height: 2.75rem; cursor: text; transition: border-color var(--dur-2), box-shadow var(--dur-2); }
.pm-assignee-wrap:focus-within { border-color: var(--accent); box-shadow: 0 0 0 .2rem var(--accent-soft); }
.pm-assignee-wrap input { flex: 1; min-width: 5rem; background: none; border: none; outline: none; font-size: var(--fs-2); padding: .125rem; color: var(--text-1); }
.pm-assignee-wrap input:focus { box-shadow: none; transform: none; }
.pm-assignee-input { height: 2rem; }
.pm-chip { display: inline-flex; align-items: center; gap: .3125rem; background: var(--surface-3); border: 1px solid var(--border); border-radius: var(--r-full); padding: .125rem .5625rem .125rem .25rem; font-size: var(--fs-1); font-weight: 500; color: var(--text-1); }
.pm-chip-avatar { width: 1.125rem; height: 1.125rem; border-radius: 50%; display: grid; place-items: center; font-size: var(--fs-1); font-weight: 600; color: var(--surface); background: var(--accent); }
.pm-chip-x { display: inline-flex; cursor: pointer; opacity: .5; color: var(--text-3); transition: opacity var(--dur-1), color var(--dur-1); }
.pm-chip-x svg { width: .6875rem; height: .6875rem; }
.pm-chip-x:hover { opacity: 1; color: var(--danger); }
.pm-assignee-dd { position: absolute; top: calc(100% + .25rem); left: 0; right: 0; background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-md); box-shadow: var(--shadow-lg); z-index: 50; max-height: 12.5rem; overflow-y: auto; display: none; }
.pm-assignee-dd.open { display: block; }
.pm-dd-item { display: flex; align-items: center; gap: .625rem; padding: .5625rem .75rem; cursor: pointer; transition: background var(--dur-1); }
.pm-dd-item:hover { background: var(--accent-soft); }
.pm-dd-info { flex: 1; min-width: 0; }
.pm-dd-name { font-size: var(--fs-2); font-weight: 500; color: var(--text-1); display: flex; align-items: center; gap: .375rem; }
.pm-dd-uid { font-size: var(--fs-1); font-weight: 400; color: var(--text-4); white-space: nowrap; }
.pm-dd-meta { font-size: var(--fs-1); color: var(--text-4); margin-top: .0625rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ── 交付件 / 风险草稿行 ── */
.pm-draft-row { display: flex; align-items: center; gap: .5rem; margin-bottom: .5rem; }
.pm-draft-in { flex: 1; }

/* ── 提示条 ── */
.pm-hint { display: flex; align-items: flex-start; gap: .5rem; margin-top: .75rem; padding: .625rem .875rem; background: var(--accent-soft); border: 1px solid var(--accent-line); border-radius: var(--r-sm); font-size: var(--fs-1); color: var(--text-2); line-height: 1.5; }
.pm-hint .pm-ico { color: var(--accent); margin-top: .0625rem; }
.pm-hint-inline { font-size: var(--fs-1); color: var(--text-4); font-style: italic; }

/* ── 延期文字 ── */
.pm-txt-overdue { color: var(--danger); font-weight: 600; }

/* ── 交付内容（link/doc/desc 三类型芯片与编辑器） ── */
.pm-deliv-chips { display: flex; flex-wrap: wrap; gap: .375rem; align-items: center; }
.pm-deliv-chip { display: inline-flex; align-items: center; gap: .3125rem; max-width: 100%; padding: .1875rem .5625rem; background: var(--surface-3); border: 1px solid var(--border); border-radius: 999px; font-size: var(--fs-1); color: var(--text-2); text-decoration: none; }
.pm-deliv-chip:hover { border-color: var(--accent-line); color: var(--accent); }
.pm-deliv-chip .pm-ico { color: var(--accent); flex-shrink: 0; }
.pm-deliv-chip span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pm-deliv-chip.pm-deliv-desc { border-style: dashed; }
.pm-sub-deliv { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin-top: .5rem; }
.pm-ms-deliv { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin-top: .5rem; }
.pm-deliv-edit-row { display: grid; grid-template-columns: 6.5rem 8rem 1fr auto; gap: .5rem; align-items: center; margin-bottom: .5rem; }

/* ── 子任务卡内联时间编辑 ── */
.pm-dt-sm { width: 12.5rem; padding: .25rem .5rem; font-size: var(--fs-1); }

/* ── 里程碑卡片（详情页） ── */
.pm-ms-card { background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--r-md); padding: .875rem 1rem; margin-bottom: .625rem; }
.pm-ms-card.pm-ms-done { border-left: 3px solid var(--success); }
.pm-ms-card.pm-ms-late { border-left: 3px solid var(--danger); }
.pm-ms-head { display: flex; align-items: center; gap: .5rem; margin-bottom: .5rem; }
.pm-ms-idx { display: inline-flex; align-items: center; color: var(--accent); }
.pm-ms-idx .pm-ico svg { width: .875rem; height: .875rem; }
.pm-ms-title { flex: 1; font-weight: 600; }
.pm-ms-row { display: flex; align-items: center; gap: .5rem; margin-bottom: .5rem; flex-wrap: wrap; }
.pm-ms-row .au-input[type="datetime-local"] { width: 12.5rem; padding: .25rem .5rem; font-size: var(--fs-1); }
.pm-ms-goal { flex: 1; min-width: 12rem; }
.pm-ms-ass { width: 9rem; }
.pm-ms-acts { display: flex; align-items: center; gap: .5rem; margin-top: .25rem; }

/* ── 甘特图增强：包容器 / 主线行 / 进度叠条 / 今日线 / 图例 / 里程碑菱形 ── */
.pm-list-view { display: flex; flex-direction: column; gap: 1rem; }
.pm-gantt-wrap { position: relative; }
.pm-gantt-row--main .pm-gantt-label { color: var(--text-2); font-weight: 600; }
.pm-gantt-row--ms { min-height: 1.625rem; }
.pm-gantt-row--ms .pm-gantt-label { font-size: var(--fs-1); color: var(--text-4); }
.pm-gantt-progress { position: absolute; top: .1875rem; height: 1.125rem; border-radius: var(--r-xs); background: linear-gradient(90deg, var(--accent-soft), var(--accent-line)); border: 1px solid var(--accent-line); pointer-events: none; }
.pm-bar--late { background: var(--danger); box-shadow: 0 0 0 1px var(--danger-soft); }
.pm-gantt-now { position: absolute; top: 0; bottom: 0; width: 0; border-left: 2px dashed var(--danger); opacity: .6; pointer-events: none; }
.pm-gantt-legend { display: flex; flex-wrap: wrap; gap: .875rem; margin-top: .75rem; font-size: var(--fs-1); color: var(--text-4); }
.pm-gantt-legend span { display: inline-flex; align-items: center; gap: .3125rem; }
.pm-lg { display: inline-block; width: 1rem; height: .5rem; border-radius: var(--r-xs); }
.pm-lg-dia { display: inline-block; width: .5rem; height: .5rem; transform: rotate(45deg); }
.pm-ms-diamond { position: absolute; top: 50%; width: .75rem; height: .75rem; margin-top: -.375rem; transform: rotate(45deg); border-radius: 2px; background: var(--text-4); opacity: .85; cursor: default; }
.pm-ms-diamond.pm-ms--done { background: var(--success); opacity: 1; }
.pm-ms-diamond.pm-ms--late { background: var(--danger); opacity: 1; }
.pm-ms--todo { background: var(--text-4); }

/* ── 派发弹窗：草稿里程碑编辑行 ── */
.pm-draft-ms { background: var(--surface-2); border: 1px dashed var(--border); border-radius: var(--r-md); padding: .75rem .875rem; margin-bottom: .625rem; }
.pm-draft-ms-head { display: flex; align-items: center; gap: .5rem; margin-bottom: .625rem; }

/* ── 项目总览（project-overview.js）：跨任务全局甘特 + 任务卡片 ── */
.po-count { margin-left: .5rem; font-weight: 400; letter-spacing: normal; text-transform: none; color: var(--text-3); }
.po-gantt .pm-gantt-row { cursor: default; }
.po-clickable { cursor: pointer; }
.po-clickable:hover .pm-gantt-label { color: var(--accent); }
.po-main-label { width: 12rem; display: flex; align-items: center; gap: .3125rem; }
.po-sub-label { width: 12rem; font-style: italic; }
.po-track-thin { height: .875rem; }
.po-track-thin .pm-gantt-bar { top: .1875rem; height: .5rem; }
.pm-gantt-row--sub { min-height: 1.375rem; margin-bottom: .625rem; }
.po-card-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(18rem, 1fr)); gap: .875rem; }
.po-card { background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--r-md); padding: .875rem 1rem; cursor: pointer; transition: border-color var(--dur-2), box-shadow var(--dur-2); }
.po-card:hover { border-color: var(--accent-line); box-shadow: var(--shadow-1); }
.po-card-head { display: flex; align-items: center; justify-content: space-between; gap: .5rem; margin-bottom: .5rem; }
.po-card-title { font-weight: 600; color: var(--text-1); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.po-card-meta { display: flex; align-items: center; gap: .3125rem; font-size: var(--fs-1); color: var(--text-4); margin-bottom: .5rem; }
.po-card-sub { font-size: var(--fs-1); color: var(--text-3); margin-top: .375rem; }
.po-card .au-progress { margin: .25rem 0 0; }

/* ══ 工程项目层（PP）：清单卡片 / 详情头 / 项目级里程碑 ══ */
.pp-card { display: flex; flex-direction: column; }
.pp-card-code { font-family: var(--font-mono); font-size: var(--fs-1); color: var(--text-4); margin-bottom: .375rem; }
.pp-link { color: var(--accent-text); cursor: pointer; }
.pp-link:hover { text-decoration: underline; }
.pp-detail-card { padding: 1rem 1.125rem; }
.pp-detail-title { display: flex; align-items: center; justify-content: space-between; gap: .5rem; margin-bottom: .375rem; }
.pp-detail-name { font-size: var(--fs-3); font-weight: 600; color: var(--text-1); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pp-detail-meta { display: flex; align-items: center; gap: .3125rem; flex-wrap: wrap; font-size: var(--fs-1); color: var(--text-4); margin-bottom: .625rem; }
.pp-detail-desc { margin-top: .625rem; padding-top: .625rem; border-top: 1px dashed var(--border); font-size: var(--fs-2); color: var(--text-3); line-height: 1.6; }
/* 详情视图三个顶层块（返回栏/项目卡/两栏栅格）互为零间距：全局 .au-panel + .au-panel 的留距规则跨不过 #ppDetailHead 这层包裹 div */
#ppDetailView > * + * { margin-top: 1.25rem; }
/* 项目/里程碑表单：单列纵向堆叠（两列栅格在字段带 hint 行时左右列高不齐，界面出现一块高一块空的错位）；间距与 .pm-dispatch 同档 */
.pp-form-stack { display: flex; flex-direction: column; gap: 1.125rem; }
/* 项目详情主栏加宽：全局 2fr/1fr 放不下派发盘 7 列单行，横向滚动会把「操作」列顶出视野 */
.pp-detail-layout { grid-template-columns: minmax(0, 5fr) minmax(0, 2fr); }
@media (max-width: 1000px) { .pp-detail-layout { grid-template-columns: 1fr; } }
.pp-dispatch-table th, .pp-dispatch-table td { padding-left: .625rem; padding-right: .625rem; }
/* 全局表头居中而数据格默认左对齐，派发人/归属人两个窄列的值会挤在同一 x 起点、上下叠成「一列两个人」——本表数据格随表头对齐，名称列除外 */
.pp-dispatch-table td { text-align: center; }
.pp-dispatch-table td.pt-col-l { text-align: left; }
.pp-dispatch-table .pm-cell-person { justify-content: center; }
.pp-dispatch-table .fname-wrap { max-width: 12.5rem; }
.pp-ms-list { display: flex; flex-direction: column; gap: .5rem; }
.pp-ms-item { padding: .625rem .75rem; background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--r-sm); }
.pp-ms-head { display: flex; align-items: center; justify-content: space-between; gap: .5rem; }
.pp-ms-title { font-weight: 600; font-size: var(--fs-2); color: var(--text-1); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pp-ms-meta { display: flex; align-items: center; gap: .3125rem; margin-top: .25rem; font-size: var(--fs-1); color: var(--text-4); }
.pp-ms-goal { margin-top: .25rem; font-size: var(--fs-1); color: var(--text-3); line-height: 1.55; }
.pp-ms-acts { margin-top: .375rem; }
.pp-btn-danger { color: var(--danger); }
.pp-btn-danger:hover { border-color: var(--danger); }

/* ── 响应式 ── */
@media (max-width: 760px) {
  .pm-filter-grid .au-field { flex: 1 1 100%; }
  .pm-filter-acts { width: 100%; }
  .pm-subtask-body .pm-grid-2 { grid-template-columns: 1fr; }
  .pm-gantt-label { width: 6rem; }
  .pm-deliv-edit-row { grid-template-columns: 1fr; }
  .pm-draft-ms .pm-grid-2 { grid-template-columns: 1fr; }
}
