/* ===== 云枢智控 · 手机端老板控制台样式（mobile.css） =====
   手机优先；亮色默认 + 暗色可切换；卡片圆角；按钮≥44px。
   无外部依赖；仅被 /static/mobile.html 引用。
   历史超 500 行（519 行，按 CLAUDE.md 超限注释豁免）：积累多屏样式规则内聚不拆；
   20260870 V2 移除 msg-preview 块样式 14 行（521→507 行，仍超 500 维持豁免注释）；
   20260889 顶栏 sticky→fixed 方案A：补各带顶栏屏 padding-top 补偿规则 9 行（507→516，仍超 500 维持豁免注释）；
   20260890 #83 底部 Tab 导航调高（56→68px / padding 4→6px / 图标 15→17px / 文字 12→13px / gap 2→3px）3 行（516→519，仍超 500 维持豁免注释）；
   20260892 #60① 语音激活期阻止选择/长按复制菜单 .voice-lock 6 行（519→525，仍超 500 维持豁免注释）；
   ⑭ iPhone 刘海屏全局安全区适配：底部 Tab 68→56 收敛 + 顶部补偿改 max(安全区,基垫) 精确对齐（525→526，仍超 500 维持豁免注释）。
   H5UI④ 清理：任务006 已删 #loginOverlay DOM，移除死代码 .login-box 大 LOGO(130px) 规则 47 行（577→530，仍超 500 维持豁免注释）。 */

/* ===== 基础重置 ===== */
*{margin:0;padding:0;box-sizing:border-box}
/* ===== Design Token 已抽至 mobile.tokens.css（20260818 组件库接入） =====
   亮/深/普通三态 token、7层字号表、圆角阴影间距统一在 tokens.css 管理（一键全局改）；
   本文件只保留布局/组件样式，禁止再内联 token 值（改色一律走 tokens.css 变量）。 */
/* 四·五 刘海区一体：html 背景=导航同色(亮#FFF/深#191919)，下拉橡皮筋不露浅灰断层、无灰缝；
   四·五·三·五 手势锁死：touch-action 禁 pinch/双击缩放，保留滚动平移 */
html{-webkit-text-size-adjust:100%;overflow-x:hidden;background:var(--card);touch-action:pan-x pan-y}
body{
  font-family:-apple-system,"SF Pro","PingFang SC","Helvetica Neue","Microsoft YaHei",sans-serif;   /* 20260818 老板: 全App统一字体族, iOS=SF Pro/Android=Roboto/H5系统栈, 不引第三方 */
  margin:0;   /* 回归整改①(老板08-18): 默认8px 边距清除, 顶栏/底栏贴边贴底、无白缝 */
  background:var(--card);color:var(--text);line-height:1.5;   /* 先行整改单①(20260818): body 背景=导航卡色(亮#FFF/深#191919), body 背景传播到视口 canvas=刘海区/手势条区颜色, 与顶栏/底栏无缝无断层; 内容区底色由 #app{background:var(--bg)} 保持浅灰不变 */
  overscroll-behavior-x:none;overflow-x:hidden;   /* 08-10 防退出：阻止横向过度滚动触发系统返回；20260876 全站横向锁定 */
  touch-action:pan-x pan-y;   /* 四·五·三·五 禁 pinch/双击缩放，保留滚动 */
}
#app{
  height:100vh;height:-webkit-fill-available;height:100dvh;height:100svh;max-width:480px;margin:0 auto;   /* 08-31 牛牛: 补 -webkit-fill-available 兜底(老 iOS 不认 dvh/svh 时拿可用视口高, 键盘弹收由 assist.js applyViewport 钉可视区底边) */
  display:flex;flex-direction:column;background:var(--bg);position:relative;overflow-x:hidden;   /* 20260876 全站横向锁定 */
  padding-bottom:calc(49px + env(safe-area-inset-bottom));  /* 20260817 SAFE硬规②: 底部为 fixed 导航让位=Tab内容区49pt+手势条(键盘弹出 kb-open 时归0) */
}

/* ===== 屏幕容器：默认整屏滚动；群聊/终端内部滚动 =====
   先行整改单②(20260818): 去 -webkit-overflow-scrolling:touch——iOS 真机该 hack 把滚动容器提升为独立合成层,
   使容器内 position:fixed 顶栏在真机失效(下拉橡皮筋时被内容盖住), 而 headless 复现不了; iOS13+ 原生滚动已平滑, 去掉后 fixed 恢复相对视口固定 */
.screen{display:none;flex:1;overflow-y:auto;overflow-x:hidden;min-height:0}
.screen.active{display:block}
#screen-chat.active,#screen-terminal.active{display:flex;flex-direction:column}
/* 总控屏：一屏完整自适应（043，flex column 撑满，禁页面滚动） */
#screen-overview{display:none;flex-direction:column;overflow:hidden;overflow-y:auto}
#screen-overview.active{display:flex}

/* ===== 顶部条（fixed：20260889 方案A sticky→fixed，防 iOS overflow-x 祖先致 sticky 失效滑走） ===== */
.topbar{
  /* 20260818 老板(对照微信): 背景上延盖满刘海区与状态栏同色、无横向分隔线; z-index 提到最高、背景不透明,内容从下方滚过不遮挡标题 */
  position:fixed;top:0;left:0;right:0;max-width:480px;margin:0 auto;z-index:60;background:var(--card);
  /* 20260818 v20260934 一·1: 贴刘海无断层——padding-top 加 safe-area-inset-top, 总高=内容区44pt+inset,
     与一级Tab subbar(44+inset)互相对齐; 无刘海(headless/安卓无safe区)=44pt 原值不变, 无回归 */
  height:calc(env(safe-area-inset-top, 0px) + 44px);box-sizing:border-box;overflow:hidden;   /* v20260934 四·19: 固定高inset+44(原min-height+双inset padding在刘海屏被撑至2*inset+内容, 与padTop断层), 内容恒44pt区垂直居中 */
  padding:env(safe-area-inset-top, 0px) 14px 0;   /* 仅顶部inset贴刘海, 底部0, 内容区恒定44pt */
  display:flex;justify-content:space-between;align-items:center;gap:8px;flex-shrink:0;
}
.topbar-title{display:flex;flex-direction:column;min-width:0;flex-shrink:1}
.topbar h1{font-size:var(--fs-l2);font-weight:700;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}   /* 20260818 字号层级L2导航标题17pt */
.topbar .sub{font-size:12px;color:var(--sub);display:block;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 右上成组（0083 审核 P2）：在线徽标 | ☀️/🌙 | 登录/退出 整体右聚，不与标题挤占 */
.topbar-right{display:flex;align-items:center;gap:8px;margin-left:auto;min-width:0}
/* 主题切换钮（0082 追加②）：☀️/🌙 小按钮，透明底随主题色 */
.theme-btn{
  flex-shrink:0;background:transparent;border:none;color:var(--text);
  padding:6px;font-size:16px;line-height:1;cursor:pointer;
}
.theme-btn:active{opacity:.7}
.badge{display:inline-flex;align-items:center;gap:5px;padding:4px 10px;border-radius:20px;font-size:14px;font-weight:600;white-space:nowrap;flex-shrink:0}
.badge.all-green{background:var(--online-soft);color:var(--online);border:1px solid var(--online)}
.badge.error{background:var(--offline-soft);color:var(--offline);border:1px solid var(--offline)}
.badge .dot{width:7px;height:7px;border-radius:50%;background:currentColor}
.topbar-right .badge{font-size:11px;padding:2px 8px;gap:4px}
.topbar-right .badge .dot{width:5px;height:5px}
/* 登录/退出按钮（T3 复验）：topbar 右侧主动入口，小号圆角主题色 */
.auth-btn{
  flex-shrink:0;background:var(--card);border:1px solid var(--border);
  color:var(--text);border-radius:14px;padding:6px 12px;font-size:14px;cursor:pointer;
}
.auth-btn:active{opacity:.85}

/* 总控入口三卡一行等分：待办 / 待验收 / 用户管理（老板反馈） */
.entry-row{display:flex;gap:12px;padding:8px 16px 0;flex-shrink:0}   /* 老板08-18·四·五·六: 左右边距16pt统一/卡片间距12pt, 原12px/6px */
.todo-banner{
  position:relative;flex:1;min-width:0;width:auto;margin:0;display:flex;flex-direction:column;justify-content:center;align-items:center;gap:5px;
  background:var(--card);border:1px solid var(--border);border-radius:12px;padding:10px 4px;cursor:pointer;min-height:64px;color:var(--text);flex-shrink:0;text-align:center;
}
.todo-banner:active{border-color:var(--accent)}
.tb-ico{font-size:16px;line-height:1;color:var(--tab-idle)}   /* v20260934 六·23: 单色图标默认灰,随主题 */
.tb-text{flex:none;width:100%;text-align:center;font-size:16px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.red-dot{
  position:absolute;top:6px;right:6px;background:var(--offline);color:#fff;border-radius:20px;min-width:20px;height:20px;
  display:inline-flex;align-items:center;justify-content:center;font-size:12px;padding:0 5px;
}
.tb-arrow{display:none}

/* ===== 顶部群消息流预览（20260870 V2：首页已移除 .msg-preview 块，入口经消息 Tab；清除非必要样式，仅留 .mp-empty 供满屏群聊屏空态） ===== */
.mp-empty{justify-content:center;color:var(--sub);font-size:12px}

/* ===== 048：满屏群聊信息屏（总控「与我相关」点击全屏打开，非弹窗） ===== */
#screen-related{position:relative}
#screen-related.active{display:flex;flex-direction:column}
.related-tabs{display:flex;flex-shrink:0;background:var(--card);border-bottom:1px solid var(--border)}
.rel-tab{
  position:relative;flex:1;min-height:44px;border:none;background:none;color:var(--sub);
  font-size:14px;font-weight:600;cursor:pointer;border-bottom:2px solid transparent;
}
.rel-tab.active{color:var(--accent);border-bottom-color:var(--accent)}
#screen-related > .chat-body{flex:1;overflow-y:auto;min-height:0;padding:14px;display:flex;flex-direction:column;gap:10px;-webkit-overflow-scrolling:touch;max-height:none;margin-top:0}

/* ===== 机器卡片（一屏一台，横向翻页 scroll-snap） ===== */
.machines{position:relative;padding:10px 0 0;flex:1;min-height:0;display:flex;flex-direction:column}
.machines-head{display:flex;justify-content:space-between;align-items:center;padding:0 12px 8px;flex-shrink:0}
.machines-head .hint{font-size:11px;color:var(--sub)}
.machines-scroll{
  display:flex;overflow-x:auto;padding:2px 0 8px;flex:1;min-height:0;
  -webkit-overflow-scrolling:touch;scroll-snap-type:x mandatory;
}
.machines-scroll::-webkit-scrollbar{display:none}
.m-card{
  flex:0 0 100%;scroll-snap-align:start;background:var(--card);border:1px solid var(--border);
  border-radius:12px;padding:14px 12px;cursor:pointer;display:flex;flex-direction:column;gap:8px;
  box-shadow:var(--card-shadow);
}
.m-card.online{border-left:3px solid var(--online)}
.m-card.standby{border-left:3px solid var(--warn)}
.m-card.offline{border-left:3px solid var(--offline);opacity:.65}
/* 机器列表加载失败占位（T3 审核#1：不再降级示例机器） */
.load-fail{
  flex:0 0 calc(100% - 24px);margin:2px 12px 8px;background:var(--card);
  border:1px dashed var(--border);border-radius:12px;padding:22px 12px;
  font-size:14px;color:var(--sub);text-align:center;
}
.m-head{display:flex;justify-content:space-between;align-items:center}
.m-name{font-size:16px;font-weight:700;color:var(--text);display:flex;align-items:center;gap:6px}
.m-todo{
  background:var(--offline);color:#fff;border-radius:20px;font-size:11px;
  min-width:18px;height:18px;display:inline-flex;align-items:center;justify-content:center;padding:0 5px;
}
.m-role{
  font-size:11px;color:var(--accent);background:var(--accent-soft);padding:2px 8px;
  border-radius:4px;align-self:flex-start;
}
.m-hw{font-size:10px;color:var(--sub);display:flex;flex-wrap:wrap;gap:2px 10px}
.m-hw b{color:var(--text)}
.status-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}
.status-dot.online{background:var(--online);box-shadow:0 0 8px var(--online);animation:pulse 2s infinite}
.status-dot.standby{background:var(--warn)}
.status-dot.offline{background:var(--offline)}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.4}}
/* 机器翻页圆点指示器（043→084返工：absolute 悬浮叠卡片顶部不占行，pointer-events:none 不挡滑动） */
.machine-dots{
  position:absolute;bottom:10px;left:0;right:0;display:flex;justify-content:center;
  gap:6px;pointer-events:none;z-index:5;
}
.machine-dot{width:6px;height:6px;border-radius:50%;background:var(--border)}
.machine-dot.active{background:var(--accent)}

/* ===== 子页顶栏（返回 + 标题）总整改单⑨(08-18): 内容区 44pt 冻结基线 —— 去 padding 10+10 与 border，
   总高 = max(inset,10) + 44pt(与 topbar 权威模式一致)，back-btn 44×44 上下贴边填满 ===== */
.subbar{
  position:fixed;top:0;left:0;right:0;max-width:480px;margin:0 auto;z-index:60;background:var(--card);   /* 先行整改单②(20260818): subbar z-index 10→60 与 topbar 一致, 防内容/底栏(z=50)在真机盖过 */
  padding:env(safe-area-inset-top, 0px) 12px 0;display:flex;justify-content:center;align-items:center;gap:8px;
  height:calc(env(safe-area-inset-top, 0px) + 44px);box-sizing:border-box;overflow:hidden;   /* v20260934 四·19: subbar固定高=inset+44(不再被内容撑高), padTop与barH严格一致无断层; 20260819 标题居中统一(老板:2级页标题应居中) */
}
.back-btn{
  position:absolute;left:6px;top:env(safe-area-inset-top, 0px);z-index:1;   /* 20260819 标题居中: back-btn 绝对定位左侧, 让 h2 真正居中(不再占流把标题顶偏) */
  height:44px;min-width:44px;display:flex;align-items:center;justify-content:center;
  padding:0 8px;background:transparent;color:var(--accent);border:none;   /* 20260821 老板: 去灰底卡片(土), 微信式透明+accent 色 */
  border-radius:10px;cursor:pointer;font-size:16px;
}
.back-btn:active{background:var(--accent-bg-light)}
.subbar h2{font-size:17px;font-weight:700;color:var(--text);flex:none;text-align:center;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:calc(100% - 88px)}   /* 20260819 标题居中统一: flex:none+居中, 超长省略号拦截不溢出(不再word-break撑高/跑出) */
#screen-terminal .subbar{justify-content:space-between}   /* 20260819 terminal工具条保留: 右侧徽标/切换按钮贴边, 不受居中规则影响 */
#screen-terminal .subbar h2{flex:1;text-align:left;white-space:normal;overflow-wrap:anywhere}
#screen-terminal .back-btn{position:static}
.conn-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}
.conn-dot.live{background:var(--online)}
/* 我的助理模式切换（P1 多租户个人助理）：终端屏↔个人助理对话 */
.assist-toggle{
  padding:6px 12px;background:var(--border);color:var(--text);border:none;
  border-radius:8px;cursor:pointer;font-size:14px;min-height:36px;flex-shrink:0;
}
.assist-toggle.active{background:var(--accent);color:#fff}

/* ===== 机器详情 ===== */
.detail-body{padding:12px 12px;display:flex;flex-direction:column;gap:12px}
.hw-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px}
.hw-block{background:var(--card);border:1px solid var(--border);border-radius:10px;padding:10px}
.hw-lbl{font-size:10px;color:var(--sub);margin-bottom:4px}
.hw-val{font-size:14px;color:var(--text);font-weight:600;word-break:break-all}
.panel{
  background:var(--card);border:1px solid var(--border);border-radius:12px;
  padding:12px;display:flex;flex-direction:column;gap:10px;
}
.panel h3{font-size:14px;color:var(--accent);font-weight:600}
.session{background:var(--bar-bg);border:1px solid var(--border);border-radius:8px;padding:10px}
.session-top{display:flex;justify-content:space-between;align-items:center;font-size:14px;font-weight:600;color:var(--text);margin-bottom:6px}
.bar-track{height:6px;background:var(--bar-bg);border-radius:4px;overflow:hidden}
.bar-fill{height:100%;background:var(--accent-grad-h);border-radius:4px}
.session-sum{font-size:11px;color:var(--sub);margin-top:6px}
/* 0310四改：会话离线态（无 ttyd 映射，如豆豆未上线）灰显不可点 */
.session.offline{opacity:.55}
.session.offline:active{opacity:.8}
.session-off{font-size:11px;color:var(--warn);margin-top:6px}
.group-msg{background:var(--bar-bg);border:1px solid var(--border);border-radius:8px;padding:8px 10px}
.gm-meta{display:flex;justify-content:space-between;font-size:11px}
.gm-author{color:var(--accent);font-weight:600}
.gm-time{color:var(--sub)}
.gm-title{font-size:14px;color:var(--text);margin-top:4px}
.term-btn{
  width:100%;min-height:48px;background:var(--accent-grad);color:#fff;border:none;
  border-radius:10px;font-size:16px;font-weight:700;cursor:pointer;
}
.term-btn:active{opacity:.85}

/* ===== 待办列表 ===== */
/* 唤醒卡片（T3 审核#2：小字与按钮同卡，样式与 todo-item 统一） */
.wake-card{background:var(--card);border:1px solid var(--border);border-radius:12px;margin:12px 12px 0;padding:12px}
.wake-row{display:flex;gap:10px}
.wake-btn{
  width:100%;min-height:44px;background:linear-gradient(135deg,var(--bg),var(--card));
  color:var(--warn);border:1px solid var(--border);border-radius:10px;
  font-size:14px;font-weight:600;cursor:pointer;
}
.wake-btn:active{border-color:var(--warn)}
.todo-list{padding:8px 12px;display:flex;flex-direction:column;gap:10px}
.todo-item{background:var(--card);border:1px solid var(--border);border-left:4px solid var(--offline);border-radius:12px;padding:12px}
.todo-item.done{opacity:.55;border-left-color:var(--border)}
.todo-type{
  font-size:11px;color:var(--accent);background:var(--accent-soft);padding:2px 8px;
  border-radius:4px;align-self:flex-start;display:inline-block;
}
.todo-title{font-size:16px;color:var(--text);font-weight:600;margin:8px 0 6px}
.todo-meta{font-size:11px;color:var(--sub);margin-bottom:10px}
.todo-actions{display:flex;gap:10px}
/* 按钮 + 按钮下方小字说明（增补2：新用户一看就懂） */
.btn-col{flex:1;display:flex;flex-direction:column;gap:4px}
.btn-col .btn-approve,.btn-col .btn-reject,.btn-col .btn-review,.btn-col .btn-supplement{width:100%}
.btn-approve,.btn-reject,.btn-review,.btn-supplement,.btn-revise{min-height:44px;border-radius:10px;font-size:16px;font-weight:600;cursor:pointer}
.btn-tip{font-size:11px;color:var(--sub);text-align:center;line-height:1.3}
/* 小字说明统一区（T3：从按钮列移入卡片内部、按钮组下方） */
.todo-tips{display:flex;gap:10px;margin-top:8px;padding-top:8px;border-top:1px dashed var(--border)}
.todo-tips .btn-tip{flex:1}
.wake-tips{display:flex;gap:10px;margin-top:8px;padding-top:8px;border-top:1px dashed var(--border)}
.wake-tips .btn-tip{flex:1}
.btn-approve{background:var(--online-soft);color:var(--online);border:1px solid var(--online)}
.btn-reject{background:var(--offline-soft);color:var(--offline);border:1px solid var(--offline)}
.btn-review{background:var(--bar-bg);color:var(--sub);border:1px solid var(--border)}
.btn-supplement{background:var(--warn);color:#fff;border:1px solid var(--warn)}
.todo-item.done .btn-approve,.todo-item.done .btn-reject,.todo-item.done .btn-review,.todo-item.done .btn-supplement{opacity:.5;pointer-events:none}
.todo-tip{font-size:12px;color:var(--warn);padding:6px 12px 0;min-height:0}
.todo-tip:empty{display:none}
.token-btn{font-size:12px;color:var(--accent);background:var(--accent-bg-light);border:1px solid var(--accent-border);border-radius:8px;padding:4px 10px;min-height:30px;cursor:pointer}
.token-btn:active{border-color:var(--accent)}
/* 档2-补：待办详情展开（全文+附件；决策按钮常驻底部不遮挡） */
.todo-detail-btn{
  width:100%;margin:8px 0 4px;min-height:38px;border-radius:8px;
  background:var(--accent-soft);color:var(--accent);border:1px dashed var(--accent-border);
  font-size:14px;font-weight:600;cursor:pointer;
}
.todo-detail-btn:active{border-color:var(--accent)}
.todo-detail{margin:4px 0 8px;padding:10px;background:var(--bg);border:1px solid var(--border);border-radius:10px}
.todo-detail-meta{font-size:11px;color:var(--sub);margin-bottom:6px}
.todo-detail-att{margin-top:10px;border-top:1px dashed var(--border);padding-top:8px}
.todo-detail-att-hd{font-size:12px;color:var(--sub);font-weight:600;margin-bottom:6px}
.todo-detail-err{font-size:12px;color:var(--warn);padding:4px 0}
.todo-att-img{margin-bottom:8px}
.todo-att-doc{margin-bottom:6px}

/* ===== 群聊界面（全屏消息流） ===== */
.chat-body{flex:1;overflow-y:auto;min-height:0;padding:14px;display:flex;flex-direction:column;gap:10px;-webkit-overflow-scrolling:touch}
/* 群聊屏相对定位：供「回到最新」浮动按钮绝对定位（T3） */
#screen-chat{position:relative}
/* 回到最新浮动按钮（T3/十三）：爬楼脱离底部时浮出，点击回到最新并隐藏。
   v20260934 十三：去底色去胶囊=纯图标 / 方向向下 / 位置靠右下 */
.jump-latest{
  position:absolute;right:14px;bottom:16px;left:auto;transform:none;
  z-index:20;width:44px;height:44px;padding:0;border-radius:50%;
  background:transparent;color:var(--sub);border:none;font-size:14px;
  cursor:pointer;white-space:nowrap;
  display:flex;align-items:center;justify-content:center;
}
.jump-latest svg{display:block}
.jump-latest:active{color:var(--accent)}
/* 爬楼翻历史入口（增补1）：顶部「加载更早消息」+ 消息列表内部布局 */
.chat-more{
  flex-shrink:0;align-self:center;font-size:12px;color:var(--sub);
  background:var(--card);border:1px solid var(--border);border-radius:20px;
  padding:6px 14px;cursor:pointer;
}
.chat-more:active{border-color:var(--accent);color:var(--accent)}
/* 接口不可用 → 加载更早入口置灰不可点（T3 审核#1） */
.chat-more-error{color:var(--sub);opacity:.6;pointer-events:none}
.chat-list{display:flex;flex-direction:column;gap:10px}
.chat-msg{background:var(--card);border:1px solid var(--border);border-radius:10px;padding:10px 12px;cursor:pointer}
.chat-meta{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}
.chat-author{font-size:14px;font-weight:700;color:var(--accent)}
.chat-time{font-size:11px;color:var(--sub)}
.chat-title{font-size:14px;color:var(--text)}
/* 群聊消息：机器名 + 展开正文（点击 chat-msg 切换 data-open，AppChat.toggleMsg 控制） */
.chat-machine{font-size:11px;color:var(--sub);font-weight:600}
.chat-msg .chat-body{display:none;margin-top:8px;padding:8px 10px;background:var(--bg);border-radius:8px;font-size:16px;color:var(--text);line-height:1.7;white-space:pre-wrap;max-height:260px;overflow-y:auto;-webkit-overflow-scrolling:touch}
.chat-msg.open .chat-body{display:block}
.chat-msg.open{border-color:var(--accent)}
/* 20260819 正文默认常驻：展开态箭头转上（▴），收起态还原（▾），一眼看出折叠状态 */
.chat-arrow{display:inline-block;margin-left:4px;font-size:11px;color:var(--sub);transition:transform .2s}
.chat-msg.open .chat-arrow{transform:rotate(180deg)}

/* ===== 终端界面（AI 对话） ===== */
.term-machines{
  display:flex;gap:8px;overflow-x:auto;padding:10px 12px;
  border-bottom:1px solid var(--border);flex-shrink:0;
}
.term-machines::-webkit-scrollbar{display:none}
.tm-chip{
  flex-shrink:0;padding:8px 14px;border:1px solid var(--border);background:transparent;
  color:var(--sub);border-radius:20px;font-size:14px;cursor:pointer;min-height:44px;
}
.tm-chip.active{background:var(--accent-grad);color:#fff;border-color:var(--accent);font-weight:600}
.term-body{flex:1;overflow-y:auto;min-height:0;padding:14px;display:flex;flex-direction:column;gap:10px;-webkit-overflow-scrolling:touch}
.bubble{max-width:70%;padding:11px 14px;border-radius:12px;font-size:16px;line-height:1.5;word-break:break-word}   /* 总整改单⑧: ≤70% */
.bubble.ai{align-self:flex-start;background:var(--card);border:1px solid var(--border);color:var(--text);border-bottom-left-radius:4px}   /* 对方: 左下4pt尾巴 */
.bubble.user{align-self:flex-end;background:var(--bubble-user);color:#fff;border-bottom-left-radius:12px;border-bottom-right-radius:4px}   /* 自己: 右下4pt尾巴；用 --bubble-user 令牌（暗色档已调暗） */
/* 前台对话「⏳ 处理中…」pending 气泡：闪烁提示（AI 回复到达后被替换） */
.bubble.pending{opacity:.75;animation:termPending 1.2s ease-in-out infinite}
@keyframes termPending{0%,100%{opacity:.75}50%{opacity:.3}}
.term-input{
  display:flex;align-items:center;gap:8px;padding:10px 12px;
  padding-bottom:var(--safe-b);
  border-top:1px solid var(--border);background:var(--card);flex-shrink:0;
}
.term-input input{
  flex:1;min-height:44px;background:var(--bar-bg);border:1px solid var(--border);
  border-radius:22px;padding:0 16px;color:var(--text);font-size:16px;outline:none;
}
.term-input input:focus{border-color:var(--accent)}
.send-btn{
  min-height:44px;padding:0 18px;background:var(--accent-grad);color:#fff;border:none;
  border-radius:22px;font-size:16px;font-weight:700;cursor:pointer;flex-shrink:0;
}
.send-btn:active{opacity:.8}

/* ===== WalkBuddy 语音：🔊 AI 回复播报按钮 + 🎤 长按输入框识别态（0158） ===== */
.speaker-btn{
  display:inline-flex;align-items:center;justify-content:center;background:transparent;border:none;cursor:pointer;
  margin-left:6px;font-size:14px;line-height:1;padding:2px;vertical-align:middle;
}
.speaker-btn:hover{opacity:.65}
.speaker-btn.speaking{color:var(--accent);font-weight:700;opacity:1;animation:speakPulse .9s ease-in-out infinite;transform:scale(1.15)}   /* I播报: 播放中变色+闪动+放大 */
/* 长按语音态：输入框识别中高亮（accent 描边 + 淡绿底），placeholder 由 voice.js 切为「🎤 正在聆听…」 */
.term-input input.voice-active,
.term-input input.voice-active:focus{border-color:var(--accent);background:var(--accent-bg-light);box-shadow:0 0 0 2px var(--accent-border)}

/* ===== 底部导航（08-10 老板定：深空蓝黑渐变底，白字，active 半透明白浮层+白描边） ===== */
.tabbar{
  /* 20260817 老板5项①: fixed 贴可视区底——iOS Safari 100svh 固定下地址栏收起屏幕增高时原流内 tabbar 停在 svh 底、下方露出大段空域;
     改 fixed bottom:0 永远贴当前可视区底(参考微信);键盘弹出 body.kb-open 隐藏(5项③④)
     20260817 B2: 图标 SVG 24px 质量图 + 图标文字间距 5px 呼吸 + 上下居中 + 上方留白 + 文字 13px */
  position:fixed;bottom:0;left:0;right:0;max-width:480px;margin:0 auto;z-index:50;
  display:flex;align-items:stretch;background:var(--tabbar-bg);border-top:1px solid var(--tabbar-border);   /* v20260934 一·C-6: 分割线 0.5px→1px 加强分层(原≈不可见) */
  min-height:calc(49px + env(safe-area-inset-bottom)); /* 20260817 SAFE硬规②: Tab内容区49pt+手势条34pt, 原62px超规 */
  padding:0 0 env(safe-area-inset-bottom);              /* 内容区49px内图标+文字垂直居中,下方安全区避让 Home 条 */
}
.tab{
  position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:4px;flex:1;padding:0;line-height:1.05;background:none;border:none;
  color:var(--tab-idle);font-size:11px;font-weight:500;cursor:pointer;   /* 20260818 老板: 文字 11pt(原10pt小气), 字重 500 选中/未选中一致防跳; 行高1.05收紧防组过高 */
  transition:color .15s ease;                                            /* 20260818 切换过渡轻量不位移 */
}
.tab .t-ico{display:flex;align-items:center;justify-content:center;line-height:1}
.tab .t-ico svg{width:25px;height:25px;transition:fill .15s ease}         /* 20260818 老板: 图标 25pt(原24pt偏小), 组高25+4+11×1.05=40.6居中后图标距顶/文字距底≈4.2pt≥4pt */
.tab .t-ico,.tab span{color:var(--tab-idle);font-weight:500}
.tab.active{color:var(--tab-active);background:transparent}
.tab.active .t-ico{color:var(--tab-active)}
.tab.active span{color:var(--tab-active);font-weight:500}
/* 20260818 老板: 选中=蓝填充图标(学微信), 未选中=灰线性图标——线性SVG用 fill:currentColor 实心化, 不增加任何上沿条/背景浮层 */
.tab.active .t-ico svg{fill:currentColor}
.tab:active{opacity:.8}
/* 详情/待办子页隐藏底部导航 */
body.no-tab .tabbar{display:none}
body.no-tab #app{padding-bottom:0}              /* 20260817: 隐藏导航屏无需底部让位 */
body.kb-open .tabbar{display:none}              /* 20260817 5项③④: 键盘弹出隐藏底部导航,防其被顶到键盘上方成"打钩栏"、键盘显高 */
body.kb-open #app{padding-bottom:0}             /* 键盘弹出时输入区贴键盘上方,不留导航空位 */

/* ===== 嵌入式终端 overlay（0051 调度派单：返回按钮 + 站内 iframe） ===== */
.term-overlay{
  position:fixed;inset:0;z-index:250;background:var(--bg);
  display:none;flex-direction:column;
}
.term-overlay.show{display:flex}
.term-overlay-bar{flex-shrink:0;position:relative}   /* 20260889 顶栏 fixed 化：overlay 内保持文档流，不随 .subbar fixed */
.rv-preview-bar,.ai-chat-bar{flex-shrink:0;position:relative}   /* 20260889 同法：overlay 内顶栏保持文档流，防 .subbar fixed 拖出流遮挡 .rv-preview-body/.ai-chat-body */
.rv-preview-bar{width:100%;margin:0;height:calc(env(safe-area-inset-top, 0px) + 44px);overflow:hidden;align-items:center}   /* 20260819 详情固定导航栏(老板:点详情应保持导航栏, 标题被拦在栏内居中): 覆盖.subbar height:auto/visible → 固定高+hidden; 20260819 修复 bar 收缩: .rv-preview-bar 是 position:relative 覆盖 .subbar fixed, 需 width:100%+margin:0 去掉 .subbar 的 margin:0 auto(否则 flex 不 stretch, 收缩为内容宽, h2 被 max-width 压到 0 不可见) */
.term-overlay iframe{
  flex:1;width:100%;min-height:0;border:none;background:var(--card);
}

/* ===== 登录层 =====
   任务006 已移除旧集群 #loginOverlay/.login-box 骨架（index.html 不再含该 DOM），
   登录/注册/验证码统一走 dshAuthSheet（.da-card 居中卡片，见 host.css）。旧 .login-box 大 LOGO(130px) 规则为死代码已清。 */
/* ===== 全局 toast ===== */
#toast{
  position:fixed;left:50%;bottom:96px;transform:translateX(-50%) translateY(20px);
  background:#000d;color:#fff;padding:12px 18px;border-radius:10px;font-size:14px;
  opacity:0;pointer-events:none;transition:.25s;z-index:200;max-width:86%;text-align:center;
}
#toast.show{opacity:1;transform:translateX(-50%) translateY(0)}

/* ===== 052 验收通道（待验收/已验收 + 附件预览） ===== */
.rv-item{background:var(--card);border:1px solid var(--border);border-left:4px solid var(--offline);border-radius:12px;padding:12px;cursor:pointer}
.rv-item.done{opacity:.55;border-left-color:var(--border)}
.rv-item.busy .rv-actions{opacity:.5;pointer-events:none}
.rv-top{display:flex;justify-content:space-between;align-items:center;gap:8px}
.rv-type{font-size:12px;color:var(--accent);background:var(--accent-soft);padding:2px 8px;border-radius:4px;display:inline-block}
/* 建言卡顶部行·提交人：flex:1 吃余宽、长名省略号截断，其余元素不换行 */
.rv-author{font-size:12px;color:var(--sub);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}
.rv-time{font-size:12px;color:var(--sub);flex-shrink:0}
.rv-title{font-size:16px;color:var(--text);font-weight:600;margin:8px 0 6px;word-break:break-word;overflow-wrap:anywhere}   /* 20260819 长标题防溢出 */
.rv-meta{font-size:12px;color:var(--sub);margin-bottom:6px}
.rv-desc{font-size:14px;color:var(--sub);background:var(--bg);border-radius:8px;padding:8px 10px;margin-bottom:8px;line-height:1.5;white-space:pre-wrap;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;overflow:hidden}
.rv-body{cursor:pointer;border-radius:10px}
.rv-body:active{opacity:.7}
.rv-actions{display:flex;gap:8px}
.rv-actions .btn-approve,.rv-actions .btn-reject,.rv-actions .btn-revise{min-height:48px;font-size:16px}
.btn-revise{background:var(--offline-soft);color:var(--offline);border:1px solid var(--offline)}
.rv-item.done .btn-approve,.rv-item.done .btn-reject,.rv-item.done .btn-revise{opacity:.5;pointer-events:none}
.rv-comment-scroll{flex:1;overflow-y:auto;min-height:0;padding:14px;-webkit-overflow-scrolling:touch}
.rv-comment-desc{background:var(--card);border:1px solid var(--border);border-radius:10px;padding:12px;font-size:16px;line-height:1.7;color:var(--text);white-space:pre-wrap;word-break:break-word}
.rv-comment-composer{flex-shrink:0;padding:10px 14px;border-top:1px solid var(--border);background:var(--card);display:flex;gap:10px;align-items:flex-end}
.rv-comment-ta{flex:1;min-height:96px;max-height:200px;background:var(--bar-bg);border:1px solid var(--border);border-radius:18px;padding:12px 14px;color:var(--text);font-size:16px;line-height:1.7;outline:none;resize:vertical}
.rv-comment-ta:focus{border-color:var(--accent)}
.rv-comment-send{flex-shrink:0;min-height:40px;padding:0 20px;background:var(--accent);color:#fff;border:none;border-radius:20px;font-size:16px;font-weight:600;cursor:pointer}
.rv-comment-send:active{opacity:.85}
/* 预览弹层：全屏 overlay，老板手机点开附件直接看 */
.rv-preview-overlay{
  position:fixed;inset:0;z-index:260;background:var(--bg);
  display:flex;flex-direction:column;
}
.rv-preview-box{flex:1;display:flex;flex-direction:column;min-height:0}
.rv-preview-bar{flex-shrink:0}
.rv-preview-body{
  flex:1;overflow-y:auto;min-height:0;padding:14px;display:flex;flex-direction:column;gap:12px;
  -webkit-overflow-scrolling:touch;background:var(--bg);
}
.rv-full-title{font-size:16px;font-weight:600;color:var(--text);word-break:break-word;overflow-wrap:anywhere;line-height:1.4}   /* 20260819 详情长标题完整可见: 导航栏省略号外, 正文顶部补完整标题 */
.rv-img{width:100%;max-height:55vh;object-fit:contain;border-radius:10px;background:var(--card);border:1px solid var(--border)}   /* v20260934 二·9/10: 附件图统一规格——最大高55vh(超高图contain完整显示不裁上下, 解决大小参差) */
.rv-video{width:100%;max-height:70vh;border-radius:10px;background:#000}
.rv-doc{
  background:var(--card);border:1px solid var(--border);border-radius:10px;padding:12px;
  font-size:16px;color:var(--text);line-height:1.7;word-break:break-all;white-space:pre-wrap;
}
.rv-doc a{color:var(--accent);text-decoration:underline}
.rv-md{
  font-family:inherit;white-space:pre-wrap;word-break:break-word;font-size:16px;
  line-height:1.8;color:var(--text);max-height:60vh;overflow-y:auto;
}
.rv-preview-foot{flex-shrink:0;padding:10px 14px;border-top:1px solid var(--border);background:var(--card)}
.rv-preview-foot .rv-actions{display:flex;gap:8px}
.rv-preview-foot .btn-col{flex:1}
.rv-preview-foot .btn-approve,.rv-preview-foot .btn-reject,.rv-preview-foot .btn-revise{width:100%}
/* 091 整改逐条勾选：勾选=通过，取消勾选=重做（自动派单） */
.rv-comment-check{padding:0 2px 12px;border-bottom:1px solid var(--border);margin-bottom:12px}
.rv-comment-hint{font-size:14px;color:var(--sub);margin-bottom:8px}
.rv-chk{display:flex;gap:8px;align-items:flex-start;padding:8px 6px;border:1px solid var(--border);border-radius:8px;margin-bottom:6px;background:var(--card);cursor:pointer;font-size:16px;line-height:1.5}
.rv-chk input{margin-top:3px;width:20px;height:20px;accent-color:var(--accent);flex-shrink:0}
.rv-chk span{flex:1;word-break:break-word;white-space:pre-wrap}

/* ===== 窄屏微调（≤360px） ===== */
@media(max-width:360px){
  .hw-grid{grid-template-columns:1fr 1fr}
  .topbar .sub{display:none}   /* 0083：超窄屏隐藏副标题，避免挤占 */
}
/* ===== 立项卡（v=20260839 mac02分机）：5步进度/评审汇总/分配单/打回原因/小进度条 ===== */
.prj-reject{background:var(--offline-soft);color:var(--offline);border:1px solid var(--offline);border-radius:10px;padding:10px 12px;font-size:14px;font-weight:600}
.prj-steps{display:flex;gap:6px;padding:12px;background:var(--card);border:1px solid var(--border);border-radius:12px}
.prj-step{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;gap:4px;text-align:center;padding:8px 2px;border-radius:8px;background:var(--bar-bg)}
.prj-step.done{background:var(--online-soft)}
.prj-step.cur{background:var(--accent-bg-light);border:1px solid var(--accent-border)}
.prj-step-name{font-size:10px;color:var(--sub)}
.prj-step-cur{font-size:10px;color:var(--warn);font-weight:600}
.prj-sec-title{font-size:14px;color:var(--accent);font-weight:600;margin-bottom:6px}
.prj-summary,.prj-alloc{background:var(--card);border:1px solid var(--border);border-radius:12px;padding:12px}
.prj-dims{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:6px}
.prj-dim{padding:4px 10px;border:1px solid var(--accent-border);background:var(--accent-soft);color:var(--accent);border-radius:14px;font-size:14px;cursor:pointer}
.prj-dim-opinion{margin-top:6px;padding:8px 10px;background:var(--bg);border-radius:8px;font-size:14px;color:var(--text);white-space:pre-wrap}
.prj-alloc-row{padding:6px 10px;background:var(--bar-bg);border-radius:8px;font-size:14px;color:var(--text);margin-bottom:6px;font-family:ui-monospace,Menlo,monospace}
.prj-mini{display:flex;gap:4px;margin-top:6px}
.prj-mini-step{flex:1;text-align:center;font-size:10px;padding:2px 0;border-radius:4px;background:var(--bar-bg);color:var(--sub)}.prj-mini-step.done{background:var(--accent-soft);color:var(--accent);font-weight:600}
.prj-src-line{display:flex;gap:6px;margin-top:4px;flex-wrap:wrap}
.prj-src{padding:1px 8px;border-radius:10px;font-size:11px;background:var(--bar-bg);color:var(--sub);border:1px solid var(--border)}
/* 0240 立项聚合项状态徽标 + 阶段标签（不画假进度，徽标说真状态）：🔄在跑/📋已过评审/🔧产出中=色块，灰显=待启动/暂缓/终止 */
.prj-agg{display:inline-block;padding:3px 10px;border-radius:12px;font-size:12px;font-weight:600;background:var(--accent-soft);color:var(--accent);border:1px solid var(--accent-border)}
.prj-agg.gray{background:var(--bar-bg);color:var(--sub);border-color:var(--border)}
.prj-stage{display:inline-block;padding:3px 10px;border-radius:12px;font-size:12px;background:var(--bar-bg);color:var(--sub);border:1px solid var(--border);margin-left:6px}
.prj-agg-row{align-items:center;gap:6px}

/* ===== 20260889 顶栏 fixed 化：各带顶栏屏内容区 padding-top 补偿（方案A）
   顶栏 fixed 后脱离文档流，内容会被遮挡；⑭ 与各顶栏自身 padding-top 公式对齐（max(安全区,基垫)），
   .topbar 高=44+max(inset,12)、.subbar 高=44+max(inset,10)（总整改单⑨ 08-18: 内容区 44pt 冻结，去 padding 10+10+border），
   刘海机/非刘海机均无镂空不吞内容。 ===== */
#screen-overview{ padding-top:calc(env(safe-area-inset-top, 0px) + 44px); }   /* v20260934 四·19: padTop与topbar高(inset+44)严格一致, 无刘海机型消除12px断层 */
#screen-related,#screen-detail,#screen-todo,#screen-confirm,#screen-reviews,
#screen-accept,#screen-delegate,#screen-users,#screen-terminal,#screen-messages,
#screen-kefu,#screen-workchat,#screen-workchat-dialog,#screen-board,
#screen-tools,#screen-chat{ padding-top:calc(env(safe-area-inset-top, 0px) + 44px); }   /* v20260934 四·19: subbar屏 padTop与subbar高(inset+44)严格一致, 刘海/无刘海均无断层; v20260934l: #screen-profile 移出(去导航栏,账号区自带刘海内边距) */

/* ===== v20260934 一·7 + 十五: 一级 Tab(首页/消息/工具/我的)顶部导航互相对齐 —— subbar 高=topbar(44pt+安全区),
   标题居中、去图标、不加粗,全应用字体统一; 登录态顶栏零图标(仅居中标题) ===== */
#screen-messages .subbar,#screen-tools .subbar,#screen-profile .subbar{
  height:calc(env(safe-area-inset-top, 0px) + 44px);
  padding-top:env(safe-area-inset-top, 0px);
  justify-content:center;
}
#screen-messages .subbar h2,#screen-tools .subbar h2,#screen-profile .subbar h2{
  flex:none;text-align:center;font-weight:500;letter-spacing:.5px;
}
#screen-messages,#screen-tools{ padding-top:calc(env(safe-area-inset-top, 0px) + 44px); }   /* v20260934 四·19: 一级Tab padTop与subbar高(inset+44)严格一致, 无刘海机型消除12px断层; v20260934l: #screen-profile 移出(去导航栏, 账号区自带刘海内边距) */

/* ===== #60① 语音激活期阻止文本选择/长按复制菜单（AppVoice.setVoiceLock 动态加/减） ===== */
.voice-lock,.voice-lock *{
  -webkit-user-select:none;user-select:none;-webkit-touch-callout:none;
}

/* 20260824 老板：二级页底部浮动返回键（拇指友好；仅 no-tab 二级页显示，避免与底部 Tab 同屏） */
.float-back{
  position:fixed;left:14px;bottom:calc(14px + env(safe-area-inset-bottom));
  width:46px;height:46px;border-radius:50%;border:none;
  background:rgba(0,122,255,.92);color:#fff;display:flex;align-items:center;justify-content:center;
  box-shadow:0 2px 10px rgba(0,122,255,.35);z-index:999;cursor:pointer;
  -webkit-tap-highlight-color:transparent;transition:opacity .2s;
}
body:not(.no-tab) .float-back{opacity:0;pointer-events:none;}
/* 老板08-29: 底部小蓝浮动返回键不要(明确点名). 已给 messages/tools/profile 补左上返回键, 无蓝钮仍可返回 → 全局隐藏. */
body.no-tab .float-back{display:none !important;opacity:0 !important;pointer-events:none !important;}
body:not(.no-tab) .float-back{display:none !important;}
