/* 外围桥 PWA · Academic Minimalist（对齐 ../SpiralFramework/页面风格标准.html，token 逐字一致）
   规约：色彩是标点符号不是正文；圆角仅 4/12/16px；阴影仅 --c-panel-shadow；零 emoji 零装饰图。
   注：--c-danger 为本项目扩展 token（标准四色无断线/拒绝语义），取苹果系统红保持低饱和同族。
   注：规约例外先例并录（均单点形态决策、WHY 在冷屋，非通用 token）——
   ① 999px 全圆角胶囊：.capsule 状态胶囊族（7 处在案）+ #218 gate 账户登录主操作；
   ② 硬编码阴影三处：.command-palette 浮层托举 / .switch::after 滑块投影 / #218 gate 主操作托板。
   主题机制：JS 解析偏好落 <html data-theme>（index.html 引导脚本 + src/theme.ts），CSS 只认本属性。 */

:root {
  --c-bg:               #fbfbfd;
  --c-surface:          rgba(255, 255, 255, 0.72);
  --c-surface-solid:    #ffffff;
  --c-surface-subtle:   #f5f5f7;
  --c-text:             #1d1d1f;
  --c-text-secondary:   #86868b;
  --c-text-tertiary:    #c0c0c5;
  --c-border:           rgba(0, 0, 0, 0.05);
  --c-border-strong:    #e5e5ea;
  --c-divider:          #d2d2d7;
  --c-table-row-border: #e5e5ea;
  --c-panel-shadow:     0 8px 30px -10px rgba(0,0,0,0.04);
  /* v4 accent 五件套：缺省=极速橙（VI 色表 D1）；蓝套见 :root[data-accent="blue"] 覆盖块。
     旧蓝族 #0066cc/#4d9aff 退役（品牌双色统一 VI 表）。 */
  --c-accent:           #F55100;
  --c-accent-bg:        rgba(245, 81, 0, 0.06);
  --c-accent-tag-bg:    rgba(245, 81, 0, 0.09);
  --c-accent-tag-text:  #E64A19;
  --c-accent-border:    rgba(245, 81, 0, 0.15);
  --c-warning:          #9a6700;
  --c-warning-bg:       rgba(154, 103, 0, 0.06);
  --c-warning-tag-bg:   #fef3e2;
  --c-warning-tag-text: #7a5200;
  --c-warning-border:   rgba(154, 103, 0, 0.15);
  --c-positive:         #0a7a35;
  --c-positive-bg:      rgba(10, 122, 53, 0.06);
  --c-positive-tag-bg:  #e8f5ee;
  --c-positive-tag-text:#076028;
  --c-positive-border:  rgba(10, 122, 53, 0.15);
  --c-danger:           #c7351b;
  --c-danger-bg:        rgba(199, 53, 27, 0.06);
  --c-danger-border:    rgba(199, 53, 27, 0.15);
  /* #164 修复C⑤：工具卡 error 缺血红（深主题 --c-danger #ff6b52 观感偏橙、负责人点名工具卡；
     专属 token 不动全局 danger 语义轴——dash-kv.dash-error/历史边条保持 danger 不动） */
  --c-error-soft:        #cc3b30;
  --c-error-soft-border: rgba(204, 59, 48, 0.25);
  /* #157 diff 语义四 token（红删绿增，独立于 positive/danger 状态语义轴——改状态色不波及 diff） */
  --c-diff-add-bg:      rgba(10, 122, 53, 0.10);
  --c-diff-add-fg:      #076028;
  --c-diff-del-bg:      rgba(199, 53, 27, 0.10);
  --c-diff-del-fg:      #a82a12;
  /* #162 吸附卡毛玻璃专属底：比 --c-surface 更透（深色 0.72 叠近黑底视觉即实心，真机验收否决）
     #163 修复C 再提亮：浅 0.65→0.5，叠白底时透感可见；顶边内高光 token 同族
     #164 修复C③ 通透化：浅 0.5→0.40（真机反馈不够透，配合 blur 20→10+saturate 1.5→1.2 三管通透化） */
  --c-rail-glass:       rgba(255, 255, 255, 0.40);
  --c-rail-glass-edge:  rgba(255, 255, 255, 0.55);
  /* #191 定标：比 rail-glass 再透两档（负责人两轮真机拍板「再透一些」）；blur 20 保持 */
  --c-island-glass:     rgba(255, 255, 255, 0.22);
  color-scheme: light;
}

:root[data-theme="dark"] {
  --c-bg:               #000000;
  --c-surface:          rgba(28, 28, 30, 0.72);
  --c-surface-solid:    #1c1c1e;
  --c-surface-subtle:   #1c1c1e;
  --c-text:             #f5f5f7;
  --c-text-secondary:   #98989d;
  --c-text-tertiary:    #48484a;
  --c-border:           rgba(255, 255, 255, 0.08);
  --c-border-strong:    #38383a;
  --c-divider:          #38383a;
  --c-table-row-border: #2c2c2e;
  --c-panel-shadow:     0 8px 30px -10px rgba(0,0,0,0.3);
  /* v4 accent 五件套（dark/orange 缺省）；蓝套见 dark+blue 覆盖块 */
  --c-accent:           #FF5E00;
  --c-accent-bg:        rgba(255, 94, 0, 0.08);
  --c-accent-tag-bg:    rgba(255, 94, 0, 0.15);
  --c-accent-tag-text:  #FF5E00;
  --c-accent-border:    rgba(255, 94, 0, 0.25);
  --c-warning:          #e8a317;
  --c-warning-bg:       rgba(232, 163, 23, 0.08);
  --c-warning-tag-bg:   rgba(232, 163, 23, 0.15);
  --c-warning-tag-text: #e8a317;
  --c-warning-border:   rgba(232, 163, 23, 0.25);
  --c-positive:         #4ade80;
  --c-positive-bg:      rgba(74, 222, 128, 0.08);
  --c-positive-tag-bg:  rgba(74, 222, 128, 0.15);
  --c-positive-tag-text:#4ade80;
  --c-positive-border:  rgba(74, 222, 128, 0.25);
  --c-danger:           #ff6b52;
  --c-danger-bg:        rgba(255, 107, 82, 0.08);
  --c-danger-border:    rgba(255, 107, 82, 0.25);
  /* #164 修复C⑤（dark）：缺血红，同浅色族 */
  --c-error-soft:        #ea8a7d;
  --c-error-soft-border: rgba(234, 138, 125, 0.30);
  /* #157 diff 语义四 token（dark） */
  --c-diff-add-bg:      rgba(74, 222, 128, 0.12);
  --c-diff-add-fg:      #4ade80;
  --c-diff-del-bg:      rgba(255, 107, 82, 0.12);
  --c-diff-del-fg:      #ff8a73;
  /* #162 吸附卡毛玻璃专属底（dark）：近黑底上 0.72 观感即实心，降到 0.55 让透感可见
     #163 修复C 再提亮：近黑叠近黑不可辨根因→换中灰 (58,58,62) 0.45（提亮+降不透明度双管）
     #164 修复C③ 通透化：深 0.45→0.30 */
  --c-rail-glass:       rgba(58, 58, 62, 0.30);
  --c-rail-glass-edge:  rgba(255, 255, 255, 0.08);
  --c-island-glass:     rgba(58, 58, 62, 0.16);
  color-scheme: dark;
}

/* ===== v4 accent 第二维度：冰蓝覆盖块（橙为缺省不写选择器；每块只含 5 个 accent 变量，约束层 4） ===== */
:root[data-accent="blue"] {
  --c-accent:           #0A5FD6;
  --c-accent-bg:        rgba(10, 95, 214, 0.06);
  --c-accent-tag-bg:    rgba(10, 95, 214, 0.09);
  --c-accent-tag-text:  #0A5FD6;
  --c-accent-border:    rgba(10, 95, 214, 0.15);
}

:root[data-theme="dark"][data-accent="blue"] {
  --c-accent:           #2FB6FF;
  --c-accent-bg:        rgba(47, 182, 255, 0.08);
  --c-accent-tag-bg:    rgba(47, 182, 255, 0.15);
  --c-accent-tag-text:  #2FB6FF;
  --c-accent-border:    rgba(47, 182, 255, 0.25);
}

* { box-sizing: border-box; }

/* iOS 键盘/滚动根治（v1.2 验收反馈两 bug）：
   body 固定化 = window 永不可滚——键盘收起后 composer 悬空（iOS 滚 body 不复位）与
   「拖整个页面上下移」（window 橡皮筋滚动）两个症状同根，全部滚动收进内层容器。 */
html {
  height: 100%;
  overflow: hidden;
  /* 键盘态 webview 若 pan 越过 body 底边（--app-height 收缩），露出的区域按页面底色渲染，
     不再露 webview 裸底（浅色模式下呈纯黑幕——真机验收实证）。与 index.html 内联块同义，改动两处同步。 */
  background: var(--c-bg);
  /* #174 项 4：禁双击缩放、保留双指捏合（负责人真机反馈：双击两下后停在错误缩放比、
     边缘内容看不全且用户不知情；原始比例才是最佳比例）。
     WHY manipulation 而非 viewport maximum-scale/user-scalable=no：后者会把双指捏合一起禁掉，
     与「保留捏合作为错误缩放比的手动修正入口」直接冲突；manipulation 语义精确＝只吃 double-tap zoom，
     捏合走浏览器系统层不受 touch-action 抑制。viewport meta 一字不改。
     WHY 落 html 而非 .app：模型选择器/确认弹窗/workbench 三处浮层是 document.body.append
     （在 .app 子树之外），挂 .app 会漏掉它们；touch-action 不继承但沿祖先链取交集，
     落 html 覆盖全子树。与 .dashboard-panel 的 pan-y 无冲突（manipulation ∩ pan-y = pan-y，
     纵滚照旧）；.diff-scroll 横滚亦不受影响（manipulation 保留 pan-x）。
     注：本声明不同步进 index.html 内联块——该块只护「style.css 被缓存钉死时 body 高度机制仍到达」，
     缩放行为非其职责。 */
  touch-action: manipulation;
}

body {
  /* 高度=JS 地面真值（index.html 引导脚本写 --app-height=innerHeight）：CSS 视口单位在 iOS
     独立模式按带工具栏小视口计算（100%/dvh/inset:0 三轮全中招），innerHeight 是当前形态
     真实可见高度；回退 100% 只存在于 JS 执行前一瞬。固定化=window 永不可滚（键盘/拖拽根治）。 */
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: var(--app-height, 100%);
  overflow: hidden;
  overscroll-behavior: none;
  margin: 0;
  font-family: -apple-system, BlinkMacSystemFont, "SF Pro Display", "SF Pro Text", "PingFang SC", "Helvetica Neue", Helvetica, Arial, sans-serif;
  background: var(--c-bg);
  color: var(--c-text);
  font-size: 16px;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}


.app {
  display: flex;
  flex-direction: column;
  height: 100%;
}

/* #198 按压触觉反馈（P7 合规：120ms≤200ms、随按压状态触发、零装饰）——.tap 原为零规则标记类，
   六消费点中四件（wb-attention-card/attention-row/section-action/group-header）此前按压零反馈；
   落位刻意靠前：session-card/project-card 自带 transition: border-color（不可叠加属性），
   其自身声明已并入 transform（见卡片块）——源序保后者整体覆盖，border-color 反馈不回归 */
.tap { transition: transform 120ms ease-out; }
.tap:active { transform: scale(0.97); }

/* ===== 顶栏（#190 浮岛 → #193 双岛 → #194 大屏反馈修 → #195 页族三分，断点单源 700px） ===== */
/* 页族三分（#195，容器级类由 renderChrome 路由驱动——popover 是 topbar 兄弟、须同作用域）：
   ① chrome-workbench（workbench）＝裸 chrome（两断点同规，#195 反馈②「竖屏也去岛」）：
     brand 左/胶囊+齿轮右 space-between，无任何岛皮；锚距 16px＝内容列 padding（裸件坐内容列缘上）。
   ② chrome-cards（sessions 列表/settings/account/admin——同根因平行链，卡片页）：
     岛＝列首卡、与 16px 卡片列同宽对齐（#195 反馈③/#196 竖屏补齐——两断点均对齐）。
   ③ 默认（session 详情等画布页）：≥700 岛锚 max(56px,safe)＝一岛高呼吸距（#195 反馈①）；
     <700 保持居中弹性收缩岛（#196 反馈②明示「竖屏保持现在的弹性」）。
   <700：cards 族满宽列首卡／画布页居中岛／workbench 裸 chrome；纯 CSS 零 JS 视口监听。
   压力契约（两级阀，贯通全形态）：tail 先缩(shrink 3，内胶囊文本 ellipsis)→lead 后缩(shrink 1，
   标题 ellipsis)→brand/方钮永不缩；全文读数出口=popover（P2）。
   blur 12（#194 反馈③）；rail blur(10) 不动。
   #193 归位修正：#191 压力阀曾误植 .tool-row，真实落位 .capsule。 */
.topbar {
  position: fixed;
  top: calc(env(safe-area-inset-top) + 8px);
  left: 50%;
  transform: translateX(-50%);
  max-width: min(calc(100vw - env(safe-area-inset-left) - env(safe-area-inset-right) - 16px), 720px);
  height: 56px;
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 0 8px;
  background: var(--c-island-glass);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border: 1px solid var(--c-border);
  border-radius: 16px;
  box-shadow: var(--c-panel-shadow), inset 0 1px 0 var(--c-rail-glass-edge);
  z-index: 25; /* dash-rail(20) 之上、status-popover(30) 之下 */
}

/* 岛内容器：透明排布件（岛皮恒在 .topbar——workbench 例外见下） */
.topbar-lead {
  display: flex;
  align-items: center;
  gap: 6px;
  flex: 0 1 auto; /* 压力次序后段：标题所在容器后缩 */
  min-width: 0;   /* 截断链传递给 .title（否则链断在容器层） */
}
.topbar-tail {
  display: flex;
  align-items: center;
  gap: 6px;
  flex: 0 3 auto; /* 压力次序前段：先于 lead 缩，内胶囊文本先 ellipsis */
  min-width: 0;
}

/* workbench 裸 chrome（#195 反馈②·非媒体块＝两断点同规；特异性 0,2,0 压过基础块与
   ≥700 媒体块——max-width:none 必须显式声明，否则 <700 残留 720px 封顶致左右不对称）：
   brand 双层 mask 直接坐页面底（同官网语言）；胶囊自带 pill 皮、齿轮裸 icon（:active 反馈在）；
   支架穿透——brand 裸区点击落到 workbench 内容，仅 tail 恢复交互 */
.chrome-workbench .topbar {
  left: 0;
  right: 0;
  transform: none;
  max-width: none;
  justify-content: space-between;
  padding: 0 max(16px, env(safe-area-inset-right)) 0 max(16px, env(safe-area-inset-left));
  background: none;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  border: none;
  border-radius: 0;
  box-shadow: none;
  pointer-events: none;
}
.chrome-workbench .topbar-tail { pointer-events: auto; }

/* ≥700 大视口（#195）：默认＝画布页漂浮岛、56px 呼吸锚距（一岛高）；卡片页见 chrome-cards 覆盖
   （置于本规则后、特异性 0,2,0 胜出）；岛皮沿用基础块、无 pointer-events:none＝整岛实体可交互；
   height 56/top safe+8 不变 ⇒ 岛底 64 恒定，popover 66 锚与吸附卡 clamp 零漂移 */
@media (min-width: 700px) {
  .topbar {
    left: max(56px, env(safe-area-inset-left));   /* 刘海防线：大机横屏 inset≈47-59px，max 式与 popover 同式 */
    right: max(56px, env(safe-area-inset-right));
    transform: none;
    max-width: none;
    justify-content: space-between;
    padding: 0 16px; /* #191 大屏留白档 */
  }
  .topbar-tail { gap: 10px; }
  .chrome-cards .topbar {
    left: max(16px, env(safe-area-inset-left));   /* 岛＝列首卡：与 .home/.settings-page 的 16px 卡片列对齐（#195 反馈③） */
    right: max(16px, env(safe-area-inset-right)); /* 卡片列自身无 safe 侧防（存量边界，随内容列宽役闭环）——岛侧自防 */
  }
}

/* #192 幽灵空标题摘除（保留）：workbench 空标题不在 lead 流内收 gap；#192 的 16px 组间距语言
   已随 #195 workbench space-between 裸 chrome 退役（两端分置天然分组）。
   依赖 ：empty 隐含 chromeTitle 恒返回非空白串（纯空格目录归「未命名」） */
.topbar .title:empty { display: none; }

/* cards 族 <700 满宽列首卡（#196 反馈①：竖屏设置岛也要与卡片对齐——短标题不再把岛缩短；
   16px 硬值＝卡片列 padding，刻意不带 max 式：竖屏 side safe 恒 0，且卡片列自身平 16、
   岛加 max 反在假想设备错位；max-width:none 显式防 720 封顶+left0/right0 冲突丢 right） */
@media (max-width: 699.98px) {
  .chrome-cards .topbar {
    left: 16px;
    right: 16px;
    transform: none;
    max-width: none;
    justify-content: space-between;
    padding: 0 16px;
  }
}

.brand {
  /* v4（方案 D2）：双色完整 SpiryCode＝双层 mask——SPIRY 层随主题墨/CODE 层随 accent；
     几何件 brand/spiry-layer.png+code-layer.png 由 VI/build.ts wordmarkLayer 单源生成；
     v3 topbar-mark.png 橙→蓝混渐变直渲退役（负责人「两色搞在一起花」），文件保留回滚缓冲。
     140×16＝375 地板机械实测预算（方案 D2）；margin-left 删（预算内）。 */
  position: relative;
  width: 140px;
  height: 16px;
  flex: none;
}

/* 分屏窗等非标窄宽防线（D2）：≤359px 缩形不溢出 */
@media (max-width: 359px) {
  .brand { width: 120px; height: 13.8px; }
}

/* v4 双层件：mask 吃 alpha、background 上色——topbar 与 gate 共用同一对层件 PNG（约束 6） */
.brand-layer {
  position: absolute;
  inset: 0;
  -webkit-mask: center / contain no-repeat;
  mask: center / contain no-repeat;
}

.brand-spiry {
  -webkit-mask-image: url("brand/spiry-layer.png?v=270823");
  mask-image: url("brand/spiry-layer.png?v=270823");
  background: var(--c-text);
}

.brand-code {
  -webkit-mask-image: url("brand/code-layer.png?v=270823");
  mask-image: url("brand/code-layer.png?v=270823");
  background: var(--c-accent);
}

.topbar .title {
  font-size: 17px;
  font-weight: 600;
  letter-spacing: -0.01em;
  flex: 1 1 auto; /* #191：basis auto＝标题天然宽参与岛宽计算与分配（原 flex:1 basis 0 被先榨干） */
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* chrome 操作件（返回/齿轮）：低频导航，去强调（P6 层级用光不用色）——
   顶栏唯一带色语义=状态胶囊的点；点按仍有 accent-bg 回应 */
.topbar-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none; /* #193：方钮永不缩（lead/tail 两级阀只牺牲胶囊文本与标题） */
  width: 36px;
  height: 36px;
  border: none;
  border-radius: 12px;
  background: none;
  color: var(--c-text-tertiary);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  position: relative; /* #225：hit 光环（::after）定位锚 */
  flex: none;
}

.topbar-btn:active { background: var(--c-accent-bg); }

.topbar-btn svg { width: 20px; height: 20px; }

/* #225 返回键 hit 光环（B 补件）：36px 图标钮扩容 ±12px（WCAG 2.5.8 目标尺寸惯例），岛内近失
   兜住；.topbar 无 overflow:hidden＝光环可伸出岛缘仍命中。返回/齿轮同 class 同享（无害扩容） */
.topbar-btn::after { content: ""; position: absolute; inset: -12px; }

/* #225 转角盲触返回区（A 主件）：岛化后左上角盲点返回失效——手机岛恒近满宽（内容最小偏好
   ≈436>374 上限）故左 gap 仅 8-35px、失败主因＝岛下纵向落点；iPad 横屏岛两侧 56px 空带＝横向
   miss。不可见 fixed 锥形区锚物理左上角，Fitts 两失败模式（位置漂移+尺寸缩水）同杀。
   锥形几何＝review W1 修法：滚动后卡片填进岛外空带，宽域（x 24-120px）只到岛带 safe+70
   （＝rail 最小顶、零重叠）＝「想点卡误返」对称伤害最小；贴角 24px 才全深 safe+88（角滴，
   覆盖岛下纵向盲触落点）。z-24＝岛(25)下、内容/rail(20) 上：岛在场处岛赢、岛外空带归此区。
   pointer:coarse 门控＝桌面 fine 指针无此区（防鼠标误触隐形区导航）；clip-path 裁剪连同
   命中区一起裁。显隐由 app.ts 镜像 backButton（!onHome && !token-gate）。
   高度档位预案（W2）：真机仍打空→按档加深角滴（岛带 70 零 rail 冲突 / 角滴 88 仅 24×18
   角重叠 / 再深＝吞卡顶带+rail 角，代价逐档明写、见冷屋 #225） */
.topbar-back-zone { display: none; }
@media (pointer: coarse) {
  .topbar-back-zone {
    display: block;
    position: fixed;
    top: 0;
    left: 0;
    width: 120px;
    height: calc(env(safe-area-inset-top) + 88px); /* 元素本体取两档最大（角滴全深） */
    --topbar-back-band: calc(env(safe-area-inset-top) + 70px); /* 岛带+6 呼吸 */
    clip-path: polygon(0 0, 120px 0, 120px var(--topbar-back-band), 24px var(--topbar-back-band), 24px 100%, 0 100%);
    z-index: 24;
  }
}

/* 合并胶囊（#159）：环境+主机单一胶囊——daemon 不可达 > opencode 断开 > 连接中 > 已连接；hostDot 仅切换域页在场 */
.capsule {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  border: 1px solid var(--c-border);
  background: var(--c-surface-subtle);
  border-radius: 999px;
  padding: 4px 12px 4px 10px;
  font-size: 13px;
  font-family: inherit;
  color: var(--c-text-secondary);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  /* #193 归位修正：#191 压力阀当时误植 .tool-row（此块从未获阀、.pill-text 阀因父不缩永不触发）——
     真实落位在此。胶囊在 tail 内可缩（shrink 3），全文读数出口=popover（P2） */
  flex: 0 3 auto;
  min-width: 0;
}

.pill-dot {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--c-text-tertiary);
  flex: none;
}

.pill-dot.ok { background: var(--c-positive); }
.pill-dot.warn { background: var(--c-warning); }
.pill-dot.down { background: var(--c-danger); }

/* 胶囊下箭头：可展开的仪器暗示（v1.3 二轮） */
.pill-chevron { display: inline-flex; flex: none; } /* #191：压缩态骨架保持（点/箭头不缩） */
.pill-chevron svg { width: 11px; height: 11px; opacity: 0.55; }
/* #191 压力阀文本侧：胶囊被压时文本先 ellipsis（默认 min-width:auto 不可缩＝阀失效，故必须显式归零） */
.pill-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ===== 环境仪表 Popover（v1.3 二轮·冷屋 #62）=====
   贾维斯仪器语言：发丝线行分隔、微缩大写标签、等宽读数、系统页脚——零新色零装饰图。
   层级：modal 40 之下、toast 之上（toast 提到 50 保证任何时刻可见）。 */
.status-popover {
  position: fixed;
  /* #190：锚岛底（岛顶 safe+8+岛高 56=岛底 64，+2 间隙）；
     #195 ≥700 三族锚：默认随画布岛缘 56 / cards·workbench 随 16（与岛/裸件/卡片列右缘一线） */
  top: calc(env(safe-area-inset-top) + 66px);
  right: 12px;
  width: min(320px, calc(100vw - 24px));
  background: var(--c-surface-solid);
  border: 1px solid var(--c-border);
  border-radius: 16px;
  box-shadow: var(--c-panel-shadow);
  z-index: 30;
  display: none;
  padding: 6px 0 0;
}
@media (min-width: 700px) {
  .status-popover { right: max(56px, env(safe-area-inset-right)); }
  .chrome-cards .status-popover,
  .chrome-workbench .status-popover { right: max(16px, env(safe-area-inset-right)); }
}
/* <700 cards·workbench 族 popover 随岛/件缘 16（#196 同族一致性；其余 <700 页恒 12）。
   #196 教训注记：上一役（#195）此处曾残留一条已退役的 24px 规则块——同特异性后者胜出，
   ≥700 画布页实锚 24≠契约 56；「grep 在束」只验存在不验生效，级联类验收必须查重复块 */
@media (max-width: 699.98px) {
  .chrome-cards .status-popover,
  .chrome-workbench .status-popover { right: 16px; } /* 竖屏 side safe 恒 0，硬 16＝卡片列/裸件缘（刻意不带 max 式：卡片列自身平 16，岛加 max 反在假想设备错位） */
}

.status-popover.open { display: block; }

.sp-row {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 9px 16px;
}

.sp-row + .sp-row { border-top: 1px solid var(--c-border); }

/* 失联前读数：整体压暗，不冒充实时（review-plan 发现③） */
.sp-row.stale { opacity: 0.45; }

.sp-main {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 1px;
}

.sp-label {
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.09em;
  color: var(--c-text-tertiary);
}

.sp-sub { font-size: 11px; color: var(--c-text-tertiary); }

.sp-value { font-size: 13px; color: var(--c-text); flex: none; }

.sp-value.mono { font-family: "SF Mono", "Fira Code", ui-monospace, monospace; }

/* v4 D8：host popover CURRENT 选中标记 → accent（选中态语义正当用途；sp-value 通用槽不动） */
.host-current-mark { color: var(--c-accent); }

/* #159 统一 popover 节分隔：主机节与连接指标节之间 */
.sp-divider { border-top: 1px solid var(--c-border); margin-top: 6px; }

.sp-footer {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-top: 6px;
  padding: 8px 16px;
  border-top: 1px solid var(--c-border);
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.09em;
  color: var(--c-text-tertiary);
}

.sp-footer .mono { font-family: "SF Mono", "Fira Code", ui-monospace, monospace; font-weight: 400; }

/* ===== 内容区 ===== */
.content {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
}

.home, .settings-page {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
  /* #190 岛化让位：岛底=safe+64，+8 呼吸；滚动时内容穿岛下=真玻璃 */
  padding: calc(env(safe-area-inset-top) + 72px) 16px calc(env(safe-area-inset-bottom) + 24px);
}

/* ===== #214 首页次级入口分流：左 rail（56px 恒见）+右内容列独立滚动 =====
   rail 不占右侧「最近会话」纵向承载区（负责人原话）；注意区全宽置顶两 tab 共享。
   桌面/宽屏不另作处理（手机 PWA 主场，review I7）。
   #215：rail fixed 吸边卡化（移出 flex 流、可竖拖挪位+横拖拽出换边）——
   占位改由 .home-body padding 派生；16px 边距遵循 #214 现状（不完全贴边），双侧圆角保持 16px。 */
.home {
  display: flex;
  flex-direction: column;
  overflow: hidden; /* 滚动移交内容列，home 本体不再滚 */
}

.home-body {
  flex: 1;
  min-height: 0;
  display: flex;
  gap: 10px;
  /* #215：rail fixed 脱离流后的内容让位——66px＝rail 16 边距+56 宽+10 间隙=82px（#214 现状内容左缘）
     − .home 既有 16px padding；物理属性统一（review W2）。right 模式镜像见下方覆盖块。 */
  padding-left: 66px;
}

/* #215 right 模式镜像（完整声明：左 padding 归零+右 padding 让位，防双侧挤压） */
:root[data-home-rail-side="right"] .home-body {
  padding-left: 0;
  padding-right: 66px;
}

.home-rail {
  width: 56px;
  /* #215 fixed 吸边卡：默认 top:32% 与会话页吸附卡同一心智（竖拖可挪、clamp 防钻岛下）；
     z-20 族＝内容流之上、popover(30)/抽屉(36) 之下（dash-rail 同档） */
  position: fixed;
  left: 16px;
  top: 32%;
  z-index: 20;
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: 8px 0;
  /* 玻璃选档＝rail-glass 族（#162/#163/#164 三代真机定标：吸附卡/抽屉/清单承载档） */
  background: var(--c-rail-glass);
  backdrop-filter: blur(10px) saturate(1.2);
  -webkit-backdrop-filter: blur(10px) saturate(1.2);
  border: 1px solid var(--c-border);
  border-radius: 16px;
  box-shadow: var(--c-panel-shadow), inset 0 1px 0 var(--c-rail-glass-edge);
  touch-action: none; /* #222 F1：与 dash-rail 同修（平行兄弟链）——点击/拖拽全 JS，禁浏览器手势解读 */
  /* #215：横拖拽出松手归边动画（dash-rail 同纹；.dragging 态 transition:none 跟手优先） */
  transition: left 0.18s ease;
}

/* #215 right 模式镜像（完整声明 left:auto+right:16px，防 left+right 双设过约束 left 胜） */
:root[data-home-rail-side="right"] .home-rail {
  left: auto;
  right: 16px;
}

/* #215：拖动态（dash-rail.dragging 同纹——毛玻璃降级+禁过渡跟手） */
.home-rail.dragging {
  background: var(--c-surface-solid);
  transition: none;
  cursor: grabbing;
  user-select: none;
}

.rail-btn {
  writing-mode: vertical-rl;
  letter-spacing: 0.18em;
  font-size: 13px;
  font-family: inherit;
  padding: 14px 0;
  background: none;
  border: none;
  border-radius: 8px;
  color: var(--c-text-tertiary);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.rail-btn.active {
  color: var(--c-accent);
  box-shadow: inset 2px 0 0 var(--c-accent);
}

.home-content {
  flex: 1;
  min-width: 0;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
}

/* #214 D3 「查看更多/收起/查看全部会话 →」：虚线框弱态行，不抢卡片视觉 */
.wb-more {
  display: block;
  width: 100%;
  padding: 10px;
  margin-top: 2px;
  font-size: 13px;
  font-family: inherit;
  color: var(--c-text-secondary);
  background: none;
  border: 1px dashed var(--c-border-strong);
  border-radius: 12px;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.section-label {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  font-size: 12px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--c-text-secondary);
  margin: 8px 4px 10px;
}

/* 仪器计数（v1.3 二轮·贾维斯语言）：两位补零、等宽、弱色——数字是读数不是标题 */
.section-count {
  font-family: "SF Mono", "Fira Code", ui-monospace, monospace;
  font-size: 11px;
  font-weight: 400;
  letter-spacing: 0.08em;
  color: var(--c-text-tertiary);
}

/* 页读数行（v1.3 三轮）：微缩标签+值，与仪表读数同语法——页头概要的仪器形态 */
.page-readout {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  padding: 2px 4px 10px;
}

.page-readout .pr-label {
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.09em;
  color: var(--c-text-tertiary);
}

.page-readout .pr-value {
  font-family: "SF Mono", "Fira Code", ui-monospace, monospace;
  font-size: 12px;
  color: var(--c-text-secondary);
}

/* 读数行（v1.3 三轮·仪器语言）：微缩键+值，全应用统一语法（详情页/设置卡/owner 卡共用）；
   行距由上下文容器微调，语法本身只有这一处 */
.readout-row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 12px;
  padding: 6px 0;
}

.readout-row + .readout-row { border-top: 1px solid var(--c-border); }

.readout-label {
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.09em;
  color: var(--c-text-tertiary);
  flex: none;
}

.readout-value {
  font-size: 13px;
  color: var(--c-text-secondary);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.readout-value.mono { font-family: "SF Mono", "Fira Code", ui-monospace, monospace; }

/* 会话详情元信息读数区（#94 标签列定稿）：PROJECT+目录名——
   左右边缘钉 12px；值统一 12px 等宽（层级用光：目录 secondary/时间 tertiary） */
.meta-readout { padding: 2px 0 3px; }
.meta-readout:empty { display: none; }

.meta-line {
  display: flex;
  align-items: baseline;
  gap: 8px;
  padding: 1px 12px;
  min-width: 0;
}

.meta-dir {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-family: "SF Mono", "Fira Code", ui-monospace, monospace;
  font-size: 12px;
  color: var(--c-text-secondary);
}

.meta-time {
  flex: none;
  margin-left: auto; /* 无目录时（global 会话）时间独撑一行仍右钉 */
  font-family: "SF Mono", "Fira Code", ui-monospace, monospace;
  font-size: 12px;
  color: var(--c-text-tertiary);
}

/* ===== v1.6 会话仪表盘 → #160 D7：右缘吸附卡+抽屉 overlay（横条 dashboard-bar 族退役） ===== */

/* 右缘吸附卡：纵排 CONTEXT% 大字+状态灯+模式徽标缩写（Y/P），fixed 钉右缘不占文档流
   （panel 摘出文档流 → messageScroll 变高，D7）；圆角只开左侧=贴缘形态。
   #161 视觉修复：底色实心改毛玻璃（半透明+backdrop blur，topbar 同语言），背后消息流透而不糊。
   #162 验收修正：--c-surface(0.72) 深色叠近黑底观感即实心（真机否决）——专属 token --c-rail-glass
   更透（浅 0.65/深 0.55）；:active 实心底闪变同退役（按压反馈由抽屉开合承担）。
   #163 修复C 再提亮（真机仍观感实心）：浅 0.5/深 (58,58,62) 0.45 + blur 加 saturate(1.5)
   提饱和分色 + 顶边 1px 内高光（--c-rail-glass-edge）出玻璃边缘感。抽屉本体 --c-bg 实心红线不动。
   贴边轴见 [data-rail-side="left"] 覆盖块。 */
.dash-rail {
  position: fixed;
  right: 0;
  top: 32%;
  z-index: 20; /* 内容流之上、popover(30)/抽屉(36) 之下 */
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 7px;
  padding: 10px 7px;
  margin: 0;
  border: 1px solid var(--c-border);
  border-right: none;
  border-radius: 10px 0 0 10px;
  background: var(--c-rail-glass);
  backdrop-filter: blur(10px) saturate(1.2);
  -webkit-backdrop-filter: blur(10px) saturate(1.2);
  box-shadow: inset 0 1px 0 var(--c-rail-glass-edge);
  font: inherit;
  -webkit-tap-highlight-color: transparent;
  /* #222 F1：touch-action:none——卡片点击走 JS click、拖拽全 JS pointer 接管，零浏览器手势需求
     （dash-rail/home-rail 均无 overflow 滚动，grep 实证）；none 后浏览器不把该触摸序列解释为
     pan/系统导航——修 side=left 贴左缘横拖触发 iOS 边缘返回手势（hash 路由有 history 条目）。
     残留风险：iOS 屏幕边缘系统手势能否被完全抑制以真机验证为准（退路：改路由形态消 history）。 */
  touch-action: none;
  /* #215：横拖拽出松手归边动画（行内 left→新基态等效值，transitionend 清行内零跳变）。
     .dragging 态 transition:none 跟手优先（下方既有规则）。 */
  transition: left 0.18s ease;
}

/* #161：拖动态——放大一级层叠削弱拖动时底层透字（毛玻璃降级观感）+禁过渡 */
.dash-rail.dragging {
  background: var(--c-surface-solid);
  transition: none;
  cursor: grabbing;
  user-select: none;
}

/* #161 左手贴边（rail-side 轴）：右缘形态全镜像（贴左缘/圆角只开右侧/右边框去掉） */
:root[data-rail-side="left"] .dash-rail {
  right: auto;
  left: 0;
  border-right: 1px solid var(--c-border);
  border-left: none;
  border-radius: 0 10px 10px 0;
}

/* CONTEXT% 大字（吸附卡主读数） */
.dash-rail-context {
  font-size: 15px;
  font-weight: 600;
  color: var(--c-text);
  flex: none;
}

.dash-label {
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.09em;
  color: var(--c-text-tertiary);
  flex: none;
}

/* 黑箱状态点：#163 灯色与 accent 解耦（橙/蓝双主题下 accent 灯与主题撞色误读——真机反馈）。
   idle 黄（--c-warning 等待语义，负责人指定）/ running --c-text 呼吸（跨主题中立）/ ok 绿 / error 红 / stale 压暗 */
.dash-dot {
  flex: none;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--c-warning);
}

.dash-dot.running { background: var(--c-text); animation: working-pulse 1.2s ease-in-out infinite; }
.dash-dot.ok { background: var(--c-positive); animation: working-pulse 1.2s ease-in-out infinite; } /* #164 修复C④：busy 绿点加呼吸（与 running 同语言、负责人反馈 busy 状态缺动效） */
.dash-dot.error { background: var(--c-danger); }
.dash-dot.stale { background: var(--c-text-tertiary); opacity: 0.45; }

/* 双模微标（仅开时显）：大写微标签语言 */
.dash-badge {
  font-size: 9px;
  font-weight: 600;
  letter-spacing: 0.08em;
  color: var(--c-text-tertiary);
  border: 1px solid var(--c-border);
  border-radius: 4px;
  padding: 1px 5px;
  flex: none;
}

/* 断流压暗：组级（读数诚实——数据停更不冒充新鲜） */
.dash-rail.dimmed { opacity: 0.45; }
.dashboard-panel.dimmed .dash-section + * { opacity: 0.6; }

/* #160 D7：抽屉遮罩——开时半透明压背景（点击=关抽屉，#159 popover 遮罩先例） */
.dash-drawer-mask {
  position: fixed;
  inset: 0;
  z-index: 35;
  background: rgba(0, 0, 0, 0.4);
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.2s ease;
}

.dash-drawer-mask.open { opacity: 1; pointer-events: auto; }

/* #160 D7：右缘抽屉——panel 摘出文档流改 fixed 滑入（吸附卡点击/遮罩/Esc 三路关）。
   z 层：遮罩(35) < 抽屉(36) < confirm modal(40) < toast(50)——抽屉内开确认弹窗必须在上 */
.dash-drawer {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  z-index: 36;
  width: min(320px, 86vw);
  display: flex;
  flex-direction: column;
  background: var(--c-bg);
  border-left: 1px solid var(--c-border);
  transform: translateX(100%);
  transition: transform 0.2s ease;
  /* #222 F4 防御：关闭态封死命中——关着的抽屉（含 compact 等按钮）绝不接收事件，
     任何命中泄漏路径物理封死。开启入口在 dashRail/遮罩、不在 drawer 子树内（实证），不误伤。 */
  pointer-events: none;
  /* #174 项 3：横向手势归 JS（横滑关闭）——本体默认 auto 时，边缘/padding 区起手的横滑
     可能被浏览器按 pan-x 处理。pan-y 声明只影响手势归属，drawer 自身不滚、
     子元素 .dashboard-panel 的纵滚不受影响（它自带 pan-y）。 */
  touch-action: pan-y;
}

.dash-drawer.open { transform: none; pointer-events: auto; /* #222 F4：开态恢复命中 */ }

/* #161 左手贴边：抽屉同轴镜像（从左缘滑入、右边框）
   #162 验收修复：本覆盖块特异性 (0,3,0) 压过上方 .dash-drawer.open (0,2,0)——左手模式下
   .open 的 transform:none 永远输给 translateX(-100%)，抽屉钉死左缘外（真机：只见遮罩变暗不见抽屉）。
   显式补左手 open 规则 (0,4,0) 稳赢，open 态归位视口内。 */
:root[data-rail-side="left"] .dash-drawer {
  right: auto;
  left: 0;
  border-left: none;
  border-right: 1px solid var(--c-border);
  transform: translateX(-100%);
}

:root[data-rail-side="left"] .dash-drawer.open { transform: none; }

/* 抽屉内 panel：通高自滚（旧文档流 82dvh 上限退役——抽屉自身即边界） */
.dash-drawer .dashboard-panel {
  flex: 1;
  max-height: none;
  border-top: none;
}

/* #163 修复A：抽屉仪表盘浅色可读性（真机反馈字小色浅——tertiary #c0c0c5 叠白底对比≈1.6:1）。
   抽屉作用域内提级、不动全局 token（readout-*/dash-* 在 settings/account/admin 等页同用、各页无恙）。
   #164 回退：负责人二轮反馈「字号调大不协调、只要对比度」——删全部 font-size 声明复原全局基值
   （label 10/value 13/note 10/kv 11/chip 9/12/meter 10），只留色级提级；值区 ellipsis 截断随字号复原消解。 */
.dash-drawer .readout-label { color: var(--c-text-secondary); }
.dash-drawer .readout-value { color: var(--c-text); }
.dash-drawer .dash-section { color: var(--c-text-secondary); }
.dash-drawer .dash-note { color: var(--c-text-secondary); }
.dash-drawer .dash-kv { color: var(--c-text); }
.dash-drawer .dash-chip-label { color: var(--c-text-secondary); }
.dash-drawer .dash-chip-value { color: var(--c-text); }
.dash-drawer .dash-context-value { color: var(--c-text); }
.dash-drawer .dash-history-more { color: var(--c-text-secondary); }
.dash-drawer .dash-todo-item { color: var(--c-text); }

/* 展开 panel：全量读数（readout-row 同语法）。
   滑动锁纵向（真机反馈 #88）：内容无横向伸展，touch-action: pan-y 物理锁死浏览器
   只认纵向平移手势（8 向拖拽如拖图=pan 未限定+橡皮筋），overflow-x 兜底裁切 */
.dashboard-panel {
  padding: 2px 4px 4px;
  overflow-y: auto;
  overflow-x: hidden;
  touch-action: pan-y;
  -webkit-overflow-scrolling: touch;
  /* #223 D：contain → none——杀掉抽屉 scroller 橡皮筋（Safari 16+ 生效，旧版忽略无害）。
     橡皮筋＝斜滑弹力球恶性循环的燃料：回弹恢复期滚动条不消失＝「运动中」，下一次横划落在
     运动 scroller 上被 iOS 粘到滚动、秒认领、pointercancel、再弹。橡皮筋退役后「运动中」
     窗口大幅缩小；抽屉是有界浮层、橡皮筋的「到边」信息价值低（负责人真机指认其为病灶）。
     本类全仓单消费点＝dash-drawer 内 panel（grep 实证），不误伤他页。 */
  overscroll-behavior: none;
}

.dashboard-panel .readout-row { padding: 3px 12px; }

.dashboard-panel:empty { display: none; }

/* 分组分隔微标（SPIRY / TODO）：section-title 同语言弱化（#88 紧凑：上距 10→6px） */
.dash-section {
  font-size: 11px; /* #170 F：加粗稍大（10px/600→11px/700） */
  font-weight: 700;
  letter-spacing: 0.1em;
  color: var(--c-text-tertiary);
  padding: 6px 12px 1px;
}

/* #170 D：TODO PROGRESS 分子——进行中时 accent 主题色（任务全结恢复现色） */
.dash-progress-num.active { color: var(--c-accent); }

/* 值内小注（来源/相对时间）：弱化不抢读数 */
.dash-note {
  font-size: 10px;
  color: var(--c-text-tertiary);
  margin-left: 6px;
}

/* 键值读数行（黑箱展开详情）：等宽、密排（#88 紧凑 3→2px） */
.dash-kv {
  font-size: 11px;
  color: var(--c-text-secondary);
  padding: 2px 12px;
  word-break: break-word;
}

.dash-kv.mono { font-family: "SF Mono", "Fira Code", ui-monospace, monospace; }

.dash-kv.dash-error { color: var(--c-danger); }

/* ===== #160 E 族：工具卡 INPUT 分型（tv-* 族；未知/形坏回落 tool-io-text JSON pre） ===== */

/* bash=终端风命令块：$ 前缀 accent + workdir 注 */
.tv-bash {
  padding: 6px 10px;
  border: 1px solid var(--c-border);
  border-radius: 6px;
  background: var(--c-bg);
  font-size: 12px;
  white-space: pre-wrap;
  word-break: break-all;
}

.tv-bash-prefix { color: var(--c-accent); font-weight: 600; }

.tv-note {
  font-size: 10px;
  color: var(--c-text-tertiary);
  padding: 2px 10px 0;
}

/* 字段行族（read/grep/glob/webfetch/task/spiry_*）：微标列+等宽值列（readout 同语法） */
.tv-field-row {
  display: flex;
  align-items: baseline;
  gap: 8px;
  padding: 2px 10px;
  min-width: 0;
}

.tv-field-label {
  flex: none;
  font-size: 9px;
  font-weight: 600;
  letter-spacing: 0.08em;
  color: var(--c-text-tertiary);
}

.tv-field-value {
  flex: 1;
  min-width: 0;
  font-size: 12px;
  color: var(--c-text-secondary);
  word-break: break-all;
}

/* task=prompt 折叠（原生 details，默认收起不吵） */
.tv-task-prompt { padding: 2px 10px; }

.tv-task-prompt-summary {
  font-size: 9px;
  font-weight: 600;
  letter-spacing: 0.08em;
  color: var(--c-text-tertiary);
  cursor: pointer;
}

.tv-task-prompt summary::-webkit-details-marker { display: none; }

.tv-task-prompt[open] .tv-task-prompt-summary { color: var(--c-text-secondary); }


/* 黑箱历史行：tool-row 读数语法（点开详情块）。
   #177 修右缘溢出曾用 width:auto——真机实证 button 元素上 width:auto 走 shrink-to-fit（按内容收缩），
   卡片缩得比其他内容窄一截。#178 定形修法：margin 挪到容器 padding，恢复全局 width:100% 在
   content box 内填满（左右 8px 对称、确定性几何不依赖 UA 怪癖）。 */
.dash-history-item { padding: 0 8px; }
.dash-history-item .tool-row { margin: 0; }
.dash-history-item .dash-history-detail { margin: 6px 0 2px; border-left: 3px solid var(--c-positive); }

/* #181 运行中 Enclave 卡（与历史卡同容器 dash-history-item；非交互行——无 pointer/按压，与可点历史行相区分） */
/* #183：current 两态共用卡（running/done 同构）——类族自 running-current 改名 enclave-current */
/* #184 快修（真机五轮反馈：ENCLAVE 标签与工具名基线错位）——#181 沿用的 align-items:center
   盒心对齐与 #184 插入的 readout-label（readout-row 语言）相混致 10px/12px 基线错位；
   对齐语言统一为 readout-row 的 baseline，dot 复刻 .tool-dot 的 align-self:center 先例 */
.enclave-current-row {
  display: flex;
  align-items: baseline;
  gap: 8px;
  width: 100%;
  margin: 0;
  padding: 9px 4px;
  font-size: 12px;
  color: var(--c-text-secondary);
  text-align: left;
}

.enclave-current-row .dash-dot { align-self: center; }

.enclave-current-tool { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.enclave-current-detail {
  display: flex;
  flex-direction: column;
  gap: 2px;
  margin: 2px 0 6px;
}

/* #182/#183 dot 四态语言闭环（dash-dot 族）：running 白呼吸/done 绿安静/error 红安静/stale 压暗——
   呼吸专属进行中；done 安静是终态语义，勿与 .dash-dot.ok（busy 呼吸）合并 */
.dash-dot.done { background: var(--c-positive); }

/* #182 badge 变体：accent＝进行中/warn＝疑停；#183 error＝失败（error 唯一浮色准则内正当；
   均为文字标识非灯，运行卡/终态卡 dot 走 dash-dot 族＝吸附卡符号延续） */
.dash-badge.accent {
  color: var(--c-accent);
  border-color: var(--c-accent);
}

.dash-badge.warn {
  color: var(--c-warning);
  border-color: var(--c-warning);
}

.dash-badge.error {
  color: var(--c-danger);
  border-color: var(--c-danger);
}

/* #158 黑箱历史区三点：①行右 chevron 可点指示（open 旋转向下）②详情块卡片化左边条色调
   （tool-detail-block 本已是浅底圆角卡片，只加左边条 ok 绿/error 红）③「查看更早」安静行 */
.dash-history-row svg {
  flex: none;
  width: 12px;
  height: 12px;
  align-self: center;
  margin-left: auto;
  color: var(--c-text-tertiary);
  transition: transform 0.15s ease;
}
.dash-history-row.open svg { transform: rotate(-90deg); }

.dash-history-item .dash-history-detail.error { border-left-color: var(--c-danger); }

.dash-history-more {
  display: flex;
  align-items: center;
  gap: 6px;
  width: 100%;
  padding: 4px 12px;
  background: none;
  border: none;
  font-size: 12px;
  color: var(--c-text-tertiary);
  text-align: left;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}
.dash-history-more:active { color: var(--c-text-secondary); }
.dash-history-more-label { flex: 1; }
.dash-history-more svg {
  flex: none;
  width: 12px;
  height: 12px;
  transition: transform 0.15s ease;
}
.dash-history-more[aria-expanded="true"] svg { transform: rotate(-90deg); }

/* todo 清单行：状态符号（等宽）+内容；completed/cancelled 压暗；通屏版行距放宽后 #88 回收 5→4px（紧凑优先） */
.dash-todo-item {
  display: flex;
  align-items: baseline;
  gap: 8px;
  padding: 4px 12px;
  font-size: 12px;
  color: var(--c-text-secondary);
}

.dash-todo-item .dash-todo-mark { flex: none; color: var(--c-text-tertiary); font-size: 10px; }

/* in_progress 真圆点（#145）：accent 呼吸（内容区活动标记）。#163 起 dash-dot.running 已改
   --c-text 中立色——灯语解耦仅针对 rail 状态灯，本点保持 accent 不动 */
.dash-todo-mark.dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--c-accent);
  align-self: center;
  animation: working-pulse 1.2s ease-in-out infinite;
}

.dash-todo-item .dash-todo-content { word-break: break-word; }

.dash-todo-item.completed .dash-todo-content,
.dash-todo-item.cancelled .dash-todo-content {
  color: var(--c-text-tertiary);
  text-decoration: line-through;
}




/* 设置卡内读数行：与卡内边距协调 */
.settings-card .readout-row { padding: 8px 0; }

.warn-label { color: var(--c-warning-tag-text); }

/* ===== 首页 · 待响应权限 ===== */
.home-permissions { margin-bottom: 8px; }

.home-permissions .card { margin-bottom: 8px; }

/* ===== 会话卡 ===== */
.session-card {
  display: flex;
  align-items: center;
  gap: 12px;
  /* #199 B：实心换岛玻璃（--c-island-glass+blur12+顶内高光，与顶栏岛完全同族；
     折射源＝无——#203 氛围层全退役（负责人裁决：纹理/几何线深浅皆丑、聊天页乱上加乱），
     玻璃质感靠 blur+顶内高光自身呈现） */
  background: var(--c-island-glass);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border: 1px solid var(--c-border);
  border-radius: 16px;
  padding: 12px 14px;
  margin-bottom: 10px;
  box-shadow: var(--c-panel-shadow), inset 0 1px 0 var(--c-rail-glass-edge);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  /* #198：并入 transform（transition 不可叠加，源序压过前置 .tap 通用规则——border-color 反馈不回归） */
  transition: border-color 0.15s ease, transform 120ms ease-out;
}

.session-card:active { border-color: var(--c-border-strong); }

.avatar {
  width: 44px;
  height: 44px;
  border-radius: 50%;
  background: var(--c-accent-bg);
  color: var(--c-accent);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 17px;
  font-weight: 600;
  flex: none;
}

/* #198：avatar-pulse 更名 state-pulse（状态语义呼吸单一资产）；#199 起按元素性质分派——
   环仅 avatar.busy 消费，badge.busy 迁 state-pulse-text 文字明暗（见 badge.busy 注记）。
   #212 P1-B：环呼吸从宿主 box-shadow 动画（每帧重绘整卡）迁到 ::after 伪元素
   transform+opacity（合成层动画，不触发重绘）——视觉等效：环 0→5px 涨落用
   scale(0.82→1) 近似（avatar 固定 44px 圆，半径比 22/27≈0.815），节奏/环色不变。 */
.avatar.busy { position: relative; }
.avatar.busy::after {
  content: "";
  position: absolute;
  inset: -5px;
  border-radius: inherit;
  border: 5px solid var(--c-accent-border);
  opacity: 0;
  transform: scale(0.82);
  animation: state-pulse-ring 1.8s ease-in-out infinite;
  pointer-events: none;
}

@keyframes state-pulse-ring {
  0%, 100% { opacity: 0; transform: scale(0.82); }
  50% { opacity: 1; transform: scale(1); }
}

/* #198 D：警示语境呼吸（环色随卡面 warning 语言，P6 环色承载语义——accent 环套 warning 卡属错位）；
   #212 P1-B：同迁伪元素合成层——卡片尺寸可变，scale 取保守中值 0.85（原 box-shadow 为等距外扩、
   scale 为比例收缩，像素级不完全等价，观感等效以真机复看为准，归负责人）。 */
@keyframes state-pulse-ring-warn {
  0%, 100% { opacity: 0; transform: scale(0.85); }
  50% { opacity: 1; transform: scale(1); }
}

/* #199 A：文字徽章呼吸通道——图形元素用环（state-pulse-ring，#212 P1-B 迁合成层）、文字徽章用字体明暗（本件），按元素性质
   分派不按页面分（负责人拍板：会话卡圆+条双环同频打架，badge 改字体自身明暗）。
   color-mix 不支持时关键帧内该声明被丢弃→同色插值退化为静止＝优雅降级。
   color 动画为 paint 级、不走合成层——徽章面积极小成本可忽略，勿推广到大面积元素。 */
@keyframes state-pulse-text {
  0%, 100% { color: var(--c-accent-tag-text); }
  50% { color: color-mix(in srgb, var(--c-accent-tag-text) 40%, transparent); }
}

.session-info {
  flex: 1;
  min-width: 0;
}

.session-title {
  font-weight: 600;
  font-size: 15px;
  letter-spacing: -0.01em;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.session-meta {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 13px;
  color: var(--c-text-secondary);
  margin-top: 3px;
  min-width: 0;
}

.session-dir {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-family: "SF Mono", "Fira Code", "Cascadia Code", ui-monospace, monospace;
  font-size: 11px;
  color: var(--c-text-tertiary);
  text-align: right;
}

.badge {
  font-size: 12px;
  font-weight: 500;
  padding: 1px 8px;
  border-radius: 4px;
  flex: none;
  background: var(--c-surface-subtle);
  color: var(--c-text-secondary);
}

.badge.busy {
  background: var(--c-accent-tag-bg);
  color: var(--c-accent-tag-text);
  /* #199 A：环呼吸改字体明暗（会话卡 avatar 环+badge 环双呼吸同频打架，负责人反馈；
     项目卡 badge 为唯一呼吸源、同语言跟随） */
  animation: state-pulse-text 1.8s ease-in-out infinite;
}

/* ===== 通用卡片（权限等） ===== */
.card {
  background: var(--c-surface-solid);
  border: 1px solid var(--c-border);
  border-radius: 16px;
  padding: 14px 16px;
  margin-bottom: 10px;
  box-shadow: var(--c-panel-shadow);
}

.card.disabled { opacity: 0.4; pointer-events: none; }

/* 权限卡：警示色左边条——打断信号，与会话卡明确区分 */
.permission-card { border-left: 3px solid var(--c-warning); }

/* #204 提问卡：主题色左边条——与权限卡（警示色）区分语义：提问是「求输入」非「求放行」 */
.question-card { border-left: 3px solid var(--c-accent); }

.question-block { margin-top: 10px; }

.question-header {
  font-size: 13px;
  font-weight: 600;
  color: var(--c-text-secondary);
  margin-bottom: 4px;
}

.question-text {
  font-size: 15px;
  line-height: 1.5;
  word-break: break-word;
  white-space: pre-wrap;
}

.question-hint {
  margin-top: 6px;
  font-size: 13px;
  color: var(--c-text-secondary);
}

.question-options {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 8px;
}

.question-option {
  /* #207：label+辅助说明纵向排（description 上卡）；基则 .inline-btn 无 display，需显式 flex 容器 */
  display: inline-flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 2px;
  text-align: left;
}

.question-option-desc {
  font-size: 12px;
  font-weight: 400;
  color: var(--c-text-secondary);
  /* 说明行可能较长：允许换行、不撑爆卡片 */
  white-space: normal;
  word-break: break-word;
}

/* #207 特异性修复：原 .question-option.selected（0-2-0）与 .inline-btn.ghost（0-2-0）同阶、
   源序在前被盖死——真机「选项选不中」观感根因（实为选中态被幽灵皮覆盖）。
   抬为三类选择器（0-3-0）压过幽灵皮，不依赖源序（#162/#196 同族教训第三次复现）。 */
.inline-btn.question-option.selected {
  background: var(--c-accent);
  color: #fff;
  border-color: var(--c-accent);
}

.inline-btn.question-option.selected .question-option-desc {
  color: rgba(255, 255, 255, 0.85);
}

.question-custom {
  width: 100%;
  box-sizing: border-box;
  margin-top: 8px;
  font-family: inherit;
  font-size: 15px;
  padding: 10px 12px;
  border-radius: 10px;
  border: 1px solid var(--c-border-strong);
  background: var(--c-surface-subtle);
  color: var(--c-text);
}

.card-title {
  font-weight: 600;
  font-size: 15px;
  letter-spacing: -0.01em;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.card-meta {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 13px;
  color: var(--c-text-secondary);
  margin-top: 4px;
  min-width: 0;
}

/* ===== 会话详情页（全屏沉浸） ===== */
.detail-page {
  display: flex;
  flex-direction: column;
  flex: 1;
  min-height: 0;
  /* #197 composer 真毛玻璃：composer 脱流 absolute（见 .composer），本容器为其定位基准；
     --composer-h 由 ResizeObserver 实时写（textarea 增高/状态行/键盘态底衬全捕获），
     --composer-clearance 单一权威表达让位距（padding-bottom 与 scroll-padding-bottom 共用，改呼吸距只动此处）；
     #206 D2：--pending-h=待响应悬浮区实高（RO 写，无待响应=0px），与 composer 串联合入让位；
     74px=单行 composer 无 safe 底衬的近似fallback（JS 首拍即写实测值） */
  --composer-clearance: calc(var(--composer-h, 74px) + var(--pending-h, 0px) + 8px);
  position: relative;
}

.message-list {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
  /* #190 岛化让位（顶距替换原 8px）：岛底=safe+64+8 呼吸；meta 行已迁入本箱首子随内容滚 */
  /* #197 底部镜像让位：内容穿 composer 玻璃下＝真玻璃；拉到底＝最后一行完整停玻璃上缘上方
     （净空＝8 呼吸+行自身 margin-bottom 10，与顶侧对称）；锚跳同式不落玻璃底 */
  padding: calc(env(safe-area-inset-top) + 72px) 0 var(--composer-clearance);
  scroll-padding-bottom: var(--composer-clearance);
}

.load-earlier {
  display: block;
  margin: 4px auto 12px;
  font-size: 13px;
  font-family: inherit;
  color: var(--c-accent);
  background: none;
  border: 1px solid var(--c-accent-border);
  border-radius: 12px;
  padding: 6px 16px;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.message-row {
  margin: 10px 16px;
}

.message-header {
  font-size: 12px;
  font-weight: 600;
  color: var(--c-text-secondary);
  margin-bottom: 4px;
}

.message-row.user {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
}

.message-row.user .message-header { display: none; }

.message-body {
  max-width: 85%;
  font-size: 15px;
  line-height: 1.65;
  word-break: break-word;
}

.message-row.assistant .message-body {
  max-width: none;
}

.message-row.user .message-body {
  background: var(--c-surface-subtle);
  border-radius: 16px;
  padding: 8px 14px;
}

.message-meta {
  margin-top: 2px;
  font-size: 11px;
  color: var(--c-text-tertiary);
  text-align: right; /* 尾部时间戳：消息右下角（v1.2 验收二轮反馈——头部隔断式反直觉） */
  min-height: 0;
}

/* #174 项 5：assistant 消息 meta 行＝元信息左对齐 + 时间戳右对齐（两端布局）。
   只作用于 assistant：user 消息 meta 只有时间戳一个子元素，套两端布局会被推到左边，
   撞回 v1.2 验收二轮定的「时间戳右下角」（故 user 保持上面的 text-align: right）。 */
.message-row.assistant .message-meta {
  padding-right: 4px;
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 8px;
}

/* 元信息（AGENT · provider · model · 档位）：窄屏可截断，时间戳恒不被挤掉 */
.message-meta-info {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  min-width: 0;
}

.message-meta-time { flex: none; }

/* Markdown 渲染区（GFM 式：段内软换行保留） */
.markdown > *:first-child { margin-top: 0; }
.markdown > *:last-child { margin-bottom: 0; }
.markdown p { margin: 0 0 0.6em; white-space: pre-wrap; }
.markdown h2, .markdown h3, .markdown h4 {
  margin: 1.2em 0 0.5em;
  letter-spacing: -0.01em;
  line-height: 1.35;
}
.markdown h2 { font-size: 1.2em; }
.markdown h3 { font-size: 1.08em; }
.markdown h4 { font-size: 1em; }
.markdown code {
  font-family: "SF Mono", "Fira Code", "Cascadia Code", ui-monospace, monospace;
  font-size: 0.88em;
  background: var(--c-surface-subtle);
  border: 1px solid var(--c-border);
  border-radius: 4px;
  padding: 0.1em 0.35em;
}
/* 代码块装备（P1-1）：shell=定位上下文；铭牌=语言读数；COPY=就地回执（COPIED/FAILED 1.5s 复原） */
.markdown .code-shell {
  position: relative;
  margin: 0.6em 0;
}

.markdown .code-shell pre {
  margin: 0;
  padding-right: 64px; /* 给 COPY 按钮让位，防长行首行被压 */
}

.markdown .code-shell.has-lang pre {
  padding-top: 26px; /* 铭牌让位：语言读数不压代码首行 */
}

.markdown .code-lang {
  position: absolute;
  top: 8px;
  left: 14px;
  z-index: 1;
  font-size: 10px;
  letter-spacing: 0.06em;
  color: var(--c-text-tertiary);
  pointer-events: none; /* 铭牌是读数不是交互物 */
}

.markdown .code-copy {
  position: absolute;
  top: 6px;
  right: 6px;
  z-index: 1;
  padding: 3px 8px;
  background: var(--c-surface-solid);
  border: 1px solid var(--c-border);
  border-radius: 6px;
  font-size: 10px;
  letter-spacing: 0.06em;
  color: var(--c-text-secondary);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.markdown .code-copy:active {
  border-color: var(--c-border-strong);
  color: var(--c-text);
}

.markdown pre {
  margin: 0.6em 0;
  padding: 12px 14px;
  background: var(--c-surface-subtle);
  border: 1px solid var(--c-border);
  border-radius: 12px;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}
.markdown pre code {
  background: none;
  border: none;
  padding: 0;
  font-size: 0.85em;
  line-height: 1.5;
  white-space: pre;
}
.markdown a {
  color: var(--c-accent);
  text-decoration: none;
  border-bottom: 1px solid var(--c-accent-border);
}
.markdown ul, .markdown ol { margin: 0.4em 0; padding-left: 1.4em; }
.markdown li { margin: 0.15em 0; }
.markdown blockquote {
  margin: 0.6em 0;
  padding: 2px 0 2px 12px;
  border-left: 2px solid var(--c-divider);
  color: var(--c-text-secondary);
}
.markdown blockquote .markdown > *:first-child { margin-top: 0; }
.markdown blockquote .markdown > *:last-child { margin-bottom: 0; }
.markdown .table-wrap {
  margin: 0.6em 0;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}
.markdown table {
  border-collapse: collapse;
  font-size: 0.92em;
  min-width: 100%;
}
.markdown th, .markdown td {
  border: 1px solid var(--c-table-row-border);
  padding: 6px 10px;
  text-align: left;
  vertical-align: top;
}
.markdown th {
  font-weight: 600;
  background: var(--c-surface-subtle);
  white-space: nowrap;
}

/* busy 工作指示卡（思考/工具调用的预留骨架位） */
.working-card {
  margin: 10px 16px;
  max-width: 200px;
  display: flex;
  align-items: center;
  gap: 8px;
  color: var(--c-text-secondary);
  font-size: 13px;
}

.working-dots {
  display: inline-flex;
  gap: 4px;
}

.working-dots span {
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--c-accent);
  animation: working-pulse 1.2s ease-in-out infinite;
}

.working-dots span:nth-child(2) { animation-delay: 0.2s; }
.working-dots span:nth-child(3) { animation-delay: 0.4s; }

@keyframes working-pulse {
  0%, 60%, 100% { opacity: 0.3; transform: translateY(0); }
  30% { opacity: 1; transform: translateY(-2px); }
}

/* ===== 工具遥测读数（长城任务 P0-3a；仪器语言：completed 安静收束 / running 呼吸 / error 唯一浮色） ===== */
.tool-trace {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin-bottom: 8px;
}

.tool-trace:empty { display: none; }

.tool-item { display: flex; flex-direction: column; }

.tool-row {
  display: flex;
  align-items: baseline;
  gap: 8px;
  width: 100%;
  padding: 5px 10px;
  background: var(--c-surface-subtle);
  border: 1px solid var(--c-border);
  border-radius: 8px;
  font-size: 12px;
  color: var(--c-text-secondary);
  text-align: left;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition: background-color 0.15s ease;
}

.tool-row:active { background: var(--c-border-strong); }

.tool-dot {
  flex: none;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--c-text-tertiary);
  align-self: center;
}

.tool-dot.pulse { background: var(--c-accent); animation: working-pulse 1.2s ease-in-out infinite; }

.tool-row.error .tool-dot { background: var(--c-error-soft); }
.tool-row.error { border-color: var(--c-error-soft-border); }
.tool-row.error .tool-detail { color: var(--c-error-soft); }

.tool-name {
  flex: none;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  font-size: 11px;
}

.tool-detail {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 12px;
  color: var(--c-text-tertiary);
}

.tool-duration {
  flex: none;
  font-size: 11px;
  color: var(--c-text-tertiary);
}

/* 展开态：测量记录（INPUT/OUTPUT 等宽，头注：中点分隔安全） */
.tool-detail-block {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin: 6px 0 2px;
  padding: 8px 10px;
  background: var(--c-surface-subtle);
  border: 1px solid var(--c-border);
  border-radius: 8px;
}

.tool-io-label {
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.06em;
  color: var(--c-text-tertiary);
  margin-bottom: 3px;
}

.tool-io-text {
  margin: 0;
  font-size: 12px;
  line-height: 1.55;
  white-space: pre-wrap;
  word-break: break-word;
  color: var(--c-text-secondary);
  max-height: 320px;
  overflow-y: auto;
}

.tool-io-empty { font-size: 12px; color: var(--c-text-tertiary); }

.tool-io-note { font-size: 11px; color: var(--c-text-tertiary); font-style: italic; }

/* ===== #157 edit diff 视图 · #179 统一单栏上下对比（负责人验收拍板「红绿一律上下、不做左右」）=====
   滚动结构（#157 冻结面保持）：外层 .diff-scroll 单容器横向滚动、左右栏行内列不独立滚动；
   长行不换行防错位。#178⑤：width:max-content+min-width:100%——容器随最长行撑开、行 block
   满宽→红绿背景全长延伸（真机已验收）。
   #179 两修：①≥700px split 左右双栏整体退役（WebKit 对 minmax(50%,max-content) 轨道不撑开
   滚动区、压回 50% 致长行与右栏视觉重叠，Chromium 撑开故桌面正常——跨引擎 track sizing
   不可统一）；②-webkit-text-size-adjust:100% 禁 WebKit Text Autosizing（超宽 max-content
   容器触发 iOS 对「块宽显著大于视口」文本的自动放大——#178⑤ 后手机 Edit 卡字号异常大的
   根因定性；若部署后仍大，再诊备选 -webkit-text-size-adjust:none，见冷屋 #179）。 */
.diff-view { display: flex; flex-direction: column; gap: 6px; min-width: 0; }

.diff-stat { display: flex; gap: 8px; align-items: baseline; font-size: 11px; }
.diff-stat-file { color: var(--c-text-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.diff-stat-add { color: var(--c-diff-add-fg); font-weight: 600; flex: none; }
.diff-stat-del { color: var(--c-diff-del-fg); font-weight: 600; flex: none; }

.diff-empty { font-size: 12px; color: var(--c-text-tertiary); font-style: italic; }

.diff-scroll { overflow-x: auto; max-height: 420px; overflow-y: auto; border-radius: 6px; }

.diff-unified {
  width: max-content;
  min-width: 100%;
  font-size: 12px;
  line-height: 1.55;
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
}

.diff-line {
  padding: 0 8px;
  white-space: pre;
  color: var(--c-text-secondary);
}

.diff-line.diff-add { background: var(--c-diff-add-bg); color: var(--c-diff-add-fg); }
.diff-line.diff-del { background: var(--c-diff-del-bg); color: var(--c-diff-del-fg); }
.diff-line.diff-hunk {
  color: var(--c-text-tertiary);
  background: var(--c-surface-subtle);
}

/* working-card 工作读数（busy + running 工具证据时） */
.working-card { max-width: 280px; }
.working-readout { display: inline-flex; align-items: baseline; gap: 6px; }
.working-label {
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.06em;
  color: var(--c-text-tertiary);
}
.working-readout .mono { font-size: 12px; color: var(--c-text-secondary); }
.working-count { font-size: 11px; color: var(--c-text-tertiary); }

/* ===== 输入区（glass） ===== */
/* #197 真毛玻璃：脱流 absolute 锚 detail-page 底（键盘机制零牵动——--app-height 缩、
   detail-page 底=键盘顶、composer 锚同一位置，与流内等价）；底换 --c-island-glass（顶栏同
   token 同档）+blur 12（对齐 #194）——内容可滚入玻璃区=blur 有物可磨（旧 --c-surface+流内
   布局=假玻璃，blur 只磨纯色 body 底）；输入框自带 solid 底保可读；键盘态底衬规则照旧 */
.composer {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  display: flex;
  flex-wrap: wrap; /* 状态行独占首行（flex 0 0 100%），输入行保持原横向排布 */
  row-gap: 0; /* 状态行与输入行间距由状态行自身 padding-bottom 控制（高度很小红线） */
  align-items: flex-end; /* 多行时发送键贴底（单行时与居中等价） */
  gap: 8px;
  /* 底衬=安全区全高（Home 指示条后方），与屏幕下缘吻合（原生 edge-to-edge 形态）；
     无指示条机型保底 10px。v1.2 验收十轮：原 +10px 叠加在深色下呈纯黑死区观感；
     #167 微调：顶 padding 10→6→2px=状态行上沿贴近 composer 顶边（负责人目视裁定） */
  padding: 2px 12px max(env(safe-area-inset-bottom), 24px);
  background: var(--c-island-glass);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border-top: 1px solid var(--c-border);
}

/* 键盘态（fit() 挂 keyboard-up 于 html）：Home 指示条已被键盘盖住，底衬收窄到与上沿对称的 10px */
html.keyboard-up .composer {
  padding-bottom: 10px;
}

/* 多行输入（P1-2）：16px 防 iOS 聚焦缩放（红线）；自动增高由 JS 拨，超高五行封顶内滚防吃满屏（#226-A2，算式见下方块内注记）。
   #169 微调：单行高度与右侧三按钮 40px 精确齐平——padding 9→8px+line-height 1.45→1.375（16×1.375=22 整），
   border-box 单行=2(border)+16(padding)+22(content)=40px（原 43.2px 高出 3.2px 被真机目视否决） */
.composer .composer-input {
  flex: 1;
  min-width: 0;
  font-size: 16px;
  line-height: 1.375;
  font-family: inherit;
  padding: 8px 14px;
  border-radius: 16px;
  border: 1px solid var(--c-border-strong);
  background: var(--c-surface-solid);
  color: var(--c-text);
   resize: none;
   overflow-y: auto;
   /* #226-A2：五行上限（负责人裁决「再多一行都不变大」）。原 40vh 相对 layout viewport
      （iPhone ≈341px≈15 行、不随键盘态缩）＝键盘态观感吃满全屏的根因。
      算式绑 border-box（* { box-sizing: border-box }）总高＝5×22(行高)+16(padding)+2(border)=128px；
      显式 height(autoGrow JS) 被 max-height 钳制，第 6 行起内滚（overflow-y:auto 已在）。
      依赖注记：1.375em 与上行 line-height 无单位比例绑定——日后若改定值 px，此上限须同步重算。 */
   max-height: calc(5 * 1.375em + 18px);
   -webkit-overflow-scrolling: touch;
}

.composer .composer-input:focus {
  outline: none;
  border-color: var(--c-accent);
}

.composer-toggle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border-radius: 12px;
  border: 1px solid var(--c-border-strong);
  background: var(--c-surface-solid);
  color: var(--c-text-secondary);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  flex: none;
}

.composer-toggle.active {
  color: var(--c-accent);
  border-color: var(--c-accent-border);
  background: var(--c-accent-bg);
}

.composer-toggle svg { width: 20px; height: 20px; }

/* #210：命令触发键字形改 SVG 图标（ICONS.slash，描边风与全家同语言、光学居中由几何构造保证）——
   原此处「等宽 / 读数+font 族声明+padding-top:2px 光学修正」块整体退役（不再依赖字体度量，不留死代码） */

/* #166 E：Build/Plan 切换键（TUI 提交钮原位替换）——等宽大写当前档读数，宽随字（BUILD/PLAN 四/五字符） */
.composer-toggle.agent-toggle {
  width: auto;
  padding: 0 10px;
  font-family: "SF Mono", "Fira Code", ui-monospace, monospace;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.06em;
}

/* 当前档读数=accent 强调（状态徽章语义）；disabled（切换中）回落基色 */
.composer-toggle.agent-toggle:not(:disabled) {
  color: var(--c-accent);
  border-color: var(--c-accent-border);
}

/* #166 E+#167：composer 内输入框上方状态行（agent+模型+思考深度）——独占首行、一行小字，variant 段恒 accent（负责人明示主题色）；
   #167 微调：padding-bottom 4→2→0.3px=与输入框上沿只留发丝级缝隙（CSS 支持小数像素，负责人目视裁定） */
.composer-status {
  flex: 0 0 100%;
  display: flex;
  align-items: baseline;
  gap: 6px;
  padding: 0 4px 0.3px;
  font-size: 11px;
  color: var(--c-text-secondary);
}

.composer-status .composer-status-sep { color: var(--c-text-tertiary); }
.composer-status .composer-status-agent { font-weight: 700; letter-spacing: 0.06em; }
.composer-status .composer-status-variant { color: var(--c-accent); }

/* #170 G 试验经真机感官验证不舒适→回退 v1.2「主操作=墨色单色」裁定（#171）：
   底色 --c-text（浅主题近黑/深主题近白）+字色 --c-bg（浅主题白/深主题近黑）=墨色反字双主题自适应。 */
.composer-send {
  font-size: 15px;
  font-weight: 500;
  font-family: inherit;
  padding: 10px 18px;
  border-radius: 16px;
  border: none;
  background: var(--c-text);
  color: var(--c-bg);
  flex: none;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.composer-send:disabled,
.inline-btn:disabled,
.composer-toggle:disabled {
  opacity: 0.4;
  pointer-events: none;
}

/* #206 D2 待响应区（v3.0 §3.1）：absolute 锚 detail-page（composer 同基准），底边贴 composer 顶
   上方 8px 呼吸；内容列内边距与 composer 对齐；超高 45vh 内滚；层级＝DOM 序（form 前）低于
   composer 玻璃、高于消息流。区实高经 --pending-h 串入 --composer-clearance 让位 */
.pending-rail {
  position: absolute;
  left: 0;
  right: 0;
  bottom: calc(var(--composer-h, 74px) + 8px);
  padding: 0 12px;
  display: flex;
  flex-direction: column;
  gap: 8px;
  max-height: 45vh;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
}

/* #206 D4 中止钮（v3.0 §3.3）：发送键旁并列、仅 busy 现身（idle 整钮移除不占位）。
   #210：文字药丸改 40px 图标方钮（composer-toggle 族）——底色继承族规 --c-surface-solid。
   2026-08-28 负责人点修：色板 danger 族→accent 族（danger 橙红恒定不随冰蓝主题）；
   语义不变＝武装态 accent 实底反字、与发送键 accent 主操作同族呼应。 */
.composer-abort {
  color: var(--c-accent);
  border: 1px solid var(--c-accent-border);
}

.composer-abort.armed {
  background: var(--c-accent);
  color: #ffffff;
  border-color: var(--c-accent);
}

/* ===== 命令面板（v1.4）：浮层=实底+浅阴影（modal 同语言），出现即用、无入场动画 ===== */
/* #197：原此处 `.composer { position: relative; }`（命令面板定位基准）已并入主块 position:absolute
   ——定位基准需求仍满足（absolute 同为 positioned），且消除了同选择器重复块（#196 教训：后者静默胜出） */

.command-palette {
  position: absolute;
  left: 12px;
  right: 12px;
  bottom: calc(100% + 6px);
  max-height: 264px;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  background: var(--c-surface-solid);
  border: 1px solid var(--c-border-strong);
  border-radius: 12px;
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
  z-index: 30;
}

.command-palette .command-row {
  display: flex;
  align-items: baseline;
  gap: 10px;
  width: 100%;
  padding: 10px 14px;
  border: none;
  background: none;
  font-family: inherit;
  text-align: left;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.command-palette .command-row.static {
  color: var(--c-text-tertiary);
  font-size: 13px;
  cursor: default;
}

.command-palette .command-row:not(.static):active {
  background: var(--c-accent-bg);
}

.command-palette .command-name {
  font-size: 14px;
  color: var(--c-text);
  flex: none;
}

.command-palette .command-desc {
  font-size: 12px;
  color: var(--c-text-tertiary);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  min-width: 0;
}

/* 降级一次性淡提示：composer 上缘细字条（平时安静：说过一次就够） */
.command-hint {
  position: absolute;
  left: 14px;
  bottom: calc(100% + 2px);
  font-size: 11px;
  color: var(--c-text-tertiary);
  z-index: 30;
  pointer-events: none;
}

/* 回到底部悬浮钮（图标圆钮）——#197：composer 脱流后 message-scroll 撑满全页，
   钮 bottom 须随玻璃实高浮动（var 定义在 detail-page、钮为其后代），否则沉入玻璃区被盖 */
.jump-latest {
  position: absolute;
  right: 16px;
  bottom: calc(var(--composer-h, 74px) + 12px);
  width: 40px;
  height: 40px;
  display: none;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  border: 1px solid var(--c-border-strong);
  background: var(--c-surface-solid);
  color: var(--c-text-secondary);
  box-shadow: var(--c-panel-shadow);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.jump-latest.visible { display: inline-flex; }

.jump-latest svg { width: 20px; height: 20px; }

.message-scroll {
  position: relative;
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
  overscroll-behavior: contain;
}

/* #166 E：warn-note 随 TUI 提交通道整体退役（原「经电脑侧 TUI 输入框提交…」黄条无消费点） */

/* ===== 权限卡 ===== */
.permission-actions {
  display: flex;
  gap: 8px;
  margin-top: 10px;
}

.permission-actions .inline-btn {
  flex: 1;
  padding: 10px 4px;
  font-size: 14px;
}

.inline-btn {
  font-size: 15px;
  font-weight: 500;
  font-family: inherit;
  padding: 10px 18px;
  border-radius: 12px;
  border: none;
  background: var(--c-text);
  color: var(--c-bg);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.inline-btn.danger {
  background: var(--c-danger);
}

.inline-btn.ghost {
  background: var(--c-surface-subtle);
  color: var(--c-text);
  border: 1px solid var(--c-border-strong);
}

.patterns {
  font-family: "SF Mono", "Fira Code", "Cascadia Code", ui-monospace, monospace;
  font-size: 13px;
  color: var(--c-text-secondary);
  word-break: break-all;
}

/* ===== 引导页（body 已固定化，gate 自管滚动） ===== */
.gate {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
  width: 100%;
  max-width: 420px;
  margin: 0 auto;
  /* #220：22vh 顶偏硬编码退役（#219 精简后内容矮半、顶偏致观感偏上，负责人真机反馈）。
     居中职责移交 .gate-inner margin-block:auto；padding 只留安全边——顶边接 safe-area
     （浮岛化方案 L60 的 22vh 刘海回避职责由本行 max() 继承，展开态滚到顶不钻刘海）。 */
  display: flex;
  flex-direction: column;
  padding: max(24px, calc(env(safe-area-inset-top) + 8px)) 20px 32px;
}

/* #220 垂直居中机制：flex 滚动容器内「margin auto 包裹层」标准解——内容矮时上下均分＝
   几何居中（padding 顶略大于底，重心自然微偏下，合手持操作区位）；内容高（「更多连接方式」
   展开/深链自动展开/小屏）时 auto 归 0、顶对齐+容器滚动，展开态统筹零 JS 零分支。
   否 justify-content:center：溢出时负向部分滚不到（经典坑），safe center 关键字 Safari 支持太晚。
   position:relative＝ceremony 绝定位锚（播放期行增长不回流、品牌定住，#174 红线）。 */
.gate-inner {
  position: relative;
  margin-block: auto;
}

/* 引导页卷标（v1.3 三轮）：刊物卷标语法——产品名作微缩键，学术风与仪器语法双契合 */
.gate-eyebrow {
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.12em;
  color: var(--c-text-tertiary);
  margin: 0 0 4px;
}

/* #174 项 1：登录→工作台转场的遥测启动序列（方案 B）。品牌标定住不动、其下逐行打状态短句。
   零新色 token（accent + text-tertiary 复用）；等宽字体栈与既有 .mono 族逐字一致。
   #220：改绝定位于 .gate-inner 底缘（top:100%）——不占流内高度，居中块不因仪式现身/逐行
   append 而重排，品牌从仪式第一帧起全程定住（#174 红线的彻底兑现；原 min-height 占位防跳
   职责由绝定位根除，随之退役）。 */
.gate-ceremony {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  display: flex;
  flex-direction: column;
  gap: 4px;
  margin-top: 14px;
}

.gate-ceremony-line {
  margin: 0;
  font-family: "SF Mono", "Fira Code", ui-monospace, monospace;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.1em;
  color: var(--c-accent);
  /* 起始态：略下移+透明；append 后下一帧加 .is-in 触发过渡（同帧加类不产生过渡） */
  opacity: 0;
  transform: translateY(4px);
  transition: opacity 0.2s ease, transform 0.2s ease;
}

.gate-ceremony-line::before {
  content: "› "; /* 终端提示符语言（bash 工具卡 $ 前缀同族） */
  color: var(--c-text-tertiary);
}

.gate-ceremony-line.is-in {
  opacity: 1;
  transform: translateY(0);
}

.gate h1 {
  font-size: 24px;
  font-weight: 700;
  letter-spacing: -0.02em;
  margin: 0 0 8px;
}

.gate p {
  color: var(--c-text-secondary);
  font-size: 14px;
}

.gate input {
  width: 100%;
  font-size: 16px;
  font-family: inherit;
  padding: 12px 14px;
  border-radius: 12px;
  border: 1px solid var(--c-border-strong);
  background: var(--c-surface-solid);
  color: var(--c-text);
  margin: 12px 0;
}

.gate input:focus {
  outline: none;
  border-color: var(--c-accent);
}

.gate-form {
  display: flex;
  flex-direction: column;
  margin-top: 8px;
}

.gate-form .inline-btn {
  width: 100%;
}

/* ===== v2 M1 配对页主路径（方案 §3.1）：wordmark 立门户 + 6 位等宽输入 + 状态行 ===== */
.gate-brand {
  /* v4（方案 D4）：gate 与顶栏同机制双层重建——修 v3 回归（旧实现 mask 无底色、
     颜色继承 .brand background，v3 换 topbar-mark 后渲染「SPIRY-only 渐变透 mask」）。
     v2.6 展示几何契约 260×30 不变；wordmark-full.png 文件保留回滚缓冲、消费摘除。 */
  position: relative;
  width: 260px;
  height: 30px;
  margin: 2px 0 6px;
}

.gate-pair-input {
  width: 100%;
  font-family: "SF Mono", "Fira Code", ui-monospace, monospace;
  font-size: 28px;
  font-weight: 600;
  letter-spacing: 0.3em;
  text-indent: 0.3em; /* 抵消尾字符 letter-spacing，居中不失衡 */
  text-align: center;
  text-transform: uppercase;
  padding: 14px 12px;
  border-radius: 12px;
  border: 1px solid var(--c-border-strong);
  background: var(--c-surface-solid);
  color: var(--c-text);
  caret-color: var(--c-accent);
  margin: 14px 0 2px;
}

.gate-pair-input:focus {
  outline: none;
  border-color: var(--c-accent);
}

.gate-pair-input[readonly] {
  opacity: 0.55; /* claim 在飞锁输入：压暗即「处理中」读数 */
}

.gate .gate-status {
  min-height: 18px;
  margin: 6px 0 0;
}

.gate .gate-status.danger {
  color: var(--c-danger);
}

/* 处理中读数（「登录中…」）=accent 随主题色——错套 danger 会恒定橙红不随冰蓝（2026-08-28 点修） */
.gate .gate-status.accent {
  color: var(--c-accent);
}

/* #218（gate 登录按钮设计进阶）：墨色实底主操作胶囊——承接 composer-send 墨色单色判决
   （v1.2 三轮裁定+#38+#171：accent 实底试验已被真机否决，不得复辟）；999px 胶囊语言引
   .capsule 状态胶囊族先例。两门等权自 B 役「同容器语言」演化为「份量相当、形态分职」：
   配对码门＝待输入的容器，本门＝待按压的主操作；等权核心是入口份量不被歧视、非物质同款。
   托板阴影/按压收缩＝层级用光不用色，零新色 token；深浅×橙蓝随 --c-text/--c-bg 自动。
   box-shadow 整体替换不可叠加，三态合成值钉死：基态托板／:focus 逗号合环／:active 收缩带环
   （源序在 focus 后、双态在场覆盖）／:disabled 去影。
   按钮必须纯文本单内容节点：#173 restore() 写 textContent，带子节点会被整体抹掉。 */
.gate-account-button {
  width: 100%;
  font-family: inherit;
  font-size: 16px;        /* 试验性取值（真机定标） */
  font-weight: 600;
  letter-spacing: 0.02em; /* 试验性取值（真机定标） */
  padding: 18px 12px;     /* 与 gate-pair-input 等高；border 退役纵向缩 2px 明示接受（I1） */
  border-radius: 999px;
  border: none;
  background: var(--c-text); /* 墨色实底：浅主题近黑底白字/深主题白底黑字（同 composer-send 判决） */
  color: var(--c-bg);
  cursor: pointer;
  appearance: none;       /* iOS Safari 原生按钮皮重置 */
  -webkit-tap-highlight-color: transparent; /* 全仓按钮类同款（W1） */
  margin: 14px 0 0;
  box-shadow: 0 8px 20px -8px rgba(0,0,0,0.25); /* 托板离页；深主题底板近黑致阴影弱化＝层级交给对比（已认领） */
  transition: transform 120ms ease-out, box-shadow 120ms ease-out; /* #198 按压语言同源；阴影随动不突跳（I2） */
}

.gate-account-button:focus {
  outline: none;
  box-shadow: 0 8px 20px -8px rgba(0,0,0,0.25), 0 0 0 3px var(--c-accent-border); /* 托板+焦点环逗号合成 */
}

.gate-account-button:active {
  transform: scale(0.97); /* #198 按压触觉：≤200ms、随按压触发、零装饰 */
  box-shadow: 0 3px 8px -6px rgba(0,0,0,0.2), 0 0 0 3px var(--c-accent-border); /* 收缩+环保留 */
}

.gate-account-button:disabled {
  opacity: 0.55; /* 「登录中…」压暗＝处理中读数（.gate-pair-input[readonly] 同语言） */
  box-shadow: none; /* 源序殿后：与 focus/active 同特异性，压住双态残影 */
}

/* legacy 折叠入口：页底一行小字（迁移期负责人自用；Q4 退役线后随退役删除） */
.gate-legacy {
  margin-top: 36px;
  display: flex;
  flex-direction: column;
  align-items: center;
}

.gate-legacy-toggle {
  background: none;
  border: none;
  padding: 4px 8px;
  font-size: 12px;
  font-family: inherit;
  color: var(--c-text-tertiary);
  text-decoration: underline;
  text-decoration-color: var(--c-border-strong);
  text-underline-offset: 3px;
  cursor: pointer;
}

.gate-legacy-detail {
  width: 100%;
}

.gate-legacy-form {
  margin-top: 12px;
}

/* #219 gate 信息架构重构：统一次级区「更多连接方式」——外层 toggle/折叠复用 gate-legacy 族（零新组件）；
   区内节奏＝页底 36px 的区内收敛档：配对码首块（lead+输入+读数行）与三级入口粘贴/令牌随迁 */
.gate-more-detail {
  padding-top: 14px;
}

.gate-more-detail .gate-legacy {
  margin-top: 24px;
}

/* ===== v2 M1 主机切换器（方案 §3.2）：读数非 tab——#159 起主机行住统一 popover 主机节，复用仪器行语言 ===== */
/* 仪器行是按钮：继承字体与背景，整行点按切换 */
.host-row {
  width: 100%;
  background: none;
  border: none;
  font-family: inherit;
  text-align: inherit;
  cursor: pointer;
}

/* ===== 设置页 ===== */
.settings-section.settings-card {
  background: var(--c-surface-solid);
  border: 1px solid var(--c-border);
  border-radius: 16px;
  padding: 4px 16px 16px;
  margin-bottom: 14px;
  box-shadow: var(--c-panel-shadow);
}

/* v2.2 设置三分（§5.3）：首部导航行（iOS 设置语言）——左 KEY·中文，右 chevron；行间分隔同 readout-row */
.settings-nav-row {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  padding: 12px 0;
  background: none;
  border: none;
  border-top: 1px solid var(--c-border);
  cursor: pointer;
  text-align: left;
  appearance: none;
}

.settings-nav-row:first-child { border-top: none; }

.settings-nav-title {
  flex: 1;
  font-size: 15px;
  /* #164 修复C⑥：--c-text-primary 从未定义（var() invalid→inherit）根因修；
     负责人明示设置页 tab 汉字跟随 accent 轴（橙/蓝切换即时变色） */
  color: var(--c-accent-tag-text);
}

.settings-nav-row svg {
  flex: none;
  width: 16px;
  height: 16px;
  color: var(--c-text-tertiary);
}

.settings-section h2 {
  font-size: 12px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.09em;
  color: var(--c-text-secondary);
  margin: 14px 0 4px;
}

.settings-hint {
  font-size: 13px;
  color: var(--c-text-secondary);
  margin: 8px 0;
}

.settings-section .inline-btn {
  margin: 6px 0;
}

.settings-row input {
  width: 100%;
  font-size: 16px;
  font-family: inherit;
  padding: 12px 14px;
  border-radius: 12px;
  border: 1px solid var(--c-border-strong);
  background: var(--c-surface-solid);
  color: var(--c-text);
}

/* 分段控件（设置页主题选择） */
.segmented {
  display: flex;
  margin: 8px 0 4px;
  padding: 2px;
  background: var(--c-surface-subtle);
  border-radius: 12px;
  font-size: 13px;
}

.segmented .segment {
  flex: 1;
  text-align: center;
  padding: 7px 0;
  border-radius: 4px;
  color: var(--c-text-secondary);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition: color 0.15s ease, background 0.15s ease;
}

.segmented .segment.active {
  background: var(--c-surface-solid);
  color: var(--c-text);
  font-weight: 500;
  box-shadow: var(--c-panel-shadow);
}

/* v4 accent segmented（D7）：active 段用 accent 变量上色自演示——本身即跟随切换。
   深浅 theme-segmented 维持中性不动（选择器按 class 隔离）。 */
.accent-segmented .segment.active {
  background: var(--c-accent-bg);
  color: var(--c-accent);
}

.diagnostics {
  font-family: "SF Mono", "Fira Code", "Cascadia Code", ui-monospace, monospace;
  font-size: 12px;
  color: var(--c-text-secondary);
  white-space: pre-wrap;
  word-break: break-all;
}

/* 诊断复制：内容右下角小图标，不与刷新钮贴身（v1.2 验收九轮反馈） */
.diagnostics-box { position: relative; }
.diagnostics-box .diagnostics { padding-bottom: 34px; }
.copy-btn {
  position: absolute;
  right: 0;
  bottom: 0;
  width: 32px;
  height: 32px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: 8px;
  background: none;
  color: var(--c-text-secondary);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}
.copy-btn:active { background: var(--c-surface-subtle); }
.copy-btn svg { width: 18px; height: 18px; }

/* ===== toast ===== */
.toast {
  position: fixed;
  left: 50%;
  transform: translateX(-50%);
  bottom: calc(env(safe-area-inset-bottom) + 24px);
  background: var(--c-text);
  color: var(--c-bg);
  font-size: 14px;
  padding: 10px 18px;
  border-radius: 999px;
  z-index: 50; /* 任何时刻可见：高于仪表 Popover(30) 与 confirm modal(40) */
  max-width: 86%;
  text-align: center;
}

.empty-note {
  text-align: center;
  color: var(--c-text-secondary);
  font-size: 14px;
  padding: 48px 20px;
}

/* ===== v1.3 工作台 ===== */
.wb-attention { margin-bottom: 8px; }

.wb-attention-card {
  border-radius: 12px;
  padding: 10px 14px;
  font-size: 14px;
  font-weight: 500;
  margin-bottom: 8px;
  -webkit-tap-highlight-color: transparent;
}

.wb-attention-card.warn {
  background: var(--c-warning-bg);
  border: 1px solid var(--c-warning-border);
  color: var(--c-warning-tag-text);
}

/* #198 D：权限等待响应＝需要人动作（语义类 actionable 判别，不借 .tap 巧合耦合）；
   环境异常卡（无 actionable、只读信息）不呼吸保持安静。
   #212 P1-B：环呼吸迁 ::after 合成层（见 state-pulse-ring-warn 注记）。 */
.wb-attention-card.actionable { position: relative; }
.wb-attention-card.actionable::after {
  content: "";
  position: absolute;
  inset: -5px;
  border-radius: 17px; /* 宿主 12px + 环宽 5px ≈ spread 外缘圆角 */
  border: 5px solid var(--c-warning-border);
  opacity: 0;
  transform: scale(0.85);
  animation: state-pulse-ring-warn 1.8s ease-in-out infinite;
  pointer-events: none;
}

.project-grid {
  display: grid;
  /* #226-B：手机单列（rail 恒占左缘 72px 后两列各 ≈145px、项目名截断——负责人裁决改单列）；
     minmax(0)=轨道可收缩保留（2026-08-16 真机投诉修复的语义不变）。满宽（≥700）恢复两列＝
     负责人「原来满屏宽度下两列 OK」原话推定 */
  grid-template-columns: minmax(0, 1fr);
  gap: 10px;
  margin-bottom: 14px;
}

@media (min-width: 700px) {
  .project-grid { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
}

.project-card {
  min-width: 0; /* grid 子项收窄，配合下行文字省略 */
  /* #199 B：实心换岛玻璃（同 .session-card 注记） */
  background: var(--c-island-glass);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border: 1px solid var(--c-border);
  border-radius: 16px;
  padding: 12px 14px;
  box-shadow: var(--c-panel-shadow), inset 0 1px 0 var(--c-rail-glass-edge);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  /* #198：并入 transform（同 .session-card 注记） */
  transition: border-color 0.15s ease, transform 120ms ease-out;
}

.project-card:active { border-color: var(--c-border-strong); }

.project-card-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 6px;
  margin-bottom: 4px;
}

.project-name {
  font-size: 15px;
  font-weight: 600;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.project-card-meta {
  font-size: 12px;
  color: var(--c-text-secondary);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* #226-B：项目卡路径行（mono 全路径，与全部项目面板 attention-path 同语言）——单列卡才有
   的横向余量产物：负责人要「看清路径、项目名等更多信息」。
   text-align:right 同 .session-dir 技法：锚定尾端（项目目录名侧）可见、超长截头 */
.project-card-path {
  font-size: 11px;
  color: var(--c-text-tertiary);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-family: "SF Mono", "Fira Code", "Cascadia Code", ui-monospace, monospace;
  text-align: right;
  margin-bottom: 4px;
}

.section-label.with-action {
  justify-content: flex-start;
  gap: 8px;
}

/* ===== 关注清单（2026-08-16 正向选择）：区头入口 + 配置面板 ===== */
.section-action {
  margin-left: auto;
  font-size: 12px;
  font-family: inherit;
  padding: 3px 10px;
  border-radius: 999px;
  border: 1px solid var(--c-border-strong);
  background: var(--c-surface-solid);
  color: var(--c-text-secondary);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.attention-overlay {
  /* 复用 modal-overlay 定位，sheet 贴底呈现 */
  display: flex;
  align-items: flex-end;
  /* #214 D5（review W2 拍板）：遮罩 0.35→0.18——遮罩不动则 sheet 玻璃透的是「内容×0.65 黑」，
     通透感物理打折（负责人要「背后内容衬得更通透」） */
  background: rgba(0, 0, 0, 0.18);
}

.attention-sheet {
  width: 100%;
  max-height: 82vh;
  display: flex;
  flex-direction: column;
  /* #214 D5：--c-surface(0.72) 观感实心（#162 真机否决过的根因）→ rail-glass 族
     （浅 0.40/深 0.30 + blur10 saturate1.2 + 顶内高光，对齐吸附卡/抽屉「其他页面」档） */
  background: var(--c-rail-glass);
  backdrop-filter: blur(10px) saturate(1.2);
  -webkit-backdrop-filter: blur(10px) saturate(1.2);
  border-top: 1px solid var(--c-border-strong);
  border-radius: 20px 20px 0 0;
  box-shadow: inset 0 1px 0 var(--c-rail-glass-edge);
  padding: 16px 16px calc(16px + max(env(safe-area-inset-bottom), 12px));
}

.attention-head {
  display: flex;
  flex-direction: column;
  gap: 2px;
  margin-bottom: 10px;
}

.attention-title {
  margin: 0;
  font-size: 16px;
  font-weight: 600;
}

.attention-sub {
  font-size: 12px;
  color: var(--c-text-tertiary);
}

.attention-search {
  font-size: 16px; /* iOS 防聚焦缩放红线 */
  font-family: inherit;
  padding: 9px 14px;
  border-radius: 12px;
  border: 1px solid var(--c-border-strong);
  background: var(--c-surface-solid);
  color: var(--c-text);
  margin-bottom: 10px;
}

.attention-search:focus {
  outline: none;
  border-color: var(--c-accent);
}

.attention-rows {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.attention-row {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  padding: 10px 12px;
  border-radius: 12px;
  border: 1px solid transparent;
  background: none;
  font-family: inherit;
  text-align: left;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.attention-row.attended {
  background: var(--c-surface-solid);
  border-color: var(--c-border-strong);
}

.attention-dot {
  flex: none;
  font-size: 10px;
  color: var(--c-text-tertiary);
}

.attention-row.attended .attention-dot {
  color: var(--c-accent);
}

.attention-names {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 1px;
}

.attention-basename {
  font-size: 14px;
  font-weight: 500;
  color: var(--c-text);
}

.attention-row:not(.attended) .attention-basename {
  color: var(--c-text-secondary);
}

.attention-path {
  font-size: 11px;
  color: var(--c-text-tertiary);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.attention-count {
  flex: none;
  font-size: 12px;
  color: var(--c-text-tertiary);
}

/* ===== v1.3 项目选项卡（会话列表顶部） ===== */
.tabs-bar {
  display: flex;
  gap: 6px;
  overflow-x: auto;
  margin: 2px 0 10px;
  -webkit-overflow-scrolling: touch;
}

.tabs-bar:empty { margin: 0; }

.tab {
  flex: none;
  font-size: 13px;
  padding: 5px 14px;
  border-radius: 999px;
  background: var(--c-surface-subtle);
  color: var(--c-text-secondary);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition: color 0.15s ease, background 0.15s ease;
}

.tab.active {
  background: var(--c-text);
  color: var(--c-bg);
  font-weight: 500;
}

.group-header { cursor: pointer; }

/* ===== v1.3 换血管理卡 ===== */

/* ===== v2.2 管理卡行布局（方案 §5.4）：行=左文右动作+行尾标记；危险动作三点菜单 ===== */
.admin-list-row {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 0;
  border-top: 1px solid var(--c-border);
}

.admin-list .admin-list-row:first-child,
.admin-list-row:first-child { border-top: none; }

.admin-row-text { flex: 1; min-width: 0; }

.row-tag {
  flex: none;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.09em;
  color: var(--c-text-tertiary);
  border: 1px solid var(--c-border);
  border-radius: 4px;
  padding: 2px 6px;
}

.row-menu { position: relative; flex: none; }

.row-menu-trigger {
  width: 32px;
  height: 32px;
  border-radius: 8px;
  border: 1px solid var(--c-border);
  background: none;
  font-size: 15px;
  letter-spacing: 0.08em;
  color: var(--c-text-secondary);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.row-menu-trigger:disabled {
  opacity: 0.4;
  cursor: default;
}

.row-menu-pop {
  position: absolute;
  right: 0;
  top: calc(100% + 4px);
  z-index: 40;
  min-width: 132px;
  background: var(--c-surface-solid);
  border: 1px solid var(--c-border);
  border-radius: 12px;
  box-shadow: var(--c-panel-shadow);
  padding: 4px;
  display: none;
}

.row-menu-pop.open { display: block; }

.row-menu-item {
  display: block;
  width: 100%;
  padding: 9px 12px;
  border: none;
  border-radius: 8px;
  background: none;
  font-size: 14px;
  text-align: left;
  /* #164 修复C⑥：--c-text-primary 从未定义同根因统一整改（平行兄弟链） */
  color: var(--c-text);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.row-menu-item.danger { color: var(--c-danger); }
.admin-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin: 6px 0;
}

.admin-row-title { font-size: 15px; font-weight: 500; }

.admin-row-hint { font-size: 12px; color: var(--c-text-secondary); }

.switch {
  flex: none;
  width: 46px;
  height: 28px;
  border-radius: 999px;
  border: none;
  background: var(--c-border-strong);
  position: relative;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition: background 0.15s ease;
}

.switch::after {
  content: "";
  position: absolute;
  top: 2px;
  left: 2px;
  width: 24px;
  height: 24px;
  border-radius: 999px;
  background: var(--c-surface-solid);
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
  transition: left 0.15s ease;
}

.switch.on { background: var(--c-positive); }
.switch.on::after { left: 20px; }
.switch:disabled { opacity: 0.4; pointer-events: none; }

/* ===== v1.3 confirm modal（零 innerHTML、安全默认=取消） ===== */
.modal-overlay {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.35);
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 40;
  padding: 24px;
}

.modal-card {
  background: var(--c-surface-solid);
  border-radius: 16px;
  padding: 20px;
  max-width: 340px;
  width: 100%;
  box-shadow: var(--c-panel-shadow);
}

.modal-title { margin: 0 0 8px; font-size: 17px; }

.modal-body {
  margin: 0 0 16px;
  font-size: 14px;
  color: var(--c-text-secondary);
}

.modal-actions { display: flex; gap: 10px; }

.modal-btn {
  flex: 1;
  font-size: 15px;
  font-weight: 500;
  font-family: inherit;
  padding: 10px 0;
  border-radius: 12px;
  border: none;
  background: var(--c-surface-subtle);
  color: var(--c-text);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.modal-btn.danger { background: var(--c-danger); color: #ffffff; }

/* ===== v1.3 设置页输入框 ===== */
.settings-input {
  width: 100%;
  /* 16px 是 iOS 红线（真机验收实证）：15px 聚焦触发系统自动放大且 standalone PWA 不回弹——
     顶部操作区被顶出屏＋webview pan 越界露裸底（黑幕）。gate/composer 输入框均已 16px。 */
  font-size: 16px;
  font-family: inherit;
  padding: 10px 12px;
  border-radius: 12px;
  border: 1px solid var(--c-border-strong);
  background: var(--c-surface-subtle);
  color: var(--c-text);
  margin: 6px 0;
}

.settings-input:focus {
  outline: none;
  border-color: var(--c-accent);
  background: var(--c-surface-solid);
}

/* ===== v2.4 D1 用户节查询控件（搜索/筛选/pager）===== */
.admin-users-controls {
  display: flex;
  gap: 8px;
  margin: 8px 0 4px;
}
.admin-users-controls .admin-users-search { flex: 1; min-width: 0; }
.admin-users-controls .admin-users-filter { flex: none; width: auto; }
.admin-pager {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
  padding-top: 10px;
}
.admin-pager-readout { font-size: 12px; color: var(--c-text-tertiary); }

/* ===== #160 仪表盘重构：CONTEXT 卡组 + accent 动作钮族（readout-row-action 退役——
   MODEL 行「调整」钮与 COMPACT 真按钮取代全行可点伪装） ===== */

/* D1 CONTEXT 卡组：主读数行（百分比大字+绝对量对+来源注） */
.dash-context-main {
  display: flex;
  align-items: baseline;
  gap: 8px;
  padding: 6px 12px 2px;
}

.dash-context-percent {
  font-size: 20px;
  font-weight: 600;
  color: var(--c-text);
  flex: none;
}

.dash-context-value {
  font-size: 13px;
  color: var(--c-text-secondary);
  flex: none;
}

/* #170 C：仪表盘标题「TELEMETRY」——accent 色大写加粗（负责人提议；右上注行退役同位替代）
   #174 项 2：#172 的首字母 T/M 放大（.dash-title-large 13px）经真机观感否决→退役，
   全字回归本规则 11px 基准（与 .dash-section 区标题同值，负责人「最初默认大小合理」） */
.dash-context-title {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.14em;
  color: var(--c-accent);
  margin-left: auto; /* 钉右缘 */
  flex: none;
}

/* D1 token 芯片行：五枚一排、0 值压暗（诚实不删） */
.dash-chip-row {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  padding: 2px 12px;
}

.dash-chip {
  display: inline-flex;
  align-items: baseline;
  gap: 5px;
  border: 1px solid var(--c-border);
  border-radius: 5px;
  padding: 2px 7px;
}

.dash-chip-label {
  font-size: 9px;
  font-weight: 600;
  letter-spacing: 0.08em;
  color: var(--c-text-tertiary);
}

.dash-chip-value {
  font-size: 12px;
  color: var(--c-text-secondary);
}

.dash-chip.dimmed { opacity: 0.45; }

/* #185 通用条形仪表族（dash-meter-*）：CACHE 命中与 CONTEXT 水位同语言字面单源（I2）——
   结构同 #166 D（底槽 --c-border+4px 圆角+读数 10px），fill 色各挂修饰类：
   accent＝命中率亮点（#166 原语言）/ neutral＝主体征水位（--c-text-secondary 中性起步，
   避 #163 tertiary 浅底对比前科；真机验证深浅两主题可见性） */
.dash-meter-row {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 4px 12px 0;
}

.dash-meter-label {
  font-size: 10px;
  color: var(--c-text-secondary);
  white-space: nowrap;
}

.dash-meter-label .dash-meter-suffix {
  font-size: 9px;
  color: var(--c-text-secondary); /* W1：9px 徽标避 tertiary 前科（review 原意含徽标；与抽屉 chip-label 提级同级） */
  margin-left: 4px;
}

.dash-meter-track {
  flex: 1;
  height: 4px;
  border-radius: 2px;
  background: var(--c-border);
  overflow: hidden;
}

.dash-meter-fill {
  display: block;
  height: 100%;
  border-radius: 2px;
}

.dash-meter-fill.accent { background: var(--c-accent); }

.dash-meter-fill.neutral { background: var(--c-text-secondary); }

.dash-meter-value {
  font-size: 10px;
  color: var(--c-text-secondary);
  white-space: nowrap;
}

/* D2 accent 描边动作钮（MODEL「调整」/ COMPACT「压缩上下文」同族） */
.dash-action-btn {
  flex: none;
  font-family: inherit;
  font-size: 11px;
  font-weight: 600;
  color: var(--c-accent);
  background: transparent;
  border: 1px solid var(--c-accent);
  border-radius: 6px;
  padding: 3px 12px;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}

.dash-action-btn:disabled { opacity: 0.45; cursor: default; }

/* #163 修复B：MODEL 卡——三行读数（provider/模型名/思考深度）+右侧跨三行大「调整」钮。
   dash-model-* 仅仪表盘使用，基色直接按修复A 层级（secondary/text）定，无需抽屉作用域覆盖 */
.dash-model-card {
  display: flex;
  align-items: stretch;
  gap: 12px;
  padding: 6px 12px;
  border-top: 1px solid var(--c-border);
}

.dash-model-lines {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 1px;
}

.dash-model-provider {
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.08em;
  color: var(--c-text-secondary);
}

.dash-model-name {
  font-size: 14px;
  font-weight: 600;
  color: var(--c-text);
  word-break: break-all;
}

.dash-model-variant { font-size: 10px; color: var(--c-accent); }

/* 大「调整」钮：卡 align-items:stretch 令其纵向跨满三行，横向加宽、文字垂直居中 */
.dash-action-btn.dash-model-adjust {
  display: flex;
  align-items: center;
  padding: 0 16px;
  font-size: 12px;
}

/* D2 COMPACT 独占行：真按钮不再伪装正文动词行；#163 修复B 上移至 CONTEXT 区（MODEL 卡之前） */
.dash-compact-row { padding: 6px 12px 2px; }
.dash-compact-btn { width: 100%; padding: 7px 12px; }

/* ===== #152 模型选择器遮罩（动作行已退役见上） ===== */

/* 模型选择器：modal 家族——card 拉高贴屏，搜索+分组列表内滚 */
.model-selector-card {
  max-width: 420px;
  max-height: min(80vh, 640px);
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.model-selector-search {
  width: 100%;
  font-size: 16px; /* iOS 红线（真机实证）：<16px 聚焦触发系统放大 */
  font-family: inherit;
  padding: 9px 12px;
  border-radius: 12px;
  border: 1px solid var(--c-border-strong);
  background: var(--c-surface-subtle);
  color: var(--c-text);
}

/* #154：Provider 芯片族（.model-selector-providers/.model-provider-chip）随 #153 过滤路径退役；
   .model-selector-hint 复用为 favorites unsynced 固定提示条 */
.model-selector-hint {
  font-size: 11px;
  color: var(--c-text-tertiary);
  line-height: 1.4;
}

.model-selector-list { overflow-y: auto; min-height: 120px; }

.model-selector-empty {
  padding: 24px 0;
  text-align: center;
  font-size: 13px;
  color: var(--c-text-tertiary);
}

.model-selector-group {
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.09em;
  color: var(--c-text-tertiary);
  padding: 12px 0 4px;
  text-transform: uppercase;
}

.model-selector-item + .model-selector-row,
.model-selector-row + .model-selector-row,
.model-selector-item + .model-selector-item { border-top: 1px solid var(--c-border); }

.model-selector-row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 10px;
  width: 100%;
  padding: 9px 0;
  border: none;
  background: none;
  font-family: inherit;
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  text-align: left;
}
.model-selector-row.open { color: var(--c-accent); }

.model-selector-name { font-size: 14px; color: var(--c-text); }
.model-selector-id { font-size: 11px; color: var(--c-text-tertiary); flex: none; }

.model-selector-current {
  font-size: 9px;
  font-weight: 700;
  letter-spacing: 0.08em;
  color: var(--c-accent);
  margin-left: 6px;
}

.model-selector-variants { display: flex; flex-wrap: wrap; gap: 8px; padding: 2px 0 10px 12px; }

.model-selector-variant {
  font-size: 13px;
  font-family: inherit;
  padding: 6px 14px;
  border-radius: 999px;
  border: 1px solid var(--c-border-strong);
  background: var(--c-surface-subtle);
  color: var(--c-text);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
}
.model-selector-variant.current { border-color: var(--c-accent); color: var(--c-accent); }

/* #184：SPIRY 区主标题化（真机四轮反馈：区界限感弱——与上下行距无差+标题无主标题地位）。
   上分隔线复用 MODEL 卡区界语言（CONTEXT→线→MODEL→线→SPIRY 上下两道线分区）+上下距+12px。
   #184-C 起 SPIRY 与 TODO 两区头同挂（TODO 初版不挂、真机确认嫌不齐后统一）；写在 .dash-section 之后保特异性（发现3）。 */
.dash-section.dash-section-major {
  margin-top: 12px;
  padding: 12px 12px 2px;
  border-top: 1px solid var(--c-border);
  font-size: 12px;
}
