/* 新页面与组件样式（pl- / wb- / ib- / pj- / td- / wz- / ov- / hm- 前缀）：由流 G 实现，见 SPEC-v2 §7.10。
   两位前端实现者各改自己的区段（用 Edit 在区段内插入，不要整文件覆盖）：
   G1 = 成员侧（hm- 首页、wb- 写周报框、pl- 通用布局与卡片）；G2 = 组长侧（ov- 总览、ib- 建议卡、pj- 项目页、td- 抽屉、wz- 向导与导入）。 */

/* ==== G1 BEGIN（成员侧：通用布局 pl-、首页 hm-、写周报框 wb-）==== */
/* ---- pl-：通用布局与组件（G2 的页面也用；badges.js 的灯芯片 / 状态胶囊 / 署名 / 灯因 / 证据 / 编号 / 浮层都在这里）----
   颜色只经 CSS 变量（R7）；形状 + 文字，颜色之外必有冗余编码（N6）。 */
.pl-lede { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; margin: 0 0 12px; font-size: 1.02rem; line-height: 1.5; }
/* 卡片栅格（SPEC-v2 §7.3.1）：<720px 1 列；720–959px 2 列；≥960px 12 列。子元素的跨度类 pl-span-3 / 4 / 6 / 8 / 12（pl-full = 12）只在 ≥960px 生效，
   没写跨度类的子元素：2 列时占 1 列，12 列时占 4 列（一行 3 张）；整行卡片（甘特、矩阵）用 pl-span-12 / pl-full。 */
.pl-grid { display: grid; grid-template-columns: minmax(0, 1fr); gap: 14px; align-items: start; margin: 0 0 14px; }
.pl-grid > * { min-width: 0; margin: 0; }
.pl-chip { display: inline-flex; align-items: center; gap: 4px; padding: 2px 10px; border: 1px solid var(--border); border-radius: 999px; background: var(--card); color: var(--fg); font-size: 0.86rem; line-height: 1.5; text-decoration: none; white-space: nowrap; }
a.pl-chip:hover, button.pl-chip:hover { border-color: var(--primary); color: var(--primary); }
.pl-chip[aria-current="page"] { background: var(--info-bg); border-color: var(--primary); color: var(--primary); font-weight: 600; }
.pl-chips { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.pl-glyph { font-style: normal; font-size: 0.85em; line-height: 1; flex: none; }
.pl-light { display: inline-flex; align-items: center; gap: 4px; font-weight: 600; white-space: nowrap; }
.pl-light-red { color: var(--err); }
.pl-light-yellow { color: var(--warn); }
.pl-light-green { color: var(--ok); }
.pl-light-none { color: var(--muted); font-weight: 400; }
.pl-reasons { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 4px 6px; }
.pl-reason { display: inline-flex; align-items: center; gap: 4px; padding: 1px 9px; border-radius: 999px; background: var(--muted-bg); font-size: 0.85rem; line-height: 1.5; max-width: 100%; }
.pl-reason .pl-light-text { color: var(--fg); overflow-wrap: anywhere; }
.pl-why { padding: 0 6px; min-height: 24px; color: var(--primary); }
.pl-status { display: inline-flex; align-items: center; gap: 3px; padding: 1px 8px; border-radius: 6px; font-size: 0.8rem; line-height: 1.5; white-space: nowrap; border: 1.5px solid transparent; }
.pl-status-todo { border: 1.5px dashed var(--muted); color: var(--muted); }
.pl-status-doing { background: var(--info-bg); border-color: var(--primary); color: var(--primary); font-weight: 600; }
.pl-status-blocked { background: repeating-linear-gradient(135deg, var(--err-bg) 0 4px, var(--card) 4px 8px); border-color: var(--err); color: var(--err); font-weight: 600; }
.pl-status-done { background: var(--muted-bg); color: var(--muted); }
.pl-status-cancelled { border: 1.5px dotted var(--muted); color: var(--muted); text-decoration: line-through; }
.pl-status-mark { font-style: normal; font-weight: 700; }
.pl-actor { font-size: 0.78rem; letter-spacing: 0; }
.pl-actor-rule { background: var(--muted-bg); color: var(--muted); }
.pl-actor-llm { background: var(--info-bg); color: var(--primary); }
.pl-actor-agent { background: var(--warn-bg); color: var(--warn); }
.pl-actor-human { background: var(--ok-bg); color: var(--ok); }
.pl-actor-system { background: var(--muted-bg); color: var(--muted); }
.pl-evidence { font-size: 0.88rem; line-height: 1.55; }
.pl-evidence-gone { color: var(--muted); }
.pl-ev-who { font-weight: 600; }
.pl-ev-text { color: var(--fg); }
.pl-code { display: inline-flex; align-items: baseline; gap: 2px; padding: 0 7px; border: 1px solid var(--border); border-radius: 6px; background: var(--card-2); color: var(--fg); font: inherit; font-size: 0.85rem; line-height: 1.6; max-width: 100%; }
button.pl-code { cursor: pointer; }
button.pl-code:hover { border-color: var(--primary); color: var(--primary); }
.pl-code-title { color: var(--muted); }
.pl-pop { position: fixed; z-index: 150; width: 360px; max-width: calc(100vw - 16px); max-height: 70vh; display: flex; flex-direction: column; background: var(--card); color: var(--fg); border: 1px solid var(--border); border-radius: var(--radius); box-shadow: 0 8px 28px var(--border); }
.pl-pop:focus { outline: none; }
.pl-pop-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 8px 12px; border-bottom: 1px solid var(--border); }
.pl-pop-x { font-size: 1.2rem; line-height: 1; padding: 0 8px; }
.pl-pop-body { padding: 8px 12px 12px; overflow: auto; }
.pl-pop-sec + .pl-pop-sec { margin-top: 10px; padding-top: 8px; border-top: 1px dashed var(--border); }
.pl-pop-title { font-size: 0.9rem; margin: 0 0 4px; color: var(--muted); }
.pl-pop-kv { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 3px 12px; margin: 0; font-size: 0.9rem; }
.pl-pop-kv dt { color: var(--muted); }
.pl-pop-kv dd { margin: 0; overflow-wrap: anywhere; }
.pl-pop-kv dd.pl-pop-wide { grid-column: 1 / -1; }
.pl-pop-sheet { left: 0; right: 0; bottom: 0; top: auto; width: auto; max-width: none; border-radius: 12px 12px 0 0; max-height: 60vh; box-shadow: 0 -6px 24px var(--border); }

/* ---- hm-：成员首页 ---- */
.hm-lede-text { font-weight: 600; }
.hm-late { color: var(--warn); font-weight: 600; }
.hm-pending { display: flex; flex-wrap: wrap; gap: 6px; margin: -4px 0 12px; }
/* app.css 没有全局 [hidden] 规则，作者样式里的 display 会盖过 UA 的 [hidden]：写了 display 的容器要自己兜底 */
.hm-pending[hidden], .wb-tasks[hidden] { display: none; }
.hm-banners:empty { display: none; }
.hm-banner .btn { white-space: nowrap; }
/* 手机（360px）上文字原来被挤成 5 行的窄条（.grow 的 flex-basis 是 0，按钮永远和它同一行）：给文字一个基准宽度，放不下时按钮自己换到下一行 */
.hm-banner .grow { flex: 1 1 16em; }
.hm-write { padding: 14px 16px 16px; }
.hm-cap { margin: 0 0 6px; font-size: 0.92rem; color: var(--muted); font-weight: 600; }
.hm-chart { min-width: 0; }
.hm-due { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; align-items: flex-start; gap: 6px; }
.hm-due > li { max-width: 100%; }
.hm-due-chip { display: inline-flex; align-items: center; padding: 3px 10px; border: 1px solid var(--border); border-radius: 999px; background: var(--card); color: var(--fg); font: inherit; font-size: 0.88rem; cursor: pointer; text-align: left; max-width: 100%; }
.hm-due-chip:hover { border-color: var(--primary); }
.hm-brief > summary { cursor: pointer; font-weight: 600; list-style: none; display: flex; align-items: center; gap: 8px; }
.hm-brief > summary::-webkit-details-marker { display: none; }
.hm-brief > summary::before { content: "▸"; color: var(--muted); }
.hm-brief[open] > summary::before { content: "▾"; }
.hm-brief[open] > summary { margin-bottom: 10px; }

/* ---- wb-：写周报框与回执 ---- */
.wb-box { display: flex; flex-direction: column; gap: 10px; }
.wb-text { min-height: 9.5rem; max-height: 60vh; font-size: 1rem; line-height: 1.65; resize: vertical; }
.wb-hint { margin: -4px 0 0; }
.wb-msg { margin: -4px 0 0; }
.wb-prior { margin: -4px 0 0; }
.wb-banner:empty { display: none; }
.wb-banner .banner { margin: 0; }
.wb-weeks { margin: -2px 0 12px; }
.wb-tools { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 16px; }
.wb-tools .wb-mood { flex: none; }
.wb-mood button { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }
.wb-tasks { display: flex; flex-wrap: wrap; gap: 6px; min-width: 0; }
.wb-task { position: relative; display: inline-flex; max-width: 100%; }
.wb-task-main, .wb-task-more { font: inherit; font-size: 0.88rem; color: var(--fg); background: var(--card); border: 1px solid var(--border); padding: 3px 10px; min-height: 30px; cursor: pointer; display: inline-flex; align-items: center; gap: 4px; }
.wb-task-main { border-radius: 999px 0 0 999px; max-width: 100%; }
.wb-task-more { border-radius: 0 999px 999px 0; border-left: 0; padding: 3px 9px; font-weight: 700; }
.wb-task-main:hover, .wb-task-more:hover { background: var(--muted-bg); }
.wb-task-title { color: var(--muted); }
.wb-task-state { font-size: 0.78rem; font-weight: 700; padding: 0 5px; border-radius: 4px; }
.wb-st-done { background: var(--ok-bg); color: var(--ok); }
.wb-st-doing { background: var(--info-bg); color: var(--primary); }
.wb-st-blocked { background: repeating-linear-gradient(135deg, var(--err-bg) 0 4px, var(--card) 4px 8px); color: var(--err); }
.wb-task-done .wb-task-main { border-color: var(--ok); }
.wb-task-doing .wb-task-main { border-color: var(--primary); }
.wb-task-blocked .wb-task-main { border-color: var(--err); border-style: dashed; }
.wb-menu { position: absolute; top: 100%; left: 0; z-index: 30; margin-top: 4px; min-width: 104px; display: flex; flex-direction: column; padding: 4px; background: var(--card); border: 1px solid var(--border); border-radius: var(--radius); box-shadow: 0 6px 20px var(--border); }
.wb-menu button { font: inherit; font-size: 0.9rem; text-align: left; color: var(--fg); background: none; border: 0; border-radius: 4px; padding: 6px 10px; cursor: pointer; }
.wb-menu button:hover { background: var(--muted-bg); }
.wb-menu button[aria-pressed="true"] { font-weight: 700; color: var(--primary); }
.wb-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.wb-actions .wb-link { margin-left: auto; }
.wb-link { color: var(--primary); text-decoration: none; font-size: 0.9rem; background: none; border: 0; padding: 0; cursor: pointer; font-family: inherit; }
.wb-link:hover { text-decoration: underline; }
.wb-zone { min-width: 0; }
.wb-zone:empty { display: none; }
.wb-stale { opacity: 0.55; transition: opacity 0.15s; }
.wb-prev { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 12px; padding: 8px 12px; border: 1px dashed var(--border); border-radius: var(--radius); background: var(--card-2); }
.wb-prev-lbl { flex: none; }
.wb-bar { flex: 1 1 220px; min-width: 200px; max-width: 460px; }
.wb-headline { flex: 1 1 100%; margin: 0; color: var(--muted); overflow-wrap: anywhere; }
.wb-receipt { padding: 10px 12px; border: 1px solid var(--border); border-left: 4px solid var(--ok); border-radius: 0 var(--radius) var(--radius) 0; background: var(--card-2); }
.wb-receipt-head { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 14px; }
.wb-ok { font-weight: 700; color: var(--ok); white-space: nowrap; }
.wb-note { margin: 6px 0 0; color: var(--warn); }
.wb-health { display: inline-flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.wb-health-btn { display: inline-flex; align-items: center; gap: 6px; font: inherit; background: var(--card); border: 1px dashed var(--border); border-radius: 999px; padding: 1px 9px; cursor: pointer; }
.wb-health-btn:hover { border-color: var(--primary); }
.wb-infer { font-size: 0.74rem; color: var(--muted); border: 1px solid var(--border); border-radius: 4px; padding: 0 4px; }
.wb-health-opts { display: inline-flex; gap: 4px; }
.wb-health-opt { font: inherit; background: var(--card); border: 1px solid var(--border); border-radius: 999px; padding: 1px 9px; cursor: pointer; }
.wb-health-opt[aria-pressed="true"] { border-width: 2px; border-color: var(--primary); }
.wb-items { list-style: none; margin: 8px 0 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
.wb-item { display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 8px; }
.wb-sec { flex: none; font-size: 0.76rem; font-weight: 700; padding: 0 7px; border-radius: 4px; border: 1px solid transparent; }
.wb-sec-done { background: var(--ok-bg); color: var(--ok); }
.wb-sec-next_plan { background: var(--info-bg); color: var(--primary); }
.wb-sec-blockers { background: repeating-linear-gradient(135deg, var(--err-bg) 0 4px, var(--card-2) 4px 8px); color: var(--err); border-color: var(--err); }
.wb-sec-decisions { background: var(--warn-bg); color: var(--warn); border-style: dashed; border-color: var(--warn); }
.wb-item-text { min-width: 0; overflow-wrap: anywhere; }
.wb-item-to { white-space: nowrap; }
.wb-needs { margin-top: 8px; }
.wb-needs-lbl { margin: 0 0 4px; }
.wb-need-list, .wb-carry-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.wb-need { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; margin: 0; }
.wb-need-text { min-width: 0; overflow-wrap: anywhere; }
.wb-need-quote { color: var(--muted); font-size: 0.88rem; overflow-wrap: anywhere; }
.wb-fix { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.wb-fix-lbl { font-size: 0.85rem; color: var(--muted); }
.wb-sel { width: auto; min-width: 8em; min-height: 30px; padding: 2px 8px; }
.wb-chip { font: inherit; font-size: 0.86rem; background: var(--card); color: var(--fg); border: 1px solid var(--border); border-radius: 999px; padding: 1px 11px; cursor: pointer; min-height: 28px; }
.wb-chip:hover { border-color: var(--primary); }
.wb-chip[aria-pressed="true"] { background: var(--primary); border-color: var(--primary); color: var(--primary-fg); font-weight: 600; }
.wb-chip:disabled { cursor: default; opacity: 0.75; }
/* 就地修正请求在途：用 aria-disabled 而不是 disabled（disabled 的焦点元素会让 Chrome 把焦点收回 body），看起来要有「在忙」的样子 */
.wb-box [aria-disabled="true"] { opacity: 0.6; cursor: progress; }
.wb-receipt:focus { outline: none; }
.wb-receipt:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.wb-note-in { width: 14em; min-height: 28px; padding: 2px 8px; }
.wb-carry { margin-top: 8px; }
.wb-carry > summary { cursor: pointer; }
.wb-carry-list { margin-top: 6px; }

@media (min-width: 720px) {
  .pl-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .pl-grid > .pl-span-12, .pl-grid > .pl-full { grid-column: 1 / -1; }
}
@media (min-width: 960px) {
  .pl-grid { grid-template-columns: repeat(12, minmax(0, 1fr)); }
  .pl-grid > * { grid-column: span 4; }
  .pl-grid > .pl-span-3 { grid-column: span 3; }
  .pl-grid > .pl-span-4 { grid-column: span 4; }
  .pl-grid > .pl-span-6 { grid-column: span 6; }
  .pl-grid > .pl-span-8 { grid-column: span 8; }
  .pl-grid > .pl-span-12, .pl-grid > .pl-full { grid-column: 1 / -1; }
}
@media (max-width: 719px) {
  .pl-grid { gap: 12px; }
  .pl-pop { width: auto; }
  .wb-actions .wb-link { margin-left: 0; }
  .wb-bar { flex-basis: 100%; max-width: none; }
  .wb-text { min-height: 8rem; }
  .wb-text, .wb-note-in, .wb-sel { font-size: 16px; } /* iOS 对小于 16px 的输入框聚焦时会整页放大 */
  .hm-write { padding: 12px; }
}
/* ---- pl-：汇总页 CH19 图条带与「项目进度」块、历史页 CH20 热力卡（digest.js / history.js 的追加） ---- */
.pl-strip, .pl-prog { overflow: visible; }
.pl-strip-row { display: grid; grid-template-columns: minmax(150px, 210px) minmax(0, 1fr) minmax(0, 1.5fr); gap: 16px 24px; align-items: start; }
.pl-strip-part { min-width: 0; }
/* 项目范围的汇总没有「提交率环」这一块（digest.js 不画它），剩两块并排 */
.pl-strip-two { grid-template-columns: minmax(0, 1fr) minmax(0, 1.5fr); }
.pl-strip-note { margin: 10px 0 0; }
/* 有计划数据时，v1 摘要里的灯芯片组前面的「周报灯：」标签（digest.js；INT-11b） */
.pl-lamp-lbl { align-self: center; white-space: nowrap; }
.pl-prog-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }
.pl-prog-row { display: grid; grid-template-columns: 4.6rem minmax(5rem, 9rem) minmax(80px, 1fr) 8.6rem 5.4rem 5.2rem; align-items: center; gap: 4px 10px; padding: 7px 0; border-top: 1px solid var(--border); }
.pl-prog-row:first-child { border-top: 0; }
.pl-prog-name { font-weight: 600; color: var(--fg); text-decoration: none; overflow-wrap: anywhere; }
.pl-prog-name:hover { color: var(--primary); text-decoration: underline; }
.pl-prog-bar { position: relative; display: block; height: 10px; border-radius: 999px; background: var(--muted-bg); }
.pl-prog-bar > i { position: absolute; left: 0; top: 0; bottom: 0; border-radius: 999px; background: var(--primary); }
.pl-prog-bar > b { position: absolute; top: -3px; bottom: -3px; width: 2px; margin-left: -1px; background: var(--fg); }
.pl-prog-num, .pl-prog-end { font-size: 0.85rem; color: var(--muted); white-space: nowrap; }
.pl-prog-delay { font-size: 0.88rem; text-align: right; white-space: nowrap; color: var(--muted); }
.pl-prog-late { color: var(--err); font-weight: 600; }
.pl-heat > summary { cursor: pointer; font-weight: 600; list-style: none; display: flex; align-items: center; gap: 8px; }
.pl-heat > summary::-webkit-details-marker { display: none; }
.pl-heat > summary::before { content: "▸"; color: var(--muted); }
.pl-heat[open] > summary::before { content: "▾"; }
.pl-heat[open] > summary { margin-bottom: 10px; }
.pl-heat-part + .pl-heat-part { margin-top: 14px; }
.pl-heat-cap { margin: 0 0 4px; font-size: 0.9rem; color: var(--muted); font-weight: 600; }
.pl-heat-chart { min-width: 0; }
.pl-more { margin-top: 8px; display: none; }
@media (max-width: 719px) {
  .pl-strip-row, .pl-strip-two { grid-template-columns: minmax(0, 1fr); }
  /* 联调里看到的：第三行（进度数字）原来占第 1 列，把「灯」那一列撑成 100px，项目名漂在行中间；改成数字跨前两列、预计完成放在最后一列右对齐 */
  .pl-prog-row { grid-template-columns: auto minmax(0, 1fr) auto; grid-template-areas: "light name delay" "bar bar bar" "num num end"; }
  .pl-prog-row > .pl-light { grid-area: light; }
  .pl-prog-row > .pl-prog-name { grid-area: name; }
  .pl-prog-row > .pl-prog-bar { grid-area: bar; margin: 2px 0; }
  .pl-prog-row > .pl-prog-num { grid-area: num; }
  .pl-prog-row > .pl-prog-end { grid-area: end; text-align: right; }
  .pl-prog-row > .pl-prog-delay { grid-area: delay; }
}
@media (max-width: 559px) {
  .pl-more { display: inline-flex; }
}
@media print {
  .wb-actions, .wb-tools, .pl-pop, .hm-pending, .pl-more { display: none; }
}
/* ==== G1 END ==== */

/* ==== G2 BEGIN（组长侧：总览 ov-、建议卡 ib-、项目页 pj-、抽屉 td-、向导与导入 wz-）==== */
/* 颜色只经 CSS 变量（R7）；形状 / 纹理 / 文字之外不靠颜色传达含义（N6）。版面用 G1 的 .pl-grid（pl-span-*）；甘特卡片及其祖先不设 overflow（否则 sticky 表头失效）。 */

/* ---- ov-：总览与项目列表 ---- */
.ov-top { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; margin: 0 0 12px; }
.ov-top .pl-lede { margin: 0; flex: 1 1 260px; font-weight: 600; }
.ov-chip { border-style: dashed; border-color: var(--warn); color: var(--warn); font-weight: 600; }
.ov-weeknav { display: inline-flex; align-items: center; gap: 6px; }
.ov-week { min-width: 3.2em; text-align: center; }
.ov-copy { display: inline-flex; flex-wrap: wrap; gap: 6px; }
.ov-recon { margin-bottom: 12px; }
.ov-review { list-style: none; display: flex; flex-wrap: wrap; align-items: center; gap: 4px 16px; margin: 0 0 12px; padding: 6px 12px; border: 1px dashed var(--border); border-radius: var(--radius); font-size: 0.92rem; background: var(--card); }
.ov-review-title { font-weight: 700; }
.ov-step-mark { display: inline-block; width: 1.1em; font-weight: 700; }
.ov-step-done { color: var(--ok); }
.ov-review-done { margin: 0 0 12px; color: var(--ok); font-weight: 600; }
.ov-card { padding: 12px 14px; }
.ov-h { margin: 0 0 8px; font-size: 0.95rem; color: var(--muted); font-weight: 600; }
.ov-chart { min-width: 0; }
.ov-names { margin: 6px 0 0; color: var(--muted); }
.ov-sparks { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 8px 16px; }
.ov-rowend { display: inline-flex; align-items: center; gap: 4px 6px; max-width: 100%; }
.ov-rowend .pl-reasons { flex-wrap: nowrap; min-width: 0; }
.ov-rowend .pl-reason { max-width: 100%; min-width: 0; } /* 宽度由页面按文案估宽预留（projects.js），不再固定 11em：真实文案（约 17 个汉字）会被截成「预计完成 11-19，…」 */
.ov-rowend .pl-reason .pl-light-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ov-rowend .pl-why, .ov-rowend .btn { flex: none; white-space: nowrap; }
.ov-inbox { display: flex; flex-direction: column; gap: 8px; }
.ov-inbox > * { margin: 0; }
.ov-count { font-weight: 600; }
.ov-more { margin-top: 2px; }
.ov-batch, .ov-hint { margin: 0; padding: 8px 10px; }
.ov-batch { background: var(--ok-bg); border-color: var(--ok); }
.pj-list .ov-top { margin-bottom: 14px; }
.pj-unmanaged, .pj-idle { margin-top: 14px; }
.pj-plain { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.pj-row, .pj-idle-row { display: flex; align-items: center; gap: 8px; padding: 6px 4px; border-top: 1px solid var(--border); }
.pj-row:first-child, .pj-idle-row:first-child { border-top: 0; }
@media (min-width: 720px) and (max-width: 959px) {
  .ov-grid > .ov-bullets, .ov-grid > .ov-history, .ov-grid > .ov-empty { grid-column: 1 / -1; }
}
@media (max-width: 719px) {
  /* 窄屏先看到「要我处理什么」：建议卡、CH04、CH03，其余在后（§7.3.5） */
  .ov-grid > .ov-inbox { order: -3; }
  .ov-grid > .ov-bullets { order: -2; }
  .ov-grid > .ov-reasons { order: -1; }
  .ov-top .pl-lede { flex-basis: 100%; }
}

/* ---- ib-：建议卡与收件箱 ---- */
.ib-list { display: flex; flex-direction: column; gap: 0; }
.ib-group { margin: 0 0 6px; }
.ib-group-title { margin: 14px 0 8px; font-size: 1rem; }
.ib-card { display: flex; flex-direction: column; gap: 6px; margin: 0 0 10px; padding: 10px 12px; background: var(--card); border: 1px solid var(--border); border-radius: var(--radius); }
.ib-safe { border-left: 4px solid var(--ok); }
.ib-review { border-left: 4px dashed var(--warn); }
.ib-stale { border-style: dashed; background: var(--card-2); }
.ib-head { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; }
.ib-title { flex: 1 1 12em; min-width: 0; overflow-wrap: anywhere; }
.ib-kind { background: var(--info-bg); color: var(--primary); }
.ib-compact { flex-direction: column; padding: 6px 10px; margin-bottom: 6px; background: var(--card-2); }
.ib-compact .ib-title { font-weight: 500; flex-basis: 8em; }
.ib-inline { display: inline-flex; gap: 4px; margin-left: auto; }
.ib-diff { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 18px; font-size: 0.92rem; }
.ib-pair { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; }
.ib-arrow { color: var(--muted); }
.ib-pct { display: inline-flex; align-items: center; gap: 6px; }
.ib-bar { display: inline-block; position: relative; width: 70px; height: 8px; background: var(--muted-bg); border: 1px solid var(--border); border-radius: 999px; overflow: hidden; }
.ib-bar > i { position: absolute; left: 0; top: 0; bottom: 0; background: var(--primary); }
.ib-cascade { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 2px 10px; }
.ib-move { padding: 0 8px; border-radius: 999px; background: var(--muted-bg); font-size: 0.85rem; }
.ib-evidence { display: flex; flex-direction: column; gap: 2px; }
.ib-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; }
.ib-cascade-box { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 12px; }
.ib-check { display: inline-flex; align-items: center; gap: 6px; cursor: pointer; }
.ib-edit { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 8px; }
.ib-input { width: 9em; }
.ib-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.ib-actions .spacer { flex: 1 1 auto; }
.ib-why { color: var(--primary); }
.ib-why-row { margin: 0 0 2px; }
.ib-top { margin: 0 0 12px; }
.ib-line { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 12px; }
.ib-line .pl-lede { margin: 0; font-weight: 600; flex: 1 1 18em; }
.ib-filters { display: flex; flex-wrap: wrap; gap: 8px 16px; margin: 8px 0; }
.ib-filter { display: inline-flex; align-items: center; gap: 6px; }
.ib-filter .select { width: auto; min-width: 8em; }
.ib-tabs { margin-bottom: 8px; }
.ib-lastbatch { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin: 0 0 10px; }
.ib-more { display: flex; justify-content: center; margin: 8px 0 16px; }

/* ---- pj-：项目页 ---- */
.pj-head { margin: 0 0 4px; }
.pj-head .pl-lede { margin-bottom: 4px; }
.pj-title { font-size: 1.25rem; margin-right: 4px; }
.pj-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; margin: 0 0 10px; }
.pj-tiles { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; margin: 0 0 14px; }
.pj-tile { display: flex; flex-direction: column; gap: 2px; min-width: 0; padding: 10px 12px; background: var(--card); border: 1px solid var(--border); border-left-width: 4px; border-radius: var(--radius); box-shadow: var(--shadow); }
.pj-tile-bad { border-left-color: var(--err); }
.pj-tile-bad .pj-tile-v { color: var(--err); }
.pj-tile-warn { border-left-color: var(--warn); }
.pj-tile-warn .pj-tile-v { color: var(--warn); }
.pj-tile-k { font-size: 0.82rem; color: var(--muted); }
.pj-tile-v { font-size: 1.35rem; line-height: 1.25; overflow-wrap: anywhere; }
.pj-tile-s { font-size: 0.82rem; color: var(--muted); }
.pj-card { padding: 12px 14px; }
.pj-ganttcard { padding: 10px 12px 8px; }
.pj-tools { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 14px; margin: 0 0 8px; }
.pj-tools .spacer { flex: 1 1 auto; }
.pj-group { display: inline-flex; align-items: center; gap: 6px; }
.pj-group .select { width: auto; min-height: 30px; padding: 2px 8px; }
.pj-toggles { display: inline-flex; flex-wrap: wrap; gap: 4px 12px; }
.pj-toggle { display: inline-flex; align-items: center; gap: 4px; font-size: 0.9rem; cursor: pointer; }
.pj-more { position: relative; }
.pj-more > summary { list-style: none; cursor: pointer; }
.pj-more > summary::-webkit-details-marker { display: none; }
.pj-more-pop { position: absolute; right: 0; top: calc(100% + 4px); z-index: 30; min-width: 230px; display: flex; flex-direction: column; gap: 10px; padding: 10px; background: var(--card); border: 1px solid var(--border); border-radius: var(--radius); box-shadow: 0 8px 28px var(--border); }
.pj-more-actions { display: flex; flex-wrap: wrap; gap: 6px; }
.pj-grid { margin-top: 14px; }
.pj-chart { min-width: 0; }
.pj-h { margin: 0 0 8px; font-size: 0.95rem; color: var(--muted); font-weight: 600; }
.pj-props { margin-bottom: 14px; }
.pj-fold { margin-top: 14px; }
.pj-fold > .fold-body { display: flex; flex-direction: column; gap: 10px; }
.pj-entry { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; padding: 6px 10px; background: var(--card-2); border-radius: 6px; }
.pj-entry-title { flex: 1 1 14em; min-width: 0; overflow-wrap: anywhere; }
.pj-closed { opacity: 0.75; }
.pj-closed-h { margin: 2px 0 0; }
.pj-sev { letter-spacing: 1px; color: var(--warn); }
.pj-logrow { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; }
.pj-log-text { min-width: 0; overflow-wrap: anywhere; }
.pj-settings .field { margin-bottom: 8px; }
.pj-policy { margin-top: 8px; }
@media (max-width: 719px) {
  .pj-tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
  .pj-more-pop { right: -4px; }
}

/* ---- td-：任务抽屉与重排弹窗 ---- */
.td-root { display: flex; flex-direction: column; gap: 12px; }
.td-head { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.td-banner:empty { display: none; }
.td-banner:not(:empty) { position: sticky; top: 0; z-index: 3; background: var(--card); padding-bottom: 2px; }
.td-banner .banner { margin: 0 0 6px; }
.td-form { display: flex; flex-direction: column; gap: 10px; }
.td-field { margin: 0; }
.td-two { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 10px; }
.td-date { display: flex; align-items: center; gap: 4px; }
.td-date .input { min-width: 0; flex: 1 1 auto; }
.td-date .btn { flex: none; padding: 3px 8px; white-space: nowrap; }
.td-progress { display: flex; align-items: center; gap: 8px; }
.td-progress input[type="range"] { flex: 1 1 auto; min-width: 0; }
.td-num { width: 5em; flex: none; }
.td-shift { display: flex; flex-wrap: wrap; gap: 6px; }
.td-base { margin: -4px 0 0; }
.td-preds { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.td-chip { display: inline-flex; align-items: center; }
.td-pred-add { width: auto; min-height: 30px; }
.td-preview { padding-left: 10px; border-left: 3px solid var(--primary); display: flex; flex-direction: column; gap: 4px; }
.td-preview:empty { display: none; }
.td-preview p { margin: 0; }
.td-preview-line { font-weight: 600; }
.td-moves { display: flex; flex-direction: column; gap: 2px; }
.td-check { display: inline-flex; align-items: center; gap: 6px; cursor: pointer; }
.td-warn { color: var(--warn); }
.td-actions { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.td-del { color: var(--err); }
.td-ro { margin-top: 0; }
.td-sec { padding-top: 8px; border-top: 1px solid var(--border); }
.td-sec > summary { cursor: pointer; font-weight: 600; }
.td-sec:not([open]) > :not(summary) { display: none; } /* 收起时内容明确 display:none：否则里面的「撤销」仍有 offsetParent，ui.js 的 Tab 循环会把它当成抽屉里最后一个可聚焦元素 */
.td-list { list-style: none; margin: 8px 0 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.td-event { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; }
.td-ev-text { flex: 1 1 10em; min-width: 0; overflow-wrap: anywhere; }
.td-rebase { display: flex; flex-direction: column; gap: 8px; }
.td-table th, .td-table td { white-space: nowrap; }
@media (max-width: 719px) {
  .td-two { grid-template-columns: minmax(0, 1fr); }
}
/* 手机宽度：任务名那一列允许折行、日期列缩小内边距——否则「结束」列被挤出弹窗，要横向滑动才看得到新结束日（真后端联调：360px 下重排预览只剩「任务 | 开始」） */
@media (max-width: 479px) {
  .td-table th, .td-table td { padding-left: 6px; padding-right: 6px; }
  .td-table th:first-child, .td-table td:first-child { white-space: normal; overflow-wrap: anywhere; min-width: 5em; }
}

/* ---- wz-：建项目向导与清单导入 ---- */
.wz-steps { display: flex; flex-wrap: wrap; gap: 6px 18px; list-style: none; margin: 0 0 12px; padding: 0; }
.wz-step { display: inline-flex; align-items: center; gap: 6px; color: var(--muted); }
.wz-step-now { color: var(--fg); font-weight: 700; }
.wz-step-no { display: inline-flex; align-items: center; justify-content: center; width: 22px; height: 22px; border: 1.5px solid currentColor; border-radius: 50%; font-size: 0.8rem; }
.wz-step-now .wz-step-no { background: var(--primary); border-color: var(--primary); color: var(--primary-fg); }
.wz-step-done .wz-step-no { color: var(--ok); }
.wz-body { display: flex; flex-direction: column; gap: 12px; }
.wz-two { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 10px; }
.wz-nav { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 8px; }
.wz-create { display: flex; flex-direction: column; gap: 8px; }
.wz-buttons { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.wz-buttons .spacer { flex: 1 1 auto; }
.wz-check { display: flex; align-items: center; gap: 6px; padding: 3px 0; cursor: pointer; }
.wz-assumed-note { margin: 0; text-align: right; }
.wz-members, .pj-settings fieldset.plain { display: flex; flex-wrap: wrap; gap: 2px 16px; }
.wz-members > legend, .pj-settings fieldset.plain > legend, .pj-settings fieldset.plain > p { flex: 1 1 100%; }
.wz-import { display: flex; flex-direction: column; gap: 10px; }
.wz-choices { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.wz-copy { width: auto; min-width: 12em; }
.wz-field { gap: 4px; }
.wz-text { min-height: 9em; font: 0.92rem/1.55 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
.wz-hint { margin: 0; }
.wz-status:empty { display: none; }
.wz-status .banner { margin: 0; }
.wz-summary { margin: 0 0 6px; font-weight: 600; }
.wz-table td, .wz-table th { padding: 6px 8px; }
.wz-col-mark { width: 2.2em; }
.wz-mark { display: inline-block; font-weight: 700; }
.wz-ok { color: var(--ok); }
.wz-warn { color: var(--warn); }
.wz-issue { display: inline-block; margin: 0 0 0 6px; padding: 0 8px; border-radius: 999px; background: var(--warn-bg); color: var(--warn); font-size: 0.8rem; }
.wz-dates { white-space: nowrap; }
.wz-assumed { color: var(--muted); font-style: italic; }
.wz-row-assumed .wz-dates { color: var(--muted); font-style: italic; }
.wz-gantt-card { margin: 10px 0 0; padding: 8px 10px; }
.wz-commit { display: flex; justify-content: flex-end; }
@media (max-width: 719px) {
  .wz-two { grid-template-columns: minmax(0, 1fr); }
  .wz-nav { justify-content: stretch; }
  .wz-assumed-note { text-align: left; }
  .wz-buttons { flex-direction: column; align-items: stretch; }
  .wz-buttons .spacer { display: none; }
  .wz-buttons > :first-child { order: 9; }
}

/* ---- 小件：只让这些容器能随网格收缩 / 对齐（没有 overflow，不影响甘特的 sticky 表头） ---- */
.ib-body, .ov-trends, .pj-gantt, .pj-toolhost, .wz-preview, .wz-gantt, .wz-source { min-width: 0; }
.ib-tag { flex: none; }
.ib-edit-label { font-size: 0.88rem; color: var(--muted); }
.td-ev-at { white-space: nowrap; }
.td-events { gap: 6px; }
.pj-entries, .pj-log { gap: 6px; }
.pj-event-note:empty { display: none; }
.wz-empty { margin: 0; }
.wz-tabs { margin-bottom: 4px; }
.wz-owner { max-width: 22em; }

@media (max-width: 719px) {
  /* iOS 对小于 16px 的输入框聚焦时会整页放大（v1 的 .input / .select / .textarea 是 15px）；组长侧在手机上要填的表单都放大到 16px（G1 的写周报框已同样处理） */
  .wz-body .input, .wz-body .select, .wz-import .textarea, .wz-import .select, .td-root .input, .td-root .select, .td-root .textarea,
  .pj-settings .input, .pj-settings .select, .pj-clone .input, .pj-group .select, .ib-input, .ib-filter .select { font-size: 16px; }
}

@media print {
  .ov-copy, .ov-weeknav, .ib-actions, .ib-inline, .pj-more, .ov-rowend, .td-actions { display: none; }
}
/* ==== G2 END ==== */
