@charset "UTF-8";
/* =============================================================================
   模块：toolbar（底部工具栏 · 手机横屏右侧竖栏）—— W10 紧凑化
   -----------------------------------------------------------------------------
   爷爷的要求：「把这些按钮组件 都做成 一个工具栏 放在底部上面位置 每个按钮都有自己的交互音效动效」；
   W10 追加：「图2横屏工具栏就做在右侧 不够简约啊 太大了 组件不够精简 紧凑」。
   载入顺序：index.html 里紧随 controlpad.css（同源外链；CSP = style-src 'self'，零内联样式）。
   DOM 真源：工具栏骨架由 modules/toolbar/ui.js 在运行时用 createElement 建（index.html 不写死容器）：
     #dv-toolbar.dv-toolbar > [#dv-toolbar-fold + .dv-toolbar-bar > 分组…]
     分组 div.dv-toolbar-group[data-group=view|play|scan|war|bag|chat]（玩法组额外带 console 类），
     槽 div.dv-toolbar-slot[data-slot=…]，组间 span.dv-toolbar-sep。
   同一套 DOM 的三种形态（只换排版）：
     ① 桌面（默认 01~07 段）   底部居中，整条高 44px（硬指标 ≤46）
     ② 手机竖屏（08 段）       底部居中、抬到行走摇杆之上，整条高 71px（≤72）
     ③ 手机横屏（09 段）       贴右侧的 2 列 × 5 行紧凑竖栏（宽 78px、无皮肤悬浮片），避让 #dock / #cam-pad
   权重口径：凡是盖别的模块（scan / bag / war / chat 的浮标按钮）或反过来被它们的 ID 规则盖的地方，
   一律用 #dv-toolbar … 前缀（≥ (1,1,0)）；按钮自己的 ID 规则（#grid / #play / #dv-*-btn）用
   #dv-toolbar #id（≥ (2,0,0)）提权 —— 那些 CSS 是运行时动态插入的，加载顺序不可靠。
   动效只用 transform / opacity；按压 keyframes 见第 07 段。
   ========================================================================== */

/* 00 对外发布的尺寸变量（契约 §二 A1×A2 接口：聊天条靠它们避让） ----------------
   --dv-tb-reserve-bottom  底部居中形态要从屏幕底边空出来的高度口径
      桌面  22(底距) + 58(旧条高口径) + 12(间隙) = 92（条高已压到 44，余量只会更安全）
      竖屏  安全区 + 240(坞边距 + 坞高 + 提示) + 82(条高口径) + 12
      横屏  0（横屏工具栏在右侧，不占底部）
   --dv-tb-reserve-right   右侧要空出来的宽度口径
      桌面 / 竖屏 0
      横屏  右栏宽 78 + 右边距 6 + 间隙 8 = 92（再加安全区；W18 去皮肤后 83 → 78）
   使用者（chat.css）一律带 fallback，不假设这两个变量一定存在。 */
:root{
  --dv-tb-reserve-bottom:92px;
  --dv-tb-reserve-right:0px;
}

/* 01 容器：桌面 bottom:22px，底部居中，悬在底部之上（W10：整条 44px） --------- */
#dv-toolbar{
  position:fixed;left:50%;bottom:22px;transform:translateX(-50%);z-index:9;
  display:flex;align-items:center;justify-content:center;
  max-width:calc(100vw - 24px);padding:4px 5px;border-radius:14px;
  background:#0e0b14b8;border:1px solid #b482ff1f;
  box-shadow:0 10px 26px #00000059,inset 0 1px 0 #ffffff0a;
  -webkit-backdrop-filter:blur(12px) saturate(125%);backdrop-filter:blur(12px) saturate(125%);
  transition:opacity .9s,transform .9s;
}
/* 没进世界：跟 header / footer 一样淡出并让开指针（#entry 遮罩 z-index:10 本来也盖住它）。
   app.js 的 worldControls() 还会给 #dv-toolbar 挂 inert（body>#dv-toolbar 在它的选择器里）。 */
body:not(.in-world) #dv-toolbar{opacity:0;transform:translate(-50%,14px);pointer-events:none}

/* 02 一条横排（bar）/ 分组 / 分隔符 / 槽 ------------------------------------ */
#dv-toolbar .dv-toolbar-bar{display:flex;align-items:center;justify-content:center;flex-wrap:nowrap;gap:3px;min-width:0}
#dv-toolbar .dv-toolbar-group{display:flex;align-items:center;gap:3px;min-width:0;padding:0;margin:0}
#dv-toolbar .dv-toolbar-sep{flex:0 0 auto;width:1px;height:18px;margin:0 3px;border-radius:1px;background:#b482ff26}
#dv-toolbar .dv-toolbar-sep.is-off{display:none}          /* 空槽两侧的分隔符由 ui.js 折叠掉 */
/* 槽：空槽不塌（min-height 撑住工具栏高度）、不占宽（:empty 收成 0 宽）；槽内节点一律吃工具栏的排布 */
#dv-toolbar .dv-toolbar-slot{display:flex;align-items:center;gap:3px;min-height:34px;min-width:0;flex:0 1 auto}
#dv-toolbar .dv-toolbar-slot:empty{width:0;height:34px;padding:0;margin:0;overflow:hidden}
/* 视角 / 玩法 / 侦查 / 资产 / 社交：素材容器留白收干净 */
#dv-toolbar .dv-toolbar-group[data-group="scan"],#dv-toolbar .dv-toolbar-group[data-group="war"],
#dv-toolbar .dv-toolbar-group[data-group="bag"],#dv-toolbar .dv-toolbar-group[data-group="chat"]{padding:0}

/* 03 视角组（#grid / #zoom-out / #zoom-in / #home 从 body > .tools 搬进来） ---
   34×34 是「可点性红线」的下限（契约 §3.1），原来 39×39 是爷爷说「太大」的来源之一。 */
#dv-toolbar #grid,#dv-toolbar #zoom-in,#dv-toolbar #zoom-out,#dv-toolbar #home{
  flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;
  width:34px;height:34px;min-width:34px;padding:0;margin:0;border:0;border-radius:10px;
  background:transparent;color:#c3aadf;font-size:17px;line-height:1;
  transition:background .18s,color .18s;
}
#dv-toolbar #grid:hover,#dv-toolbar #zoom-in:hover,#dv-toolbar #zoom-out:hover,#dv-toolbar #home:hover{
  background:#b482ff1f;color:#e9d8ff;
}
#dv-toolbar #grid[aria-pressed="true"]{color:#e1bdff;background:#b482ff19}
/* 搬空之后的 body > .tools（原右侧竖排 FAB 列）：整块隐藏，原位置不留空洞。
   style.css 给它的毛玻璃底 + mobile.css 的 2×2 排布都不会再显形（本表最后加载，同权重靠后生效）。 */
body > .tools{display:none}

/* 04 玩法组：从 header 的 .console 搬进来，外壳还原成按钮，下拉翻到工具栏上方 ----
   .dv-toolbar-play 自带 console 类，面板皮肤 / 方向键 / chevron 旋转全留在 controlpad.css，
   这里只把「一整块控制台」的外壳（底色 / 边框 / 内距 / 模糊）抹平。 */
#dv-toolbar .dv-toolbar-group.console{
  position:relative;gap:0;min-width:0;max-width:none;padding:0;margin:0;border:0;border-radius:0;
  background:none;box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none;
}
#dv-toolbar .console .play-menu{
  top:auto;bottom:calc(100% + 10px);left:auto;right:0;z-index:12;
  width:min(216px,calc(100vw - 28px));
  transform-origin:bottom right;transform:translateY(6px) scale(.96);   /* 从下往上冒（原来是从上往下落） */
}
#dv-toolbar .console #play[aria-expanded="true"]~#play-menu{transform:none}

/* 05 落位进槽的浮标按钮 + 玩法主按钮：定位交给工具栏（它们各自的 fixed 全部作废），高度统一 34px */
#dv-toolbar .dv-toolbar-slot > *{
  position:static;inset:auto;left:auto;right:auto;top:auto;bottom:auto;transform:none;
  height:34px;min-height:34px;padding:0 10px;margin:0;border-radius:11px;
  font-size:12px;
  flex:0 1 auto;min-width:0;max-width:100%;white-space:nowrap;
}
#dv-toolbar .dv-toolbar-slot > *:hover{transform:none}
#dv-toolbar #play{height:34px;min-height:34px;padding:0 10px;font-size:12px;border-radius:11px}
/* war.css 的战争按钮是贴左边缘的半胶囊（border-left:none / 单边圆角），进工具栏后补齐左边框 */
#dv-toolbar #dv-war-btn{border-left:1px solid #ffffff29}

/* 06 折叠按钮：组件右上角一枚小圆点；折起来后它就是那颗「小圆点」（任何断点 ≤32px） --- */
#dv-toolbar-fold{
  position:absolute;top:-11px;right:-11px;z-index:3;
  display:inline-flex;align-items:center;justify-content:center;
  width:24px;height:24px;min-width:24px;padding:0;margin:0;border-radius:50%;
  border:1px solid #b482ff33;background:#160f26f2;color:#c6aee3;
  font-size:11px;line-height:1;transition:background .18s,color .18s;
}
#dv-toolbar-fold:hover{background:#241a36;border-color:#b482ff80;color:#ecdcff}
body.dv-toolbar-folded #dv-toolbar{width:32px;height:32px;padding:0;border-radius:50%}
body.dv-toolbar-folded #dv-toolbar .dv-toolbar-bar{display:none}
body.dv-toolbar-folded #dv-toolbar-fold{
  position:static;width:32px;height:32px;min-width:32px;border:0;background:transparent;
  font-size:12px;
}

/* 07 按压动效（契约 §四）：任何带 data-sound 的元素，命中就拿到 .dv-press -----
   用 :is(#dv-toolbar,body) 把权重抬到 ID 级：免得被各模块自己的 ID 规则
   （例如 #dv-scan-btn.dv-scanning 的呼吸动画）压掉。320ms，缩放 0.92 + 一圈微光。 */
@keyframes dv-press{
  0%{transform:scale(1);box-shadow:0 0 0 0 #b482ff00}
  35%{transform:scale(.92);box-shadow:0 0 0 5px #b482ff2e,0 0 20px #b482ff4d}
  100%{transform:scale(1);box-shadow:0 0 0 0 #b482ff00}
}
:is(#dv-toolbar,body) [data-sound].dv-press{animation:dv-press 320ms cubic-bezier(.22,1,.36,1) both}
/* 降低动效：style.css 有全局 animation:none!important（动画与过渡全禁），所以：
   ① .dv-press 不再有动画效果；② 按压反馈改由 :active 给「瞬时压暗」——:active 由浏览器自己收，
   不依赖 animationend，天生不会卡住（.dv-press 也不会因此长期挂在按钮上：ui.js 另有 480ms 兜底摘除）。 */
@media (prefers-reduced-motion:reduce){
  :is(#dv-toolbar,body) [data-sound].dv-press{animation:none}
  :is(#dv-toolbar,body) [data-sound]:active{opacity:.55}
}

/* 08 手机竖屏：避开底部行走摇杆（#dock / #stick）与其上方的状态带 / 比例尺 / #hint
   几何：safe-area + 坞边距(12) + 坞高(152) + 76。76 = #hint(≈16) + 状态带两行(≈34) + 两道间隙(≈26)，
   也就是说工具栏整体落在「坞 + 状态带 + 提示行」之上的空档里，永不压住摇杆与任何文字。
   W10：两行各 30px + 两道 3px 缝 + 3/3 内距 + 2 边框 = 71px（硬指标 ≤72，旧值 82）。 */
@media (max-width:700px), (pointer:coarse) and (hover:none) and (max-width:1024px){
  :root{
    --dv-tb-reserve-bottom:calc(env(safe-area-inset-bottom,0px) + 240px + 82px + 12px);
    --dv-tb-reserve-right:0px;
  }
  #dv-toolbar{
    left:calc(env(safe-area-inset-left) + 10px);
    right:calc(env(safe-area-inset-right) + 10px);
    bottom:calc(env(safe-area-inset-bottom) + var(--dock-edge,12px) + var(--dock-h,152px) + 76px);
    transform:none;max-width:none;padding:3px 6px;border-radius:14px;
  }
  #dv-toolbar .dv-toolbar-bar{flex-wrap:wrap;gap:3px}
  body:not(.in-world) #dv-toolbar{transform:translateY(14px)}
  html body.dv-toolbar-folded #dv-toolbar{left:50%;right:auto;transform:translateX(-50%)}
  #dv-toolbar #grid,#dv-toolbar #zoom-in,#dv-toolbar #zoom-out,#dv-toolbar #home{
    width:28px;height:28px;min-width:28px;border-radius:9px;font-size:15px;
  }
  #dv-toolbar .dv-toolbar-slot{min-height:30px;gap:3px}
  #dv-toolbar .dv-toolbar-slot > *,#dv-toolbar .dv-toolbar-bar > .dv-toolbar-group > button{
    height:30px;min-height:30px;padding:0 8px;font-size:11px;border-radius:9px;
  }
  #dv-toolbar #play{height:30px;min-height:30px;padding:0 9px;font-size:11px;border-radius:9px}
  #dv-toolbar .dv-toolbar-sep{height:16px;margin:0 2px}
  #dv-toolbar-fold{top:-22px}
}

/* 08b 竖屏窄屏（≤340px）：只把内距 / 缝再收一点，保证「视角+玩法+侦查」稳在两行里（不动字号与按钮尺寸） */
@media (max-width:340px){
  #dv-toolbar{padding:2px 5px}
  #dv-toolbar .dv-toolbar-bar{gap:2px}
  #dv-toolbar .dv-toolbar-slot > *,
  #dv-toolbar .dv-toolbar-bar > .dv-toolbar-group > button{padding:0 6px}
  #dv-toolbar #play{padding:0 7px}
}

/* 08c 矮屏竖屏（≤640px 高，如 360×640 / 320×568，与 mobile.css §10b 同一档）：
   两行各 28px + 两道 2px 缝 + 内距 4 + 边框 2 = 整条 64px（原 71）；
   位置仍抬在「坞 + 状态带 + 提示」之上（76 的算法不变，只是坞自己矮了 32）。
   爷爷：「太大了 组件不够精简 紧凑」。下限 26px 的依据：触控可点性红线是 34（桌面口径），
   矮屏优先保「地图面积」，28 = 竖屏档「视角四键 28×28」的同一条可点性口径（见 ㉚ 的几何模型）。 */
@media (max-width:700px) and (max-height:640px), (pointer:coarse) and (hover:none) and (max-width:1024px) and (max-height:640px){
  :root{--dv-tb-reserve-bottom:calc(env(safe-area-inset-bottom,0px) + 130px + 76px + 64px + 12px)}
  #dv-toolbar{
    bottom:calc(env(safe-area-inset-bottom) + var(--dock-edge,10px) + var(--dock-h,120px) + 76px);
    padding:2px 5px;border-radius:12px;
  }
  #dv-toolbar .dv-toolbar-bar{gap:2px}
  #dv-toolbar .dv-toolbar-slot{min-height:28px;gap:2px}
  #dv-toolbar .dv-toolbar-slot > *,#dv-toolbar .dv-toolbar-bar > .dv-toolbar-group > button{
    height:28px;min-height:28px;padding:0 7px;font-size:10.5px;border-radius:8px;
  }
  #dv-toolbar #play{height:28px;min-height:28px;padding:0 8px;font-size:10.5px;border-radius:8px}
  #dv-toolbar #grid,#dv-toolbar #zoom-in,#dv-toolbar #zoom-out,#dv-toolbar #home{
    width:28px;height:28px;min-width:28px;border-radius:8px;font-size:14px;
  }
  #dv-toolbar .dv-toolbar-sep{height:16px;margin:0 2px}
  #dv-toolbar-fold{top:-20px}
}
/* 09 手机横屏（触屏横屏，任意高度）：工具栏从底部搬到**右侧紧凑竖栏** ---------------
   W18 · 车 I 收口（爷爷：「图2横屏工具栏就做在右侧 不够简约啊 太大了 组件不够精简 紧凑」「遮挡啊」）
   -----------------------------------------------------------------------------
   形态：贴右（安全区右 + 6px）、App 条下方 6px 起，2 列 × 5 行的**无皮肤悬浮小圆片**。
     · 容器不再画「深色圆角黑板」（底色 / 边框 / 阴影 / 模糊全拿掉）——
       视觉占地 = 10 枚小片本身（2×34 + 缝 2 = 70 宽），比 W10 那块 83 宽的面板更瘦更素；
     · 行高 clamp(22px,(100dvh − 摇杆直径 − 96px)/5,34px) 反解，底边永远停在 #cam-pad 顶边之上；
     · 折叠把手从「左上角外挂」挪到「左缘中点」：W10 的 top:-9px 会顶进 App 条，
       与声音 / 横屏 / 离开三键在视觉上打架（爷爷截图里的「遮挡」之一）。
   门控为什么放宽：W10 写死 max-height:560px，横屏但更高的机器（1024×587、平板横屏）
   会掉回「底部居中」档 —— 那块三行控制面板正好压在玩家点与地图中线上（爷爷图2）。
   现在「横屏 + 粗指针」一律贴右；底部那套双摇杆 / 底部坞仍由 mobile.css 13 段按
   max-height:560px 自己退让，两套布局互不干扰（09b 只负责给聊天条留够底部空档）。
   -----------------------------------------------------------------------------
   W10 / W11 既有口径（一字未改）：分组 / 槽 display:contents；分隔符 display:none；
   .dv-toolbar-bar 必须同时写 grid-template-columns 与 grid-template-rows
   （只写列流向 + auto-rows 会把 10 键铺成 10 个隐式列 —— W11 线上事故）；
   文案收成 ::before 的一枚单字（data-dv-short），完整中文留在 DOM / aria-label；
   玩法下拉弹在栏左侧（右栏狭窄，弹到右边就出屏）。 */
@media (orientation:landscape) and (pointer:coarse){
  :root{
    /* 横屏工具栏不在底部 → 底部预留改成「坞顶 + 8」（聊天条落在坞上面，不许被坞压住） */
    --dv-tb-reserve-bottom:calc(env(safe-area-inset-bottom,0px) + 172px);
    /* 右栏：栏宽 78 + 右边距 6 + 间隙 8 = 92 */
    --dv-tb-reserve-right:calc(env(safe-area-inset-right,0px) + 92px);
  }

  #dv-toolbar{
    /* 格子宽 / 行高只在本组件里用；声明在 #dv-toolbar（body 的后代）上，
       var(--lap-pad) 才拿得到 mobile.css 定义在 body 的真实摇杆直径
       （自定义属性在声明处就替换 var()，写在 :root 会永远吃 fallback 138px）。 */
    --dv-tb-lap-w:34px;
    --dv-tb-lap-gap:2px;
    --dv-tb-lap-pad:3px;
    --dv-tb-lap-row:clamp(22px,calc((100dvh - var(--lap-pad,138px) - 96px) / 5),34px);
    left:auto;right:calc(env(safe-area-inset-right) + 6px);
    top:calc(env(safe-area-inset-top) + var(--appbar-h,46px) + 6px);bottom:auto;
    display:block;transform:none;max-width:none;
    /* border-box 口径：2 列 34 + 中缝 2 + 左右内距 6 + 边框 2 = 78（≤108「两列小图标」上限） */
    width:calc(2 * var(--dv-tb-lap-w) + var(--dv-tb-lap-gap) + 2 * var(--dv-tb-lap-pad) + 2px);
    padding:var(--dv-tb-lap-pad);border-radius:16px;
    /* W18 去皮肤：这一块原来是「深色圆角大黑板」，也是爷爷说「太大 / 不够简约」的主体 */
    background:none;border:0;box-shadow:none;
    -webkit-backdrop-filter:none;backdrop-filter:none;
    transition:width .28s cubic-bezier(.2,.8,.2,1),height .28s cubic-bezier(.2,.8,.2,1),border-radius .28s,opacity .35s,transform .35s;
  }
  body:not(.in-world) #dv-toolbar{transform:translateX(18px)}
  #dv-toolbar .dv-toolbar-bar{
    display:grid;grid-template-columns:repeat(2,var(--dv-tb-lap-w));
    grid-auto-flow:column;grid-template-rows:repeat(5,var(--dv-tb-lap-row));
    grid-auto-rows:var(--dv-tb-lap-row);align-items:stretch;
    column-gap:var(--dv-tb-lap-gap);row-gap:var(--dv-tb-lap-gap);width:100%;min-width:0;
  }
  /* 分组 / 槽在横屏不再产生盒子：里面的按钮直接变成上面那张 2×5 网格的格子 */
  #dv-toolbar .dv-toolbar-group,#dv-toolbar .dv-toolbar-slot{display:contents}
  #dv-toolbar .dv-toolbar-sep{display:none}
  /* 折叠态：只剩一枚 32px 小圆点。去皮肤之后必须把底子加回来，否则那颗点自己也隐形了 */
  html body.dv-toolbar-folded #dv-toolbar{width:32px;height:32px;padding:0;border-radius:50%;
    left:auto;right:calc(env(safe-area-inset-right) + 6px);transform:none;
    background:#160f26f2;border:1px solid #b482ff33}
  html body.dv-toolbar-folded #dv-toolbar .dv-toolbar-bar{display:none}
  /* 宽屏触控（>1024：mobile.css 整体不生效，header 走桌面档「top 35 + 高 48」）：
     var(--appbar-h,46px) 的兜底 46 会让右栏顶到 header 右上角的声音 / 横屏 / 离开三键上，
     这里把真实值补上（量具实测 header 底边 83，见 work/verify/w18-i-layout.json）。 */
  @media (min-width:1025px){body{--appbar-h:83px}}
  #dv-toolbar-fold{top:calc(50% - 12px);left:-12px;right:auto}
  /* 格子：34px 宽、行高自适应；文字收起来，只留 ::before 的一枚单字 / 符号
     （用 ::before 而不是 ::after：scan.css 的冷却环是 #dv-scan-btn.dv-cooling::after，
      两者要能同时在 —— 环继续画，单字也不被 conic-gradient 的 mask 啃掉） */
  #dv-toolbar .dv-toolbar-bar > button,
  #dv-toolbar .dv-toolbar-group > button,
  #dv-toolbar .dv-toolbar-slot > *{
    display:inline-flex;align-items:center;justify-content:center;gap:0;
    width:100%;min-width:0;height:auto;min-height:0;padding:0;margin:0;
    border-radius:11px;font-size:0;line-height:1;
  }
  #dv-toolbar #grid,#dv-toolbar #zoom-in,#dv-toolbar #zoom-out,#dv-toolbar #home{
    width:100%;height:auto;min-width:0;border-radius:11px;font-size:0;
    /* W18：容器去皮肤后，视角四键必须自带底色 —— 第 03 段给的是 transparent，
       少了这一条它们在横屏会变成「看不见但点得到」的隐形按钮 */
    background:#160f26b3;border:1px solid #b482ff21;
  }
  #dv-toolbar #play{width:100%;height:auto;min-height:0;padding:0;font-size:0;border-radius:11px}
  #dv-toolbar .dv-toolbar-bar > button{position:relative}
  #dv-toolbar .dv-toolbar-bar > button::before{
    content:attr(data-dv-short);font-size:14px;line-height:1;color:inherit;
  }
  /* W11 根因之二（线上实测复现）：DOM 里按钮挂在 bar > group > button 或 bar > group > slot > button 上，
     分组 / 槽只声明了 display:contents —— 那只改盒子生成、不改 DOM 树 —— 所以上面两条 `> button`
     直接子代选择器一个都命中不了：单字从未渲染、槽内 <i> 图标也没被收起（线上「空糊块」的另一半）。
     下面补齐真实路径；原直接子代写法原样保留，既有单测 / 对外契约口径不变。 */
  #dv-toolbar .dv-toolbar-group > button,
  #dv-toolbar .dv-toolbar-slot > *{position:relative}
  #dv-toolbar .dv-toolbar-group > button::before,
  #dv-toolbar .dv-toolbar-slot > *::before{
    content:attr(data-dv-short);font-size:14px;line-height:1;color:inherit;
  }
  /* 自带图标 / 文案 / 状态点：横屏全收起来（单字由 ::before 负责）；
     同样要覆盖 group / slot 两条真实路径，否则槽内按钮的 <i> 图标会和单字一起挤进 34px 格子。 */
  #dv-toolbar .dv-toolbar-bar > button > i,
  #dv-toolbar .dv-toolbar-bar > button > b,
  #dv-toolbar .dv-toolbar-bar > button > u,
  #dv-toolbar .dv-toolbar-bar > button > span,
  #dv-toolbar .dv-toolbar-group > button > i,
  #dv-toolbar .dv-toolbar-group > button > b,
  #dv-toolbar .dv-toolbar-group > button > u,
  #dv-toolbar .dv-toolbar-group > button > span,
  #dv-toolbar .dv-toolbar-slot > * > i,
  #dv-toolbar .dv-toolbar-slot > * > b,
  #dv-toolbar .dv-toolbar-slot > * > u,
  #dv-toolbar .dv-toolbar-slot > * > span:not(.dv-scan-cd){display:none}
  /* A-4 硬保证：上面最后一条用 :not(.dv-scan-cd) 把冷却读秒排除在外 —— 横屏档里没有任何
     display:none 规则能命中 .dv-scan-cd；下面再钉一道显式可显示（scan.css 那条 (1,2,0) 本来就赢）。 */
  #dv-toolbar #dv-scan-btn.dv-cooling .dv-scan-cd{display:inline-block}
  /* 计数徽标（行囊「有新物品」/ 战争「有战报」）缩成 6px 小圆点，不占单字位 */
  #dv-toolbar .dv-toolbar-bar > button > span[id],
  #dv-toolbar .dv-toolbar-group > button > span[id],
  #dv-toolbar .dv-toolbar-slot > * > span[id]{
    display:block;position:absolute;top:3px;right:3px;
    min-width:0;width:6px;height:6px;padding:0;border-radius:50%;
    background:#5ad1ff;color:transparent;font-size:0;overflow:hidden;
  }
  #dv-toolbar .dv-toolbar-bar > button > span[id][hidden],
  #dv-toolbar .dv-toolbar-group > button > span[id][hidden],
  #dv-toolbar .dv-toolbar-slot > * > span[id][hidden]{display:none}
  #dv-toolbar #dv-stealth-btn[aria-pressed="true"]{background:#0c2020;border-color:#78ffd28c;color:#bcffe9}
  /* 玩法下拉：弹在栏**左侧**（right:100% + 8px）、垂直居中，绝不出屏 */
  #dv-toolbar .console .play-menu{
    top:50%;bottom:auto;left:auto;right:calc(100% + 8px);
    width:min(216px,calc(100vw - 140px));
    transform-origin:100% 50%;transform:translate(6px,-50%) scale(.96);
  }
  #dv-toolbar .console #play[aria-expanded="true"]~#play-menu{transform:translate(0,-50%)}
}
/* 09b 短横屏（≤560px，命中 mobile.css 13 段双摇杆档）：底部是两枚摇杆而不是坞面板，
   聊天条由 chat.css 自己挪到摇杆上方，底部预留清零（长横屏的 172px 在这里作废）。 */
@media (orientation:landscape) and (pointer:coarse) and (max-height:560px){
  :root{--dv-tb-reserve-bottom:0px}
}
