/* css/views.css — 视图层（自 style.css 逐值迁移，R1 模块化重构）
 * 承接：归档页折叠树 / 统计页区块 / relay 分模式规则 / board-tabs / 899px 与 767px 响应式断点 */

/* ---------------- 归档页二级折叠树（契约 §4.2） ---------------- */

.archive-tree { display: flex; flex-direction: column; gap: var(--spacing-xs); max-width: 860px; }

.archive-tree details.type-group {
  background: var(--color-card);
  border: 1px solid var(--color-border); border-radius: var(--radius-lg);
  box-shadow: var(--shadow-1);
}

.archive-tree details.type-group > summary {
  list-style: none; cursor: pointer;
  display: flex; align-items: center; gap: var(--spacing-xs);
  padding: var(--spacing-xs) var(--spacing-sm);
  font-size: var(--font-size-base); font-weight: var(--font-weight-semibold);
  border-radius: var(--radius-lg);
}

.archive-tree details.type-group > summary::-webkit-details-marker { display: none; }

.archive-tree details.type-group > summary::before {
  content: "▾"; display: inline-block; color: var(--color-text-weak);
  font-size: var(--font-size-sm); font-weight: var(--font-weight-regular);
  transition: transform var(--duration-fast) var(--ease-out);
}

.archive-tree details.type-group:not([open]) > summary::before { transform: rotate(-90deg); }

.archive-month-group { border-top: 1px solid var(--color-lane); }

.archive-month-group > summary {
  list-style: none; cursor: pointer;
  display: flex; align-items: center; gap: var(--spacing-xs);
  padding: var(--spacing-xxs) var(--spacing-sm) var(--spacing-xxs) var(--spacing-lg);
  font-size: var(--font-size-sm); color: var(--color-text-weak);
}

.archive-month-group > summary::-webkit-details-marker { display: none; }

.archive-month-group > summary::before {
  content: "▾"; display: inline-block;
  transition: transform var(--duration-fast) var(--ease-out);
}

.archive-month-group:not([open]) > summary::before { transform: rotate(-90deg); }

.archive-item { padding: var(--spacing-xs) var(--spacing-sm) var(--spacing-sm) var(--spacing-xl); border-top: 1px dashed var(--color-lane); }

.archive-item-title { font-size: var(--font-size-base); font-weight: var(--font-weight-semibold); word-break: break-word; }

.archive-item-summary { margin-top: var(--spacing-xxs); font-size: var(--font-size-sm); color: var(--color-text-weak); word-break: break-word; }

.archive-item-time { font-family: var(--font-mono); }

/* ---------------- 统计页 2×2 区块（契约 §4.3） ---------------- */

.stats-grid {
  display: grid; grid-template-columns: 1fr 1fr;
  gap: var(--spacing-md); max-width: 960px;
}

.stat-block {
  background: var(--color-card);
  border: 1px solid var(--color-border); border-radius: var(--radius-lg);
  box-shadow: var(--shadow-1);
  padding: var(--spacing-md);
  display: flex; flex-direction: column; gap: var(--spacing-sm);
}

.stat-block-head {
  display: flex; align-items: center; justify-content: space-between;
}

.stat-block-title { font-size: var(--font-size-base); font-weight: var(--font-weight-semibold); }

.stat-block-note { font-size: var(--font-size-xs); color: var(--color-text-weak); }

/* 纯 CSS 条形图（契约 §4.3） */
.stat-row {
  display: grid; grid-template-columns: 88px 1fr 48px;
  align-items: center; gap: var(--spacing-sm); margin: 0;
}

.stat-label { font-size: var(--font-size-sm); color: var(--color-text); }

.stat-label .dot { width: 8px; height: 8px; border-radius: 50%; display: inline-block; margin-right: 6px; vertical-align: middle; }

.bar-track {
  height: 10px; background: var(--color-lane);
  border-radius: var(--radius-pill); overflow: hidden;
}

.bar-fill { height: 100%; border-radius: var(--radius-pill); }

.stat-value {
  font-family: var(--font-mono); font-size: var(--font-size-sm);
  text-align: right;
}

/* 状态条填充色 = 状态点色（契约 §3.3） */
.bar-fill[data-status="todo"]  { background: var(--color-dot-todo); }
.bar-fill[data-status="doing"] { background: var(--color-dot-doing); }
.bar-fill[data-status="done"]  { background: var(--color-dot-done); }

/* 类型条填充色 = 对应 --type-* 色（契约 §4.3 B 区块） */
.bar-fill[data-type="feature"]     { background: var(--type-feature); }
.bar-fill[data-type="bugfix"]      { background: var(--type-bugfix); }
.bar-fill[data-type="refactor"]    { background: var(--type-refactor); }
.bar-fill[data-type="performance"] { background: var(--type-performance); }
.bar-fill[data-type="security"]    { background: var(--type-security); }
.bar-fill[data-type="chore"]       { background: var(--type-chore); }
.bar-fill[data-type="other"]       { background: var(--type-other); }

/* 本月完成大数字卡（契约 §4.3 C 区块） */
.stat-big { align-items: flex-start; justify-content: center; }

.stat-big-number {
  font-family: var(--font-mono); font-size: var(--font-size-stat);
  font-weight: var(--font-weight-semibold); color: var(--color-text);
  line-height: 1.1;
}

.stat-big-label { font-size: var(--font-size-sm); color: var(--color-text-weak); }

/* ---------------- 窄窗降级 <900px（契约 §7，同 DOM 纯 CSS 换向） ---------------- */

@media (max-width: 899px) {
  /* 侧边栏缩为 56px 图标栏（契约 §7） */
  .sidebar { width: var(--sidebar-width-narrow); }

  .brand { justify-content: center; padding: var(--spacing-sm) var(--spacing-xxs); }

  .brand-title { display: none; }

  .view-nav { padding: 0 var(--spacing-xxs); }

  /* 三导航仅图标（title + aria-label 提示名称） */
  .nav-item { justify-content: center; padding-left: 0; }

  .nav-label { display: none; }

  /* 项目信息区整组隐藏（v3 D4：窄窗无展示空间，契约 §7 同款降级） */
  .project-section { border-top: 1px solid var(--color-border); }

  .project-head { justify-content: center; padding: var(--spacing-xxs); }

  .project-head-label, .project-scroll { display: none; }

  /* R2 项目配置区窄屏降级（同项目信息区口径：图标栏态收起体，抽屉态恢复；
   * :not(.collapsed) 保持折叠态优先——抽屉打开时折叠的区块不意外展开内容）；
   *  #198 入口卡沿用同口径（摘要行+按钮收进 config-body，弹窗不受影响——
   *  .modal 宽 calc(100vw - 32px) 既有规则覆盖） */
  .config-toggle { justify-content: center; }

  .config-body { display: none; }

  body.sidebar-open .config-block:not(.collapsed) .config-body { display: block; }

  /* 轮询状态缩为圆点（绿=轮询/红=暂停，title 全文） */
  .sidebar-foot { justify-content: center; padding: var(--spacing-sm) var(--spacing-xxs); }

  .poll-text { display: none; }

  .poll-dot { display: inline-block; }

  /* 统一看板单列换向：列头保留显示状态名，列体放开高度限制（契约 §7 同款降级）；
   *  mobile-fix 1：minmax(0,1fr) 消除轨道 min-content 下限——长 hash/URL/长徽章不再撑破轨道 */
  .board-columns { grid-template-columns: minmax(0, 1fr); gap: var(--spacing-xs); }

  .col-head { position: static; }

  .board-col .col-body { max-height: none; overflow-y: visible; }

  /* topbar 自动换行；类型 chips 横向滚动（契约 §7） */
  .topbar-row { flex-wrap: wrap; min-height: 0; padding-top: var(--spacing-xs); padding-bottom: var(--spacing-xs); }

  /* v6→#130 窄窗降级：首行恢复 flex 换行，统计迷你卡行换行后独占一行（按钮行下方） */
  .topbar-row.topbar-row-center { display: flex; flex-wrap: wrap; }

  .topbar-row-center .home-stat-row { order: 3; flex-basis: 100%; }

  /* 56px 图标栏无文字空间——设备下拉/项目下拉隐藏（<768px 抽屉态恢复） */
  .sidebar-device, .sidebar-project { display: none; }

  /* mobile-fix 2：chips 触屏可滑——容器钳制在行宽内（max-width:100% 才能触发自身
   *  overflow-x 滚动；否则 flex-shrink:0 使容器=内容宽度，溢出被 body overflow:hidden
   *  剪掉且无法滚动）+ 惯性滚动；子 chip 保持 flex-shrink:0 不被压缩变形 */
  .chip-group {
    overflow-x: auto; max-width: 100%; min-width: 0;
    -webkit-overflow-scrolling: touch;
  }

  /* 弹层宽 calc(100vw - 32px)（契约 §7） */
  .modal { width: calc(100vw - 32px); }

  /* 统计页单列（契约 §7） */
  .stats-grid { grid-template-columns: 1fr; }

  /* D5 产出文档面板单列（列表在上、查看区在下） */
  .doc-panel { grid-template-columns: 1fr; }

  /* ---------- mobile-fix 3① 侧边栏抽屉（固定左侧 240px 滑入 + 遮罩关闭）----------
   * P1-2（Verifier 审查修复）：抽屉适用区间自 <768px 放宽到 <900px 全区间——
   * 768~899px 视口侧栏缩为 56px 图标栏且无抽屉入口时，工作区子菜单/设备下拉
   * （#130 后唯一切换入口）在该区间完全不可用（切换入口真空）；放宽后汉堡入口
   * 全区间在场，抽屉内子菜单/设备恢复可用。
   * 汉堡入口左下角 44px 触控目标（safe-area 刘海屏适配）；z 序：遮罩 110 < 抽屉 120
   * < 汉堡 130 < 弹层 200（详情弹层在抽屉之上，互不遮挡） */
  .sidebar-toggle {
    display: flex; align-items: center; justify-content: center;
    position: fixed;
    left: calc(var(--spacing-sm) + env(safe-area-inset-left, 0px));
    bottom: calc(var(--spacing-sm) + env(safe-area-inset-bottom, 0px));
    width: 44px; height: 44px;
    background: var(--color-card);
    border: 1px solid var(--color-border); border-radius: var(--radius-md);
    box-shadow: var(--shadow-2);
    font-size: 18px; color: var(--color-text); cursor: pointer;
    z-index: 130;
  }

  .sidebar-overlay {
    display: block; position: fixed; inset: 0;
    background: rgba(59, 58, 54, 0.45);
    z-index: 110;
  }

  body:not(.sidebar-open) .sidebar-overlay { display: none; }

  /* 收起态抽屉移出屏外（fixed 脱离 flex 流 → .main 全宽；源序晚于本段上方
   * width:narrow 规则 → 抽屉态恢复 240px 全宽） */
  .sidebar {
    position: fixed; left: 0; top: 0; bottom: 0;
    width: var(--sidebar-width);
    transform: translateX(-100%);
    transition: transform var(--duration-normal) var(--ease-out);
    z-index: 120;
    box-shadow: var(--shadow-3);
  }

  body.sidebar-open .sidebar { transform: none; }

  /* 抽屉态恢复文本标签与左对齐（覆盖本段上方图标栏降级规则——抽屉 240px 全宽有空间） */
  body.sidebar-open .brand { justify-content: flex-start; }

  body.sidebar-open .brand-title { display: inline; }

  body.sidebar-open .nav-item { justify-content: flex-start; padding-left: var(--spacing-sm); }

  body.sidebar-open .nav-label { display: inline; }

  body.sidebar-open .project-head { justify-content: space-between; }

  body.sidebar-open .project-head-label { display: inline; }

  body.sidebar-open .project-scroll { display: block; }

  body.sidebar-open .sidebar-foot { justify-content: flex-start; }

  body.sidebar-open .poll-text { display: inline; }

  /* 抽屉态恢复项目下拉与设备下拉（覆盖本段上方图标栏态隐藏规则）；设备下拉
   *  :not([hidden]) 保持 relay-only hidden 属性语义；项目下拉无 hidden 属性恒显示，
   *  不需要 :not([hidden]) 守卫（与 .sidebar-device 的差异点） */
  body.sidebar-open .sidebar-project { display: block; }

  body.sidebar-open .sidebar-device:not([hidden]) { display: block; }
}

/* ---------------- v7 relay 模式：只读态布局（body.mode-relay 由 app.js 启动时附加） ---------------- */

/* relay 数据源说明（mobile-fix 3② 调整）：/api/archive /api/stats 无 relay 端点，
 * 但 board 快照含全量任务（含 archived）——归档/统计页由 app.js 从快照本地派生
 * （relayArchiveGroups/relayStats），侧边栏归档/统计导航与项目列表保留可用；
 * 仅项目信息区隐藏（/api/project-info 无 relay 数据源；DOM 保留，切回本地自然恢复）。
 * #130：「工作空间」分组移除后 .project-section 仅剩项目信息区——:not() 修饰符
 * 随该分组退役简化 */
.mode-relay .project-section { display: none; }

/* relay 退出小按钮与展开/折叠按钮同排（btn-sm 紧凑变体） */
.mode-relay .topbar-side-right .btn-sm { margin-left: var(--spacing-xxs); }

/* ---------------- v7 移动端响应式 <768px（单列 + 状态 tab；desktop >768px 零影响） ---------------- */

/* 状态 tab 条：desktop 隐藏（三列全量呈现），<768px 显示 */
.board-tabs { display: none; }

@media (max-width: 767px) {
  /* 状态 tab：三等分单行，44px 触控目标（active = accent 底白字，nav-item.active 同款语言） */
  .board-tabs {
    display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--spacing-xxs); margin-bottom: var(--spacing-xs);
    position: sticky; top: calc(-1 * var(--spacing-sm)); z-index: 5;
  }

  .board-tab {
    display: flex; align-items: center; justify-content: center; gap: var(--spacing-xxs);
    height: 44px;
    background: var(--color-card);
    border: 1px solid var(--color-border); border-radius: var(--radius-md);
    font-size: var(--font-size-base); color: var(--color-text);
    cursor: pointer;
    transition: background var(--duration-fast) var(--ease-out);
  }

  .board-tab.active {
    background: var(--color-accent); border-color: var(--color-accent); color: #FFFFFF;
  }

  .board-tab.active .lane-count { background: rgba(255, 255, 255, 0.22); color: #FFFFFF; }

  .board-tab:not(.active):hover { background: var(--color-accent-soft); }

  /* 单列 tab 切换：board-columns data-mobile-tab 非 active 列整列隐藏（9 组两两互斥）；
   *  mobile-fix 1：minmax(0,1fr) 同 899px 断点——窄屏轨道不被 min-content 撑破 */
  .board-columns { grid-template-columns: minmax(0, 1fr); }

  .board-columns[data-mobile-tab="todo"] .board-col[data-status="doing"],
  .board-columns[data-mobile-tab="todo"] .board-col[data-status="done"] { display: none; }

  .board-columns[data-mobile-tab="doing"] .board-col[data-status="todo"],
  .board-columns[data-mobile-tab="doing"] .board-col[data-status="done"] { display: none; }

  .board-columns[data-mobile-tab="done"] .board-col[data-status="todo"],
  .board-columns[data-mobile-tab="done"] .board-col[data-status="doing"] { display: none; }

  /* 列体高度放开（单列纵向滚动由 content 承担） */
  .board-col .col-body { max-height: none; overflow-y: visible; }

  .col-head { position: static; }

  /* v9（#63）：父卡内嵌子任务区窄屏适配——缩进收紧（内容区最大化）；行内标题弹性
   *  省略 + 状态/按钮不收缩（min-width:0 族规则）保证不溢出卡片；极窄屏行可换行兜底 */
  .card-subtask-list { margin-left: var(--spacing-xs); padding-left: var(--spacing-xxs); }

  .card-subtask-row { flex-wrap: wrap; }

  /* T-E1（F-41，批次 E #118）：卡片徽章组移动端收缩——短名隐藏（纯色点+计数，
   *  tap 卡片看详情）；active 呼吸点保留（信息价值高、占地小）；#186 起摘要行
   *  完整多行显示 + 超长折叠（截断档位已退役，CSS 见 components.css 摘要行段） */
  .card-agent-label { display: none; }

  .card-agent { gap: 3px; }

  /* 触控目标 ≥44px：按钮/chip/下拉/检索统一加高（移动端密度放宽） */
  .btn { min-height: 44px; }

  .chip { height: 44px; padding: 0 var(--spacing-md); font-size: var(--font-size-sm); }

  .topbar select { min-height: 44px; }

  .topbar input[type="search"] { min-height: 44px; flex-basis: 100%; }

  /* 顶栏行距收紧（折叠适配：首行换行沿用 899px 降级，二行检索独占整行） */
  .topbar-row { padding-top: var(--spacing-xxs); padding-bottom: var(--spacing-xxs); }

  .topbar-row + .topbar-row { gap: var(--spacing-xxs); }

  /* #130：工作区大标题已随顶栏改版退役（DOM 不再渲染，本段规则随删）——统计迷你卡
   *  独占一行由 home.css 767px 段 flex-basis:100% 承担 */

  /* 详情/文档弹层窄屏全屏化 */
  .modal-backdrop { padding: 0; align-items: stretch; }

  .modal {
    width: 100vw; max-width: 100vw;
    height: 100dvh; max-height: 100dvh;
    border-radius: 0;
  }

  /* T-E2（F-42，批次 E #118）：详情弹层 bottom sheet 形态——自底向上、默认占屏 70%、
   *  把手上拉全屏/下滑关闭（48px 阈值，forms.js 手势）；覆盖上方通用 modal 全屏化
   *  规则（#modal-detail 特异性更高）；弹层滚动锁定沿用既有 modal 机制 */
  #modal-detail { align-items: flex-end; }

  #modal-detail .modal {
    height: 70dvh; max-height: 70dvh;
    border-radius: var(--radius-xl) var(--radius-xl) 0 0;
    transition: height var(--duration-normal) var(--ease-out);
  }

  #modal-detail .modal.sheet-full { height: 100dvh; max-height: 100dvh; }

  /* sheet 把手（forms.js ensureDetailSheet 装配；desktop 由 components.css 隐藏）：
   *  36×4 圆角短条居中，触区由把手+标题行整行承担（≥44px） */
  .sheet-handle {
    display: block;
    width: 36px; height: 4px;
    margin: var(--spacing-xxs) auto 0;
    background: var(--color-border);
    border-radius: var(--radius-pill);
    flex-shrink: 0;
  }

  /* 提交记录行内自适应：hash 徽章固定宽（不收缩不换行）+ message 换行承载不溢出弹层 */
  .commit-hash { flex-shrink: 0; width: 9ch; }

  /* token 输入页窄屏：卡片占满留边距 */
  .token-page { padding: var(--spacing-md); }

  /* 侧栏抽屉机制已上移 899px 段（P1-2：<900px 全区间生效——768~899px 视口切换入口
   *  真空修复；本段 <768px 经区间包含自动继承，规则不重复声明） */
}

/* ---------------- R3 统计仪表盘（Dashboard：快捷操作行 / 统计卡行 / 最近动态流 / 卡片进度条） ----------------
 * 零新增令牌：全部复用 tokens.css 既有令牌（--color-card / --color-border / --font-size-stat 等） */

/* 快捷操作行（统计视图顶部「+ 新建任务」——relay 只读态不渲染按钮） */
.dash-actions {
  display: flex; align-items: center; gap: var(--spacing-sm);
  margin-bottom: var(--spacing-md); max-width: 960px;
}

/* 统计卡行：4 张大数字卡（卡片令牌复用；状态卡容器 data-status 驱动状态点着色） */
.dash-stat-cards {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: var(--spacing-md); margin-bottom: var(--spacing-md); max-width: 960px;
}

.dash-stat-card {
  background: var(--color-card);
  border: 1px solid var(--color-border); border-radius: var(--radius-lg);
  box-shadow: var(--shadow-1);
  padding: var(--spacing-md);
  display: flex; flex-direction: column; gap: var(--spacing-xs);
  min-width: 0;
}

.dash-stat-label {
  font-size: var(--font-size-sm); color: var(--color-text-weak);
  display: flex; align-items: center; gap: var(--spacing-xs);
}

.dash-stat-dot {
  width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;
}

.dash-stat-card[data-status="todo"]  .dash-stat-dot { background: var(--color-dot-todo); }
.dash-stat-card[data-status="doing"] .dash-stat-dot { background: var(--color-dot-doing); }
.dash-stat-card[data-status="done"]  .dash-stat-dot { background: var(--color-dot-done); }

.dash-stat-value {
  font-family: var(--font-mono); font-size: var(--font-size-stat);
  font-weight: var(--font-weight-semibold); color: var(--color-text);
  line-height: 1.1;
}

/* 最近动态流（反馈时间线同族视觉：弱化底色 + mono 时间段；行 = 按钮，点击开详情弹层） */
.dash-activity {
  margin-bottom: var(--spacing-md); max-width: 960px; gap: var(--spacing-xs);
}

.dash-activity-list {
  display: flex; flex-direction: column; gap: var(--spacing-xxs);
}

.dash-activity-row {
  display: flex; align-items: center; gap: var(--spacing-sm);
  padding: var(--spacing-xs) var(--spacing-sm);
  background: var(--color-lane);
  border: none; border-radius: var(--radius-md);
  font: inherit; color: var(--color-text); cursor: pointer; text-align: left;
  min-width: 0;
  transition: background var(--duration-fast) var(--ease-out);
}

.dash-activity-row:hover { background: var(--color-accent-soft); }

.dash-activity-time {
  font-size: var(--font-size-xs); color: var(--color-text-weak);
  flex-shrink: 0;
}

.dash-activity-title {
  font-size: var(--font-size-sm); font-weight: var(--font-weight-semibold);
  flex-shrink: 0; max-width: 40%;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

.dash-activity-text {
  font-size: var(--font-size-sm); color: var(--color-text-weak);
  flex: 1 1 auto; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* 卡片/详情子事项完成度进度条（轨道 accent-soft + 填充 accent + 右侧 n/m 计数） */
.card-progress {
  display: flex; align-items: center; gap: var(--spacing-sm);
  margin-top: var(--spacing-xs);
}

.card-progress-track {
  flex: 1 1 auto; height: 6px;
  background: var(--color-accent-soft);
  border-radius: var(--radius-pill); overflow: hidden;
}

.card-progress-fill {
  height: 100%; background: var(--color-accent);
  border-radius: var(--radius-pill);
}

.card-progress-count {
  font-size: var(--font-size-xs); color: var(--color-text-weak);
  flex-shrink: 0;
}

/* R3 窄窗降级 <900px：统计卡行 2×2、动态流行内自适应（同既有断点口径） */
@media (max-width: 899px) {
  .dash-stat-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); }

  .dash-activity-row { flex-wrap: wrap; }

  .dash-activity-title { max-width: 100%; white-space: normal; }
}

/* ---------------- 批次 C（#118 tasks.md §4 / design §5.1/§6.1）：三甬道卡片细化 ----------------
 * 令牌全复用（tokens.css 既有变量）；紧凑态对齐沿用 components.css 既有
 *  .cards-collapsed .card-badges 隐藏规则（徽章组随徽章行隐藏，零重复声明）。 */

/* agent 工种徽章组（F-11）：.card-badges 行内尾位——inline-flex 随徽章行换行 */
.card-agents {
  display: inline-flex; align-items: center; flex-wrap: wrap;
  gap: var(--spacing-xxs); max-width: 100%;
}

/* 单工种徽章：色点 + 单字短标 + mono 计数（弱色轻量，不与类型/优先级徽章争视觉层级） */
.card-agent {
  display: inline-flex; align-items: center; gap: 2px;
  font-size: var(--font-size-xs); color: var(--color-text-weak);
  line-height: var(--line-height-tight);
}

.card-agent-dot {
  width: 8px; height: 8px; border-radius: 50%;
  display: inline-block; flex-shrink: 0;
}

.card-agent-count { font-family: var(--font-mono); }

.card-agent-more { cursor: default; }   /* 「+n」折叠项（title 展开完整工种清单） */

/* active 工种呼吸点（F-12：该工种存在 working 实例——执行中脉冲扩散） */
.card-agent.is-active .card-agent-dot {
  animation: kbAgentPulse 2s var(--ease-out) infinite;
}

@keyframes kbAgentPulse {
  0%   { box-shadow: 0 0 0 0 rgba(91, 141, 239, 0.45); }
  70%  { box-shadow: 0 0 0 5px rgba(91, 141, 239, 0); }
  100% { box-shadow: 0 0 0 0 rgba(91, 141, 239, 0); }
}

@media (prefers-reduced-motion: reduce) {
  .card-agent.is-active .card-agent-dot { animation: none; }
}

/* done/archived 整组灰化（L9：徽章是历史计数不删除，§3.1） */
.card-agents.is-done { filter: grayscale(1); opacity: 0.55; }

/* 摘要行升级（F-13）：[工色点] HH:MM 结论——覆盖既有 ::before「进展 · 」前缀，
 *  flex 三段（色点/时间/文本）。#186：文本段完整多行显示（pre-line 真实换行 +
 *  anywhere 折行；超长折叠类 is-clamped 见 components.css）；flex-start 使色点
 *  对齐首行文字 */
.card-feedback-agent {
  display: flex; align-items: flex-start; gap: var(--spacing-xxs);
}

.card-feedback-agent::before { content: none; }

.card-feedback-time { flex-shrink: 0; color: var(--color-text-weak); }

.card-feedback-agent > .card-agent-dot { margin-top: 4px; flex-shrink: 0; }

.card-feedback-text {
  min-width: 0; flex: 0 1 auto;
  white-space: pre-line; overflow-wrap: anywhere;
}

/* delivered 新交付高亮（F-12 / L4）：4s CSS 过渡消退（forwards 终态回常态；
 *  窗口记忆在 JS cardActivityClass——消退后不再重放）；working 语义锚点类（呼吸点在
 *  active 徽章色点上呈现，类保留作样式扩展位） */
.card-delivered {
  animation: kbCardDelivered 4s ease-out forwards;
}

@keyframes kbCardDelivered {
  0%, 25% { box-shadow: 0 0 0 2px var(--color-success); }
  100%    { box-shadow: 0 0 0 0 transparent; }
}

@media (prefers-reduced-motion: reduce) {
  .card-delivered { animation: none; box-shadow: 0 0 0 2px var(--color-success); }
}

/* 紧凑密度计数点（F-14）：默认隐藏；紧凑态（.cards-collapsed）徽章行隐藏后由标题尾
 *  「●N」（N=在册工种数）承接徽章信息（title 工种清单） */
.card-agent-mini {
  display: none;
  margin-left: var(--spacing-xxs);
  font-size: var(--font-size-xs); font-weight: var(--font-weight-regular);
  color: var(--color-text-weak); cursor: default;
}

.cards-collapsed .card-agent-mini { display: inline; }

/* 长泳道紧凑提示条（F-43 P0，>100 卡）：随 board html diff 出现/消失；
 *  「一键紧凑」复用既有 btn 体系（data-action="compact-all" 事件委托） */
.lane-compact-hint {
  display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap;
  gap: var(--spacing-xs);
  margin-bottom: var(--spacing-xs);
  padding: var(--spacing-xxs) var(--spacing-sm);
  background: var(--color-card);
  border: 1px solid var(--color-border); border-radius: var(--radius-md);
  font-size: var(--font-size-sm); color: var(--color-text-weak);
}

/* 长泳道窗口化占位（F-43 P1，>300 卡）：上下占位撑滚动条长度（高度 = 卡数 × 单卡估算） */
.lane-window-pad { width: 100%; flex-shrink: 0; }

/* 修复轮（P1-1，F-15 P1 档）：卡片 hover 500ms 延迟浮层——摘要 + 最近两条 feedback + 工种清单。
 * 单例（body 级唯一实例，hidden 类显隐）；z 序低于弹层（200）；prefers-reduced-motion 无动画降级；
 * <768px 强制隐藏（T-E1：移动端维持 title 态，pointerType 过滤之外的 CSS 双保险） */
.hover-preview {
  position: fixed;
  width: 280px; max-width: calc(100vw - 16px);
  background: var(--color-card);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-3);
  padding: var(--spacing-xs) var(--spacing-sm);
  font-size: var(--font-size-sm); color: var(--color-text);
  z-index: 150;
  animation: hoverPreviewIn 0.15s var(--ease-out);
  pointer-events: none;   /* 浮层自身不捕获指针——避免与卡片 hover 区互扰 */
}

.hover-preview.hidden { display: none; }

.hover-preview-summary {
  color: var(--color-text-weak);
  margin-bottom: var(--spacing-xxs);
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}

.hover-preview-line {
  display: flex; align-items: center; gap: var(--spacing-xxs);
  margin: var(--spacing-xxs) 0; min-width: 0;
}

.hover-preview-time { color: var(--color-text-weak); flex-shrink: 0; }

.hover-preview-text {
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

.hover-preview-agents {
  margin-top: var(--spacing-xxs); padding-top: var(--spacing-xxs);
  border-top: 1px solid var(--color-border);
  color: var(--color-text-weak); font-size: var(--font-size-xs);
}

@keyframes hoverPreviewIn { from { opacity: 0; } to { opacity: 1; } }

@media (prefers-reduced-motion: reduce) {
  .hover-preview { animation: none; }
}

@media (max-width: 767px) {
  .hover-preview { display: none !important; }   /* T-E1：移动端不做浮层（title 态） */
}

/* ---------------- v13 部署监控页（看板卡 #238，plan §3.2 UI 契约） ----------------
 * 令牌全复用（tokens.css 既有变量）；分节卡 + 六要素表 + 状态徽章 data-status 配色
 * （success=success 绿 / failed=danger 红 / denied=text-weak 灰 / running=dot-todo 蓝）。 */

.deploy-page { display: flex; flex-direction: column; gap: var(--spacing-md); }

.deploy-section {
  background: var(--color-card);
  border: 1px solid var(--color-border); border-radius: var(--radius-lg);
  box-shadow: var(--shadow-1);
  padding: var(--spacing-sm) var(--spacing-md);
}

.deploy-section-head {
  display: flex; align-items: center; gap: var(--spacing-xs);
  padding: var(--spacing-xxs) 0;
}

.deploy-section-title { font-size: var(--font-size-md); font-weight: var(--font-weight-semibold); min-width: 0; }

.deploy-version-badge {
  background: var(--color-accent-soft); color: var(--color-accent-dark);
  font-family: var(--font-mono);
}

.deploy-table { width: 100%; border-collapse: collapse; }

.deploy-table th {
  text-align: left; font-size: var(--font-size-xs); font-weight: var(--font-weight-medium);
  color: var(--color-text-weak); padding: var(--spacing-xxs) var(--spacing-xs);
  border-bottom: 1px solid var(--color-border); white-space: nowrap;
}

.deploy-table td {
  font-size: var(--font-size-sm); padding: var(--spacing-xxs) var(--spacing-xs);
  border-bottom: 1px dashed var(--color-lane); vertical-align: top;
}

.deploy-table tbody tr:last-child td { border-bottom: none; }

.deploy-commit-hash { color: var(--color-text-weak); }

/* 状态徽章：data-status 驱动令牌配色（零硬编码色值） */
.deploy-status {
  display: inline-block; font-size: var(--font-size-xs); line-height: 18px;
  padding: 0 var(--spacing-xs); border-radius: var(--radius-pill);
  background: var(--color-lane); color: var(--color-text-weak);   /* 兜底灰（含未知态） */
  white-space: nowrap;
}

.deploy-status[data-status="success"] { background: var(--color-success); color: #FBFAF7; }
.deploy-status[data-status="failed"]  { background: var(--color-danger); color: #FBFAF7; }
.deploy-status[data-status="denied"]  { background: var(--color-border); color: var(--color-text-weak); }
.deploy-status[data-status="running"] { background: var(--color-dot-todo); color: #FBFAF7; }

/* 触发任务卡号按钮（可点开详情弹层）与纯文本同形 */
.deploy-trigger {
  font: inherit; font-size: var(--font-size-sm);
  color: var(--color-text-weak); background: none; border: none;
  padding: 0; text-align: left; word-break: break-all;
}

button.deploy-trigger-link { color: var(--color-accent); cursor: pointer; }

button.deploy-trigger-link:hover { text-decoration: underline; }

/* 窄窗降级 <899px：表格横向滚动（六要素列宽内容不挤压溢出） */
@media (max-width: 899px) {
  .deploy-section { padding: var(--spacing-xs) var(--spacing-sm); overflow-x: auto; }

  .deploy-table { min-width: 560px; }
}

/* ============================================================
 * v14 部署批次聚合行（伞卡 #241 / 子卡 #243，plan §4.2）——deploy-monitor
 * 批次行/成员展开行 + 配置中心部署历史分区共享；零新增色值（复用既有令牌）。
 * ============================================================ */

/* 批次聚合行：版本列批次短号前缀已用 mono；行底轻微区分平铺行 */
.deploy-batch-row .deploy-cell-version { font-weight: var(--font-weight-semibold); }

/* 批次成员展开行：首列目标标识缩进（└ 树形指引）+ 弱化 */
.deploy-batch-member td { color: var(--color-text-weak); }
.deploy-batch-member .deploy-cell-status,
.deploy-batch-member .deploy-cell-type { color: var(--color-text); }
