/* 移动端形态：由 patch.js 依据「触摸能力 + 宽度」打 body.m-mobile（不再用 media query 猜宽度）*/
  body.m-mobile [class*="_frame"] { grid-template-columns: 0px minmax(0, 1fr) 0px !important; }
  body.m-mobile [class*="_frame"] > [class*="centerCol"] { grid-column: 2 !important; }
  body.m-mobile [class*="_frame"] > [class*="sidebarCol"] { overflow: hidden !important; }
  body.m-mobile [class*="_frame"]:not([data-sidebar-collapsed]) > [class*="sidebarCol"] { position: fixed !important; top: 0 !important; bottom: 0 !important; left: 0 !important; width: var(--m-drawer-w, min(82vw, 320px)) !important; max-width: 96vw !important; min-width: 150px !important; z-index: 1000 !important; background: var(--dsw-alias-bg, #1b1b1e) !important; box-shadow: 4px 0 24px rgba(0,0,0,.5) !important; display: flex !important; overflow-x: auto !important; }
  body.m-mobile [class*="_frame"]:not([data-sidebar-collapsed]) > [class*="sidebarCol"] > * { max-width: 100% !important; box-sizing: border-box !important; }
  body.m-mobile [class*="_frame"] > [class*="handle"] { display: none !important; }
  /* 收回态：用 display:none 彻底移除（iOS Safari 下 transform+visibility 会留合成层残影，实测残留 32%）
     内部加 overflow-x:hidden + 子元素 max-width:100% 防内容撑破屏宽（用户看到的"全屏"多为内容溢出） */
  body.m-mobile [class*="_frame"] > [class*="rightbarCol"] { position: fixed !important; top: 0 !important; bottom: 0 !important; right: 0 !important; width: var(--m-rightbar-w, min(70vw, 300px)) !important; max-width: 96vw !important; min-width: 160px !important; z-index: 998 !important; background: var(--dsw-alias-bg, #1b1b1e) !important; box-shadow: -4px 0 24px rgba(0,0,0,.5) !important; display: none !important; overflow-x: auto !important; visibility: visible !important; }
  body.m-mobile.m-rightbar-open [class*="_frame"] > [class*="rightbarCol"] { display: flex !important; }
  body.m-mobile.m-rightbar-open [class*="_frame"] > [class*="rightbarCol"] > * { max-width: 100% !important; box-sizing: border-box !important; }
  body.m-mobile #m-drawer-btn, body.m-mobile #m-rightbar-btn { position: fixed !important; top: var(--m-btn-top, 50%) !important; transform: translateY(-50%) !important; touch-action: none !important; user-select: none !important; -webkit-user-select: none !important; width: 30px !important; height: 56px !important; background: var(--dsw-alias-bg, #2a2a2e) !important; color: var(--dsw-alias-label-primary, #e8e8e8) !important; border: 1px solid var(--dsw-alias-border-l2, rgba(255,255,255,.14)) !important; display: flex !important; align-items: center !important; justify-content: center !important; cursor: pointer !important; padding: 0 !important; font-size: 16px !important; line-height: 1 !important; z-index: 999 !important; opacity: .85 !important; }
  body.m-mobile #m-drawer-btn { left: 0 !important; border-radius: 0 10px 10px 0 !important; border-left: none !important; }
  body.m-mobile #m-rightbar-btn { right: 0 !important; border-radius: 10px 0 0 10px !important; border-right: none !important; }
  /* 2026-10-05 v57：删除 `[class*="uV2eYG_row"] { flex-wrap:nowrap; overflow-x:auto }`。
   该规则本意是"防输入区撑破"，但实测副作用是【输入框内出现横向滚动条】
   （截图那条贯穿的横线），且 flex-wrap:nowrap 使内容永不换行。
   输入区布局交回 DSH 原生。 */
/* 2026-10-06 v80：原写法只有 `flex-wrap:wrap + overflow-x:visible`，缺"可否收缩"的约束 ——
   行内 flex-shrink:0 的控件（发送按钮/麦克风）不会缩，一旦整行总宽超过容器就直接溢出
   （用户报"输入过文字后发送按钮等控件超出对话泡泡容器；刷新又正常"）。
   现补两条约束：行自身限制在容器宽度内，行内子项一律允许收缩且可低于内容宽。 */
body.m-mobile [class*="uV2eYG_row"] {
  flex-wrap: wrap !important;
  overflow-x: visible !important;
  max-width: 100% !important;
  min-width: 0 !important;
  box-sizing: border-box !important;
}
body.m-mobile [class*="uV2eYG_row"] > * {
  min-width: 0 !important;
  max-width: 100% !important;
  box-sizing: border-box !important;
}
/* 发送/麦克风等图标按钮：允许收缩但不小于 28px（否则点不到） */
body.m-mobile [class*="uV2eYG_row"] > button,
body.m-mobile [class*="uV2eYG_row"] > [role="button"] {
  flex-shrink: 1 !important;
  min-width: 28px !important;
}
  /* ① 输入类元素字号：已【撤销】强制 16px。
     原因（2026-10-05 用户报"整个手机页面字体变大、视觉内容都放大"）：
       1) 原选择器含 [class*="input"]，会命中"任何 class 含 input 的容器"（如 uV2eYG_input 等输入区外壳），
          其 font-size 被所有子元素继承 → 整页文字变大、tab/标题/DAG 全部变大。该选择器本就是多余的，
          [contenteditable="true"] 已能命中主输入框。
       2) 强制 ≥16px 的**唯一目的**是规避 iOS「聚焦 <16px 输入元素自动放大整页」，
          而该问题已由 nginx 注入 viewport（maximum-scale=1, user-scalable=no）从根上解决，
          故字号强制不再必要，一律交回 DSH 原生。 */
/* ② 长按会话项不再"凸出来变成文字选中"（用户反馈的实际观感） */
body.m-mobile [class*="sidebarCol"] *,
body.m-mobile [class*="rightbarCol"] * { -webkit-touch-callout: none !important; }
body.m-mobile [class*="sessionRow"],
body.m-mobile [class*="sessionRow"] *,
body.m-mobile [class*="projectRow"],
body.m-mobile [class*="projectRow"] * { -webkit-user-select: none !important; user-select: none !important; }
/* 2026-10-05 审查：语音输入插件（dsh-voice-input-web）已于本日删除、改用 DSH 自带，
   原「语音按钮定位」整组规则（含 uV2eYG_card{position:relative} 与 textarea{padding-right:46px}）
   已失效且会干扰输入卡片，故移除。 */

/* ── 抽屉/右栏「内容自适应」：治"内容按桌面尺寸渲染、被容器切掉"（2026-10-05）
   元凶通常是天生不折行的内容：代码块 / 预格式化文本 / 表格 / 长链接。
   三层约束：①所有后代不超容器 ②代码类允许折行 ③表格可横向滚动。 */
body.m-mobile [class*="sidebarCol"] *:not(svg):not(canvas):not(img),
body.m-mobile [class*="rightbarCol"] *:not(svg):not(canvas):not(img) {
  max-width: 100% !important;
  box-sizing: border-box !important;
}
body.m-mobile [class*="sidebarCol"] pre,
body.m-mobile [class*="sidebarCol"] code,
body.m-mobile [class*="rightbarCol"] pre,
body.m-mobile [class*="rightbarCol"] code {
  white-space: pre-wrap !important;
  word-break: break-word !important;
  overflow-wrap: anywhere !important;
}
body.m-mobile [class*="sidebarCol"] table,
body.m-mobile [class*="rightbarCol"] table {
  display: block !important;
  overflow-x: auto !important;
  max-width: 100% !important;
}
/* 长链接/长单词：允许在任意处断行，避免撑宽 */
body.m-mobile [class*="sidebarCol"] a,
body.m-mobile [class*="rightbarCol"] a {
  overflow-wrap: anywhere !important;
  word-break: break-word !important;
}

/* ── 右栏「拖左缘改宽」把手（2026-10-05 恢复被 display:none 灭掉的能力）
   不用 DSH 原生 handle（它在 position:fixed 抽屉下会错位），自建一条 12px 热区。
   宽度存 localStorage，跨会话记住。 */
body.m-mobile #m-rightbar-resizer {
  position: fixed !important; top: 0 !important; bottom: 0 !important;
  width: 12px !important; z-index: 1001 !important; display: none !important;
  cursor: col-resize !important; touch-action: none !important;
  background: linear-gradient(90deg, rgba(255,255,255,.10), rgba(255,255,255,0));
}
body.m-mobile.m-rightbar-open #m-rightbar-resizer { display: block !important; right: calc(var(--m-rightbar-w, min(70vw, 300px)) - 5px) !important; }
body.m-mobile #m-rightbar-resizer::after {
  content: "" !important; position: absolute !important; left: 4px !important; top: 50% !important;
  transform: translateY(-50%) !important; width: 4px !important; height: 42px !important;
  border-radius: 2px !important; background: var(--dsw-alias-label-dimmed, rgba(255,255,255,.35)) !important;
}

/* ── 移动端断掉「双击缩放」链（2026-10-05）
   根因：viewport 无 user-scalable=no + touch-action:auto → iOS Safari 检测双击时
   会延迟/吞掉单击（表现为"必须先选中再切换"），真双击又会缩放整页 + 误触原生改名。
   touch-action:manipulation = 禁双击缩放、保留滚动/单击/拖动。 */
body.m-mobile { touch-action: manipulation !important; }
body.m-mobile [class*="sidebarCol"] button,
body.m-mobile [class*="rightbarCol"] button,
body.m-mobile [class*="panelRow"],
body.m-mobile [class*="sessionItem"],
body.m-mobile [class*="session-item"] { touch-action: manipulation !important; -webkit-user-select: none !important; user-select: none !important; }
/* 禁掉长按弹出的系统菜单（iOS 上长按会话项会弹「拷贝/共享」，也是误操作来源） */
body.m-mobile [class*="sidebarCol"] button,
body.m-mobile [class*="panelRow"] { -webkit-touch-callout: none !important; }

/* ── 左侧抽屉「拖右缘改宽」把手（2026-10-05，与右栏同套逻辑）
   宽度走 var(--m-drawer-w)，存 localStorage，收起时自动隐藏。 */
body.m-mobile #m-drawer-resizer {
  position: fixed !important; top: 0 !important; bottom: 0 !important;
  width: 12px !important; z-index: 1001 !important; display: none !important;
  cursor: col-resize !important; touch-action: none !important;
  background: linear-gradient(270deg, rgba(255,255,255,.10), rgba(255,255,255,0));
}
/* 显隐与 left 由 patch.js 依"左栏是否展开"动态设置（浏览器无法用 CSS 反推子元素状态） */
body.m-mobile #m-drawer-resizer::after {
  content: "" !important; position: absolute !important; right: 4px !important; top: 50% !important;
  transform: translateY(-50%) !important; width: 4px !important; height: 42px !important;
  border-radius: 2px !important; background: var(--dsw-alias-label-dimmed, rgba(255,255,255,.35)) !important;
}

/* ── 超长文本不再撑破对话区（2026-10-05，用户报"节点卡片超宽/页面能左右拖/对话区显窄"）
   实测元凶不是 forge 卡片（.dag-wrap 自带 overflow-x:auto），而是消息里的超长不换行文本：
   SPAN._text_* 单行宽达 5293px，把祖先链一路撑开。
   策略：①普通文本允许任意处断行 ②代码块保持不折行但改为"容器内横向滚动"（可读性优先）
   ③链路容器补 min-width:0 —— flex/grid 子项默认 min-width:auto 会拒绝收缩，是撑破的根因。
   注意：桌面端与移动端都超宽，故此处不加 .m-mobile 限定。 */
/* ① 超长文本可断行 */
[class*="centerCol"] [class*="_text_"],
[class*="centerCol"] p,
[class*="centerCol"] li,
[class*="centerCol"] td { overflow-wrap: anywhere !important; word-break: break-word !important; }
/* ② 代码块不折行，但限宽 + 内部滚动 */
[class*="centerCol"] pre,
[class*="centerCol"] code { max-width: 100% !important; }
[class*="centerCol"] pre { overflow-x: auto !important; }
/* ③ 表格整体可横向滚动，别撑破 */
/* ④ forge 迭代面板：可横向滚动的区域限宽，链路容器可收缩 */
[class*="dag-wrap"], [class*="dagWrap"] { min-width: 0 !important; max-width: 100% !important; }
/* ⑤ 兜底：谁都不许横向撑破视口 */

/* ── 治「摘要文字被硬截断」（2026-10-05 实测定位；2026-10-05 v63 再收窄）
   起因：SPAN._text_1rdzk_17 是 white-space:nowrap（宽达 5293px），
        父级 .lcKema_summaryText 用 overflow-x:hidden 裁掉 → 摘要看不到完整。
   ⚠️ v63 修正：上一版写成 `[class*="centerCol"] [class*="_text_"]`（对话区所有 _text_），
      并强制 `white-space: normal` —— 结果把「思考 / 工具调用」这类**折叠成一行**的
      组件（其折叠正是靠 nowrap）全部拆开换行，对话区显示杂乱（用户报）。
      现只保留【折叠不起作用、确实需要折行】的摘要场景：限定在 summary 类容器内，
      且**不再强制 white-space**（改由 overflow-wrap 兜底，不破坏 nowrap 折叠）。 */
[class*="centerCol"] [class*="summaryText"],
[class*="centerCol"] [class*="summary"] [class*="_text_"] {
  overflow-wrap: anywhere !important;
  word-break: break-word !important;
}
/* forge 插件内的 DAG 卡片区：用户确认「大小合适、可横向滚动」，此处不改动（2026-10-05 回滚）*/

/* ── forge 迭代进度卡片内长文本不再撑破（2026-10-05，实测定位）
   元凶：卡片内某行 <b>（无 class）带 white-space:nowrap，内容形如
   「R2 drama checker 验收接入（L3-3c）：creator_markdown_check.py 黄金样…」宽达 541px，
   把外层卡片顶到 523px → 440/500px 手机上必然横向溢出（用户报"超长卡片/要左右拖"）。
   注：该卡片渲染在主页 DOM（非 iframe），且 home 入口也走同一 nginx，故此处一处修、三端生效。 */
/* 2026-10-05 审查：原此处含 `body.m-mobile b, body.m-mobile strong` 通配（移动端所有加粗文本），
   与当年 [class*="input"] 同型错误，已删除；仅保留卡片内（下方 [data-m-card] 组）的精准规则。 */
/* 2026-10-05 审查：O_Ebla_body（消息列容器）规则会波及对话气泡，已移除；
   卡片宽度跟随由 [data-m-card] 自身完成，无需改消息列。 */

/* ═══════════════ 悬浮卡片（输入框上方）—— 极简版 v46（2026-10-05）
   v45 教训：对"卡片内所有元素"下通配（`[data-m-card] * { flex-wrap:wrap }`、
   `* { max-width:100%; overflow-wrap:anywhere }`）会把【卡片内部原有布局】打碎：
     · 标题行/进度行被强制换行 → 竖排
     · chip 标签被撑成整行
   故本版只做【三件互不干扰的最小改动】，绝不下探到卡片内部元素：
     ① 卡片自身宽度跟随对话消息列（CSS 变量 --m-col-w 由 patch.js 写入，不写死 px）
     ② 卡片自身居中
     ③ 卡片过高时自身滚动（21vh），不牵动内部任何布局
   卡片内部的换行/字号/收缩策略一律交回插件与 DSH 原生。 */
[class*="composerSeat"] [data-m-card],
[class*="composerStack"] [data-m-card] {
  /* 2026-10-05 用户裁定：容器可比对话区【稍宽】。余量 56px 的由来（实测）：
     · 卡片内容比消息列宽 28px（插件自带 margin-right:-20/-34 的负边距外溢）
     · 卡片右上角的 ✕ 关闭按钮（aria-label="隐藏执行流条（刷新页面恢复）"）原落在
       卡片右边界之外 1~15px，容器过窄时会被裁掉 → 用户点不到、无法关闭卡片
     · 故余量 = 28（内容）+ 15（✕）+ 13（安全）≈ 56px；上限再夹 min(屏宽-16px)。 */

  width: calc(min(var(--m-col-w, 680px) + 88px, 100vw - 16px)) !important;
  max-width: calc(min(var(--m-col-w, 680px) + 88px, 100vw - 16px)) !important;
  min-width: 0 !important;
  margin-left: auto !important;
  margin-right: auto !important;
  box-sizing: border-box !important;
  /* 2026-10-05 v69：用户要求卡片最高高度再收窄两行。实测卡片行高 17px，
     故在 21vh 基础上减行：v69 减 2 行（34px），v73 用户要求再缩一点、再减 1 行 → 共 51px。 */
  max-height: calc(21vh - 51px) !important;
  overflow-y: auto !important;
  overflow-x: hidden !important;   /* 卡片内负 margin 元素（插件设计，mr:-20/-34）造成的 28px 外溢在此收口，不产生横向滑动 */
  -webkit-overflow-scrolling: touch !important;
  overscroll-behavior: contain !important;
}
/* 2026-10-06 排雷双保险：答题卡/审批卡（ApprovalPanel，自带 data-approval-key/
   data-approval-scroll 语义钩子）即使被旧版 JS 误打了 data-m-card，也在此解钳——
   提问框内容必须完整可见可选（用户实证：被压到 ~120px 无法点选项）。 */
[class*="composerSeat"] [data-m-card]:has([data-approval-key]),
[class*="composerStack"] [data-m-card]:has([data-approval-key]),
[data-m-card]:has([data-approval-key]),
[data-m-card][data-approval-scroll] {
  max-height: none !important;
  overflow-y: visible !important;
}
/* 2026-10-06 v75：工具结果卡(CY-8Ka_/o3BgMG_)与问答卡(fsXYAq_)绝不被卡片限高波及 ——
   它们承载必须完整可见的内容（工具输出 / 待作答选项），一旦被压到 21vh 就"看不见、点不到"。 */
[data-m-card]:has([class*="CY-8Ka_"]),
[data-m-card]:has([class*="o3BgMG_"]),
[data-m-card]:has([class*="fsXYAq_"]) {
  max-height: none !important;
  overflow-y: visible !important;
}
/* 2026-10-06 v77：交互式问答卡（@deepseek-ai/dsh-client-ui-user-questions）——
   结构 .Mbwy4a_frame > .Mbwy4a_card > (.Mbwy4a_header / .Mbwy4a_body > .Mbwy4a_options > .Mbwy4a_option)。
   它的 frame 若落在 composerStack 下，会被"卡片限高"波及 → 卡片压到 ~120px 后
   只能显示 header（标题 + ⌃ ✕），选项按钮 .Mbwy4a_options 被挤进滚动区外，
   用户表现为"问答卡点不了答案、按钮被遮盖"。
   此处显式解除【我们的】限高与裁切；卡片自身的 max-height:min(60vh,…) 与
   body 的 overflow-y:auto 是它自己的合理设计，保持不动。 */
[class*="Mbwy4a_frame"], [class*="Mbwy4a_card"],
[class*="composerSeat"] [class*="Mbwy4a_frame"], [class*="composerStack"] [class*="Mbwy4a_frame"] {
  max-height: none !important;
  overflow: visible !important;
}
[class*="Mbwy4a_body"], [class*="Mbwy4a_options"] {
  max-height: none !important;
}
[class*="composerSeat"] [data-m-card]::-webkit-scrollbar { width: 4px; }
[class*="composerSeat"] [data-m-card]::-webkit-scrollbar-thumb { background: rgba(255,255,255,.22); border-radius: 2px; }

/* ── 卡片内"加粗长文本行"允许折行（2026-10-05）
   实测：卡片内 <b>（无 class）带 white-space:nowrap，宽 481px / 541px，
   父级 overflow:hidden 把它裁掉；表现为"容器放不下内容、要左右滑"，
   且因 nowrap 与容器同宽增长，故"只加宽容器永远不够"。
   注意：只作用于 <b>/<strong> 两种行内元素，严禁下探到 * 或 div（v45 教训：
   通配会打碎卡片内部布局，导致标题竖排、chip 撑满整行）。 */
body.m-mobile [class*="composerSeat"] b,
body.m-mobile [class*="composerStack"] b,
body.m-mobile [class*="composerSeat"] strong,
body.m-mobile [class*="composerStack"] strong {
  white-space: normal !important;
  flex: 0 1 auto !important;      /* 允许收缩（原为 0 0 auto 时拒绝收缩） */
  min-width: 0 !important;
  max-width: 100% !important;
  overflow-wrap: anywhere !important;
  word-break: break-word !important;
}

/* ── 卡片关闭按钮（✕）必须始终可见可点（2026-10-05，用户实测"没法关闭卡片"）
   实测该按钮为：<span role="button" title="隐藏执行流条（刷新页面恢复）" …>✕</span>
   —— 用的是 **title 属性**（不是 aria-label，上一版选择器因此打空）。
   它所在"标题行"宽 119px、右端超出卡片右边界 15px，被 overflow-x:hidden 裁掉 → 点不到。
   修法（双保险）：①按 title 精准命中；②把它钉在卡片内右上角，不再依赖标题行宽度。 */
[class*="composerSeat"] [data-m-card] [title*="隐藏执行流条"],
[class*="composerStack"] [data-m-card] [title*="隐藏执行流条"],
[class*="composerSeat"] [title*="隐藏执行流条"],
[class*="composerStack"] [title*="隐藏执行流条"] {
  /* 2026-10-05 v59：撤回上一版的 absolute 定位 —— 它把 ✕ 钉在右上角，
     正好压在「进度 3/16（19%）」文字上（实测两者矩形重叠 = true）。
     改回流式布局：跟随标题行自然排布，只保证不收缩、可点。 */
  position: static !important;
  right: auto !important;
  top: auto !important;
  left: auto !important;
  flex: 0 0 auto !important;
  min-width: 14px !important;
  margin-left: 10px !important;
  cursor: pointer !important;
  pointer-events: auto !important;
  display: inline-block !important;
  line-height: 1.2 !important;
  z-index: 1 !important;
}
/* 卡片本体：保留 relative（无害，供插件自身定位使用） */
[class*="composerSeat"] [data-m-card],
[class*="composerStack"] [data-m-card] { position: relative !important; }
/* 卡片内"标题行"允许收缩，别把 ✕ 挤出容器 */
[class*="composerSeat"] [data-m-card] > div > span,
[class*="composerStack"] [data-m-card] > div > span { min-width: 0 !important; }

/* ── 对话区规则收敛（2026-10-05，用户报"对话泡泡被改了格式、多了横滚条、控件溢出"）
   原因：v31 为治超宽加了两条【无 m-mobile 前缀的通配规则】
     · [class*="centerCol"] { min-width: 0 }
     · [class*="centerCol"] *:not(pre):not(code):not(table) { min-width: 0 }
   它们作用于对话区内【所有元素】（含气泡内按钮/控件），使控件失去最小宽度保护 → 布局崩、
   内容溢出、并诱发横向滚动条；且因无前缀，桌面端同样被改。
   另 [class*="centerCol"] table{display:block} 与全局 body{overflow-x:hidden} 亦一并移除。
   现只保留【必要且最小】的三条：超长文本折行 + 代码块/表格容器内滚动。 */
[class*="centerCol"] [class*="_text_"],
[class*="centerCol"] p,
[class*="centerCol"] li { overflow-wrap: anywhere !important; word-break: break-word !important; }
[class*="centerCol"] pre,
[class*="centerCol"] code { max-width: 100% !important; }
[class*="centerCol"] pre { overflow-x: auto !important; }

/* ── 输入框内不再出现横向滚动条（2026-10-05 v58，用户截图那条贯穿横线）
   实测链路：uV2eYG_scroll(708/750, overflow-x:auto) → uV2eYG_grow(708/750)
             → 文字「发消息或创建任务, / 调用指令, @ 文件或对话」单行需 750px
   即：placeholder 单行溢出 42px，被 overflow-x:auto 渲染成横滚条。
   修法：①滚动容器取消横向滚动 ②占位/输入文本允许折行（输入框本身是多行设计，折行安全）。 */
body.m-mobile [class*="uV2eYG_scroll"] { overflow-x: hidden !important; }
body.m-mobile [class*="uV2eYG_grow"] {
  white-space: normal !important;
  overflow-wrap: anywhere !important;
  word-break: break-word !important;
  max-width: 100% !important;
  min-width: 0 !important;
}
/* 2026-10-06 v81：输入框本体（contenteditable 与其直接外层）在聚焦后
   会被 DSH 追加状态（底部指标行等），若它自身 flex-shrink:0 / min-width:auto，
   就会把行内其他控件（麦克风、发送按钮）顶出容器 —— 用户报"一旦输入焦点切进
   对话框，稍等一会发送按钮就超出容器顶出去"（刷新后 JS 未介入时正常）。
   此处强制它可收缩且不超容器宽；图标按钮另给最小可点尺寸，避免被压没。 */
body.m-mobile [class*="uV2eYG_input"],
body.m-mobile [class*="composerSeat"] [contenteditable="true"],
body.m-mobile [class*="composerStack"] [contenteditable="true"] {
  max-width: 100% !important;
  min-width: 0 !important;
  flex-shrink: 1 !important;
  box-sizing: border-box !important;
  overflow-wrap: anywhere !important;
}
body.m-mobile [class*="uV2eYG_row"] > button,
body.m-mobile [class*="uV2eYG_row"] > [role="button"],
body.m-mobile [class*="uV2eYG_row"] button {
  flex-shrink: 0 !important;
  min-width: 28px !important;
  flex-basis: auto !important;
}

/* 输入卡片自身也收口，避免 24px 外溢带动布局 */
body.m-mobile [class*="uV2eYG_card"] { max-width: 100% !important; box-sizing: border-box !important; }

/* ── 卡片内「标签行」允许换行 + 允许收缩（2026-10-05 v59，用户报"最左 chip 被截一点点"）
   卡片内容实测仍比容器宽 28px，被 overflow-x:hidden 裁掉左右边缘。
   方案（用户给的第二条）："内部控件缩小、卡片容器不缩小" ——
   故只让卡片内的行容器可换行、标签可收缩，卡片本体宽度保持不变（已加到 +88px 余量）。 */
[class*="composerSeat"] [data-m-card] > div:nth-child(2) div,
[class*="composerStack"] [data-m-card] > div:nth-child(2) div { flex-wrap: wrap !important; }
[class*="composerSeat"] [data-m-card] > div:nth-child(2) span,
[class*="composerStack"] [data-m-card] > div:nth-child(2) span {
  min-width: 0 !important;
  max-width: 100% !important;
  box-sizing: border-box !important;
  text-overflow: ellipsis !important;
}

/* ── 卡片内「标签行」显示策略（2026-10-05 v64，用户裁定）
   用户原话："要不整体把字体改小，要不就截掉过宽的文字，不要这种异常换行。"
   实测：卡片内标签字号已是 11px（DSH 原生），无需再改字号；
   问题出在"标签被 flex 压缩后文字被硬切"（半截字），故：
     ① 标签自身：不换行 + 溢出省略号（长标签显示为"需求澄清与基线确认…"）
     ② 标签行容器：允许整体换行（多个标签放不下就换到下一行，而不是挤扁每个标签）
     ③ 标签不参与收缩到小于自身文字宽度（避免出现半截字） */
/* 2026-10-06 v74 修复：原为卡片内所有 span，会命中【问答卡的答案元素】
   (dsh-client-ui-tool 的 fsXYAq_answer / fsXYAq_answerLine) → overflow:hidden 裁掉可点区域，
   用户报问答卡点不了答案。现收窄为【只作用于标签行(第2个子 div)内的 span】。 */
[class*="composerSeat"] [data-m-card] > div:nth-child(2) span,
[class*="composerStack"] [data-m-card] > div:nth-child(2) span {
  white-space: nowrap !important;
  overflow: hidden !important;
}
/* 2026-10-05 v65：撤回「卡片内所有直接子 div 都 wrap」——
   实测它把【标题行】（名称 + 迭代号 + 进度）在窄屏下拆成两行（用户报"进度被折叠到第二行"）。
   现改为按行区分：标题行 nowrap / 标签行 wrap / 节点行 nowrap+截断。 */
[class*="composerSeat"] [data-m-card] > div:nth-child(2),
[class*="composerStack"] [data-m-card] > div:nth-child(2) { flex-wrap: wrap !important; }

/* ═══ 卡片内「三行」的不同显示策略（2026-10-05 v65，用户逐行裁定）═══
   用户原话："迭代#26 执行中 和下面的 进度9/16，这个应该在一行显示的，硬被折叠到了两行，就是问题；
             最后的文字行也有这个问题，后面大段的文字和其后的模型配置整体收缩为一行，多余的文字截断，不要超过一行。"
   实测卡片结构：子1=标题行(名称+迭代号+进度+✕) / 子2=标签行(16 个 chip) / 子3=节点行(每条描述+模型配置)
   策略：
     ① 标题行 → 强制单行（进度不得折到第二行）；内部元素可收缩、超长省略
     ② 标签行 → 允许换行（多个标签放不下就换行，保留 v64 策略）
     ③ 节点行 → 每条强制单行，超出部分省略号截断（"多余的文字截断，不要超过一行"） */
[class*="composerSeat"] [data-m-card] > div:first-child,
[class*="composerStack"] [data-m-card] > div:first-child {
  flex-wrap: nowrap !important;
  overflow: hidden !important;
  align-items: center !important;
}
[class*="composerSeat"] [data-m-card] > div:first-child > *,
[class*="composerStack"] [data-m-card] > div:first-child > * {
  min-width: 0 !important;
  flex-shrink: 1 !important;
  overflow: hidden !important;
  text-overflow: ellipsis !important;
  white-space: nowrap !important;
}
/* 标题行里"最长的那一段"（通常是卡名）优先收缩，保证进度与 ✕ 始终同行可见 */
[class*="composerSeat"] [data-m-card] > div:first-child > *:first-child,
[class*="composerStack"] [data-m-card] > div:first-child > *:first-child { flex-shrink: 3 !important; }

/* 节点行：每条单行 + 截断 */
[class*="composerSeat"] [data-m-card] > div:nth-child(3),
[class*="composerStack"] [data-m-card] > div:nth-child(3) { overflow: hidden !important; }
[class*="composerSeat"] [data-m-card] > div:nth-child(3) > *,
[class*="composerStack"] [data-m-card] > div:nth-child(3) > * {
  white-space: nowrap !important;
  overflow: hidden !important;
  text-overflow: ellipsis !important;
  min-width: 0 !important;
  flex-wrap: nowrap !important;
  max-width: 100% !important;
}
[class*="composerSeat"] [data-m-card] > div:nth-child(3) > * > *,
[class*="composerStack"] [data-m-card] > div:nth-child(3) > * > * {
  white-space: nowrap !important;
  overflow: hidden !important;
  text-overflow: ellipsis !important;
  min-width: 0 !important;
}

/* ── 节点行（卡片第 3 行）全层级单行 + 截断（2026-10-05 v66）
   实测 v65 只覆盖到 `> * > *` 两层，而"描述文本"位于更深一层：
     节点行 > 条目(flex,nowrap) > 描述DIV(white-space:normal,h=48,3行) ← 未命中
   用户要求："后面大段的文字和其后的模型配置整体收缩为一行，多余的文字截断，不要超过一行。"
   故此处改用【后代选择器】覆盖节点行内全部层级；作用域仍严格限定在卡片第 3 行内。 */
[class*="composerSeat"] [data-m-card] > div:nth-child(3) *,
[class*="composerStack"] [data-m-card] > div:nth-child(3) * {
  white-space: nowrap !important;
  overflow: hidden !important;
  text-overflow: ellipsis !important;
  min-width: 0 !important;
  max-width: 100% !important;
  flex-wrap: nowrap !important;
}

/* ── 卡片内各行宽度约束（2026-10-05 v71 修正）
   v70 曾把标签行 display 由 inline-flex 改成 flex，实测反而让横向溢出从 20px 增到 34px，
   故撤回该改动；只保留"不得超过内容区"的最小约束。 */
[class*="composerSeat"] [data-m-card] > div,
[class*="composerStack"] [data-m-card] > div {
  max-width: 100% !important;
  box-sizing: border-box !important;
}

/* ═══ 让「卡片本体」成为唯一滚动容器（2026-10-05 v72，用户报"滚动条都没有了、滚不到最后"）═══
   实测根因：卡片内【标签行】（第 2 个子 div）自带 overflow-y:auto，配合我给它的
   flex-wrap:wrap 后高度撑到 137px（≈ 卡片限高上限），把第 3 行（节点行）整个挤出视野；
   用户在卡片上滑动时滑的是【标签行】（仅 3px 可滚），故"怎么滑都看不到最后的文字行"。
   修法：卡片内除本体外的所有行容器一律不滚动（overflow: visible），
        让内容自然堆叠、由卡片本体统一滚动。 */
[class*="composerSeat"] [data-m-card] > div,
[class*="composerStack"] [data-m-card] > div {
  overflow: hidden !important;      /* v73：原为 visible，会让标签行把多出的内容画到卡片外（用户报"节点框冒头"）*/
  max-height: none !important;
}
/* 卡片本体保留自身滚动 */
[class*="composerSeat"] [data-m-card],
[class*="composerStack"] [data-m-card] {
  overflow-y: auto !important;
  overflow-x: hidden !important;
}
