/* ════════════════════════════════════════════════════════════════
   v10 设计令牌（2026-10-24）——唯一来源。
   规则：组件里不许再写 hex / rgba 字面量，不许写 9.5px 这种半步字号。
   色：会议应用的浅色外壳 + 深色视频舞台；主色 Zoom 蓝 #2D8CFF。
   字：Inter / Helvetica Neue / Segoe UI + Noto Sans SC。
   ════════════════════════════════════════════════════════════════ */
/*
 * 字号令牌同时挂 :root：v5-shell.js 给 body 加 .v5 之前 CSS 就已经生效，
 * 只挂 body.v5 会让首帧的 var(--fs-*) 失效、退化成 16px 再跳变。
 */
:root{--fs-1:11px;--fs-2:12px;--fs-3:13px;--fs-4:14px;--fs-5:16px;--fs-6:18px;--fs-7:22px;--fs-8:28px}

body.v5{
  --bg:#F6F7F9;--bg-2:#FFFFFF;--panel:#FFFFFF;--panel-2:#F1F4F8;--panel-3:#E8EDF3;
  --line:#E2E7ED;--line-soft:#EDF1F5;--line-strong:#C9D1DC;

  /*
   * 2026-10-25 巡检：--faint #8A95A2 在 #F6F7F9 上只有 2.84:1（11px 小字看不清），
   * 承担文字的蓝 #2D8CFF 配白字只有 3.33:1。按 WCAG 调到 4.5:1 以上：
   *   --faint → #6B7280（4.51） / --muted → #565F6B（6.04）
   *   --lamp 仍留给描边/进度/圆点，文字与按钮底色用 --lamp-strong #1B6FD0（白字 4.96）
   */
  --text:#0F141A;--text-2:#3D4652;--muted:#565F6B;--faint:#6B7280;

  --lamp:#2D8CFF;--lamp-strong:#1B6FD0;--lamp-ink:#FFFFFF;
  /* 文字级蓝：--lamp-strong 压在 --lamp-soft 浅蓝底上只有 4.16:1，仍不够 4.5，再深一档 */
  --lamp-text:#1257A8;
  --lamp-soft:rgba(45,140,255,.10);--lamp-line:rgba(45,140,255,.30);

  /* 对比度：#E5484D 在 11px 小字/白底上只有 3.9，软底(3.19)，均低于 4.5；提到 #C2262C 后为 5.9 / 4.7 */
  /* --ok #16A34A 在浅底上 11px 小字只有 3.0:1，文字/状态位用加深的 --ok-strong（5.7:1） */
  --danger:#C2262C;--ok:#16A34A;--ok-strong:#12703A;--warn:#D97706;
  /* 文字级琥珀：--warn #D97706 压在浅底上只有 3.1:1，状态文字用加深版（5.3:1） */
  --warn-strong:#8A5A00;
  /* 数据可视化专用（星座图 / 拓扑边）：不是 UI 强调色，只给"分类"用 */
  --viz-violet:#7C5CFF;--viz-blue:#2D8CFF;--viz-teal:#14B8A6;

  --font-ui:"Inter","Segoe UI","Noto Sans SC","PingFang SC",system-ui,sans-serif;
  --font-display:"Inter","Helvetica Neue","Segoe UI","Noto Sans SC","PingFang SC",sans-serif;
  --font-mono:"Cascadia Mono","JetBrains Mono",Consolas,monospace;

  --fs-1:11px;--fs-2:12px;--fs-3:13px;--fs-4:14px;--fs-5:16px;--fs-6:18px;--fs-7:22px;--fs-8:28px;

  /* 旧主题里这些是被浅色硬编码的（--avatar-bg 是 #e9e4d8）：v5 下不覆盖就会出现奶白圆头像与白边卡片 */
  --avatar-bg:var(--panel-2);
  --bar-bg:rgba(246,243,236,.86);
  --hairline:rgba(23,20,15,.10);
  --hairline-strong:rgba(23,20,15,.18);
  --tint:rgba(23,20,15,.025);
  --tint-2:rgba(23,20,15,.05);
  --scrim:rgba(23,20,15,.55);

  --r-sm:6px;--r:10px;--r-lg:14px;
  --shadow:0 18px 44px -30px rgba(15,20,26,.22);
  --stage:#17191D;--stage-2:#22262D;--stage-line:#333A44;--stage-text:#F4F6F9;

  background:var(--bg);color:var(--text);
  font-family:var(--font-ui);-webkit-font-smoothing:antialiased;
  color-scheme:light;
}
body.v5 .app{display:grid;grid-template-columns:236px minmax(0,1fr) 300px;grid-template-rows:minmax(0,1fr);height:100dvh;overflow:hidden;background:var(--bg)}
body.v5 .sidebar{display:flex;flex-direction:column;gap:10px;min-height:0;overflow-y:auto;padding:14px 10px 10px;background:var(--bg-2);border-right:1px solid var(--line-soft)}
body.v5 .sidebar .brand{padding:0 8px 10px;gap:8px}
body.v5 .sidebar .brand-name{font-size:var(--fs-4);font-weight:600;color:var(--text)}
body.v5 .sidebar .brand-lamp{width:9px;height:9px;border-radius:50%;background:var(--lamp);box-shadow:0 0 0 4px rgba(200,68,42,.09)}
body.v5 .sidebar .head-primary{display:flex;flex-direction:column;gap:6px}
body.v5 .sidebar .head-primary .primary-btn{width:100%;height:36px;justify-content:center;border-radius:8px;font-size:var(--fs-3);font-weight:600;background:var(--text);color:var(--bg)}
body.v5 .sidebar .head-primary .ghost-btn{width:100%;height:32px;justify-content:center;border-radius:10px;font-size:var(--fs-2);color:var(--text-2);border:1px solid var(--line);background:transparent}
body.v5 .sidebar .head-meeting{display:flex;flex-wrap:wrap;gap:6px;max-width:none;padding:8px;border-top:1px solid var(--line-soft)}
body.v5 .sidebar .meeting-title{font-size:var(--fs-2);font-weight:500;color:var(--text-2);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
body.v5 .sidebar .status-badge,body.v5 .sidebar .round-badge{font-size:var(--fs-1);height:18px;padding:0 6px;border-radius:6px;border:1px solid var(--line);color:var(--muted);background:transparent}
body.v5 #mode-seg{display:none}
body.v5 .sidebar .head-actions{display:flex;flex-direction:column;align-items:stretch;gap:1px;flex-wrap:nowrap;overflow:visible;-webkit-mask-image:none;mask-image:none;padding:2px 0}
body.v5 .sidebar .head-actions .ghost-btn{width:100%;height:31px;padding:0 10px;border:0;border-radius:10px;justify-content:flex-start;text-align:left;font-size:var(--fs-2);color:var(--text-2);background:transparent}
body.v5 .sidebar .head-actions .ghost-btn:hover{background:rgba(23,20,15,.05);color:var(--text)}
body.v5 .sidebar .head-actions .audio-ctl{display:flex;align-items:center;gap:8px;padding:4px 8px}
body.v5 .sidebar .head-actions .volume{flex:1}
body.v5 .sidebar #head-more-menu{position:static;width:100%;border:0;background:transparent;padding:0}
body.v5 .sidebar #head-more-menu .ghost-btn{height:31px;justify-content:flex-start;font-size:var(--fs-2);border:0}
body.v5 .workspace{display:grid;grid-template-rows:44px 168px minmax(0,1fr) auto;min-height:0;min-width:0;background:var(--bg)}
body.v5 .topbar{display:flex;align-items:center;gap:14px;padding:0 18px;border-bottom:1px solid var(--line-soft);min-width:0}
body.v5 .tb-title{font-size:var(--fs-3);font-weight:600;color:var(--text)}
body.v5 main.stage{display:block;min-height:0;border:0;padding:0;background:var(--bg)}
body.v5 .room-pane{position:relative;height:168px;border:0;background:var(--bg);padding:0 18px}
body.v5 .table-hub{height:38px;border:0;background:transparent;padding:0;display:flex;align-items:center}
body.v5 .hub-topic{font-size:var(--fs-3);font-weight:600;color:var(--text)}
body.v5 .hub-meta{font-size:var(--fs-1);color:var(--muted);gap:6px}
body.v5 .hub-status{font-size:var(--fs-1);height:20px;padding:0 7px}
body.v5 .seats{inset:42px 18px 34px}
body.v5 .mode-hint,body.v5 .metrics-bar{position:absolute;bottom:0;left:18px;right:18px;height:28px;margin:0;display:flex;align-items:center;font-size:var(--fs-1);color:var(--faint);border:0;background:transparent}
body.v5 .metrics-bar{justify-content:flex-end}
body.v5 .mode-hint{max-width:55%}
body.v5 .stream-pane{min-height:0;display:flex;flex-direction:column;border:0;background:var(--bg);padding:0 18px}
body.v5 .stream-head{height:38px;flex:none;border-bottom:1px solid var(--line-soft);padding:0;gap:8px}
body.v5 .stream-title{font-size:var(--fs-2);color:var(--text-2)}
body.v5 .conn-badge{font-size:var(--fs-1);height:18px;padding:0 6px;border:1px solid var(--line);border-radius:6px;background:transparent;color:var(--muted)}
body.v5 .transcript{padding:12px 0 4px}
body.v5 .stream-empty{border:0;background:transparent}
body.v5 .dock{display:flex;flex-direction:column;gap:0;padding:8px 18px 12px;background:var(--bg);border-top:0}
body.v5 .voice-bar{height:22px;padding:0 4px;gap:8px;border:0;background:transparent;font-size:var(--fs-1);color:var(--faint)}
body.v5 .voice-bar .path-badge,body.v5 .voice-state{font-size:var(--fs-1);color:var(--faint);border:0;background:transparent;padding:0}
body.v5 .voice-wave{height:14px;opacity:.5}
body.v5 .dock-row{display:flex;align-items:center;gap:6px;flex-wrap:nowrap}
body.v5 .dock-left{flex:none;display:flex;gap:2px;order:0}
body.v5 .dock-left .ctl-txt,body.v5 .dock-left .ctl-caret{display:none}
body.v5 .dock-left .ctl,body.v5 .dock-left .interrupt-btn{width:32px;height:32px;padding:0;justify-content:center;border-radius:10px;border:1px solid transparent;background:transparent;color:var(--text-2)}
body.v5 .dock-left .int-kbd,body.v5 .dock-left .voice-kbd{display:none}
body.v5 .dock-left .voice-btn{width:auto;padding:0 10px;border-radius:10px;gap:6px;background:rgba(23,20,15,.04);border:1px solid var(--line)}
body.v5 .interject-form{order:1;flex:1;display:flex;align-items:center;gap:6px;border:1px solid rgba(23,20,15,.11);border-radius:14px;background:var(--panel);padding:5px 6px 5px 10px;min-height:42px}
body.v5 .interject-form:focus-within{border-color:rgba(200,68,42,.34)}
body.v5 .mat-attach{width:28px;height:28px;border:0;background:transparent;color:var(--muted)}
body.v5 .interject-input{flex:1;border:0;background:transparent;font-size:var(--fs-3);min-height:28px}
body.v5 .send-btn{height:30px;padding:0 14px;border-radius:10px;font-size:var(--fs-2);font-weight:600;background:var(--lamp);color:var(--lamp-ink)}
body.v5 .dock-right{order:2;flex:none;gap:2px}
body.v5 .dock-right .ghost-btn{height:30px;padding:0 8px;font-size:var(--fs-1);border-radius:10px;color:var(--muted);border:1px solid transparent;background:transparent}
body.v5 .rail{border-left:1px solid var(--line-soft);background:var(--bg-2);padding:14px}
body.v5 .rail-h{font-size:var(--fs-3);font-weight:600;color:var(--text)}
body.v5 .rail-empty{margin-top:12px;font-size:var(--fs-2);line-height:1.8;color:var(--muted)}
body.v5 .rail-empty span{color:var(--faint);font-size:var(--fs-1)}

/* 根因：.header 带着旧的 flex-wrap:wrap，v5 只改了 flex-direction:column；
   内容一超过视口高度（1440×749 实测），最后一块 head-actions 会**换到第二列**（x=261、sidebar scrollWidth 512），
   于是在 1920 高的屏上表现为「侧栏底部一坨工具 + 橙色音量条」，在矮屏上则整块被舞台盖住。 */
body.v5 .sidebar{flex-wrap:nowrap;overflow-x:hidden}
body.v5 .sidebar .sb-history{flex:1 1 auto;min-height:72px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:rgba(23,20,15,.14) transparent;-webkit-mask-image:linear-gradient(to bottom,#000 94%,transparent 100%);mask-image:linear-gradient(to bottom,#000 94%,transparent 100%)}
body.v5 .sidebar .sb-history::-webkit-scrollbar-button{display:none;width:0;height:0}
body.v5 .sidebar .sb-history::-webkit-scrollbar{width:6px}
body.v5 .sidebar .sb-history::-webkit-scrollbar-thumb{background:rgba(23,20,15,.14);border-radius:6px}
/* 工具区压紧：8 个入口 + 音量占 276px 会把最近会议挤到只剩 3 行 */
body.v5 .sidebar .head-actions .ghost-btn{height:24px;font-size:var(--fs-2);padding:0 8px}
body.v5 .sidebar .head-actions .audio-ctl{padding:4px 8px 0}
body.v5 .sidebar .head-actions{margin-top:auto}

/* ── 侧栏底部工具区：旧顶栏按钮被搬进来后没收拾，行高 31px + 44px 高的橙色音量条 ── */
/* 1200px 以上的屏（1920 实测）会整块露出来：按钮行距松散、「更多 ▾」的箭头换行、滑块像根进度条 */
body.v5 .sidebar .head-actions{gap:0;padding:6px 0 2px;margin-top:6px;border-top:1px solid var(--line-soft)}
body.v5 .sidebar .head-actions .ghost-btn{height:24px;font-size:var(--fs-2);color:var(--muted);white-space:nowrap;gap:6px}
body.v5 .sidebar .head-actions .ghost-btn svg{flex:none}
body.v5 .sidebar .head-actions .ghost-btn:hover{color:var(--text)}
body.v5 .sidebar .head-actions .audio-ctl{gap:6px;margin-top:6px;padding:6px 8px 2px}
body.v5 .sidebar .head-actions .volume{flex:1;width:auto;height:12px;-webkit-appearance:none;appearance:none;accent-color:rgba(200,68,42,.75);background:transparent;cursor:pointer}
body.v5 .sidebar .head-actions .volume::-webkit-slider-runnable-track{height:3px;border-radius:6px;background:rgba(23,20,15,.14)}
body.v5 .sidebar .head-actions .volume::-webkit-slider-thumb{-webkit-appearance:none;width:10px;height:10px;margin-top:-3.5px;border-radius:50%;background:var(--lamp);box-shadow:none}
body.v5 .sidebar .head-actions .volume::-moz-range-track{height:3px;border-radius:6px;background:rgba(23,20,15,.14)}
body.v5 .sidebar .head-actions .volume::-moz-range-thumb{width:10px;height:10px;border:0;border-radius:50%;background:var(--lamp)}

/* ── 修正：侧栏高度与顺序 ── */
body.v5 .sidebar .head-actions{flex:0 0 auto}
body.v5 .sidebar .head-actions .audio-ctl{order:99;margin-top:6px;padding-top:8px;border-top:1px solid var(--line-soft)}
body.v5 .sidebar .head-meeting{order:0}
/* ── 修正：输入器不溢出 ── */
body.v5 .dock-row{min-width:0}
body.v5 .interject-form{min-width:0}
body.v5 .interject-input{min-width:0}
body.v5 .dock-right{overflow:hidden;max-width:260px}
@media (max-width:1400px){ body.v5 .dock-right .ghost-btn{padding:0 6px} body.v5 #btn-stuck,body.v5 #btn-help{display:none} }
@media (max-width:1240px){ body.v5 #btn-summon,body.v5 #btn-pause{display:none} }
/* ── 修正：宫格不出舞台 ── */
body.v5 .seats{inset:40px 18px 30px;overflow:hidden}
body.v5 .room-pane{height:340px}
body.v5 .workspace{grid-template-rows:44px 340px minmax(0,1fr) auto}
/* ── 修正：发言流宽度 ── */
body.v5 .stream-pane{min-width:0;width:auto}
body.v5 .stream-empty{margin:0}
body.v5 .transcript{min-width:0}
/* ── 细节 ── */
body.v5 .sidebar .brand-name{letter-spacing:.01em}
body.v5 .sidebar .head-actions .icon-btn{width:26px;height:26px;border-radius:6px;border:1px solid var(--line)}

/* ── 精确修正（依据实测 computed style） ── */
body.v5 .sidebar{align-items:stretch}
body.v5 .sidebar .head-primary,body.v5 .sidebar .head-meeting{flex:0 0 auto;width:100%}
body.v5 .sidebar .head-actions{width:100%;justify-content:flex-start}
body.v5 .sidebar .head-actions .ghost-btn{flex:0 0 auto}
body.v5 .dock-left > *{flex:0 0 32px;width:32px;height:32px;padding:0}
body.v5 .dock-left .voice-btn{flex:0 0 auto;width:auto;padding:0 10px}
body.v5 .interject-form{flex:1 1 auto;min-width:200px}
body.v5 .stream-empty{width:100%;max-width:100%;min-height:0;height:auto;margin:0;padding:24px 0}
body.v5 .stream-pane{align-items:stretch}

/* ── 修正：空状态绝对定位要跟着发言流 ── */
body.v5 .stream-pane{position:relative}
body.v5 #stream-empty{position:absolute;inset:38px 0 0;display:flex;flex-direction:column;align-items:center;justify-content:center}
/* ── 修正：窄一点时收起次要控件，输入器才放得下 ── */
@media (max-width:1500px){
  body.v5 #btn-camera,body.v5 #btn-handsfree,body.v5 #btn-mode{display:none}
}
@media (max-width:1300px){
  body.v5 .dock-right .ghost-btn{font-size:var(--fs-1);padding:0 6px}
}

/* ── 修正：输入器整行左对齐并吃满宽度 ── */
body.v5 .dock{align-items:stretch}
body.v5 .dock-row{width:100%;justify-content:flex-start}
body.v5 .dock-right{flex:0 0 auto}

body.v5 .dock-row{align-self:stretch;width:auto;margin:0;flex:1 1 auto;min-width:0}

/* 用 grid 接管输入器，绕开 flex 布局里那条来源不明的偏移 */
body.v5 #dock{display:grid;grid-template-columns:minmax(0,1fr);justify-items:stretch;align-content:start}
body.v5 .dock-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px;width:auto;margin:0}

/* 舞台里不再放提示行，把高度让给宫格 */
body.v5 .mode-hint,body.v5 .metrics-bar{display:none}
body.v5 .seats{inset:40px 18px 10px}

body.v5 #btn-seats-expand{display:none}

/* ── 状态条 ── */
body.v5 .workspace{grid-template-rows:44px 340px 40px minmax(0,1fr) auto}
body.v5 .statusbar{display:flex;align-items:center;gap:12px;padding:0 18px;border-bottom:1px solid var(--line-soft);min-width:0}
body.v5 .sb-cap{display:flex;align-items:center;gap:8px;min-width:0;flex:1;font-size:var(--fs-2);color:var(--text-2)}
body.v5 .sb-cap b{color:var(--lamp-strong);font-weight:500;white-space:nowrap}
body.v5 .sb-cap span:last-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
body.v5 .sb-wave{display:flex;align-items:flex-end;gap:1.5px;height:11px;flex:none}
body.v5 .sb-wave i{width:2px;background:var(--lamp);border-radius:6px;animation:v5w 1.1s ease-in-out infinite}
body.v5 .sb-wave i:nth-child(1){height:4px}
body.v5 .sb-wave i:nth-child(2){height:9px;animation-delay:.12s}
body.v5 .sb-wave i:nth-child(3){height:6px;animation-delay:.24s}
body.v5 .sb-wave i:nth-child(4){height:10px;animation-delay:.36s}
body.v5 .sb-wave i:nth-child(5){height:5px;animation-delay:.48s}
@keyframes v5w{50%{transform:scaleY(.4)}}
body.v5 .sb-right{display:flex;align-items:center;gap:10px;flex:none;font-size:var(--fs-1);color:var(--muted)}
body.v5 .sb-track{width:72px;height:3px;border-radius:6px;background:rgba(23,20,15,.09);overflow:hidden}
body.v5 .sb-track i{display:block;height:100%;width:0;background:linear-gradient(90deg,#8f6a3d,var(--lamp));transition:width .3s}

/* 舞台高度跟随视口，别把小屏的下半截顶出去 */
body.v5 .workspace{grid-template-rows:44px clamp(200px, 34vh, 340px) 40px minmax(0,1fr) auto}
/* 投屏时把舞台抬到 58vh：1280×720 的页面在 340px 高的格子里只能缩到 0.26（看不清） */
body.v5 #app[data-presenting="1"] .workspace{grid-template-rows:44px clamp(280px, 58vh, 620px) 40px minmax(0,1fr) auto}
/* 白板和投屏一样需要高度：340px 里四列卡片只能露出三行字 */
body.v5 #app[data-stage-view="board"] .workspace{grid-template-rows:44px clamp(300px, 56vh, 640px) 40px minmax(0,1fr) auto}
body.v5 .room-pane{height:auto}

/* ── 舞台三视图 ── */
body.v5 #present-stage.v5-live{position:absolute;left:18px;right:18px;top:40px;bottom:10px;border-radius:10px;overflow:hidden;z-index:3}

/* v5.2：投屏页只活在「投屏」视图里 —— 覆盖在 React 岛上（z 6），iframe 不销毁、不移位 */
body[data-v5mode="2"] #present-stage{display:none}
body[data-v5mode="2"] #present-stage.v5-live{
  /* 2026-10-25：改为挂进 React 的投屏容器（见 Stage.jsx presentHostRef），inset:0 就是舞台可用区 */
  display:flex;position:absolute;inset:0;border-radius:10px;overflow:hidden;z-index:6;
}
body[data-v5mode="2"] #present-stage.v5-live .present-body,
body[data-v5mode="2"] #present-stage.v5-live .present-canvas{flex:1;min-height:0}
/* 投屏「放大」：旧规则 .present-stage.fullscreen 被 v5-live 的绝对定位压过（实测点了高度不变），补一条更具体的 */
body[data-v5mode="2"] #present-stage.v5-live.fullscreen{position:fixed;inset:0;z-index:120;border-radius:0;padding:10px}
/* 投屏时把舞台放大（默认 220–340px 太矮，1280×720 的页面缩成邮票） */
body[data-v5mode="2"] #app[data-presenting="1"] .workspace{grid-template-rows:44px clamp(300px,64vh,680px) 40px minmax(0,1fr) auto}
/*
 * 宫格/白板不是“投屏页”：投屏还在后台挂着时，不该继续按 58vh 固定舞台，
 * 否则 900px 高的窗口下半屏会剩一整块空白。让舞台吃掉剩余高度。
 */
/* 投屏时提示条上移，别压住屏幕下方那排小头像 */
body.v5[data-stage-view="present"] .toasts{bottom:calc(var(--dock-h, 88px) + 112px)}
body.v5 #app[data-stage-view="gallery"] .workspace,
body.v5 #app[data-stage-view="board"] .workspace,
body.v5 #app[data-stage-view="present"] .workspace{grid-template-rows:44px minmax(0,1fr) 40px}
/* 剧场视图是旧实现的沉浸模式：进剧场时让位给 #theater（React 岛隐藏），点「返回宫格」再回来 */
body[data-v5mode="2"] #app[data-view="theater"] #v5-react-root{display:none}
/* 剧场是"沉浸模式"：进剧场时把舞台加高（320px 里塞整张圆桌只会糊成一团） */
body[data-v5mode="2"] #app[data-view="theater"] .workspace{grid-template-rows:44px clamp(320px,52vh,560px) 40px minmax(0,1fr) auto}

body.v5 .room-pane{height:100%;min-height:0}

/* ── 侧栏历史 ── */
body.v5 .sb-history{display:flex;flex-direction:column;gap:2px;padding:8px 0 4px;border-top:1px solid var(--line-soft);min-height:0}
body.v5 .sb-h{font-size:var(--fs-1);color:var(--faint);letter-spacing:.04em;padding:0 8px 4px}
body.v5 .sb-list{display:flex;flex-direction:column;gap:1px;min-height:0;flex:0 0 auto}
body.v5 .sb-item{display:flex;align-items:center;gap:7px;height:30px;padding:0 8px;border-radius:10px;color:var(--text-2);font-size:var(--fs-2);text-align:left}
body.v5 .sb-item:hover{background:rgba(23,20,15,.05);color:var(--text)}
body.v5 .sb-item .sbd{width:5px;height:5px;border-radius:50%;background:rgba(23,20,15,.22);flex:none}
body.v5 .sb-item.live .sbd{background:var(--lamp);box-shadow:0 0 0 3px rgba(200,68,42,.14)}
body.v5 .sb-item .sbt{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
body.v5 .sb-item .sbm{font-style:normal;font-size:var(--fs-1);color:var(--faint);flex:none}
body.v5 .sb-empty{font-size:var(--fs-1);color:var(--faint);padding:2px 8px}

body.v5 .sb-item{background:transparent;border:0;font-family:inherit;font-size:var(--fs-2);line-height:1.35;font-weight:400;cursor:pointer;flex:0 0 30px}

/* ── 侧栏一级导航：洞察四入口（知识 / 记忆 / 周看板 / 拓扑） ── */
body.v5 .sb-nav{display:flex;flex-direction:column;gap:1px;padding:6px 0;border-top:1px solid var(--line-soft)}
body.v5 .sb-nav .ghost-btn{width:100%;height:28px;padding:0 10px;border:0;border-radius:10px;justify-content:flex-start;text-align:left;font-size:var(--fs-2);color:var(--text-2);background:transparent}
body.v5 .sb-nav .ghost-btn:hover{background:rgba(23,20,15,.05);color:var(--text)}

/* ── 窄屏：先收右栏，再收侧栏 ── */
@media (max-width:1000px){
  body.v5 .app{grid-template-columns:232px minmax(0,1fr)}
  body.v5 .rail{display:none}
}
@media (max-width:1024px){
  body.v5 .app{grid-template-columns:208px minmax(0,1fr)}
  body.v5 .sidebar .head-actions .ghost-btn{font-size:var(--fs-2)}
}

/* ── 窄屏（≤820px：手机 / 半屏窗口）：侧栏收成抽屉，主区占满 ──
   430px 下 208px 侧栏会把舞台压到 ~200px，宫格与输入器都不可用（test-zoom 实测）。
   抽屉只改布局，id / 监听 / data-i18n 全不动。 */
body.v5 .sb-close{display:none}
/* 手机抽屉顶栏的「设置」快捷入口（绝对定位，不参与流布局） */
body.v5 .sb-settings-quick{display:none}
@media (max-width:820px){
  body.v5 .sb-settings-quick{display:inline-flex;align-items:center;justify-content:center;position:absolute;top:8px;right:60px;min-width:56px;height:44px;padding:0 10px;border:1px solid var(--line);border-radius:12px;background:var(--panel);color:var(--text-2);font-size:var(--fs-1);z-index:2}
  body.v5 .sb-settings-quick:hover{background:var(--panel-2);color:var(--text)}
}
/* 侧栏脚部（未启用吸底：见 v5-shell.js 注释，三段式重构会导致首页白屏，已回滚） */
body.v5 .sidebar .sb-foot{background:var(--bg-2);border-top:1px solid var(--line-soft);padding:6px 0 calc(8px + env(safe-area-inset-bottom,0px))}
body.v5 .sidebar .sb-foot .ghost-btn{width:100%;min-height:44px;justify-content:flex-start;padding:0 10px;border:0;border-radius:10px;background:transparent;color:var(--text-2)}
body.v5 .sb-toggle{display:none;width:28px;height:28px;flex:none;border-radius:10px;border:1px solid var(--line);background:transparent;color:var(--text-2);font-size:var(--fs-4);line-height:1;align-items:center;justify-content:center;cursor:pointer}
body.v5 .sb-toggle:hover{background:rgba(23,20,15,.05);color:var(--text)}
body.v5 .sb-scrim{position:fixed;inset:0;background:rgba(0,0,0,.52);z-index:55}
body.v5 .sb-scrim[hidden]{display:none}
@media (max-width:820px){
  body.v5 .app{grid-template-columns:minmax(0,1fr)}
  body.v5 .sidebar{position:fixed;left:0;top:0;bottom:0;width:264px;max-width:84vw;transform:translateX(-103%);transition:transform .18s ease;z-index:60;box-shadow:8px 0 24px rgba(0,0,0,.45)}
  body.v5 .app.sb-open .sidebar{transform:none}
  body.v5 .sb-toggle{display:inline-flex}
  body.v5 .sb-close{display:grid;place-items:center;position:absolute;top:8px;right:8px;width:44px;height:44px;border:1px solid var(--line);border-radius:12px;background:var(--panel);color:var(--text-2);font-size:20px;line-height:1;z-index:2}
  body.v5 .sb-close:hover{background:var(--panel-2);color:var(--text)}
  body.v5 .rail{display:none}
  body.v5 .topbar{padding:0 10px;gap:8px}
  body.v5 .tb-title{font-size:var(--fs-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  body.v5 .workspace{grid-template-rows:40px clamp(180px,34vh,300px) 34px minmax(0,1fr) auto}
  /* 信息栏折行会把舞台顶掉：窄屏只留议题 + 状态，轮次/时长/连接在状态条与发言流头部已各有去处 */
  body.v5 .hub-meta,
  body.v5 .hub-timer,
  body.v5 #hub-conn{display:none}
}

body.v5 .workspace{grid-template-rows:44px clamp(220px, 38vh, 340px) 40px minmax(0,1fr) auto}
body.v5 #v5-react-root{overflow:hidden;border-radius:10px}


/* ── 设置面板里的旧控件在暗色下重绘 ── */
body[data-v5mode="2"] #v5-panel .seg{display:inline-flex;gap:2px;padding:2px;border-radius:10px;background:rgba(23,20,15,.05);border:1px solid rgba(23,20,15,.07)}
body[data-v5mode="2"] #v5-panel .seg button{height:24px;padding:0 10px;border:0;border-radius:6px;background:transparent;color:var(--muted);font-size:var(--fs-2);cursor:pointer}
body[data-v5mode="2"] #v5-panel .seg button[aria-pressed="true"],body[data-v5mode="2"] #v5-panel .seg button.on,body[data-v5mode="2"] #v5-panel .seg button.active{background:var(--text);color:var(--bg)}
body[data-v5mode="2"] #v5-panel .set-title{font-size:var(--fs-3);font-weight:600;color:var(--text);margin:14px 0 6px}
body[data-v5mode="2"] #v5-panel .set-desc,body[data-v5mode="2"] #v5-panel .hint,body[data-v5mode="2"] #v5-panel .hint-line{font-size:var(--fs-1);line-height:1.75;color:var(--muted);margin:4px 0 8px}
body[data-v5mode="2"] #v5-panel .switch-row{display:flex;align-items:flex-start;gap:7px;font-size:var(--fs-2);line-height:1.7;color:var(--text-2);margin:6px 0}
body[data-v5mode="2"] #v5-panel .switch-row input{margin-top:3px}
body[data-v5mode="2"] #v5-panel .set-row{display:flex;align-items:center;gap:10px;padding:4px 0}
body[data-v5mode="2"] #v5-panel .set-k{flex:none;width:72px;font-size:var(--fs-2);color:var(--text-2)}
body[data-v5mode="2"] #v5-panel .set-state{font-size:var(--fs-1);color:var(--muted);margin:0 0 6px}
body[data-v5mode="2"] #v5-panel .drawer-body{max-width:100%;overflow-x:hidden}

/* 弹窗里的旧分段控件也统一成暗色（设置面板内的规则更具体，不受影响） */
/* v5 的「顶栏」其实是左栏，高度=整页；旧规则 padding-top:min(--header-h,30dvh) 会把
   新会议浮层往下推 240px，1280×800/1024×768 下主按钮直接掉出首屏（A1-01）。
   v5 浮层改用固定 24px，卡片内部滚动，页脚常驻。 */
body.v5 .overlay{padding:24px}
/*
 * 2026-10-25：白板在侧栏里被压成「四列挤在左边 + 横向滚动条」。
 * 侧栏可用宽度约 590px，而 SVG 有 min-width:640px → 必然溢出。
 * 侧栏里让 SVG 按 viewBox 等比缩放到容器宽度（别再横向滚动），
 * 舞台上的大图白板仍然保留最小宽度（那里空间够，字要大）。
 */
/*
 * 2026-10-25 巡检修正：上一版把它压到 width:100%（760 画布→477px，字缩到 6.9px 且卡片被裁）。
 * 侧栏里保持 640px 最小宽度 + 横向滚动：字能看清，卡片不溢出。
 */
body.v5 #panel-board .board-svg{min-width:640px;width:100%;height:auto}
@media (max-width:560px){body.v5 #panel-board .board-svg{min-width:0}}
body.v5 #panel-board .board-canvas{overflow-x:auto}
body.v5 .nm-card{display:flex;flex-direction:column;max-height:calc(100dvh - 48px);overflow:hidden}
body.v5 .nm-scroll{flex:1 1 auto;min-height:0;overflow-y:auto;padding-right:2px}
body.v5 .nm-foot{flex:none;position:static;bottom:auto;margin-top:0;padding:10px 0 2px;border-top:1px solid var(--line-soft);background:transparent}
body.v5 .overlay .primary-btn{color:var(--lamp-ink);background:var(--lamp-strong)}
body.v5 .overlay .primary-btn:hover{background:#155DC0}
@media (max-width:560px){
  body.v5 .overlay{padding:12px}
  body.v5 .nm-card{max-height:calc(100dvh - 24px)}
}

body.v5 .overlay .seg{display:inline-flex;gap:2px;padding:2px;border-radius:10px;background:rgba(23,20,15,.05);border:1px solid rgba(23,20,15,.07)}
body.v5 .overlay .seg button{height:32px;padding:0 12px;border:0;border-radius:6px;background:transparent;color:var(--muted);font-size:var(--fs-2)}
@media (max-width:820px){body.v5 .overlay .seg button{height:44px}}
body.v5 .overlay .seg button[aria-pressed="true"],body.v5 .overlay .seg button.on,body.v5 .overlay .seg button.active{background:var(--lamp-strong);color:var(--lamp-ink);font-weight:600}

/*
 * 多真人在座条（#participants-strip）是旧布局里夹在信息栏与宫格之间的一条：
 * v5 的舞台从固定 top 开始（宫格/投屏/白板），它会压在视图切换条和第一行 tile 上
 * （OpenCLI 生产实测：3 人会议时整条盖住标签）。v5 里先隐藏，真人与邀请入口在侧栏；
 * 多真人控件迁移到 React 舞台是下一轮的事。
 */
body[data-v5mode="2"] #participants-strip{display:none}

/*
 * 剧场底部提示（按 T 切换视图 · 你说话时全场会停下来）在 369px 高的 v5 舞台上会压住实时字幕；
 * 回宫格的按钮保留（同一个 footer），提示文字隐藏 —— 快捷键在 ? 面板里还能查到。
 */
body[data-v5mode="2"] #th-foot-hint{display:none}

/*
 * 窄屏（≤600px）输入器：动作组（打断/卡住了/举手/暂停/结束）在 500px 下被挤出视口
 * （OpenCLI 生产实测：结束按钮 right=517 > 500，点不到）。让整行允许换行，动作组独占第二行、右对齐。
 */
@media (max-width:600px){
  body.v5 #v5-react-composer > div{flex-wrap:wrap}
  body.v5 #v5-react-composer [data-actions]{width:100%;justify-content:flex-end;padding-top:2px}
}

/* 宫格人物：抠图站进会议室，用极轻的呼吸/说话幅度让它看起来是活的（真口型在剧场由 engine 画） */
@keyframes v5-breathe{0%,100%{transform:translateY(0) scale(1)}50%{transform:translateY(-1px) scale(1.008)}}
@keyframes v5-talk{0%,100%{transform:translateY(0) scale(1)}35%{transform:translateY(-2px) scale(1.012)}70%{transform:translateY(1px) scale(1.004)}}
.v5-tile-person{transform-origin:50% 100%;animation:v5-breathe 6.5s ease-in-out infinite;will-change:transform}
.v5-tile-person.is-talking{animation:v5-talk 1.15s ease-in-out infinite}
@media (prefers-reduced-motion: reduce){.v5-tile-person,.v5-tile-person.is-talking{animation:none}}

/* 侧栏「洞察」：从旧 ghost-btn 升级成一级导航（图标 + 标签 + 右侧计数） */
body.v5 .sb-nav{padding:8px 0;gap:2px}
body.v5 .sb-nav .sb-h{font-size:var(--fs-1);letter-spacing:.12em;color:var(--faint);padding:2px 8px 6px}
body.v5 .sb-nav .sb-nav-item{display:flex;align-items:center;gap:8px;width:100%;height:32px;padding:0 8px;border-radius:10px;justify-content:flex-start;text-align:left;font-size:var(--fs-2);color:var(--text-2)}
body.v5 .sb-nav .sb-nav-item:hover{background:rgba(23,20,15,.05);color:var(--text)}
body.v5 .sb-nav .sb-nav-item:focus-visible{outline:2px solid var(--lamp);outline-offset:-2px}
body.v5 .sb-nav .sb-ico{width:14px;height:14px;flex:none;display:grid;place-items:center;color:var(--muted)}
body.v5 .sb-nav .sb-ico svg{width:14px;height:14px}
body.v5 .sb-nav .sb-t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
body.v5 .sb-nav .sb-n{flex:none;font-size:var(--fs-1);color:var(--faint);font-variant-numeric:tabular-nums}

/* 旧舞台的「发言队列」和会议横幅在 v5 里没有位置：React 岛只盖住一部分，透明区会漏出旧 chip，
   实测会压住「宫格/投屏/白板」切换条。队列信息由状态条从 store 直接渲染。 */
body[data-v5mode="2"] #floor-queue,body[data-v5mode="2"] #meeting-banner{display:none!important}

/* 洞察导航：选中态与 hover（图标一起变灯色，而不是只有文字） */
body.v5 .sb-nav .sb-nav-item.is-active{background:var(--lamp-soft);color:var(--text);box-shadow:inset 2px 0 0 var(--lamp)}
body.v5 .sb-nav .sb-nav-item:hover .sb-ico,body.v5 .sb-nav .sb-nav-item.is-active .sb-ico{color:var(--lamp)}
body.v5 .sb-nav .sb-n{min-width:20px;text-align:right}

/* 顶栏右侧状态（原来 44px 高只有左边一个标题，1900 宽下空 1200px） */
body.v5 .topbar{justify-content:space-between}
body.v5 .tb-right{display:flex;align-items:center;gap:8px;margin-left:auto}
body.v5 .tb-chip{display:inline-flex;align-items:center;height:22px;padding:0 8px;border-radius:14px;border:1px solid var(--line);color:var(--text-2);font-size:var(--fs-1)}
body.v5 .tb-icon{display:grid;place-items:center;width:24px;height:24px;border-radius:6px;border:1px solid transparent;color:var(--muted);font-size:var(--fs-2)}
body.v5 .tb-icon:hover{background:rgba(23,20,15,.06);color:var(--text)}

/* 底部工作台：与「洞察」同一套行（图标 + 标签），悬停有背景 */
body.v5 .sidebar .head-actions .ghost-btn.sb-tool-item{display:flex;align-items:center;gap:8px;height:30px;padding:0 8px;border-radius:10px;font-size:var(--fs-2);color:var(--text-2)}
body.v5 .sidebar .head-actions .ghost-btn.sb-tool-item:hover{background:rgba(23,20,15,.08);color:var(--text)}
body.v5 .sidebar .head-actions .sb-tool-item .sb-ico{width:14px;height:14px;flex:none;display:grid;place-items:center;color:var(--muted)}
body.v5 .sidebar .head-actions .sb-tool-item:hover .sb-ico{color:var(--lamp)}

/* ══════════════════════════════════════════════════════════════════
   v5.3 首页（无会议欢迎态）
   旧空态把整个会议室外壳摊开（10 个随机专家格子 + 空发言流 + 空右栏），
   看起来像坏掉的会议室。无会议时改为：侧栏 + 一句话开场首页，会议骨架全部收起。
   ══════════════════════════════════════════════════════════════════ */
body.v5.home-mode .app{grid-template-columns:262px minmax(0,1fr)}
body.v5.home-mode .rail{display:none}
body.v5.home-mode .workspace{position:relative;display:block;overflow:hidden}
body.v5.home-mode .workspace > .topbar,
body.v5.home-mode .workspace > main.stage,
body.v5.home-mode .workspace > #v5-statusbar,
body.v5.home-mode .workspace > #stream-pane,
body.v5.home-mode .workspace > #dock{display:none}
#v5-home{position:absolute;inset:0;display:none;overflow-y:auto;overflow-x:hidden}
body.v5.home-mode #v5-home{display:block}

/* 首页侧栏：只留在首页真的有意义的入口（专家 / 资料库 / 会议 / 设置 + 洞察） */
body.v5.home-mode .sidebar{background:var(--bg-2)}
body.v5.home-mode .sidebar .head-meeting,
body.v5.home-mode .sidebar #btn-invite,
body.v5.home-mode .sidebar #btn-minutes,
body.v5.home-mode .sidebar #btn-facts,
body.v5.home-mode .sidebar #btn-present,
body.v5.home-mode .sidebar #btn-more,
body.v5.home-mode .sidebar .audio-ctl{display:none}
body.v5.home-mode .sidebar .head-primary .primary-btn{box-shadow:0 10px 30px -16px rgba(200,68,42,.35)}
body.v5.home-mode .sidebar .head-actions{border-top:1px solid var(--line-soft);margin-top:auto}

@media (max-width:820px){
  body.v5.home-mode .app{grid-template-columns:minmax(0,1fr)}
}

/* 对话优先：练习/陪聊/认识会缩短舞台，把高度让给发言流（演示/剧场视图不压） */
@media (min-width: 900px) {
  body.v5[data-scenario="practice"] #app:not([data-presenting="1"]):not([data-view="theater"]) .workspace,
  body.v5[data-scenario="casual"] #app:not([data-presenting="1"]):not([data-view="theater"]) .workspace,
  body.v5[data-scenario="intro"] #app:not([data-presenting="1"]):not([data-view="theater"]) .workspace {
    grid-template-rows: 44px clamp(180px, 24vh, 240px) 40px minmax(0, 1fr) auto;
  }
}

/* v5：旧 toast 固定 left:24px，会被 262px 侧栏压住（实测「点一下页面放行声音」整条埋在导航下面）。
   在 v5 里让开侧栏与底部输入器；窄屏侧栏离场，恢复左右 12px。 */
body.v5 .toasts{
  left: calc(262px + 20px);
  /* 跟着输入器的真实高度走（v5-shell.js 用 ResizeObserver 维护 --dock-h），不再写死 92px */
  bottom: calc(var(--dock-h, 92px) + 18px);
  z-index: 260;
  max-width: min(420px, calc(100vw - 302px));
}
body.v5.home-mode .toasts{bottom: 24px}
@media (max-width: 820px){
  body.v5 .toasts{left: 12px; right: 12px; bottom: calc(var(--dock-h, 88px) + 12px); max-width: none}
  body.v5.home-mode .toasts{bottom: 24px}
  /* 首页自带 ☰；顶栏的 .sb-toggle 在 home-mode 是 0×0，别留在无障碍树里 */
  body.v5.home-mode .sb-toggle{display:none}
  /* 触屏最小可点高度：A4 实测 26–34px 太密；按 WCAG 2.5.5 目标 44×44 收口 */
  body.v5 #v5-home button{min-height:44px}
  body.v5 .home-menu{min-width:44px;min-height:44px}
  body.v5 .sb-nav-item,
  body.v5 .mtg-item,
  body.v5 .sidebar .head-primary .primary-btn,
  body.v5 .sidebar .head-primary .ghost-btn{min-height:42px}
  body.v5 .overlay .seg-btn{min-height:36px}
  body.v5 [data-testid^="insights-tab-"]{min-height:42px}
  body.v5 [data-actions] button{min-height:36px;min-width:36px}
  body.v5 [data-testid="composer-send"]{min-height:36px;min-width:36px}
}

/* 纪要统计：tokens / 调用次数默认折叠，避免把内部成本口径当产品指标展示 */
body.v5 .minutes-stats .tech-detail{display:none}
body.v5 .minutes-stats.tech-open .tech-detail{display:inline}
body.v5 .minutes-stats .tech-toggle{margin-left:6px;padding:0 4px;border:1px solid rgba(23,20,15,.14);border-radius:6px;background:transparent;color:rgba(23,20,15,.62);font-size:var(--fs-1);cursor:pointer}
body.v5 .minutes-stats .tech-toggle:hover{color:rgba(23,20,15,.75);background:rgba(23,20,15,.05)}
body.v5 .minutes-tech{margin:4px 0 8px;color:rgba(23,20,15,.5);font-size:var(--fs-1)}
body.v5 .minutes-tech summary{cursor:pointer;color:rgba(23,20,15,.55);list-style:none}
body.v5 .minutes-tech summary::-webkit-details-marker{display:none}
body.v5 .minutes-tech summary::before{content:'ⓘ ';color:rgba(23,20,15,.3)}
body.v5 .minutes-tech p{margin:4px 0 0;line-height:1.6;color:rgba(23,20,15,.45)}

/* 高分屏（≥1800 CSS px）：整体缩放 1.2/1.3，避免 2560 下 10–13px 字太小。
   缩放 body 时高度也要按比例除回去，否则 #app 的 100dvh 会溢出屏幕。 */
@media (min-width: 1800px){
  body.v5{zoom:1.2;height:calc(100dvh / 1.2)}
  body.v5 #app{height:100%}
}
@media (min-width: 2200px){
  body.v5{zoom:1.3;height:calc(100dvh / 1.3)}
}

/* 键盘用户跳过 40 个侧栏/历史 tab stop 直达主内容 */
.skip-link{position:fixed;left:12px;top:12px;z-index:999;transform:translateY(-200%);padding:8px 12px;border-radius:10px;background:var(--lamp);color:var(--lamp-ink);font-size:var(--fs-2);font-weight:600;text-decoration:none;box-shadow:0 8px 24px rgba(0,0,0,.4)}
.skip-link:focus{transform:none}

/* 空闲时收起语音状态条：v5 里它只剩「识别通道：未探测 · 待机」这种内部口径，
   占一行高度还挤输入器；录音/识别时状态变化会自动出现。 */
body.v5 #dock:has(#voice-state[data-state="idle"]) #voice-bar{display:none}

/* 横屏手机（844×390）：默认舞台行 220–340px 会把发言流压没；按视口高度收舞台。 */
@media (max-height: 520px) and (max-width: 1100px){
  body.v5 .workspace{grid-template-rows:36px clamp(120px,30vh,170px) 32px minmax(0,1fr) auto}
  body.v5 .hub-meta,
  body.v5 .hub-timer{display:none}
}



/* ════════════════════════════════════════════════════════════════
   v6 侧栏（2026-10-24）：只做一层覆盖，不改旧规则。
   目标：品牌/主操作/导航三级清楚，计数退到第三层，会议列表行高压到 30。
   ════════════════════════════════════════════════════════════════ */
body.v5 .sidebar{padding:16px 12px 12px}
body.v5 .sidebar .brand{padding:0 6px 14px;gap:8px}
body.v5 .sidebar .brand-name{font-size:var(--fs-4);font-weight:600;letter-spacing:0;color:var(--text)}
body.v5 .sidebar .brand-lamp{width:8px;height:8px;box-shadow:0 0 0 4px rgba(200,68,42,.10)}

body.v5 .sidebar .head-primary{gap:8px;padding-bottom:12px}
/* 白字压在 --lamp(#2D8CFF) 上只有 3.32:1，达不到 4.5 —— 常态就用加深色（白字 4.96），hover 再深一档 */
body.v5 .sidebar .head-primary .primary-btn{height:38px;border-radius:8px;font-size:var(--fs-3);font-weight:600;background:var(--lamp-strong,#1B6FD0);color:#fff;border:0;box-shadow:none}
body.v5 .sidebar .head-primary .primary-btn:hover{background:#155DC0;filter:none}
body.v5 .sidebar .head-primary .ghost-btn{height:32px;border-radius:8px;font-size:var(--fs-3);color:var(--text-2);border:0;background:transparent}
body.v5 .sidebar .head-primary .ghost-btn:hover{background:rgba(23,20,15,.05);color:var(--text)}

body.v5 .sidebar .sb-nav{display:flex;flex-direction:column;gap:1px;padding:10px 0 6px;border-top:1px solid var(--line-soft)}
body.v5 .sidebar .sb-h{font-size:var(--fs-1);letter-spacing:.12em;color:var(--faint);padding:8px 8px 6px}
body.v5 .sidebar .sb-nav-item{display:flex;align-items:center;gap:10px;height:32px;padding:0 8px;border:0;border-radius:8px;background:transparent;color:var(--text-2);font-size:var(--fs-3);font-weight:400;text-align:left}
body.v5 .sidebar .sb-nav-item:hover{background:rgba(23,20,15,.045);color:var(--text)}
body.v5 .sidebar .sb-nav-item .sb-ico{display:inline-flex;width:16px;height:16px;color:var(--faint)}
body.v5 .sidebar .sb-nav-item .sb-ico svg{width:16px;height:16px}
body.v5 .sidebar .sb-nav-item .sb-t{flex:1}
body.v5 .sidebar .sb-nav-item .sb-n{font-size:var(--fs-1);color:var(--faint);font-variant-numeric:tabular-nums;display:none}

body.v5 .sidebar .head-meeting{gap:6px;padding:0 8px 10px;border:0}
body.v5 .sidebar .meeting-title{font-size:var(--fs-3);font-weight:500;color:var(--text-2)}
body.v5 .sidebar .status-badge,body.v5 .sidebar .round-badge{height:18px;padding:0 6px;border:0;border-radius:5px;background:rgba(23,20,15,.05);color:var(--muted);font-size:var(--fs-1)}

body.v5 .sidebar .sb-history{margin:0 -2px;padding:6px 0 0;border-top:1px solid var(--line-soft)}
body.v5 .sidebar .sb-item{display:flex;align-items:center;gap:8px;width:100%;height:30px;padding:0 8px;border:0;border-radius:8px;background:transparent;color:var(--text-2);font-size:var(--fs-3);text-align:left}
body.v5 .sidebar .sb-item:hover{background:rgba(23,20,15,.045);color:var(--text)}
body.v5 .sidebar .sb-item.is-active{background:rgba(200,68,42,.10);color:var(--text)}
body.v5 .sidebar .sb-item .sb-item-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
body.v5 .sidebar .sb-item .sb-item-status{flex:none;font-size:var(--fs-1);color:var(--faint)}

body.v5 .sidebar .head-actions{border-top:1px solid var(--line-soft);padding-top:6px;margin-top:6px}
body.v5 .sidebar .head-actions .ghost-btn{height:28px;font-size:var(--fs-2);color:var(--muted)}
body.v5 .sidebar .head-actions .ghost-btn:hover{color:var(--text)}

/* ════════════════════════════════════════════════════════════════
   v6 席位（宫格）：只调材质与字，不动尺寸与排布。
   ════════════════════════════════════════════════════════════════ */
body.v5 .seat.fx-tile{border-color:var(--line);background:var(--panel)}
body.v5 .seat.fx-tile:hover{border-color:var(--line-strong)}
body.v5 .seat.fx-tile .fx-avatar{background:var(--panel-2);border-color:var(--line)}
body.v5 .seat.fx-tile .fx-bar{background:rgba(8,9,11,.72);border-radius:6px;border-left-width:2px}
body.v5 .seat.fx-tile .fx-name{font-size:var(--fs-3);font-weight:600;color:var(--text)}
body.v5 .seat.fx-tile .fx-role{font-size:var(--fs-1);color:var(--text-2)}
body.v5 .seat.fx-tile .fx-live{font-size:var(--fs-1);color:var(--lamp)}
body.v5 .seat.fx-tile.speaking{border-color:var(--lamp-line)}
body.v5 .seat.fx-tile.speaking .fx-avatar{box-shadow:0 0 0 1px var(--lamp-line)}
body.v5 .seat.fx-tile .fx-host{font-size:var(--fs-1);border-radius:999px}

/* 顶部信息条：标题与元信息之间留出层级 */
body.v5 .topbar .tb-title{font-size:var(--fs-3);font-weight:600;color:var(--text)}
body.v5 .table-hub .hub-topic{font-size:var(--fs-3);font-weight:600;color:var(--text)}
body.v5 .table-hub .hub-meta{font-size:var(--fs-1);color:var(--faint)}
body.v5 .stream-head .stream-title{font-size:var(--fs-2);color:var(--text-2)}

/* ════════════════════════════════════════════════════════════════
   v6 会议信息条：一行只留必要状态，其余退到 11.5px 的第三层。
   ════════════════════════════════════════════════════════════════ */
body.v5 .table-hub .hub-meta{font-size:var(--fs-1);color:var(--faint);gap:6px}
body.v5 .table-hub .hub-meta .dot-sep{opacity:.4}
body.v5 .table-hub .hub-count,body.v5 .table-hub .hub-timer,body.v5 .table-hub .hub-conn{font-size:var(--fs-1);font-variant-numeric:tabular-nums}
body.v5 .table-hub .hub-conn[data-state="on"]{color:var(--ok)}
body.v5 .table-hub .hub-view-btn{height:28px;padding:0 10px;border:1px solid var(--line);border-radius:6px;background:transparent;color:var(--text-2);font-size:var(--fs-2)}
body.v5 .table-hub .hub-view-btn:hover{border-color:var(--line-strong);color:var(--text)}
body.v5 .table-hub .hub-status{height:20px;padding:0 7px;border-radius:5px;background:rgba(23,20,15,.05);color:var(--muted);font-size:var(--fs-1)}
body.v5 .room-tabs,body.v5 .view-tabs{font-size:var(--fs-2)}

/* ════════════════════════════════════════════════════════════════
   v6 右栏纪要：里面是旧 HTML（.minutes-body / .number-trace / .conclusion-card），
   这里只把它拉进同一套材质与字阶，不改结构。
   ════════════════════════════════════════════════════════════════ */
body.v5 .rail .minutes-body{font-size:var(--fs-3);line-height:1.85;color:var(--text-2)}
body.v5 .rail .minutes-body h1{font-size:var(--fs-5);line-height:1.5;color:var(--text)}
body.v5 .rail .minutes-body h2{font-size:var(--fs-4);border-left-width:2px;margin:16px 0 6px;color:var(--text)}
body.v5 .rail .minutes-body h3{font-size:var(--fs-3);color:var(--muted)}
body.v5 .rail .minutes-body a{color:var(--lamp)}

body.v5 .rail .minutes-stats{display:flex;flex-wrap:wrap;gap:6px 14px;padding:10px 12px;margin-bottom:12px;border:1px solid var(--line);border-radius:10px;background:var(--panel);font-size:var(--fs-1);color:var(--muted)}
body.v5 .rail .minutes-stats b{color:var(--text);font-weight:600}
body.v5 .rail .minutes-stats .tech-toggle{height:22px;padding:0 8px;border:1px solid var(--line);border-radius:6px;background:transparent;color:var(--faint);font-size:var(--fs-1)}
body.v5 .rail .minutes-stats .tech-toggle:hover{color:var(--text-2);border-color:var(--line-strong)}

body.v5 .rail .number-trace{padding:12px;margin-bottom:12px;border:1px solid var(--line);border-radius:10px;background:var(--panel)}
body.v5 .rail .number-trace .nt-line{display:flex;flex-wrap:wrap;align-items:baseline;gap:6px 10px;font-size:var(--fs-2);color:var(--text-2)}
body.v5 .rail .number-trace .nt-line b{font-size:var(--fs-2);color:var(--text)}
body.v5 .rail .number-trace .nt-jump{margin-left:0;height:22px;padding:0 8px;border:1px solid var(--line);border-radius:999px;background:transparent;color:var(--faint);font-size:var(--fs-1)}
body.v5 .rail .number-trace .nt-jump:hover{color:var(--text-2);border-color:var(--line-strong)}
body.v5 .rail .hint-line{margin:6px 0 0;font-size:var(--fs-1);line-height:1.7;color:var(--faint)}

body.v5 .rail .conclusion-card{padding:12px 14px;margin-bottom:12px;border:1px solid var(--line);border-left:2px solid var(--lamp);border-radius:10px;background:var(--panel)}
body.v5 .rail .conclusion-card .conclusion-head h3{font-size:var(--fs-3);color:var(--text)}
body.v5 .rail .conclusion-card .conclusion-src{font-size:var(--fs-1);color:var(--faint)}
body.v5 .rail .conclusion-card .conclusion-text{font-size:var(--fs-3);line-height:1.85;color:var(--text-2)}
body.v5 .rail .conclusion-card .ghost-btn{height:26px;padding:0 10px;border:1px solid var(--line);border-radius:6px;background:transparent;color:var(--text-2);font-size:var(--fs-1)}

/* 会议信息条：结束态不再重复报"已结束"，也不显示冻结的 00:00 */
body.v5 #table-hub[data-status="ended"] #hub-timer,
body.v5 #table-hub[data-status="ended"] #hub-status{display:none}

/* ════════════════════════════════════════════════════════════════
   v6 拓扑：席位节点带头像，圆点降级为描边环；边色收敛到暖色系。
   ════════════════════════════════════════════════════════════════ */
body.v5 .topo-node.has-photo .topo-dot{fill:none;stroke:var(--lamp-line);stroke-width:1.4}
body.v5 .topo-photo{opacity:.94}
body.v5 .topo-node.has-photo:hover .topo-photo,
body.v5 .topo-node.has-photo:focus-visible .topo-photo{opacity:1}
body.v5 .topo-node .topo-edge.mention{stroke:rgba(200,68,42,.55)}
body.v5 .topo-node .topo-edge.reply{stroke:rgba(127,169,138,.6)}

/* v8 极简：舞台压成一条席位带；旧状态条隐藏；会议信息条去卡片化 */
body.v5 #v5-statusbar{display:none}
body.v5 .workspace{grid-template-rows:44px 400px minmax(0,1fr) auto}
body.v5 .room-pane{height:400px}
#table-hub{background:transparent;border:0;border-bottom:1px solid var(--line-soft);border-radius:0;box-shadow:none;padding:6px 2px}

@media (max-width:640px){body.v5 .workspace{grid-template-rows:44px 300px minmax(0,1fr) auto}body.v5 .room-pane{height:300px}}

/* v8 极简：右栏统计去卡片、输入器改下划线、状态按钮去边框、toast 收窄 */
body.v5 .rail .minutes-stats{border:0;border-bottom:1px solid var(--line-soft);border-radius:0;background:transparent;padding:6px 0 10px;margin-bottom:8px}
body.v5 .interject-form{border:0;border-bottom:1px solid var(--line-strong);border-radius:0;background:transparent;padding:4px 0;min-height:44px}
body.v5 .interject-form:focus-within{border-color:var(--lamp)}
body.v5 .interject-form .send-btn{background:var(--text);color:var(--bg);border-radius:6px}
body.v5 .table-hub .hub-view-btn{border:0;padding:0 6px;color:var(--ink3)}
body.v5 .table-hub .hub-status{background:transparent;padding:0}
/*
 * 2026-10-25 视觉巡检：toast 原来在左下角、压在宫格上（截图里两行提示盖住了
 * 「林可」那张卡片的说明条）。挪到右上角、贴顶栏下方，并去掉 pointer-events，
 * 恒不遮挡操作；窄屏时贴右边缘留 12px。
 */
/*
 * z-index 必须低于弹层（Panel 是 z-100）：否则 toast 会压在「专家洞察」的搜索框和关闭按钮上。
 * 高于舞台（z-4）即可。
 * 宽屏时右栏占 360px，toast 再贴右就会压住第一条发言 —— 让出右栏宽度。
 */
/*
 * 2026-10-25：toast 原来钉在右上角（top:56px），正好压住舞台的「实时白板 / 论据 4」表头。
 * 挪到左下、控制条上方：那里平时是空的，也不挡宫格和表头。
 */
body.v5 .toasts{left:calc(236px + 20px);right:auto;top:auto;bottom:calc(var(--dock-h, 88px) + 16px);z-index:60;align-items:flex-start;max-width:min(360px,calc(100vw - 300px))}
body.v5 .toast{background:var(--panel);border:1px solid var(--line-soft);border-left:3px solid var(--lamp);border-radius:10px;padding:9px 12px;font-size:var(--fs-2);line-height:1.55;box-shadow:0 8px 24px rgba(23,20,15,.10);max-width:none}
/* 手机上只在首页把 toast 放到底部；会议页放顶部，避免盖住最后一格画面 */
@media (max-width:820px){
  body.v5.home-mode .toasts{right:12px;left:12px;top:auto;bottom:24px;align-items:stretch}
}
/*
 * 430 宽实测：9 个控制项被压到 42×35，最右「离开」右缘 432 越界、只剩半个字。
 * 窄屏只留 6 个主操作（麦克风/摄像头/讨论/成员/结束/离开），共享/记录/更多收进设置与菜单。
 */
/* 巡检 P2：窄屏把小控件统一抬到 44（弹层页脚/换人/折叠行/侧栏行/汉堡） */
@media (max-width:820px){
  body.v5 .overlay .modal-foot button,
  body.v5 .overlay .clarify-foot button,
  body.v5 .overlay .link-btn,
  body.v5 .overlay details > summary,
  body.v5 .sidebar .sb-item,
  body.v5 .sb-toggle{min-height:44px}
  body.v5 .sb-toggle{width:44px}
  body.v5 .overlay .nm-selected-x{min-width:32px;min-height:32px}
}
/* 审计 P1：430 宽下这些控件只有 25–36px（视图 tab 28×25 / 发送 36×36 / 右栏关闭 26×26） */
@media (max-width:820px){
  body.v5 #v5-stage [role="tab"],
  body.v5 #v5-stage .stage-tabs button,
  body.v5 [data-testid="composer-send"],
  body.v5 #v5-react-rail button[aria-label*="关闭"],
  body.v5 #v5-react-rail button[title*="关闭"]{min-width:44px;min-height:44px}
}
@media (max-width:560px){
  /*
   * 430 宽：9 个控制项一行放不下（最右「离开」会被裁）。
   * 改成两行（4+5），每个 44×44 —— 共享/记录/更多 也都还有入口，不用把它们藏起来。
   */
  body.v5 [data-testid="stage-controls"]{flex-wrap:wrap;justify-content:center;max-width:340px;border-radius:18px;row-gap:2px}
  body.v5 [data-testid="stage-controls"] > *{min-width:44px;height:44px}
}

body.v5 .sidebar .sb-item-status{display:none}

/* v8：剧场视图先下线，避免深色影院画面破坏纸面语言；DOM 与测试钩子保留 */
body.v5 #btn-view-toggle{display:none!important}
body.v5 #theater{display:none!important}
body.v5 .set-row:has(#set-view){display:none}
body.v5 [data-i18n="settings.viewHint"]{display:none}

/* v8：toast 去色块，只留一条朱砂左边 */
/* 上面已给出 v5 的 toast 样式（圆角卡片 + 朱砂左边），这里不再覆盖 */

body.v5 .tb-title{text-transform:uppercase;letter-spacing:.14em;font-size:var(--fs-1);font-weight:600;color:var(--text-2)}
body.v5 .sb-h{text-transform:uppercase;letter-spacing:.16em}
body.v5 .sidebar .sb-item .sbm{display:none}

body.v5 .toast[data-kind="warn"]{border-left-color:var(--warn)}
body.v5 .toast[data-kind="error"]{border-left-color:var(--danger)}
body.v5 .toast[data-kind="ok"]{border-left-color:var(--ok)}

.v10-tile-bg{background:
  radial-gradient(90% 70% at 50% 18%, rgba(255,255,255,.98), transparent 62%),
  radial-gradient(120% 90% at 50% 100%, rgba(255,255,255,.55), transparent 58%),
  linear-gradient(180deg, var(--panel), var(--panel-2))}

/* ── v10 右侧 Console：Chat / People / Context ── */
body.v5 .app{grid-template-columns:236px minmax(0,1fr) 360px}
body.v5 .workspace{grid-template-rows:44px minmax(0,1fr)}
body.v5 .room-pane{height:100%}
body.v5 .workspace > #stream-pane,
body.v5 .workspace > #dock,
body.v5 #v5-statusbar{display:none!important}
body.v5 .rail{padding:0;background:var(--panel);border-left:1px solid var(--line-soft);min-height:0}
body.v5 .v10-console{display:flex;flex-direction:column;height:100%;min-height:0}
body.v5 .v10-console-tabs{display:flex;align-items:center;gap:20px;height:48px;padding:0 16px;border-bottom:1px solid var(--line-soft);flex:none}
body.v5 .v10-console-tabs button[data-pane]{height:48px;padding:0;border:0;border-bottom:2px solid transparent;background:transparent;color:var(--faint);font-size:var(--fs-1);letter-spacing:.12em;text-transform:uppercase;cursor:pointer}
body.v5 .v10-console-tabs button[data-pane]:hover{color:var(--text-2)}
body.v5 .v10-console-tabs button[data-pane].is-active{color:var(--text);border-bottom-color:var(--lamp)}
body.v5 .v10-console-close{margin-left:auto;width:26px;height:26px;border:0;border-radius:6px;background:transparent;color:var(--faint);font-size:var(--fs-6);line-height:1;cursor:pointer;display:none}
body.v5 .v10-console-close:hover{background:var(--panel-2);color:var(--text)}
body.v5 .v10-console-body{flex:1;min-height:0;display:flex}
body.v5 .v10-pane{display:none;flex:1;min-height:0;flex-direction:column}
body.v5 .v10-pane.is-active{display:flex}
body.v5 .v10-pane[data-pane="chat"] #v5-react-thread{flex:1;min-height:0;overflow:hidden}
body.v5 .v10-pane[data-pane="chat"] #v5-react-thread > div{padding-left:16px;padding-right:16px}
body.v5 .v10-pane[data-pane="chat"] #v5-react-composer{flex:none;width:100%;padding:8px 12px 12px;border-top:1px solid var(--line-soft)}
body.v5 .v10-pane[data-pane="context"] #v5-react-rail{height:100%;overflow-y:auto}
body.v5 .v10-pane[data-pane="context"] #v5-react-rail > div > div:first-child{display:none}
body.v5 .v10-people{padding:10px 16px 20px;overflow-y:auto}
body.v5 .v10-people-head{display:flex;justify-content:space-between;margin:16px 0 8px;font-size:var(--fs-1);letter-spacing:.14em;text-transform:uppercase;color:var(--faint)}
body.v5 .v10-people-row{display:flex;align-items:center;gap:10px;padding:8px 4px;border-bottom:1px solid var(--line-soft)}
body.v5 .v10-people-av{display:grid;place-items:center;width:30px;height:30px;flex:none;border-radius:50%;background:var(--panel-2);color:var(--text-2);font-size:var(--fs-3)}
body.v5 .v10-people-meta{min-width:0;flex:1}
body.v5 .v10-people-name{font-size:var(--fs-3);color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
body.v5 .v10-people-role{font-size:var(--fs-1);color:var(--faint);margin-top:1px}
body.v5 .v10-people-live{width:6px;height:6px;flex:none;border-radius:50%;background:var(--lamp)}
body.v5 .v10-people-empty{padding:10px 4px;font-size:var(--fs-2);color:var(--faint)}
body.v5 .v10-rail-scrim[hidden]{display:none}

@media (max-width:1000px){
  body.v5 .app{grid-template-columns:232px minmax(0,1fr)}
  body.v5 .rail{display:flex;position:fixed;top:0;right:0;bottom:0;width:min(380px,92vw);z-index:70;transform:translateX(103%);transition:transform .18s ease;box-shadow:-8px 0 24px rgba(15,20,26,.18)}
  body.v5.rail-open .rail{transform:none}
  body.v5 .v10-console-close{display:grid;place-items:center}
  body.v5 .v10-rail-scrim{position:fixed;inset:0;z-index:65;background:rgba(15,20,26,.25)}
  body.v5 .v10-rail-scrim[hidden]{display:none}
}
@media (max-width:820px){
  body.v5 .app{grid-template-columns:minmax(0,1fr)}
  body.v5 .workspace{grid-template-rows:40px minmax(0,1fr)}
  body.v5 .room-pane{height:100%}
}
body.v5 .v10-pane[data-pane="context"] #v5-react-rail > div > div:first-child{display:block}
body.v5 .v10-pane[data-pane="context"] #v5-react-rail > div > div:first-child > div:first-child{display:none}
body.v5 .v10-people-invite{margin-top:16px;width:100%;height:34px;border:1px solid var(--line);border-radius:8px;background:var(--panel);color:var(--text-2);font-size:var(--fs-2);cursor:pointer}
body.v5 .v10-people-invite:hover{background:var(--panel-2);color:var(--text)}

body.v5 .v10-people-row{cursor:pointer;border-radius:6px;padding-left:6px;padding-right:6px}
body.v5 .v10-people-row:hover{background:var(--panel-2)}
body.v5 .v10-people-row.is-pinned{background:var(--lamp-soft)}

body.rail-resizing{cursor:col-resize;user-select:none}
body.v5 .rail{position:relative}
body.v5 .v10-rail-resize{position:absolute;left:-3px;top:0;bottom:0;width:6px;z-index:5;cursor:col-resize}
body.v5 .v10-rail-resize:hover{background:var(--lamp-soft)}
@media (min-width:1201px){body.v5 .app{grid-template-columns:236px minmax(0,1fr) var(--rail-w,360px)}}
@media (max-width:1200px){body.v5 .v10-rail-resize{display:none}}

body.v5 .v10-people-head{align-items:center;gap:8px}
body.v5 .v10-people-head .v10-people-action{margin-left:auto}
body.v5 .v10-people-action{height:24px;padding:0 8px;border:1px solid var(--line);border-radius:6px;background:transparent;color:var(--text-2);font-size:var(--fs-1);cursor:pointer}
body.v5 .v10-people-action:hover{background:var(--panel-2);color:var(--text)}
body.v5 .v10-people-actions{display:flex;gap:4px;margin-left:6px;flex:none}
body.v5 .v10-people-actions .v10-people-action{height:22px;padding:0 6px}

/* v12：投屏贴回视频区，保留控制条与 Chat */
body[data-v5mode="2"] #present-stage.v5-live{top:104px;bottom:64px;border:1px solid var(--line);border-radius:10px;background:var(--panel);box-shadow:0 12px 32px rgba(15,20,26,.10);padding:10px}
body[data-v5mode="2"] #present-stage.v5-live .present-label{color:var(--lamp)}
body[data-v5mode="2"] #present-stage.v5-live .present-dot{background:var(--lamp);animation:none;box-shadow:0 0 0 3px var(--lamp-soft)}
body[data-v5mode="2"] #present-stage.v5-live .present-canvas{background:var(--bg);border:1px solid var(--line-soft)}
@media (max-width:820px){
  body[data-v5mode="2"] #present-stage.v5-live{top:88px;bottom:56px;left:10px;right:10px}
}

/* v12：真人入会 prejoin */
body.v5 .join-card{width:min(760px,calc(100vw - 32px));display:grid;grid-template-columns:300px minmax(0,1fr);padding:0;overflow:hidden}
body.v5 .join-preview{position:relative;min-height:380px;display:flex;align-items:center;justify-content:center;background:
  radial-gradient(80% 60% at 50% 30%, rgba(255,255,255,.9), transparent 70%),
  linear-gradient(180deg,var(--panel-2),var(--panel-3));border-right:1px solid var(--line-soft)}
body.v5 .join-cam{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;background:var(--panel-3)}
body.v5 .join-cam[hidden]{display:none}
body.v5 .join-cam-empty{display:flex;flex-direction:column;align-items:center;gap:10px;color:var(--faint)}
body.v5 .join-cam-empty[hidden]{display:none}
body.v5 .join-avatar{display:grid;place-items:center;width:88px;height:88px;border-radius:50%;background:var(--panel);box-shadow:0 6px 20px rgba(15,20,26,.08);font-size:var(--fs-8);color:var(--text-2)}
body.v5 .join-cam-empty p{margin:0;font-size:var(--fs-2);color:var(--faint)}
body.v5 .join-cam-btn{position:absolute;left:50%;bottom:14px;transform:translateX(-50%);height:30px;padding:0 12px;border:1px solid var(--line);border-radius:999px;background:var(--panel);color:var(--text-2);font-size:var(--fs-2);cursor:pointer}
body.v5 .join-cam-btn:hover{color:var(--text);border-color:var(--line-strong)}
body.v5 .join-form{display:flex;flex-direction:column;padding:26px 24px 18px;min-width:0}
body.v5 .join-kicker{font-size:var(--fs-1);letter-spacing:.16em;text-transform:uppercase;color:var(--lamp);margin-bottom:8px}
body.v5 .join-info{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px;font-size:var(--fs-1);color:var(--faint)}
body.v5 .join-info span{padding:2px 8px;border:1px solid var(--line);border-radius:999px;background:var(--panel-2)}
body.v5 .join-form .field{margin-top:18px}
body.v5 .join-form .modal-foot{margin-top:auto;padding-top:20px}
@media (max-width:720px){
  body.v5 .join-card{grid-template-columns:minmax(0,1fr)}
  body.v5 .join-preview{min-height:180px;border-right:0;border-bottom:1px solid var(--line-soft)}
  body.v5 .join-form{padding:18px 18px 14px}
  body.v5 .join-avatar{width:64px;height:64px;font-size:var(--fs-7)}
}

body.v5 .join-card{max-width:none}

body.v5 #join-overlay{background:rgba(15,20,26,.28);backdrop-filter:blur(2px)}

body.v5 .join-controls{position:absolute;left:50%;bottom:14px;transform:translateX(-50%);display:flex;align-items:center;gap:6px}
body.v5 .join-control{height:30px;padding:0 12px;border:1px solid var(--line);border-radius:999px;background:var(--panel);color:var(--text-2);font-size:var(--fs-2);cursor:pointer;white-space:nowrap}
body.v5 .join-control:hover{color:var(--text);border-color:var(--line-strong)}
body.v5 .join-mic-level{display:flex;align-items:flex-end;gap:2px;height:18px;padding:0 2px}
body.v5 .join-mic-level[hidden]{display:none}
body.v5 .join-mic-level i{width:3px;height:100%;border-radius:2px;background:var(--lamp);transform:scaleY(.15);transform-origin:bottom;transition:transform .08s linear}

body.v5 .v10-console-tabs button[data-pane="chat"]{display:inline-flex;align-items:center;gap:6px}
body.v5 .v10-console-badge{display:inline-grid;place-items:center;min-width:16px;height:16px;padding:0 4px;border-radius:999px;background:var(--lamp);color:var(--lamp-ink);font-size:var(--fs-1);line-height:1}
body.v5 .v10-console-badge[hidden]{display:none}
body.v5 [aria-label="Chat"]{position:relative}
body.v5 [aria-label="Chat"][data-unread]::after{content:attr(data-unread);position:absolute;top:-3px;right:-3px;min-width:14px;height:14px;padding:0 3px;border-radius:999px;background:var(--lamp);color:var(--lamp-ink);font-size:var(--fs-1);line-height:14px;text-align:center;font-weight:600}

body.v5 .join-devices{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:10px}
body.v5 .join-device-label{display:flex;flex-direction:column;gap:3px;min-width:0;font-size:var(--fs-1);color:var(--faint)}
body.v5 .join-device{width:100%;height:28px;padding:0 6px;border:1px solid var(--line);border-radius:6px;background:var(--panel);color:var(--text-2);font-size:var(--fs-1)}

body.v5 .v10-waiting{position:fixed;inset:0;z-index:78;display:grid;place-items:center;padding:24px;background:rgba(246,247,249,.93);backdrop-filter:blur(6px)}
body.v5 .v10-waiting[hidden]{display:none}
body.v5 .v10-waiting-card{width:min(380px,100%);padding:28px 26px;border:1px solid var(--line);border-radius:14px;background:var(--panel);box-shadow:0 18px 50px rgba(15,20,26,.10);text-align:center}
body.v5 .v10-waiting-dot{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--lamp);box-shadow:0 0 0 4px var(--lamp-soft);margin-bottom:14px}
body.v5 .v10-waiting-kicker{font-size:var(--fs-1);letter-spacing:.16em;color:var(--faint);text-transform:uppercase}
body.v5 .v10-waiting-card h2{margin:8px 0 0;font-size:var(--fs-6);font-weight:600;color:var(--text)}
body.v5 .v10-waiting-topic{margin:10px 0 0;font-size:var(--fs-3);line-height:1.7;color:var(--text-2)}
body.v5 .v10-waiting-hint{margin:6px 0 0;font-size:var(--fs-2);line-height:1.7;color:var(--faint)}
body.v5 .v10-waiting-leave{margin-top:18px;height:32px;padding:0 14px;border:1px solid var(--line);border-radius:8px;background:var(--panel);color:var(--text-2);font-size:var(--fs-2);cursor:pointer}
body.v5 .v10-waiting-leave:hover{background:var(--panel-2);color:var(--text)}

/* v13：三栏布局下舞台始终占满；练习/陪聊/认识会不再把舞台压到 180–240px */
@media (min-width:900px){
  body.v5[data-scenario="practice"] #app .workspace,
  body.v5[data-scenario="casual"] #app .workspace,
  body.v5[data-scenario="intro"] #app .workspace{grid-template-rows:44px minmax(0,1fr)!important}
}

/* v13：修移动端右栏被 position:relative 拉回文档流（导致主区 0 高） */
@media (max-width:1000px){
  body.v5 .rail{position:fixed;top:0;right:0;bottom:0;left:auto;width:min(380px,92vw);transform:translateX(103%);transition:transform .18s ease;z-index:70;box-shadow:-8px 0 24px rgba(15,20,26,.18)}
  body.v5.rail-open .rail{transform:none}
}

body.v5 .v10-people-deny{color:var(--danger);border-color:var(--line)}
body.v5 .v10-people-deny:hover{background:var(--danger);color:var(--lamp-ink);border-color:var(--danger)}

body.v5 .present-page{min-width:44px;text-align:center;font-size:var(--fs-1);color:var(--faint);font-variant-numeric:tabular-nums}
body.v5 #btn-present-prev:disabled,body.v5 #btn-present-next:disabled{opacity:.35;cursor:default}

/* v14：Chat 栏被子元素 min-content 撑到 ~500px，正文/气泡被右边缘裁掉 */
body.v5 .v10-console-body{min-width:0}
body.v5 .v10-pane{min-width:0;overflow:hidden}
body.v5 .v10-pane[data-pane="chat"] #v5-react-thread{width:100%;min-width:0}
body.v5 .v10-pane[data-pane="chat"] #v5-react-composer{min-width:0}
body.v5 .v10-pane[data-pane="chat"] #v5-react-composer > div{min-width:0}

/* v14：Chat 输入器只保留主行；打断/卡住/举手/暂停/结束交给控制条与 People，避免底部第二行被裁 */
body.v5 .v10-pane[data-pane="chat"] #v5-react-composer [data-actions]{display:none}

/* v14：Chat 输入行给正文让位：按住说话在主控制条已有，窄栏里隐藏 */
body.v5 .v10-pane[data-pane="chat"] #v5-react-composer button[aria-label="按住说话"]{display:none}
