/* ===== 云枢智控 · 总控页 + 机器详情 UI 优化（mobile.overview.css） =====
   049 A组（总控页：LOGO/顶部压窄/2×2网格/在线状态点/详情按钮/数据摘要/退出比例）
   + C组（机器详情：返回精致化/6卡协调/点会话进终端）。
   独立文件控制行数（mobile.css 已被 052 占满 500 行铁律）。加载于 mobile.css 之后，覆盖同优先级样式。
   仅被 /static/mobile.html 引用。20260874 引入 v11 小人系统 CSS（复用 zhilian-home-v11.html L15-82）。
   20260875 二修：①容器改 9:16 竖屏撑满可视高度（去 55vh）；②双图去渐变直接切换（去 transition:opacity）。→ 约束：单文件 ≤500 行（CLAUDE.md 铁律）。 */

/* ===== ⑱ 顶部横条压窄 + ⑤ LOGO 置前 ===== */
.topbar{padding:8px 14px}
.topbar-title{flex-direction:row;align-items:center;gap:8px}
.top-logo{width:26px;height:26px;border-radius:8px;flex-shrink:0}
.topbar h1{font-size:var(--fs-l2)}
.topbar .sub{font-size:var(--fs-l5);margin:0 0 0 6px}
/* 20260817 B2 老板要求: 顶栏极简,只留居中品牌名(20260819 由「集群老板端」改「艾索达」); 去 logo/标题/在线/铃铛/主题/用户/登录按钮(元素保留防 JS 空引用);
   topbar 保持 fixed(不写 position, 继承 mobile.css 的 fixed)。
   #authBtn(🔐登录)为 B2 返工补充: 首页右上角残留图标, 一并隐藏。 */
.topbar{justify-content:center}
.topbar .top-logo,.topbar h1,.topbar .sub,
.topbar .badge,#soundBtn,#themeBtn,#usersEntryBtn,#authBtn{display:none}   /* 20260818 三态主题入口唯一化: 顶栏零图标禁删(theme.js:36/notify.js:137/auth.js:56 getElementById 仍引用,DOM 保留防空引用); 功能入口统一个人中心=主题外观(as-menu)/消息通知+声音振动(profile屏)/微信授权(as-menu)/权限·用户(profile屏AppUsers) */
.boss-name{font-size:var(--fs-l2);font-weight:500;color:var(--text);letter-spacing:2px;white-space:nowrap;line-height:1.3}   /* 20260818 字号层级L2导航标题17pt; 回归整改① line-height:1.5→1.3 使顶栏内容区44pt */
.topbar-right{position:absolute;right:10px;top:50%;transform:translateY(-50%);display:flex;align-items:center;gap:6px}
/* 20260817 SAFE硬规①⑨: 顶部导航栏内容区固定 44pt, 总高 = safeAreaInsets.top + 44pt, 不写死总高。
   header.topbar 提特异性覆盖 mobile.css(padding 12px) 与 mobile.pwa.css(padding-top:safe 12px);
   内容区=height-padding-top = 44px(全局 box-sizing:border-box), 刘海屏上收(非全屏 Safari safe=0 → 总高恰 44px) */
header.topbar{height:calc(env(safe-area-inset-top, 0px) + 44px);padding-top:env(safe-area-inset-top, 0px);padding-bottom:0;align-items:center}
header.topbar .topbar-title{min-height:0}
/* SAFE硬规⑤: #screen-overview padding-top 与 顶栏总高(inset+44) 同步(mobile.css:526 原 46+max(safe,12) 高估, 图片下掉),
   内容全落安全区, 后加载覆盖同特异性规则 */
#screen-overview{padding-top:calc(env(safe-area-inset-top, 0px) + 44px)}
/* ⑲ 退出/在线图标比例协调：未登录=文字小圆角按钮；已登录=圆形头像 */
.auth-btn{padding:6px 12px;border-radius:14px}
.auth-btn.avatar-mode{width:34px;height:34px;padding:0;border-radius:10px;display:inline-flex;align-items:center;justify-content:center;overflow:hidden}
.auth-avatar{width:26px;height:26px;border-radius:8px;object-fit:cover;display:block}

/* ===== ① 2×2 机器网格 + ④ 一屏完整无滚动 ===== */
.machines-grid{
  flex:1;min-height:0;display:grid;grid-template-columns:1fr 1fr;
  gap:10px;padding:2px 12px 12px;overflow-y:auto;align-content:start;
  -webkit-overflow-scrolling:touch;
}
.machines-grid::-webkit-scrollbar{display:none}
.machines-grid .m-card{
  flex:none;scroll-snap-align:none;min-width:0;
  display:flex;flex-direction:column;gap:6px;overflow:hidden;
  padding:10px 10px 6px;border-radius:12px;
}
.machines-grid .m-card.online{border-left:3px solid var(--online)}
.machines-grid .m-card.standby{border-left:3px solid var(--warn)}
.machines-grid .m-card.offline{border-left:3px solid var(--sub);opacity:.6}
/* ② 在线状态点：绿=在线；待机/离线一律灰（不再用红点） */
.status-dot.standby,.status-dot.offline{background:var(--sub)}
/* ③ 卡片主体可点进终端 + 右下「详情」小按钮 */
.machines-grid .m-card{cursor:pointer}
.machines-grid .m-card:active{border-color:var(--accent)}
.m-detail{
  align-self:flex-end;min-height:0;padding:5px 12px;margin-top:2px;
  background:var(--accent-soft);color:var(--accent);border:1px solid var(--accent-border);
  border-radius:14px;font-size:12px;font-weight:600;cursor:pointer;flex-shrink:0;
}
.m-detail:active{border-color:var(--accent)}
/* ㉕ 机器卡片数据摘要（群活动一行，超长截断两行） */
.m-sum{font-size:11px;color:var(--sub);line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}

/* ===== 084 一屏并排两台大卡：横向翻屏（.m-screen 分组，snap 锚点=屏数） =====
   .machines-scroll 复用 mobile.css 的横向 snap 容器；覆盖 .m-card 100% 为 50%（两卡一屏）。
   本文件加载于 mobile.css 之后，.m-screen .m-card 优先级更高。 */
.machines-scroll{scroll-snap-stop:always}
.m-screen{flex:0 0 100%;scroll-snap-align:start;display:flex;gap:12px;padding:0 16px;align-items:center}   /* 老板08-18·四·五·六: 左右边距16pt/卡片间距12pt, 原12px/10px */
.m-screen .m-card{flex:1 1 0;aspect-ratio:3/4;min-width:0;scroll-snap-align:none;display:flex;flex-direction:column;justify-content:center;gap:8px}
/* 089 返工：奇数台机器末屏只 1 张卡 → flex:1 1 0 拉满屏宽 → 3:4 卡高爆炸（390w 卡高 488px）撑高整行机器区（555px）致消息存在时全屏溢出（Blink 解析）。
   单卡限半宽（与双卡同宽 50%-gap/2）→ 末屏卡高=双卡卡高，机器区回到内容高（约 300px），消息预览可弹性吸收富余。 */
.m-screen .m-card:only-child{max-width:calc(50% - 5px)}
/* 085 机器大卡文字随屏自适应（clamp 缩放：屏大卡片大→文字大，始终满屏协调） */
.m-screen .m-card .m-name{font-size:clamp(17px,4.8vw,24px)}
.m-screen .m-card .m-role{font-size:clamp(11px,3vw,14px)}
.m-screen .m-card .m-hw{font-size:clamp(11px,3vw,14px)}
.m-screen .m-card .m-sum{font-size:clamp(12px,3.4vw,16px)}
.m-screen .m-card .m-detail{font-size:clamp(12px,3.4vw,16px);padding:6px 14px}
/* 086 机器卡固定 3:4（老板定稿：竖长方形，形状随机型稳定）+ 整屏协同填满（老板「满屏不空白」）：
   机器区改按内容高度（不再 flex:1 撑满），富余空间由上方消息预览弹性吸收（放开 250px 上限），
   四卡 entry-row 保持原样，整屏不留大块空白。 */
.machines{flex:0 0 auto}
/* 20260870 V2：机器区改单行状态条（#machineBar）；旧 machines-head/翻页卡样式保留供兼容（元素已从首页移除） */
.machines-head{background:var(--accent-bg-light);border-bottom:1px solid var(--border);border-radius:12px 12px 0 0;margin:0 12px 8px;padding:9px 12px}
.machines-head span:first-child{font-size:13px;color:var(--accent);font-weight:600}
.machines-head .hint{font-size:11px;color:var(--sub)}
/* 我的机器单行状态条（20260870 V2：替代翻页大卡，点按进详情；紧凑 40-48px） */
.machines-bar{
  display:flex;align-items:center;gap:8px;min-height:42px;
  margin:6px 16px 10px;padding:0 12px;border-radius:12px;   /* 老板08-18·四·五·六: 左右边距16pt统一, 原12px */
  background:var(--card);border:1px solid var(--border);
  font-size:14px;font-weight:600;color:var(--text);text-align:left;font-family:inherit;
  cursor:pointer;flex-shrink:0;
}
.machines-bar:active{border-color:var(--accent)}
.mb-ico{font-size:16px;line-height:1}
.mb-txt{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mb-arrow{color:var(--sub);font-size:16px}

/* ===== ㉔ 待办列表页：未处理标红计数 + 子页角标 ===== */
.subbar .todo-count{background:var(--offline);color:#fff;border:none;font-size:12px;padding:2px 8px;border-radius:20px}
.todo-group-hd{display:flex;align-items:center;font-size:12px;color:var(--sub);padding:4px 2px 0}
.todo-group-hd .tg-red{color:var(--offline);font-weight:700}

/* ===== B组 ㉑ 筛选一行两个小卡片（与我相关/群聊信息屏通用） ===== */
.related-tabs{padding:10px 16px;gap:8px}   /* 老板08-18·四·五·六: 左右边距16pt统一, 原12px */
.rel-tab{
  flex:1;min-height:40px;border:1px solid var(--border);border-radius:10px;
  background:var(--bar-bg);color:var(--sub);font-size:13px;
}
.rel-tab.active{color:var(--accent);border-color:var(--accent);background:var(--accent-soft);border-bottom:1px solid var(--accent)}

/* ===== C组 机器详情：返回精致化 + 标题行压缩 + 6卡协调 + 点会话进终端 ===== */
.back-btn{height:44px;padding:0 12px;border-radius:10px;background:var(--bar-bg);font-size:14px}   /* 总整改单⑨: 44×44 贴边填满(原 padding 8px/min-height 40px 压塌) */
.hw-grid{grid-template-columns:1fr 1fr 1fr;gap:8px}
.hw-block{padding:10px 8px;text-align:center}
.hw-block .hw-lbl{font-size:10px}
.hw-block .hw-val{font-size:12px;word-break:break-all}
button.session{width:100%;text-align:left;cursor:pointer;font:inherit;color:var(--text)}
button.session:active{border-color:var(--accent)}
.panel h3{font-size:13px;color:var(--accent);font-weight:700;padding-bottom:2px;border-bottom:1px dashed var(--border)}

/* ===== ⑥ 头像操作单（退出/取消，底部弹出） ===== */
.auth-sheet{position:fixed;inset:0;z-index:300;display:flex;align-items:flex-end;justify-content:center}
.auth-sheet-mask{position:absolute;inset:0;background:#000a}
.auth-sheet-panel{
  position:relative;width:100%;max-width:480px;background:var(--card);
  border-radius:16px 16px 0 0;padding:16px 16px var(--safe-b);
  display:flex;flex-direction:column;gap:8px;
}
.auth-sheet-user{display:flex;align-items:center;gap:10px;padding:8px 4px 12px;font-size:16px;font-weight:600;color:var(--text)}
.auth-sheet-user .avatar-img{width:40px;height:40px;border-radius:12px;object-fit:cover}
.auth-sheet-btn{min-height:48px;border-radius:12px;font-size:16px;font-weight:600;cursor:pointer;border:1px solid var(--border)}
.auth-sheet-btn.logout{background:var(--offline-soft);color:var(--offline);border-color:var(--offline)}
.auth-sheet-btn.cancel{background:var(--bar-bg);color:var(--sub)}
.auth-sheet-btn:active{opacity:.85}

/* ===== 20260817 B2 老板要求: 首屏只有图片, 挡位元素隐藏 ===== */
/* PWA「开启锁屏推送」横幅挡首屏 → 首页不显示(设置页 .px-pwa-entry 同功能入口保留, 功能不丢)。
   必须提特异性(#screen-overview 前缀)压过 mobile.pwa.css 后加载的 .px-pwa-banner{display:flex} */
#screen-overview .px-pwa-banner{display:none}
/* API 错误提示条无内容时隐藏(平时 state.machineApiError 为空仍占 24px 挡首屏; 有错误内容正常显示) */
.todo-tip:empty{display:none}

/* ===== 20260817 B2 返工: 首屏只有图片, 卡片全部上滑才显 =====
   老板复验反馈「该清除的卡片没清」→ 待办横幅(entry-row)不再悬浮首屏,
   回滚动流置于 cluster-summary 上方, 与数据卡一并上滑才显; 首屏=顶栏+图片全屏+底部导航, 干净无卡片。
   待办横幅仍不被导航遮挡(#screen-overview 滚动, fixed tabbar 不覆盖内容, 滚动到横幅时在视口内可见)。 */

/* ===== 20260865 B 节：像素办公室底图 + 集群概况条（背景与功能层分区，半透明深底衬） ===== */
/* 像素办公室底图：契约容器 #pixelOffice，圆角横幅；底部半透明深衬与功能层分区（不标「占位」字样） */
.pixel-office{
  /* 20260890 #84 预算重核（原 min-height/max-height 同锁 100svh-140px，140px 偏小 → 容器被压扁、cover 上下裁剪 → 顶底被吞）：
     按实际高度逐项核算替换 140px = 顶栏 fixed 补偿(46px + max(顶部安全区,12px)) + 顶部边距(10px) + 底部 Tab 菜单(56px + 底部安全区)，
     用 CSS 变量集中管理；容器高 = min(1:2 自然高, 可用空间)，去除 min-height 锁死使 cover 不裁剪或裁剪可忽略；
     svh 与 #app 高度基准(100svh)一致，dvh 随浏览器栏显示/隐藏跳动、lvh 底部会被浏览器栏遮挡，均不取（20260877 终裁 1:2 比例保留）。 */
  --px-vtop:calc(env(safe-area-inset-top, 0px) + 44px);    /* 20260817 SAFE硬规: 顶栏总高 = safeAreaInsets.top + 44pt(内容区44pt), 原 30px 高估/低估同步 */
  --px-vtab:calc(49px + env(safe-area-inset-bottom));      /* 20260817 SAFE硬规: Tab栏总高 = 49pt + safeAreaInsets.bottom(手势条34pt), 原 62px 超规同步 */
  --px-vmg:4px;                                             /* 顶部边距 margin-top(老板08-18·四·五·六: 图片框距导航≤4pt最多一条线, 原10px❌) */
  /* 验收整改⑦：去左右 12px 边距 → 全宽无留白（消除「右边空白/图片偏左」感知）；圆角取消改全幅出血；
     水印为豆包AI原图自带，换无印图待运营官供图（本项目不二次 P 图） */
  /* 20260817 验收补单 P0：场景图改 flex 弹性伸缩占满「顶栏下 ~ 待办横幅上」剩余空间——
     原 max-height 固定预算(100svh-vtop-vmg-vtab)不随 PWA banner/pull-hint 起点偏移自适应，
     起点被推到 133 后 bottom=853 溢出导航(788)，待办横幅(entry-row)被挤出到 857 完全被导航遮挡。
     改 flex:1 + min-height:0 + max-height:none 后，场景图吸收剩余空间，横幅固定位于导航上方可见。 */
  position:relative;margin:var(--px-vmg) 0 0;border-radius:0;overflow:hidden;
  background:linear-gradient(160deg,#0f172a,#1e293b);   /* 半透明深底衬 */
  box-shadow:var(--card-shadow);
  /* 20260817 B2 老板要求: 图片首屏全屏(顶栏下~导航上), 摘要卡片上滑显示。
     锁死首屏高度 calc(100svh - 顶栏 - 顶边距 - 底部导航) + flex:0 0 auto 不被压缩:
     svh 与 #app 基准一致(地址栏展开视口), fixed tabbar 同基准, 高度恒等衔接不溢出;
     下方 entryRow/cluster-summary/machines-bar 固定占位随之落到首屏下 → 上滑可见(#screen-overview 滚动),
     不再被兄弟元素压缩(flex:1 只能拿剩余空间, 首屏被上方 banner/下方卡片挤占只有 450px)。 */
  flex:0 0 auto;height:calc(100svh - var(--px-vtop) - var(--px-vmg) - var(--px-vtab));
}
/* 20260878 多场景图组：N 张 <img> 由 PX_SCENES 动态生成叠放（JS 每 8s 循环切下一张，active 图加 .px-img-on）。
   无过渡直接切换（去渐变）；.night 仅控制星光显隐（见下），不再控制 img opacity。 */
.pixel-office img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;opacity:0}
.pixel-office img.px-img-on{opacity:1}
/* ===== 20260874 v11 小人系统（复用 zhilian-home-v11.html L15-82，命名原样保留）：15 个像素小人
   .sp 绝对定位 + b-* 部件（头/脸/身/双臂/双腿/双脚）+ nm 角色名 + say 气泡 + act-* 切帧动画 + 灯带/光流氛围。
   坐标沿用 v11 原百分比值（基于旧底图，待老板实测后按新图校准——后续单独做）。
   z-index 覆于双图（img z 1/2）之上；.say 气泡 pointer-events:none + z-index 高于小人。
   20260890 #84 容器高改按可用空间自适应（min-height 锁死去除），sp/band/flow/stars 均为 % 定位随容器缩放，
   因 cover 裁剪已近可忽略，小人仍落在完整图内，坐标无需大改 JS（后续校准照旧）。 ===== */
.sp{position:absolute;width:3.4%;height:7.8%;z-index:6;pointer-events:none;transform-origin:center bottom}
.b-hd{position:absolute;left:30%;top:6%;width:40%;height:28%;border-radius:15%;z-index:2}
.b-fa{position:absolute;left:34%;top:16%;width:32%;height:18%;background:#ffd9a0;z-index:1}
.b-bd{position:absolute;left:18%;top:33%;width:64%;height:44%;z-index:3;border-radius:2px}
.b-ar{position:absolute;top:34%;width:15%;height:40%;background:#ffd9a0;z-index:4;transform-origin:top}
.b-ar.l{left:8%}.b-ar.r{right:8%}
.b-lg{position:absolute;bottom:0;width:18%;height:36%;background:#2b2a3a;z-index:2;transform-origin:top}
.b-lg.l{left:26%}.b-lg.r{right:26%}
.b-sh{position:absolute;bottom:0;width:20%;height:8%;background:#1c1b28;z-index:5;border-radius:1px}
.b-sh.l{left:22%}.b-sh.r{right:22%}
.nm{position:absolute;top:-3.2em;left:50%;transform:translateX(-50%);font-size:max(6px,1.8vw);font-weight:700;color:#0f1430;background:rgba(255,255,255,.78);border:1px solid #3a4470;border-radius:3px;padding:0 3px;white-space:nowrap;z-index:8;opacity:.8;line-height:1.3}
/* 原图比例的小气泡 */
.say{position:absolute;top:-6.2em;left:50%;transform:translate(-50%,5px) scale(.5);font-size:max(7px,2.1vw);font-weight:700;color:#0f1430;background:#fff;border:1px solid #7a5a2a;border-radius:9px;padding:1px 5px;white-space:nowrap;z-index:9;box-shadow:0 1px 5px rgba(0,0,0,.3);opacity:0;transition:all .28s ease;line-height:1.3;pointer-events:none}
.say.on{opacity:1;transform:translate(-50%,0) scale(1)}
.say.melt{opacity:0;transform:translate(-50%,-4px) scale(.45)}

/* 办公：手臂敲键 + 身体晃 */
.act-work .b-ar.r{animation:kp .7s ease-in-out infinite}
.act-work .b-ar.l{animation:kp .7s ease-in-out .35s infinite}
.act-work .b-bd{animation:sway 2.8s ease-in-out infinite}
@keyframes kp{0%,100%{transform:translateY(0)}50%{transform:translateY(-26%)}}
@keyframes sway{0%,100%{transform:rotate(-2.5deg)}50%{transform:rotate(2.5deg)}}
/* 开会：手臂比划 */
.act-talk .b-ar.r{animation:tk 3s ease-in-out infinite}
@keyframes tk{0%,100%{transform:rotate(0)}30%{transform:rotate(22deg)}70%{transform:rotate(-16deg)}}
/* 跑步机：腿快摆 + 身体起伏 */
.act-run .b-lg.l{animation:run .4s linear infinite alternate}
.act-run .b-lg.r{animation:run .4s linear .2s infinite alternate}
.act-run .b-bd{animation:rbob .2s linear infinite alternate}
@keyframes run{0%{transform:rotate(30deg)}100%{transform:rotate(-30deg)}}
@keyframes rbob{0%{transform:translateY(0)}100%{transform:translateY(-14%)}}
/* 举铁：双臂抬 */
.act-fit .b-ar.l,.act-fit .b-ar.r{animation:lift .9s ease-in-out infinite}
@keyframes lift{0%,100%{transform:translateY(0)}50%{transform:translateY(-42%)}}
/* 喝咖啡：抬手 */
.act-cof .b-ar.r{animation:si 3.4s ease-in-out infinite}
@keyframes si{0%,55%,100%{transform:translateY(0)}70%{transform:translateY(-30%)}85%{transform:translateY(-30%)}}
/* 走动：腿摆+手臂摆+横移+身体起伏 */
.act-walk .b-lg.l{animation:swleg .5s linear infinite alternate}
.act-walk .b-lg.r{animation:swleg .5s linear .25s infinite alternate}
.act-walk .b-ar.l{animation:swarm .5s linear infinite alternate}
.act-walk .b-ar.r{animation:swarm .5s linear .25s infinite alternate}
.act-walk .b-bd{animation:bob .5s linear infinite alternate}
@keyframes swleg{0%{transform:rotate(30deg)}100%{transform:rotate(-30deg)}}
@keyframes swarm{0%{transform:rotate(20deg)}100%{transform:rotate(-20deg)}}
@keyframes bob{0%{transform:translateY(0)}100%{transform:translateY(-10%)}}
.act-walk{animation:mv 7s ease-in-out infinite}
@keyframes mv{0%,100%{transform:translateX(0)}50%{transform:translateX(var(--dx,20%))}}
/* 走动距离微调 */
.wl0{--dx:70%}.wl1{--dx:60%}.wl2{--dx:80%}
.wl0{animation-duration:9s}.wl1{animation-duration:11s}.wl2{animation-duration:7.5s}
/* 灯带呼吸 + 数据光流（氛围动画） */
.band{position:absolute;left:16%;width:14%;height:1.6%;border-radius:3px;z-index:4;opacity:.75;animation:glow 2.2s ease-in-out infinite}
.band.b1{top:5.5%;background:linear-gradient(180deg,#ff9ec8,#ff5ea8)}.band.b2{top:21%;background:linear-gradient(180deg,#c4a6ff,#8f6bff)}
.band.b3{top:39%;background:linear-gradient(180deg,#7db4ff,#3f7ff0)}.band.b4{top:57%;background:linear-gradient(180deg,#54d98c,#1fb868)}
.band.b5{top:75%;background:linear-gradient(180deg,#ffb454,#f08a1f)}
@keyframes glow{0%,100%{opacity:.3}50%{opacity:1}}
.flow{position:absolute;left:33.5%;top:62%;width:13%;height:3px;z-index:5;opacity:.85;background:repeating-linear-gradient(90deg,#8fd0ff 0 5px,transparent 5px 10px);animation:flow .8s linear infinite}
@keyframes flow{0%{background-position:0 0}100%{background-position:10px 0}}
/* 集群概况条：4 项一行等分，大字号关键值 */
.cluster-summary{
  display:flex;gap:4px;margin:6px 16px 0;padding:5px 6px;flex-shrink:0;   /* 老板08-18·四·五·六: 左右边距16pt统一, 原12px */
  background:rgba(255,255,255,.55);border:1px solid var(--border);border-radius:12px;
  backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
}
:root[data-theme="dark"] .cluster-summary{background:rgba(15,25,35,.55)}
.cs-item{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;gap:1px;text-align:center}
.cs-ico{font-size:13px;line-height:1;color:var(--tab-idle)}   /* v20260934 六·23: 单色图标默认灰,随主题 */
.cs-lbl{font-size:10px;color:var(--sub);white-space:nowrap}
.cs-val{font-size:14px;font-weight:700;color:var(--text);line-height:1.1}
/* 要事条卡：保留核心决策入口，压缩高度给像素图让空间（20260870 V2） */
.entry-row{margin-top:4px}
.todo-banner{min-height:50px;padding:6px 4px}
.todo-banner .tb-text{font-size:14px}
/* 总整改单①（08-18）：首页「我的助理」入口卡片 —— 助理移出底部 Tab，改为首页卡片进入沉浸 2 级页。
   蓝底图标+名称+副标题+箭头；深色模式随 --card/--accent token 自动适配，不做硬编码色 */
.assist-entry-card{
  display:flex;align-items:center;gap:10px;width:auto;min-height:56px;margin:8px 16px 0;   /* 七·24: 左右边距16pt与下方卡片对齐 */
  padding:10px 12px;background:var(--card);border:1px solid var(--border);border-radius:12px;
  cursor:pointer;font-family:inherit;text-align:left;color:var(--text);
  -webkit-tap-highlight-color:transparent;
}
.assist-entry-card:active{background:var(--bar-bg)}
.ae-ico{
  flex-shrink:0;width:36px;height:36px;border-radius:10px;display:flex;align-items:center;justify-content:center;
  background:var(--accent);color:#fff;
}
.ae-ico svg{width:20px;height:20px;display:block}
.ae-txt{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.ae-name{font-size:16px;font-weight:600;line-height:1.2}
.ae-sub{font-size:12px;color:var(--sub);line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ae-arrow{flex-shrink:0;font-size:18px;color:var(--sub);line-height:1}
/* 动画放慢（老板 20260865：首页不再急促） */
#screen-overview .status-dot.online{animation-duration:3.2s}
@media(max-width:360px){
  .cs-val{font-size:12px}
  /* 20260875 二修① + 20260890 #84：不覆盖像素图高度，窄屏沿用基础 aspect-ratio 1:2 + CSS 变量预算 max-height，保持竖屏比例不裁剪 */
}

/* ===== 20260818 5-Tab 导航：Tab 文字规格以 mobile.css .tab 为唯一权威（11px/字重500/line-height 1.05）。
     此处不再覆盖字号/行高/颜色（旧 17px 图标字号、10px 文字、line-height 1.2 覆盖已删，杜绝层级打架），仅保留 badge 定位 ===== */
.tab .tab-badge{top:4px;right:8px}

/* ===== 包E：机器详情 8 台切换条（横向胶囊，当前机高亮、异常红灰，角标=当前机 序号/总数） ===== */
.detail-switcher{display:flex;align-items:center;gap:8px;padding:8px 16px;background:var(--card);border-bottom:1px solid var(--border);flex-shrink:0}   /* 老板08-18·四·五·六: 左右边距16pt统一, 原12px */
.ds-badge{flex-shrink:0;font-size:11px;font-weight:700;color:var(--accent);background:var(--accent-soft);border:1px solid var(--accent-border);border-radius:14px;padding:3px 9px;white-space:nowrap}
.ds-scroll{flex:1;min-width:0;display:flex;gap:6px;overflow-x:auto;-webkit-overflow-scrolling:touch}
.ds-scroll::-webkit-scrollbar{display:none}
.ds-chip{flex-shrink:0;display:inline-flex;align-items:center;gap:5px;padding:6px 12px;border:1px solid var(--border);background:var(--bar-bg);color:var(--sub);border-radius:16px;font-size:12px;font-weight:600;cursor:pointer;min-height:32px;font-family:inherit}
.ds-chip .ds-dot{width:7px;height:7px;border-radius:50%;background:var(--border);flex-shrink:0}
.ds-chip.online .ds-dot{background:var(--online)}
.ds-chip.offline .ds-dot{background:var(--offline)}
.ds-chip.offline{color:var(--offline)}
.ds-chip.active{background:var(--accent-grad);color:#fff;border-color:var(--accent)}
.ds-chip.active .ds-dot{background:#fff}
/* 该机群消息入口：强化可点性（绿软底实心钮，与 term-btn 同语义） */
.msgs-btn{width:100%;min-height:44px;background:var(--accent-soft);color:var(--accent);border:1px solid var(--accent-border);border-radius:10px;font-size:14px;font-weight:700;cursor:pointer;font-family:inherit}
.msgs-btn:active{border-color:var(--accent)}

/* ===== 20260876 实测补充：首页下拉刷新指示器（#pullHint 位于 topbar 下、内容顶；height:0 不占位，
   内层药丸默认上移+透明隐藏，JS 下拉 translateY 跟随位移、松手超阈值触发刷新） ===== */
.pull-hint{
  position:relative;height:0;overflow:visible;display:flex;justify-content:center;
  z-index:30;pointer-events:none;will-change:transform;
}
.pull-hint .ph-inner{
  display:flex;align-items:center;gap:6px;margin-top:4px;padding:6px 14px;border-radius:16px;
  background:rgba(15,23,42,.78);color:#fff;font-size:12px;line-height:1;white-space:nowrap;
  box-shadow:0 2px 8px rgba(0,0,0,.28);opacity:0;transition:opacity .18s;
}
.pull-hint.show .ph-inner{opacity:1}
.pull-hint.will .ph-txt{color:#a5d6a7;font-weight:700}
.pull-hint.loading .ph-arrow{animation:phSpin .8s linear infinite}
.pull-hint .ph-arrow{display:inline-block;font-size:13px;transition:transform .15s}
@keyframes phSpin{from{transform:rotate(0)}to{transform:rotate(360deg)}}

/* ===== 20260876 实测补充：深夜图星光闪烁层（星点 i 由 overview.js 生成 25~35 颗，随机 top/left+错峰 delay/时长）。
   绝对定位覆于双图之上：z3 介于 img2(z2) 与 band(4)/flow(5) 之间、低于小人 sp(z6) 不遮挡；
   transform/opacity 驱动动画低开销。仅深夜图(.night)强显示，白天近隐（opacity .15）。 ===== */
.pixel-office .stars{position:absolute;inset:0;z-index:3;pointer-events:none;opacity:1}
.pixel-office:not(.night) .stars{opacity:.15}
.pixel-office .stars i{
  position:absolute;width:2px;height:2px;border-radius:50%;background:#fff;
  box-shadow:0 0 4px rgba(255,255,255,.85);
  animation:twinkle 2.4s ease-in-out infinite;
}
@keyframes twinkle{0%,100%{opacity:.15}50%{opacity:.95}}
