
/* CEO 收纳球 */
.ceo-ball{position:fixed;right:24px;bottom:24px;width:64px;height:64px;border-radius:0;z-index:950;cursor:grab;
  background:transparent;color:#fff;display:flex;align-items:center;justify-content:center;font-size:24px;
  box-shadow:none;border:none;overflow:visible;
  user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;outline:none;
  transition:transform .18s, left .3s cubic-bezier(.34,1.4,.4,1), top .3s cubic-bezier(.34,1.4,.4,1)}
.ceo-ball:hover{transform:scale(1.06)}
.ceo-ball:active{cursor:grabbing;transform:scale(1.02)}
.ceo-ball:active .cb-pulse{opacity:0}   /* 拖动时隐藏蓝色脉冲光晕, 避免视觉干扰 */
.ceo-ball .cb-pulse{position:absolute;inset:0;border-radius:50%;background:radial-gradient(circle,rgba(51,112,255,.35),transparent 70%);animation:ceoPulse 2.4s infinite;pointer-events:none}
.ceo-ball .cb-img{width:100%;height:100%;object-fit:contain;display:block;pointer-events:none;filter:drop-shadow(0 4px 10px rgba(0,0,0,.25))}
.ceo-ball[data-ball-state="snap-right"] .cb-img{transform:scaleX(-1)}
.ceo-ball[data-ball-state="walk-left"] .cb-img{transform:scaleX(-1)}
.ceo-ball[data-ball-state="walk-right"] .cb-img{transform:scaleX(1)}
.ceo-ball .cb-cnt{position:absolute;top:0;right:0;background:#e5484d;color:#fff;font-size:10px;font-weight:800;min-width:19px;height:19px;border-radius:10px;display:none;align-items:center;justify-content:center;padding:0 5px;box-shadow:0 2px 6px rgba(229,72,77,.5);z-index:3}
@keyframes ceoPulse{0%{transform:scale(1);opacity:.7}100%{transform:scale(1.9);opacity:0}}
/* 面板标题栏 logo */
.ch-ic{overflow:visible!important}
.ch-ic .ch-img{width:100%;height:100%;object-fit:contain;display:block;filter:drop-shadow(0 3px 8px rgba(0,0,0,.2))}
/* CEO 对话面板 */
.ceo-win{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);width:min(700px,92vw);height:auto;z-index:960;
  background:var(--card);border:1px solid var(--line);border-radius:18px;box-shadow:0 16px 50px rgba(20,30,60,.2);display:flex;flex-direction:column;overflow:visible;user-select:none;
  /* ★ 2026-10-08 狼哥：transition 去掉 left（清 left 时会触发过渡 → 往左抖动）
     保留 top/width/height（展开动画需要）*/
  transition:top .28s cubic-bezier(.2,.8,.3,1),width .2s,height .26s cubic-bezier(.2,.8,.3,1),margin-left .26s cubic-bezier(.2,.8,.3,1)}
.ceo-win.open{height:min(74vh,620px);min-height:0}
/* 拖动中: 冻结内部所有过渡/动画, 只让窗口跟手 */
.ceo-win.ceo-moving *{transition:none !important;animation-play-state:paused !important;}
/* ★拖动中: 全局 iframe 不接收指针事件 —— 否则鼠标划过 iframe 时 mousemove 会卡顿/中断 */
body.ceo-dragging iframe{pointer-events:none !important;}
/* ★★★ 2026-10-08 狼哥：拖动反制（真机验证：.mini 的 !important 会压过 inline）
   方案：拖动后加 .ceo-dragged 类 → 用 auto 覆盖 CSS 的 left/bottom/transform
        → 位置权归 inline（JS 写的 left/top 生效）
   真机数据：修复前拖动后 left 仍 280（未生效）*/
/* ★★★ 2026-10-08 狼哥（真机验证后定案）：
   真机证据：inline left=150px，computed left=234px
   根因：反制规则写 left:auto!important → 【反而让 inline 失效】
   正解：只覆盖 .mini 用来定位的属性（bottom/right/transform）
        ✅ 不写 left/top → inline 的 left/top 自然生效 */
/* ★★★ 2026-10-08 狼哥（真机验证定案）：
   真机证据：.mini 用 `inset: auto auto 24px 50% !important`（简写）
            → 写单独的 left 会被简写覆盖
   正解：也用 inset 简写，值来自 CSS 变量（JS 拖动时赋值）
   inset: top right bottom left */
#ceoWin.ceo-dragged{
  inset: var(--cdy, auto) auto auto var(--cdx, 50%) !important;
  transform: none !important;
}
/* 拖动/缩放中: 关大阴影(每帧重绘成本高) + 提示合成器 */
.ceo-win.ceo-moving{box-shadow:0 6px 18px rgba(20,30,60,.14);
  /* 拖动中: 提升为独立合成层(离屏内存只在拖动期间占用, 松手即释放) */
  will-change:left,top;}
/* ===== ★ P0 吸附右栏形态(dock) —— 模块可「叫」对话贴到右侧边栏 =====
   与 .max(全屏) 同级, 互斥。宽度由 --dock-w 控制(默认 380px)。
   进入方式: 宿主收 { type:'DOC_DOCK', side:'right', width:380 }
   退出方式: { type:'DOC_UNDOCK' } 或用户点标题栏 ⤢ */
/* ★ 09-21 语音态：窗口收成一条（语音条=输入框的另一种形态）
   背景：沉浸式语音原先把 ceoWin 整个 display:none → 里面的语音条跟着 0 尺寸
        → 用户看到"什么都没有"但语音在跑。改成"只藏头和身子，留 foot"。 */
.ceo-win.voice .ceo-head,
.ceo-win.voice .ceo-mid,
.ceo-win.voice .cz{display:none!important;pointer-events:none!important;cursor:default!important}
/* ★★★ 2026-10-09 狼哥（修复恢复）：.cz 四向缩放手柄【启用】——
   10-08 曾因「cursor 残留但拉不动」而整体禁用，但那样就彻底没有缩放能力了。
   现在：恢复 pointer-events + 正确 cursor。
   窄条态(.mini)：只显示 e/w（左右可拉），上下/四角隐藏（狼哥：上下不拉伸）。
   展开态(.open 非 mini)：四向 + 四角全开。 */
#ceoWin .cz{pointer-events:auto!important}
/* ★ 2026-10-17 狼哥：mini 态去掉上下边框（消息区上方那条横线）*/
.ceo-win.mini{border-top:0!important;border-bottom:0!important;box-shadow:0 8px 30px rgba(20,30,60,.16)!important}
.ceo-win.mini .cz.n,.ceo-win.mini .cz.s,
.ceo-win.mini .cz.ne,.ceo-win.mini .cz.nw,
.ceo-win.mini .cz.se,.ceo-win.mini .cz.sw{display:none!important}
.ceo-win.voice .cz{display:none!important;pointer-events:none!important}
/* ★★ 09-22 修「打字时看不到聊天记录」：文字输入态 = 语音条 + 聊天记录一起显示。
   做法：放开 .ceo-mid，并给窗口一个有高度的形态（与展开态同高），
        底部仍是那条语音条（含输入面板），上面是可滚动的聊天记录。
   判据：用户打字时能看到「AI 刚说了什么 / 我刚说了什么」= 输入才有意义。 */
.ceo-win.voice.voice-texting{height:min(58vh,460px)!important;min-height:0!important;
  background:var(--card)!important;border:1px solid var(--line)!important;
  border-radius:18px!important;box-shadow:0 16px 50px rgba(20,30,60,.2)!important;
  overflow:hidden!important}
.ceo-win.voice.voice-texting .ceo-mid{display:flex!important;flex:1 1 auto;min-height:0}
.ceo-win.voice.voice-texting .ceo-head{display:none!important}
.ceo-win.voice.voice-texting .cz{display:flex!important}
.ceo-win.voice{height:auto!important;min-height:0!important;overflow:visible;
  /* ★ 09-22 修「两个条」：外框自带 background+border+radius18，语音态只改内框圆角
     → 外框比内框大一圈，上下各露 ~20px 边框 = 视觉上像两条。
     修法：语音态把外框的背景/边框/padding 全部去掉，只留 .ceo-foot 这一条。 */
  background:transparent!important;border:none!important;box-shadow:none!important;
  padding:0!important;border-radius:0!important;
  /* ★★ 09-22 修「空壳遮罩」：语音态宽度必须收缩到内容（与输入框同宽同高）。
     否则外层仍是 700px 宽的浮层，多出的部分是透明空壳，会盖住 iframe 底部 = 遮罩感。
     width:min(700px,92vw) 与输入框完全一致 → 形态切换时尺寸零变化、零跳动。 */
  width:min(700px,92vw)!important;max-width:92vw!important;
  /* ★ 09-23：不再 transition:none —— 保持与输入框同一套过渡，切换更顺（原本 none 会让"变形态"很生硬） */
  transition:left .28s cubic-bezier(.2,.8,.3,1),bottom .28s cubic-bezier(.2,.8,.3,1),width .2s}
.ceo-win.voice .ceo-foot{border-radius:17px;border:1px solid var(--line)!important}

/* ★ 2026-09-29 狼哥：dock 态隐藏机器人 logo（ch-ic），标题从左边开始 */
/* ★★★ 2026-09-26 狼哥：吸附态(380px窄)输入区【重做】
   旧问题：一行塞 grip+权限+身份+模型+输入框+3按钮 → 编辑器被挤成竖排单字；
           附件条 + 滚动条 + 发送按钮互相打架。
   新布局：整块改成【竖向分层】——
     ① 轻量工具条：🤖品牌官 · 模型
     ② 输入框：独占整行，可换行增高（自身滚动）
     ③ 附件预览：横向小图
     ④ 操作条：🎤 📎 …… ➤（靠右）
   实现：cf-box 由 row 改 column，各子项用 order 分组排序。 */
/* ★ 2026-09-29 狼哥：dock 态下【身份 + 模型】应同一行（原来各占一行）*/
/* ★ 2026-09-30 狼哥：dock 态空间够 → 显示【身份名 + 模型名】（非 dock 态只显示头像）*/
/* ★ 2026-09-30 狼哥：dock 态空间够 → 显示【模型名】（非 dock 态只显示 logo）
   超长截断，hover 看全称（title 属性已有）*/
/* dock 态：身份和模型同行（用伪元素强制 cf-model 不换行到下一行）*/
/* 操作条容器：非吸附态 = 透明（不改变原横向排布，子按钮仍是 cf-box 的直接"视觉成员"） */
.ceo-foot .cf-actions{ display:contents }
/* 吸附态：操作条独占一行、靠右成组 */
/* ★ 2026-10-02 狼哥：这条会把品牌域下排的 margin-left:auto 顶掉 → 品牌域单独放开 */
/* 工具条与操作条各自成行：用伪元素撑开换行（order 已保证视觉顺序） */

/* ==================================================================
   ★★★ 2026-09-27 狼哥：品牌专属输入框形态（设计广场大框同款）
   —— 只在 body.ceo-imgmode 生效（品牌域）。其他模块 dock 态零影响。
   结构：大框(圆角18) = 上排[图片框堆叠 | 输入框] + 底排[参数 @ 积分 ➤]
   ================================================================== */
/* ★★★ 2026-09-27 狼哥：品牌域左吸附 —— 去掉身份标识 + 文本模型选择
   （上面已有提示语说明是谁；这里主要生图，文本模型按默认走） */
/* ★★★ 2026-09-28 狼哥：上排 = [图片框] ...... [模型+参数@]（右对齐，竖向两行） */
/* ★★★ 2026-09-28 狼哥：模型+参数【右对齐】（不紧贴图片，中间留空） */

/* ==================================================================
   ★★★ 2026-10-02 狼哥：品牌域左吸附输入区【重排】
   目标布局（上→下）：
     ① 上排：左[参考图堆叠]  右[提示语]
     ② 输入框（独占整行）
     ③ 下排：[模型logo] [参数]  ...(空)...  [积分] [发送]
   删掉：语音图标、上传(+)图标
   ================================================================== */
/* ① 隐藏语音 + 上传加号（品牌域左吸附） */

/* ② 品牌域：cf-iwrap 改成【可换行的横向流】→ 用 order 精确排布
   （原来 flex-direction:column 竖向堆叠，导致模型/参数被挤上去） */
/* 上排：参考图堆叠（左） + 提示语（右） —— 各占满行、强制换行 */
/* ★★★ 2026-10-02 狼哥：参考图 + 输入框【同一行】（图左 / prompt 右） */
/* 输入框：跟在参考图右边，占剩余宽度（必须 min-width:0 + width:auto 才能收缩） */
/* 输入框：占剩余宽度（图 46px + 间距 8px） */
/* ★★★ 2026-10-02 狼哥：cf-topright（模型+参数）在下排【最左】—— order 必须最小，
   否则被 spacer 顶到右边（之前 order:20 是错的，实测它在 x201） */
/* 输入框：独占整行，排在上排之后 */
/* 下排：模型(logo) + 参数 + 积分 + 发送 */
/* 积分条：从 .cf-box 里提到下排（用 order 保持在模型/参数之后、发送之前） */
/* ★★★ 2026-10-02 狼哥：下排 = 模型+参数+积分+发送【同一行、垂直居中、无分隔线】 */
/* 下排所有直接子项：统一行高、垂直居中、不撑高 */
/* 模型/参数容器：也强制单行居中 */
/* 参数按钮：统一高度，消除 13px 偏差 */
/* ★ 2026-10-02 狼哥：统一 26px（和模型/积分/发送同高，消除 5px 偏差） */
/* ★ 2026-10-02 狼哥：cmdbar 原来有 padding-top:6px → 参数被顶下 4px。全清。 */
/* 发送：用 margin-left:auto 顶到最右 */
/* ★★★ 2026-10-02 狼哥：真正的积分是 .cf-inline-cost（不是 cf-costbar）
   —— cf-costbar 是空的，给它 auto 会跟发送【平分】空间 → 发送被推到中间。
   这里彻底隐掉 cf-costbar，auto 只留给发送。 */
/* 上排右侧提示语 */
/* 模型前的厂商 logo */
.cfm-logo{ width:15px; height:15px; border-radius:3px; flex:none; display:inline-flex;
  align-items:center; justify-content:center; overflow:hidden; background:#2b2f3a }
.cfm-logo svg{ width:11px; height:11px; display:block; fill:#fff }
.cfm-logo img{ width:100%; height:100%; object-fit:cover }
/* 参数/@ 在模型下方 */
/* 下排统一：去掉一切上边距/分隔线（狼哥 10-02） */
/* ★★★ 2026-09-28 狼哥：积分【和发送按钮同一行】（原来单占一行，白占空间）
   做法：不单独成条 → 把积分塞进 cf-actions 行、靠左，右侧仍是语音/加号/发送 */
/* ★ 2026-10-02 狼哥：品牌图片模式输入框 —— 长 prompt 延展（到 240px 后滚动） */
/* 工具条：默认隐藏（非品牌域 / 未开启生图模式） */
.cf-cmdbar{ display:none }
/* ★★★ 2026-10-02 狼哥：这条 border-top 就是「模型/参数上面那条横杠」→ 去掉
   （加上 padding-top/margin-top 一起清，让下排紧贴输入框） */
.cf-cmd{ display:inline-flex; align-items:center; gap:4px; padding:3px 8px; border-radius:8px;
  font-size:11.5px; color:var(--sub); cursor:pointer; user-select:none; transition:.15s; white-space:nowrap }
.cf-cmd:hover{ background:rgba(0,144,255,.10); color:#0090ff }
.cf-cmd b{ font-weight:600 }
.cf-cmd-ar{ font-size:10px; opacity:.6 }
.cf-cmd-cost{ margin-left:auto; font-size:11.5px; font-weight:700; color:#0090ff; white-space:nowrap }
/* ★★★ 2026-09-28 狼哥：设计广场页 → 隐藏全局对话输入区（该页自带输入框） */
body.ceo-hide-input .ceo-win .ceo-foot{ display:none!important }
/* ★★★ 2026-10-18 狼哥：修「展开只露标题栏」
   根因：ceo-hide-input 残留 → .open 的 height 被 auto 覆盖 → flex 塌陷到 head 高度
   修法：只在【该页确实没有输入区】时才 auto；且给最小高度兜底 */
body.ceo-hide-input .ceo-win.open{ height:min(74vh,620px)!important; min-height:320px!important }
/* ★★★ 2026-09-29 修（狼哥：左吸附看不到模型名/输入区）：
   ceo-hide-input 是给【设计广场页】用的（那页自带输入框）。
   但【品牌吸附态】也需要宿主输入框（含模型选择+积分）→ 不能被藏。
   判据：窗口有 .dock（吸附中）→ 恢复输入区显示。 */
/* ★★★ 2026-09-29 修：吸附态(dock) + 输入框形态(mini) 都不藏输入区
   —— 原来只救 .dock，漏了 .mini（选完模型后可能变 mini） */
body.ceo-hide-input .ceo-win.mini .ceo-foot{ display:flex!important }
/* ★★★ 2026-10-04 狼哥：作品库【对话视图】→ 整个全局对话窗隐藏
   —— 与 ceo-hide-input（只藏输入框，且 dock/mini 会被 !important 恢复）不同，
     这是【硬屏蔽】：整个窗 + 球都藏，优先级最高。
   用途：作品库对话视图 / 设计广场 这类「页面自带输入框」的场景。 */
body.ceo-hide-all .ceo-win,
body.ceo-hide-all #ceoBall,
body.ceo-hide-all #ceoWin{ display:none!important; visibility:hidden!important }
body.ceo-hide-all .cb-tip{ display:none!important }
/* ★★★ 2026-10-09 狼哥：双保险 —— ceo-hide-all 时【连输入区也藏】。
   原因：上面那条 `body.ceo-hide-input .ceo-win.mini .ceo-foot{display:flex!important}`
   特异性更高(0,4,1 vs 0,3,1)，若 ceoWin 被某操作恢复 display:flex，
   输入区会立刻冒出来（狼哥反馈：灵感广场还看到全局输入框）。
   这里用「同特异性 + 更靠后」把它压住。 */
body.ceo-hide-all .ceo-win.mini .ceo-foot,
body.ceo-hide-all .ceo-win .ceo-foot{ display:none!important }
/* 图片框堆叠区（品牌域才显示，非品牌域 display:none 由 JS 控） */
.cf-imgstack{ flex:none; display:flex; align-items:flex-start; margin-right:6px }
.cf-imgstack-in{ position:relative; width:46px; height:58px }
/* 堆叠卡片：默认错落叠放（固定尺寸，不占额外空间） */
.cf-ref{ position:absolute; left:0; top:0; width:46px; height:58px; border-radius:9px;
  background:var(--bg2) center/cover no-repeat;
  border:1px solid var(--line); cursor:pointer;
  transition:transform .18s, box-shadow .18s, left .22s cubic-bezier(.2,.8,.3,1); transform-origin:50% 90% }
.cf-imgstack-in .cf-ref:nth-child(1){ transform:rotate(-4deg) }
.cf-imgstack-in .cf-ref:nth-child(2){ transform:rotate(3deg) translateX(3px); z-index:2 }
.cf-imgstack-in .cf-ref:nth-child(3){ transform:rotate(-2deg) translateX(6px); z-index:3 }
.cf-imgstack-in .cf-ref:nth-child(4){ transform:rotate(4deg) translateX(9px); z-index:4 }
.cf-imgstack-in .cf-ref:nth-child(n+5){ transform:rotate(-3deg) translateX(12px); z-index:5 }
/* ★★★ 2026-09-28 狼哥：hover = 【横向完全展开】（第一步先摊开，便于逐张点选）
   —— 原来是 translateX 小幅挪动（看着还叠着）+ 滚动，图一多中间就没法选。
   新做法：容器按张数撑宽，每张 left 平铺（间距 = 卡宽 46 + gap 6 = 52）。 */
.cf-imgstack-in{ transition:width .24s cubic-bezier(.2,.8,.3,1) }
.cf-imgstack-in:hover{ width:var(--stack-open,46px)!important }
/* （展开态的 transform 由各 nth-child 单独给 → 这里不再统一归零） */
/* ★★★ 2026-09-28 狼哥：展开 + 左右左右错落（仿即梦）奇数上抬左倾 / 偶数下沉右倾 */
.cf-imgstack-in:hover .cf-ref:nth-child(1){ left:0;    transform:rotate(-6deg) translateY(-9px) }
.cf-imgstack-in:hover .cf-ref:nth-child(2){ left:52px; transform:rotate(5deg)  translateY(9px) }
.cf-imgstack-in:hover .cf-ref:nth-child(3){ left:104px;transform:rotate(-6deg) translateY(-9px) }
.cf-imgstack-in:hover .cf-ref:nth-child(4){ left:156px;transform:rotate(5deg)  translateY(9px) }
.cf-imgstack-in:hover .cf-ref:nth-child(5){ left:208px;transform:rotate(-6deg) translateY(-9px) }
.cf-imgstack-in:hover .cf-ref:nth-child(6){ left:260px;transform:rotate(3deg)  translateY(3px) }
.cf-imgstack-in:hover .cf-ref:nth-child(7){ left:312px;transform:rotate(-3deg) translateY(-3px) }
.cf-imgstack-in:hover .cf-ref:nth-child(8){ left:364px;transform:rotate(4deg)  translateY(4px) }
.cf-imgstack-in:hover .cf-ref:nth-child(9){ left:416px;transform:rotate(-4deg) translateY(-3px) }
.cf-imgstack-in:hover .cf-ref:nth-child(10){ left:468px;transform:rotate(3deg) translateY(3px) }
/* 序号角标（图1/图2… → prompt 里可对应） */
.cf-ref-idx{ position:absolute; left:2px; top:2px; min-width:14px; height:14px; border-radius:7px;
  background:rgba(24,28,40,.72); color:#fff; font-size:9.5px; line-height:14px; text-align:center;
  font-weight:700; padding:0 3px; z-index:25; pointer-events:none }
/* 单张 hover → 微放大（表示选中） */
/* ★ 单张 hover：在【各自错落 transform】基础上放大（不覆盖 rotate/translateY） */
.cf-imgstack-in:hover .cf-ref:nth-child(1):hover{ transform:rotate(-6deg) translateY(-9px) scale(1.12) }
.cf-imgstack-in:hover .cf-ref:nth-child(2):hover{ transform:rotate(5deg)  translateY(9px)  scale(1.12) }
.cf-imgstack-in:hover .cf-ref:nth-child(3):hover{ transform:rotate(-6deg) translateY(-9px) scale(1.12) }
.cf-imgstack-in:hover .cf-ref:nth-child(4):hover{ transform:rotate(4deg)  translateY(4px)  scale(1.12) }
.cf-imgstack-in:hover .cf-ref:nth-child(n+5):hover{ transform:rotate(-4deg) translateY(-3px) scale(1.12) }
.cf-imgstack-in:hover .cf-ref:hover{ z-index:20!important; box-shadow:0 6px 18px rgba(10,20,40,.22) }
/* 删除按钮 */
.cf-ref-x{ position:absolute; right:-5px; top:-5px; width:15px; height:15px; border-radius:50%;
  background:#ff4d6d; color:#fff; font-size:11px; line-height:15px; text-align:center; font-weight:700;
  border:1.5px solid #fff; display:none; z-index:30; cursor:pointer }
.cf-ref:hover .cf-ref-x{ display:block }
/* 空态：一个加号框 */
.cf-ref-empty{ position:absolute; inset:0; border-radius:9px; border:1.5px dashed var(--line);
  background:var(--bg2); display:flex; align-items:center; justify-content:center;
  font-size:18px; color:var(--dim); cursor:pointer }
.cf-ref-empty:hover{ border-color:#0090ff; color:#0090ff }
/* 右下角 ➕（有图时出现） */
.cf-ref-add{ position:absolute; right:2px; bottom:2px; width:17px; height:17px; border-radius:50%;
  background:#0090ff; color:#fff; font-size:12px; line-height:17px; text-align:center; font-weight:700;
  border:1.5px solid #fff; display:none; z-index:30; cursor:pointer }
.cf-imgstack-in:hover .cf-ref-add{ display:block }
/* hover 大图预览（浮在下方；贴底则翻上） */
.cf-refview{ position:fixed; z-index:99999; display:none; padding:6px; border-radius:12px;
  background:var(--card,#fff); box-shadow:0 10px 40px rgba(10,20,40,.28); border:1px solid var(--line) }
.cf-refview img{ display:block; max-width:min(300px,60vw); max-height:min(300px,55vh); border-radius:8px }
.cf-refview-tag{ position:absolute; left:12px; top:12px; font-size:10.5px; padding:2px 7px; border-radius:6px;
  background:rgba(0,144,255,.92); color:#fff; font-weight:700 }


/* ★ 2026-09-26 狼哥：吸附态输入框别贴屏幕最底 —— Windows 任务栏可能遮挡
   → 底部预留 14px（+ 安全区），保证按钮点得到、输入框看得见 */
/* 吸附态: 外挂面板(雷达/记录)改为覆盖式, 不撑破 380px */
/* 模块主内容让宽 —— body 上加类, iframe 容器统一右移 */
/* ★ 2026-09-26 狼哥：左吸附 —— 对话窗口贴左，盖住侧边栏(210px)，主内容左让宽 */
/* 左吸附时，外挂面板方向对调 */
/* ★★★ 2026-10-03 狼哥：dock-left 时搜索面板应在【右侧】——
   原来用 right:100% → 面板跑到屏幕左边外（x=-366）看不见。
   （同理 radar 是 left:100%，search 也应该是 left:100%） */
/* 侧边栏：左吸附时让位（隐藏，被对话盖住）*/
/* ★★★ 2026-10-03 狼哥：左吸附时侧栏【完全隐藏】
   原来 margin-left:-210px 塌陷不彻底（侧栏实际 78px 宽 + 父容器负偏移）
   → 留出 132px 多余空白（画布左侧多一道空） */
/* 主内容：左吸附时左让宽 */
/* ★ 2026-09-30 修：实际 iframe 没有 mv-frame 类 → 补 .mv-contain > iframe（dock 让位从来没生效）*/
/* ★ 2026-09-30 狼哥：dock 态隐藏右下【对话球】（左边已有对话，重复了）；保留要事中心 */
@media (max-width:900px){
}
@media (max-width:640px){
}
/* 吸附态下的悬浮球: 藏起来(对话已常驻, 球是冗余) */
/* ★ 窄屏兜底: 吸附宽度不得超过视口的 88%, 否则会盖住全部主内容(手机端/窄窗口) */
@media (max-width:900px){
}
/* ★ 手机端(<640px): 左右分栏在手机上本就不可用(手指无 hover + 热区打架)
   → 吸附态退化为「全屏覆盖」, 主内容让宽归零。这与"画布只给桌面端"同一判据。 */
@media (max-width:640px){
}
.ceo-win.max{width:100vw!important;height:100vh!important;left:0!important;top:0!important;right:auto!important;bottom:auto!important;transform:none!important;border-radius:0!important}
/* ===== 全屏「向内展开」: 面板不再外挂出屏, 改为从窗口内侧贴边展开, 对话区缩窄占位 =====
   未全屏: 雷达 right:100%(左侧外挂) / 记录 left:100%(右侧外挂) —— 不占对话框宽度
   全屏:   雷达贴左内侧 / 记录贴右内侧, 固定列宽; 中间对话区自动缩窄(不遮挡) */
.ceo-win.max .ceo-mid{transition:padding .22s cubic-bezier(.2,.8,.3,1)}
.ceo-win.max.radar-on .ceo-mid{padding-left:calc(var(--radar-w,230px) + 8px)}
.ceo-win.max.search-on .ceo-mid{padding-right:calc(var(--search-w,360px) + 8px)}
.ceo-win.max .ceo-radar{right:auto;left:0;top:0;bottom:0;margin-right:0;
  border-radius:0 14px 14px 0;transform:translateX(-14px)}
.ceo-win.max .ceo-radar.open{transform:translateX(0)}
.ceo-win.max .ceo-search{left:auto;right:0;top:0;bottom:0;margin-left:0;
  border-radius:14px 0 0 14px;transform:translateX(14px)}
.ceo-win.max .ceo-search.open{transform:translateX(0)}
@keyframes ceoPop{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}
/* 标题栏 = 恒定身份锚点(仅展开显示) */
.ceo-head{display:none;flex:none;flex-direction:row;align-items:center;gap:10px;padding:11px 14px;background:var(--card);border-bottom:1px solid var(--line);border-radius:17px 17px 0 0;cursor:grab;position:relative}
.ceo-win:not(.open) .ceo-foot{border-radius:17px}
/* ★ 窄条态: 只留 左右(e/w) 调宽把手可点(上下不调); 展开态才有全 8 向 */
.ceo-win:not(.open) .cz{display:none}
/* ★★★ 2026-10-10 狼哥：窄条态(.mini)左右缩放手柄 ——
   真 bug：原来 `.ceo-win .cz.e{top:12px;bottom:60px}` 在 68px 高的窄条上算出【负高度】
   → 手柄不可见 → 鼠标命中 .ceo-foot → 拖动窗口而不是缩放（实测 elementFromPoint=.ceo-foot）
   正解：窄条态专门规则 —— 上下撑满（top:0;bottom:0），左右各 9px 宽，z-index 抬高。 */
.ceo-win.mini .cz.e,.ceo-win.mini .cz.w{
  display:block!important; top:0!important; bottom:0!important; height:auto!important;
  width:10px!important; z-index:5!important}
.ceo-win.mini .cz.e{right:-5px!important; left:auto!important; cursor:ew-resize!important}
.ceo-win.mini .cz.w{left:-5px!important; right:auto!important; cursor:ew-resize!important}
/* hover 时显示一条蓝色提示条（告诉用户可拉） */
.ceo-win.mini .cz.e::after,.ceo-win.mini .cz.w::after{
  content:'';position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
  width:3px;height:30px;border-radius:3px;background:transparent;transition:background .15s}
.ceo-win.mini .cz.e:hover::after,.ceo-win.mini .cz.w:hover::after{background:#3370ff}

/* 兼容旧规则（非 open 且非 mini） */
.ceo-win:not(.open):not(.mini) .cz.e,.ceo-win:not(.open):not(.mini) .cz.w{display:block;top:0;bottom:0;height:auto}
.ceo-win:not(.open):not(.mini) .cz.e{right:-4px;left:auto;width:9px;cursor:ew-resize}
.ceo-win:not(.open):not(.mini) .cz.w{left:-4px;right:auto;width:9px;cursor:ew-resize}
.ceo-win.open .ceo-head{display:flex}
.ceo-head:active{cursor:grabbing}
.ceo-head .ch-ic{width:34px;height:34px;border-radius:11px;background:transparent;color:#fff;display:flex;align-items:center;justify-content:center;font-size:17px;flex:none;box-shadow:none}
.ceo-head .ch-who{flex:1;min-width:0;line-height:1.25}
.ceo-head .ch-who b{display:block;font-size:13.5px;color:var(--txt);font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ceo-head .ch-who b .ch-badge{display:inline-block;font-size:9.5px;font-weight:700;color:var(--blue);background:var(--blue-bg,#eef3ff);border-radius:8px;padding:1px 7px;margin-left:6px;vertical-align:1px}
.ceo-head .ch-who small{display:block;font-size:10.5px;color:var(--sub);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ceo-head .ch-btn{width:26px;height:26px;border-radius:8px;border:none;background:none;color:var(--dim);display:flex;align-items:center;justify-content:center;font-size:13px;cursor:pointer;flex:none}
.ceo-head .ch-btn:hover{background:var(--bg2);color:var(--txt)}
.ceo-head .ch-btn.radar{color:#3370ff;font-size:15px;position:relative}
.ceo-head .ch-btn.radar .ch-radar-cnt{position:absolute;top:-5px;right:-5px;background:#e5484d;color:#fff;font-size:9px;font-weight:800;min-width:17px;height:17px;border-radius:9px;display:flex;align-items:center;justify-content:center;padding:0 4px;box-shadow:0 2px 6px rgba(229,72,77,.5)}
/* 消息区 */
.ceo-body{flex:1;min-height:0;overflow-y:auto;padding:14px 15px;background:var(--bg2);border-radius:0 0 17px 17px}
.ceo-body::-webkit-scrollbar{width:6px}.ceo-body::-webkit-scrollbar-thumb{background:#d5dbe7;border-radius:6px}
.ceo-msg{max-width:90%;margin-bottom:10px;padding:9px 12px;border-radius:12px;font-size:12.5px;line-height:1.6;white-space:pre-wrap;word-break:break-word}
/* ★ 2026-10-02 狼哥：定位后背景闪烁 3 次 */
@keyframes ceoHlFlash{
  0%,100%{ background:transparent }
  50%{ background:rgba(255,214,0,.35); box-shadow:0 0 0 3px rgba(255,214,0,.25) }
}
/* P3: 搜索跳转定位 · 黄色高亮(淡出) */
.ceo-msg.ceo-hl{background:#fffbe0 !important;box-shadow:0 0 0 2px #ffeaa0;transition:background .35s, box-shadow .35s}
/* ★ 引导置顶卡（悬浮覆盖在对话消息上方，不占布局高度，点✕关闭） */
.ceo-pinned{position:absolute;top:10px;left:12px;right:12px;z-index:32;pointer-events:none}
.ceo-pin-card{position:relative;pointer-events:auto;border:1px solid #ffd666;border-radius:11px;background:#fffbe6;padding:11px 34px 11px 13px;font-size:12.5px;line-height:1.65;color:var(--txt);box-shadow:0 4px 16px rgba(255,197,61,.28)}
.ceo-pin-card .cp-close{position:absolute;top:6px;right:7px;width:20px;height:20px;border:none;border-radius:6px;background:rgba(0,0,0,.05);color:var(--dim);font-size:12px;line-height:1;cursor:pointer;font-family:inherit;transition:.15s}
.ceo-pin-card .cp-close:hover{background:rgba(0,0,0,.12);color:var(--txt)}
/* ★ 置顶卡黄色闪烁 3 次 */
@keyframes ceoPinFlash{
  0%,100%{background:#fffbe6;box-shadow:0 2px 8px rgba(255,197,61,.18);border-color:#ffd666}
  50%{background:#fff3bf;box-shadow:0 0 0 4px rgba(255,214,102,.55),0 2px 10px rgba(255,197,61,.3);border-color:#ffc53d}
}
.ceo-pin-card.pin-flash{animation:ceoPinFlash .72s ease-in-out 3}
/* ★ 2026-09-24 狼哥：「不是置顶消息，是机器人说了一句话」
   —— 引导语作为一条真实消息进对话流（不是浮层卡）*/
.ceo-msg.ceo-guide-msg{max-width:88%;align-self:flex-start;position:relative;overflow:hidden;background:linear-gradient(100deg,color-mix(in srgb, var(--dept-now,var(--blue)) 20%, var(--card)) 0%,color-mix(in srgb, var(--dept-now,var(--blue)) 9%, var(--card)) 34%,var(--card) 72%, var(--card) 100%);border:1px solid color-mix(in srgb, var(--dept-now,var(--blue)) 24%, var(--line));border-left:none;border-radius:10px;padding:11px 13px 11px 16px}
.ceo-guide-msg .cg-who{font-size:11px;font-weight:700;color:var(--dept-now,var(--blue));margin-bottom:5px}
.ceo-guide-msg .cg-bd{font-size:12.5px;line-height:1.7;color:var(--txt)}
.ceo-guide-msg .cg-bd b{color:var(--txt)}
/* ★ 历史消息分隔线 */
.ceo-hist-sep{text-align:center;font-size:10.5px;color:var(--dim);margin:12px 0 10px;display:flex;align-items:center;gap:10px}
.ceo-hist-sep::before,.ceo-hist-sep::after{content:"";flex:1;height:0;border-top:1px dashed var(--line)}
.ceo-load-more{text-align:center;margin:6px 0 10px}
.ceo-load-more button{padding:5px 14px;border-radius:8px;border:1px solid var(--line);background:var(--card);color:var(--txt-sub);font-size:11.5px;cursor:pointer;font-family:inherit;transition:.15s}
.ceo-load-more button:hover{border-color:var(--accent);color:var(--accent)}
/* ★ 问题3(09-24): 历史消息区折叠——只露约 1/3，超出内部滚动；下方留白给新内容 */
/* ★★★ 2026-10-01 狼哥：历史消息区【不要独立滚动】！
   原来 max-height:34% + overflow-y:auto → 只有上方 34% 能滚，下面消息区不动
   改成：跟随 .ceo-body 一起滚（整块连续） */
.ceo-hist-wrap{overflow:visible;flex:none;border-bottom:1px dashed var(--line);margin-bottom:10px;padding-bottom:2px}
.ceo-hist-wrap::-webkit-scrollbar{width:5px}
.ceo-hist-wrap::-webkit-scrollbar-thumb{background:rgba(120,130,150,.3);border-radius:3px}
.ceo-hist-tail{text-align:center;font-size:10.5px;color:var(--dim);margin:8px 0 2px;display:flex;align-items:center;gap:10px}
.ceo-hist-tail::before,.ceo-hist-tail::after{content:"";flex:1;height:0;border-top:1px dashed var(--line)}
/* ★ 引导语卡片：黄色闪烁3次（提示用户去看） */
@keyframes ceoGuideFlash{
  0%,100%{background:var(--card);box-shadow:none;border-color:var(--line)}
  50%{background:#fff3bf;box-shadow:0 0 0 3px rgba(255,214,102,.55);border-color:#ffc53d}
}
/* ★ 2026-09-24 狼哥：点模块内对话 → Agent 引导语高亮闪烁 3 次（类似搜索定位的提示）
   用【域色】光晕，不改背景（保留页头渐变），只加外圈光 + 轻微提亮 */
@keyframes ceoIntroFlash{
  0%,100%{box-shadow:0 1px 2px rgba(16,24,40,.04);filter:brightness(1)}
  50%{box-shadow:0 0 0 4px color-mix(in srgb, var(--dept-now,var(--blue)) 45%, transparent),0 2px 12px color-mix(in srgb, var(--dept-now,var(--blue)) 35%, transparent);filter:brightness(1.06)}
}
.ceo-msg.ceo-intro-flash{animation:ceoIntroFlash .78s ease-in-out 3}
.ceo-msg[data-guide="1"].ceo-guide-flash{animation:ceoGuideFlash .72s ease-in-out 3}
/* 回到底部按钮(照飞书) */
.ceo-tobottom{position:absolute;right:calc(14px + var(--sb-pad,0px));bottom:14px;width:34px;height:34px;border-radius:50%;background:var(--card);border:1px solid #e3e8f0;box-shadow:0 3px 12px rgba(0,0,0,.13);display:none;align-items:center;justify-content:center;cursor:pointer;z-index:30;color:#5b6b85;font-size:15px;transition:transform .12s, background .12s, right .22s}
.ceo-tobottom:hover{background:#f5f8ff;transform:translateY(-1px)}
.ceo-tobottom.show{display:flex}
/* ★★★ 狼哥10-02：引导语「可点选项」—— 不用打字，点一下直接发 */
.ceo-guide-msg .cg-choices{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}
.ceo-guide-msg .cg-ch{display:inline-flex;align-items:center;gap:5px;padding:7px 13px;border-radius:16px;
  border:1px solid color-mix(in srgb, var(--dept-now,var(--blue)) 32%, var(--line));
  background:color-mix(in srgb, var(--dept-now,var(--blue)) 8%, var(--card));
  color:var(--txt);font-size:12.5px;cursor:pointer;transition:.16s;user-select:none;max-width:100%}
.ceo-guide-msg .cg-ch:hover{border-color:var(--dept-now,var(--blue));
  background:color-mix(in srgb, var(--dept-now,var(--blue)) 16%, var(--card));
  transform:translateY(-1px);box-shadow:0 2px 8px rgba(20,30,60,.10)}
.ceo-guide-msg .cg-ch:active{transform:translateY(0)}
.ceo-guide-msg .cg-ch .cg-ch-ic{font-size:13px;line-height:1}
/* ★ 2026-09-24 狼哥：机器人消息【默认朴素】—— 只有「本域第一句引导语」(.ceo-guide-msg)
   才带域色渐变 + 4px 左竖条。历史消息不能被染色。 */
.ceo-msg.bot{align-self:flex-start;position:relative;background:var(--card);color:var(--txt);border:1px solid var(--line);border-radius:10px;border-bottom-left-radius:3px}
/* ★ 2026-09-30 P6：统一消息渲染（DialogCore.renderMsg）——头像+名字+正文 */
.ceo-msg{display:flex;gap:8px;align-items:flex-start;background:none!important;border:none!important;padding:0!important;max-width:100%!important}
.ceo-msg .cm-av{width:26px;height:26px;border-radius:50%;flex:none;background:#e8eef8;display:flex;align-items:center;justify-content:center;font-size:14px;overflow:hidden}
.ceo-msg .cm-bd{flex:1;min-width:0}
.ceo-msg .cm-nm{font-size:10.5px;color:var(--dim);margin-bottom:3px}
.ceo-msg .cm-tx{font-size:12.5px;line-height:1.65;color:var(--txt);white-space:pre-wrap;word-break:break-word;background:var(--card);border:1px solid var(--line);border-radius:10px;padding:8px 11px;display:inline-block;max-width:100%}
.ceo-msg.usr .cm-bd{order:-1}
.ceo-msg.usr{align-self:flex-end;flex-direction:row-reverse}
/* 引导语（本域第一句）：域色渐变 + 左竖条（与模块页头 .mod-hd 同款）*/
.ceo-msg.ceo-guide-msg{background:linear-gradient(100deg,color-mix(in srgb, var(--dept-now,var(--blue)) 20%, var(--card)) 0%,color-mix(in srgb, var(--dept-now,var(--blue)) 9%, var(--card)) 34%,var(--card) 72%, var(--card) 100%);border:1px solid color-mix(in srgb, var(--dept-now,var(--blue)) 24%, var(--line));border-left:none;padding-left:16px;overflow:hidden}
.ceo-msg.ceo-guide-msg::after{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--dept-now,var(--blue));opacity:.95}
.ceo-msg.user{align-self:flex-end;background:#3370ff;color:#fff;border-bottom-right-radius:3px;margin-left:auto}
.ceo-msg .ceo-hi{display:block;font-size:12px;font-weight:700;color:var(--txt);margin-bottom:3px}
.ceo-l1{border:1px solid var(--line);border-left:3px solid var(--dept-now,var(--blue));background:var(--dept-now-bg,var(--card2));border-radius:10px;padding:11px 13px;margin-bottom:8px}
/* ★ 2026-09-24：开场白直接在 .ceo-msg.bot 里（不再套 .ceo-l1）→ 选择器同时支持两种 */
.ceo-l1 .l1-t,.ceo-msg .l1-t{font-size:12px;font-weight:700;color:var(--txt)}
.ceo-l1 .l1-i,.ceo-msg .l1-i{font-size:11.5px;color:var(--sub);margin-top:4px;line-height:1.5}
.ceo-l1 .l1-i b,.ceo-msg .l1-i b{color:var(--dept-now,var(--blue))}
/* 输入区 */
.ceo-foot{flex:none;margin-top:auto;display:flex;align-items:center;gap:8px;padding:9px 11px;border-top:1px solid var(--line);background:var(--card);border-radius:0 0 17px 17px}
.ceo-foot .cf-grip{width:14px;height:100%;min-height:30px;cursor:grab;flex:none;display:flex;align-items:center;justify-content:center;
  color:#c8cfda;border-radius:7px;user-select:none;-webkit-user-select:none;transition:color .15s,background .15s}
/* ★10-04 狼哥：原来用「⋮⋮」看着像乱码 → 换标准拖拽把手「⠿」(盲文点)，并淡化到 hover 才明显 */
.ceo-foot .cf-grip::after{content:'⠿';font-size:15px;line-height:1;opacity:.55}
.ceo-foot .cf-grip:hover{color:var(--blue);background:var(--bg2)}
.ceo-foot .cf-grip:active{cursor:grabbing}
.ceo-foot .cf-box{flex:1;display:flex;flex-direction:row;align-items:center;gap:6px;background:var(--bg2);border:1px solid transparent;border-radius:14px;padding:5px 9px;min-height:38px;max-height:150px;overflow:visible;transition:border-color .15s}

/* ★★★ 2026-10-08 狼哥：全局对话输入框 —— 【单行排一排，多行才换行】
   规则：
     · 空 / 单行输入 → 身份 模型 输入框 语音 展开 上传 发送  全在一排
     · 输入框撑高（≥2行）→ 自动换行：上行[身份 模型 输入框]，下行[语音 展开 上传 发送]
   ★ 关键：用 flex-wrap 的自然换行，【不给任何元素设 flex-basis:100%】
     （之前设了 → 空输入也强制两行，是 bug） */
.ceo-foot .cf-box{
  flex-wrap:wrap;              /* 允许换行（只在内容放不下时换）*/
  align-items:flex-end;        /* ★ 底对齐（多行时按钮跟输入框底部对齐） */
  padding:5px 9px 5px;
}
/* 身份 / 模型：不伸缩，跟随行内 */
.ceo-foot .cf-box > .cf-who,
.ceo-foot .cf-box > .cf-model{
  flex:none;
  /* ★ 2026-10-11 狼哥：保持底对齐（多行时与发送/语音同一行 ✅）
     单行时输入框(30px)比身份(26px)高 4px → 底对齐后身份偏下 2px
     → 用 margin-bottom:2px 补偿，视觉与输入框居中 */
  align-self:flex-end;
  /* ★ 2026-10-11 狼哥：单行时与输入框居中（4px 补偿）；多行时贴底（略高于按钮 4px，可接受） */
  margin-bottom:4px;
  transition:none;
  /* ★ 2026-10-08 狼哥：身份/模型图标对齐（原来模型矮一截）*/
  display:inline-flex;
  align-items:center;
  height:26px;
  line-height:1;
}
/* 输入区：占满剩余宽度（单行时与其他元素并排；多行时自然占满一行）*/
.ceo-foot .cf-box > .cf-input-wrap{
  flex:1 1 240px;              /* ★ 基准 240px：够宽就并排，不够才换行 */
  min-width:0;
  order:0;
}
/* 操作按钮组：靠右，不强制独占一行 */
.ceo-foot .cf-box > .cf-actions{
  display:flex;
  flex:0 0 auto;               /* ★ 不占满整行 */
  order:0;
  justify-content:flex-end;
  align-items:center;
  gap:6px;
  align-self:flex-end;
  margin-left:auto;            /* 有空间时推到最右 */
}
.ceo-foot .cf-box > .cf-actions .cf-send{margin-left:2px}
/* ★ 输入框区（上行占满） */
.ceo-foot .cf-box .cf-input-wrap{display:flex;flex-direction:column;justify-content:flex-end}
/* 展开按钮 */
.ceo-foot .cf-box .cf-expand{flex:none;align-self:flex-end;cursor:pointer;opacity:.55;padding:4px;border-radius:6px;transition:opacity .15s,background .15s;display:flex;align-items:center;justify-content:center;width:22px;height:22px}
.ceo-foot .cf-box .cf-expand:hover{opacity:1;background:var(--bg,#f0f4fb)}
/* ★ 展开态：大面积输入框 + 底栏选项 */
body.ceo-expand-mode .ceo-win.open .ceo-foot .cf-editor{min-height:38vh!important;max-height:52vh!important}
body.ceo-expand-mode .ceo-win.open .ceo-foot .cf-box{max-height:none!important;align-items:stretch}
body.ceo-expand-mode .ceo-win.open .ceo-foot .cf-input-wrap{justify-content:flex-start}
body.ceo-expand-mode .ceo-win.open .ceo-foot .cf-expand{transform:rotate(180deg)}
/* ★ 展开态：选项条（模型/参数/@）沉到输入框【下方底栏】 */
body.ceo-expand-mode .ceo-win.open .ceo-foot .cf-iwrap{display:flex;flex-direction:column}
body.ceo-expand-mode .ceo-win.open .ceo-foot .cf-editor{order:1}
body.ceo-expand-mode .ceo-win.open .ceo-foot .cf-topright{order:2;margin-top:6px;position:static!important;display:flex!important;align-items:center;gap:6px;flex-wrap:wrap;justify-content:flex-start}
body.ceo-expand-mode .ceo-win.open .ceo-foot .cf-cmdbar{order:3;display:flex!important;align-items:center;gap:6px;margin-top:4px}
body.ceo-expand-mode .ceo-win.open .ceo-foot .cf-imgstack{order:0}
/* ★ 09-22 输入框内的图标（麦克风/上传）——无框，纯图标 */
/* 输入区：占满剩余宽度（图标已移到右侧） */
.ceo-foot .cf-input-wrap{flex:1;min-width:0;display:flex;flex-direction:row;align-items:center}
/* ★ 09-22 权限开关（只在客户端显示 · 输入框内最左）
   ★ 判据：开关管的是「客户机本地运行时」的敏感操作，网页端对话跑在服务器上 → 网页端不显示 */
.cf-perm{display:none;align-items:center;gap:4px;flex:none;margin-right:8px;padding:3px 8px 3px 6px;
  border-radius:8px;cursor:pointer;user-select:none;font-size:11.5px;color:var(--sub,#8f959e);
  border:1px solid transparent;white-space:nowrap;position:relative}
body.in-client .cf-perm{display:flex}
/* ★ 2026-10-04（狼哥）：标题栏里的权限开关（放在 .s2-top 的 .tb 行内） */
/* ★★★ 2026-10-13（狼哥「按 WorkBuddy 做」）：权限【胶囊形态】
   收起态：◆ 允许完全访问 ▴   展开态：面板（说明 + 开关 + 风险提示）
   位置：全局对话 .cf-box 最左（身份 ceoWhoTag 左侧）；工作台 #s2Perm 原位 */
.cf-perm{display:none;align-items:center;gap:5px;flex:none;margin-right:6px;padding:4px 9px 4px 7px;
  border-radius:999px;cursor:pointer;user-select:none;font-size:11.5px;color:var(--sub,#8f959e);
  border:1px solid var(--line,#e5e7eb);white-space:nowrap;position:relative;background:transparent;
  transition:background .15s,border-color .15s,color .15s}
body.in-client .cf-perm{display:inline-flex}
.cf-perm:hover{background:var(--hover,#f0f2f5);color:var(--txt,#1f2329)}
/* 开启态胶囊：高亮 */
.cf-perm.on{color:#1f9d5c;border-color:#b7e8cd;background:#eefbf3}
.cf-perm.on:hover{background:#e3f7ec}
/* 胶囊内的小圆点（未开：灰；开：绿） */
.cf-perm .pm-ic{width:13px;height:13px;flex:none;border-radius:50%;display:inline-flex;align-items:center;
  justify-content:center;font-size:9px;font-weight:800;background:#c8cfd9;color:#fff;line-height:1}
.cf-perm.on .pm-ic{background:#2fbf71}
.cf-perm .pm-txt{font-weight:600;line-height:1}
.cf-perm .pm-ar{font-size:8px;opacity:.7;margin-left:1px;transition:transform .18s}
/* ★ 2026-10-13：胶囊出现在【标题栏】时（.ceo-head / .s2-top），微调以匹配按钮行高 */
.ceo-head .cf-perm,.s2-top .cf-perm{margin-right:2px;padding:3px 8px 3px 6px;font-size:11px;height:26px}
.ceo-head .cf-perm .pm-ic,.s2-top .cf-perm .pm-ic{width:12px;height:12px;font-size:8px}
/* 标题栏胶囊的面板：从右上弹出更自然（避免超出窗口左边界） */
.ceo-head .cf-perm .permpop{left:auto;right:0}
/* ⋮ 展开箭头在标题栏里朝下更符合直觉（面板在上方） */
.ceo-head .cf-perm .pm-ar{transform:none}
.ceo-head .cf-perm.open .pm-ar{transform:rotate(180deg)}
.cf-perm.open .pm-ar{transform:rotate(180deg)}
/* 展开面板 */
.permpop{position:absolute;left:0;bottom:calc(100% + 10px);width:min(330px,86vw);z-index:9999;
  background:var(--card,#fff);border:1px solid var(--line,#e5e7eb);border-radius:14px;
  box-shadow:0 16px 44px rgba(15,23,42,.20);padding:15px 16px;display:none;color:var(--txt,#1f2329);
  font-size:12.5px;line-height:1.7;text-align:left;cursor:default}
.permpop.on{display:block;animation:permpopIn .16s cubic-bezier(.2,.8,.3,1)}
@keyframes permpopIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
.permpop .pp-desc{color:var(--sub,#8f959e);margin-bottom:13px}
.permpop .pp-row{display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:11px 12px;border-radius:10px;background:var(--bg,#f5f6f8)}
.permpop .pp-lbl{font-weight:600}
.permpop .pp-sub{font-size:11.5px;color:var(--sub,#8f959e);font-weight:400;margin-top:2px}
.permpop .pp-warn{margin-top:12px;padding:10px 12px;border-radius:10px;box-sizing:border-box;
  background:#fff8e8;color:#8a6316;font-size:11.5px;line-height:1.65;
  /* ★★★ 2026-10-13（狼哥截图：文字从框里露出来）：
     flex 子项默认 min-width:auto → 长文本不换行 → 溢出到框外。
     修：给文本子项 min-width:0（允许缩短换行）+ 强制断词。 */
  /* ★★★ 2026-10-14（狼哥截图二次反馈）：flex 在窄容器里换行不可靠 → 改用定位布局。
     图标绝对定位在左，文本用 padding-left 避开图标 → 文本自然换行。 */
  position:relative;padding-left:30px}
.permpop .pp-warn > span:first-child{position:absolute;left:11px;top:9px;line-height:1;font-size:12px}
.permpop .pp-warn > span:last-child{display:block;width:100%;
  word-break:break-word;overflow-wrap:anywhere;white-space:normal;margin:0}
.permpop .pp-warn b{color:#6b4c0e}
/* 面板里的开关（复用 pm-sw 拨档） */
.permpop .pm-sw{position:relative;display:inline-block;width:40px;height:22px;border-radius:999px;
  background:#c8cfd9;flex:none;transition:background .2s ease;cursor:pointer}
.permpop .pm-sw .pm-knob{position:absolute;top:3px;left:3px;width:16px;height:16px;border-radius:50%;
  background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.28);transition:transform .2s cubic-bezier(.4,0,.2,1)}
.permpop .pm-sw.on{background:#2fbf71}
.permpop .pm-sw.on .pm-knob{transform:translateX(18px)}
/* ★★★ 2026-10-11（狼哥）：权限开关改成【拨档样式】（iOS 风格滑块）
   —— 原来是 7px 小圆点变色，用户看不懂是开关。
   结构：<div class="cf-perm"><span class="pm-sw"><i class="pm-knob"></i></span><span class="pm-txt">默认权限</span></div>
   交互：默认灰底·圆点在左；开启绿底·圆点滑到右；文字同步变化。 */
.pm-sw{position:relative;display:inline-block;width:28px;height:16px;border-radius:999px;
  background:#c8cfd9;flex:none;transition:background .2s ease;vertical-align:middle}
.pm-sw .pm-knob{position:absolute;top:2px;left:2px;width:12px;height:12px;border-radius:50%;
  background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.28);transition:transform .2s cubic-bezier(.4,0,.2,1)}
/* 开启态：绿底 + 圆点右移 */
.cf-perm.on .pm-sw,.tb-perm.on .pm-sw{background:#2fbf71}
.cf-perm.on .pm-sw .pm-knob,.tb-perm.on .pm-sw .pm-knob{transform:translateX(12px)}
/* hover 微反馈 */
.cf-perm:hover .pm-sw,.tb-perm:hover .pm-sw{filter:brightness(.96)}
/* ★ 保留旧 .pm-dot 样式（防止其他地方还在用） */
.tb-perm{display:none;align-items:center;gap:5px;cursor:pointer;padding:3px 9px 3px 7px;border-radius:7px;font-size:12px;color:var(--sub);user-select:none}
body.in-client .tb-perm{display:inline-flex}
.tb-perm:hover{background:var(--hover);color:var(--txt)}
.tb-perm .pm-dot{width:7px;height:7px;border-radius:50%;flex:none;background:#a8b0bd;transition:background .18s}
.tb-perm.on .pm-dot{background:#2fbf71;box-shadow:0 0 0 3px rgba(47,191,113,.16)}
.tb-perm.on{color:#2fbf71}
/* ★ 拨档态：文字也用绿色（与滑块呼应） */
.cf-perm.on .pm-txt,.tb-perm.on .pm-txt{color:#2fbf71;font-weight:600}
.cf-perm:hover{background:rgba(127,127,127,.10);color:var(--txt,#1f2329)}
.cf-perm .pm-dot{width:7px;height:7px;border-radius:50%;flex:none;background:#a8b0bd;transition:background .18s}
.cf-perm.on .pm-dot{background:#2fbf71;box-shadow:0 0 0 3px rgba(47,191,113,.16)}
.cf-perm.on{color:#2fbf71;border-color:rgba(47,191,113,.35);background:rgba(47,191,113,.07)}
.cf-perm .pm-tip{position:absolute;left:0;bottom:calc(100% + 8px);z-index:60;width:252px;
  background:#1f2329;color:#fff;font-size:11.5px;line-height:1.62;padding:9px 11px;border-radius:9px;
  box-shadow:0 6px 22px rgba(0,0,0,.26);opacity:0;visibility:hidden;transition:opacity .15s,visibility .15s;
  pointer-events:none;font-weight:400;white-space:normal;text-align:left}
.cf-perm:hover .pm-tip{opacity:1;visibility:visible}
.cf-perm .pm-tip b{color:#fff}
/* 授权卡（内联在对话流里，不弹窗） */
.cf-permcard{border:1px solid rgba(245,185,66,.55);background:rgba(245,185,66,.07);border-radius:11px;
  padding:11px 13px;margin:8px 0;max-width:520px}
.cf-permcard .pc-hd{font-size:12.5px;font-weight:600;color:#b8860b;display:flex;align-items:center;gap:6px;margin-bottom:6px}
.cf-permcard .pc-bd{font-size:12.5px;line-height:1.7;color:var(--txt,#1f2329)}
.cf-permcard .pc-path{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:11.5px;
  background:rgba(127,127,127,.12);padding:1px 5px;border-radius:4px;word-break:break-all}
.cf-permcard .pc-acts{display:flex;gap:7px;margin-top:10px;flex-wrap:wrap}
.cf-permcard .pc-btn{font-size:12px;padding:5px 13px;border-radius:7px;cursor:pointer;border:1px solid transparent;
  font-family:inherit;transition:opacity .15s}
.cf-permcard .pc-btn:hover{opacity:.85}
.cf-permcard .pc-btn.pri{background:#3370ff;color:#fff}
.cf-permcard .pc-btn.def{background:transparent;color:var(--txt,#1f2329);border-color:rgba(127,127,127,.4)}
.cf-permcard .pc-btn.dng{background:transparent;color:#e5484d;border-color:rgba(229,72,77,.45)}
.cf-permcard.done{opacity:.72}
.cf-permcard.done .pc-acts{display:none}
.cf-permcard.done .pc-hd{color:#2fbf71}
/* ★ 右侧三件套：语音/上传/发送 靠右收拢 */
.ceo-foot .cf-icon.cf-inline{margin-left:0}
.ceo-foot .cf-send{margin-left:2px}
.ceo-foot .cf-icon.cf-inline{width:28px;height:28px;border-radius:8px;background:transparent;color:var(--dim);flex:none;display:flex;align-items:center;justify-content:center}
.ceo-foot .cf-icon.cf-inline:hover{background:rgba(51,112,255,.10);color:var(--blue)}
/* 输入区（附件条+编辑器）——占满剩余宽度 */
.ceo-foot .cf-iwrap{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:center}
/* 发送按钮在框内保持有框（蓝色圆角块），但缩小一点更协调 */
.ceo-foot .cf-send{margin-left:auto}
.ceo-foot .cf-box:focus-within{border-color:#c9d8ff}
/* P5: 富文本编辑器(URL 实时识别) */
.ceo-foot .cf-editor{outline:none;font-size:12.5px;line-height:1.55;color:var(--txt);min-height:30px;max-height:min(240px,32vh);overflow-y:auto;padding:4px 0;word-break:break-word;white-space:pre-wrap;scrollbar-width:thin}
/* ★ 09-25 全局对话模型切换 */
/* ★ 2026-10-02 狼哥：输入框身份【显示名称】（原来只显头像，看不出跟谁说话） */
/* ★ 2026-10-02 狼哥（撤回）：输入框【只显示头像】，名称 hover 显示（省位置） */
/* ★★★ 2026-10-09 狼哥：统一身份名字显示（原来隐藏 → 工作台显示，不一致）
   统一规格：12px / 灰 rgb(154,165,189) / 显示 */
.ceo-foot .cf-who-ava .cf-who-txt{display:none}
.ceo-foot .cf-who-ava{padding:2px;border-radius:50%}
.ceo-foot .cf-who-ava #ceoWhoIco{display:flex;align-items:center}
.ceo-foot .cf-who-ava .s2-ava{width:26px;height:26px;border-radius:50%;object-fit:cover}
.ceo-foot .cf-model{display:flex;align-items:center;gap:3px;flex:none;cursor:pointer;user-select:none;padding:3px 7px;border-radius:8px;font-size:12px;color:var(--dim);transition:background .15s;max-width:160px}
.ceo-foot .cf-who{display:flex;align-items:center;gap:3px;flex:none;font-size:12px;color:var(--dim);padding:3px 7px;max-width:140px}
.ceo-foot .cf-who span:last-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ceo-foot .cf-model:hover{background:rgba(51,112,255,.10);color:var(--blue)}
/* ★ 2026-10-02 狼哥：模型选择器【显示名称】（原来只显 logo，看不出用的什么模型） */
/* ★ 2026-10-02 狼哥（撤回）：模型选择器【只显示 logo】，名称 hover 显示 */
/* ★★★ 2026-10-09 狼哥：统一模型名字显示（原隐藏）12px 灰 */
.ceo-foot .cf-model .cfm-nm{display:none!important}
.ceo-foot .cf-model .cfm-ar{font-size:10px;opacity:.7}
/* ★ 2026-10-02 狼哥：模型名统一显示（保留这条仅为兼容旧注释） */
body.ceo-imgmode .ceo-foot .cf-model .cfm-nm{display:none!important}
.ceo-foot .cf-model .cfm-lg{display:flex;align-items:center}
.ceo-foot .cf-model .cfm-lg-in{width:20px;height:20px;border-radius:6px;display:flex;align-items:center;justify-content:center;font-size:11px;color:#fff;font-weight:700}
.ceo-foot .cf-editor:empty::before{content:attr(data-ph);color:var(--dim,#9aa3b0)}
/* ★ 输入框发光呼吸：提示这里是输出区域 */
@keyframes cfGlowPulse{
  0%,100%{box-shadow:0 0 0 0 rgba(51,112,255,0);border-color:var(--line,#e5e6eb)}
  50%{box-shadow:0 0 0 4px rgba(51,112,255,.14),0 0 14px rgba(51,112,255,.32);border-color:#3370ff}
}
.ceo-foot .cf-box{transition:border-color .3s,box-shadow .3s;border-radius:10px}
.ceo-foot .cf-box.cf-glow{animation:cfGlowPulse 1.5s ease-in-out 4;border-color:#3370ff}
.ceo-foot .cf-editor .ceo-url{color:#3370ff;text-decoration:underline;text-underline-offset:2px;cursor:pointer}
/* P5: 附件预览条 */
.ceo-foot .cf-atts{display:none;flex-wrap:wrap;gap:6px;padding:3px 0 5px}
.ceo-foot .cf-atts.has{display:flex}
.ceo-foot .cf-att{position:relative;width:52px;height:52px;border-radius:8px;overflow:hidden;background:#eef2f8;display:flex;align-items:center;justify-content:center;font-size:20px;border:1px solid #e3e8f0}
.ceo-foot .cf-att img{width:100%;height:100%;object-fit:cover}
.ceo-foot .cf-att .x{position:absolute;top:1px;right:1px;width:15px;height:15px;border-radius:50%;background:rgba(0,0,0,.55);color:#fff;font-size:10px;line-height:15px;text-align:center;cursor:pointer}
.ceo-foot .cf-att .nm{position:absolute;left:0;right:0;bottom:0;font-size:8px;color:#fff;background:rgba(0,0,0,.5);padding:1px 3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* P5: 上传菜单 */
.ceo-foot .cf-umenu{position:absolute;background:var(--card);border:1px solid #e8eaee;border-radius:10px;box-shadow:0 8px 26px rgba(0,0,0,.13);padding:5px;min-width:150px;display:none;z-index:60;bottom:calc(100% + 6px)}
.ceo-foot .cf-umenu.show{display:block}
.ceo-foot .cf-um-item{display:flex;align-items:center;gap:9px;padding:8px 11px;font-size:12.5px;color:#374151;border-radius:7px;cursor:pointer;white-space:nowrap}
.ceo-foot .cf-um-item:hover{background:#f3f6ff;color:#3370ff}
.ceo-foot .cf-um-item .ic{font-size:15px}
.ceo-foot{position:relative}
.ceo-foot .cf-box:focus-within{border-color:var(--blue);background:var(--card);box-shadow:0 0 0 3px rgba(51,112,255,.1)}
.ceo-foot input{flex:1;border:none;background:none;outline:none;font-size:13.5px}
.ceo-foot .cf-send{width:34px;height:34px;border-radius:11px;background:#3370ff;color:#fff;border:none;display:flex;align-items:center;justify-content:center;font-size:14px;cursor:pointer;flex:none}
.ceo-foot .cf-send:hover{background:#2758e0}
/* 输入条左侧/语音+上传图标按钮 */
.ceo-foot .cf-icon{width:34px;height:34px;border-radius:11px;border:none;background:transparent;color:var(--dim);display:flex;align-items:center;justify-content:center;cursor:pointer;flex:none;transition:.15s}
.ceo-foot .cf-icon:hover{background:var(--bg2);color:var(--blue)}
.ceo-foot .cf-icon.rec{background:#e5484d;color:#fff;animation:ceoRecPulse 1s infinite}
/* ★2026-09-21 上传引导：➕ 按钮呼吸光环（持续到用户上传为止） */
.ceo-foot .cf-icon.upload-hint{color:#3370ff;background:rgba(51,112,255,.10);animation:ceoUpHint 1.8s ease-in-out infinite}
@keyframes ceoUpHint{0%,100%{box-shadow:0 0 0 0 rgba(51,112,255,.45)}50%{box-shadow:0 0 0 8px rgba(51,112,255,0)}}
/* ★2026-09-21 狼哥定稿：上传统一横幅（标题栏下方·通栏·浅蓝细条）
   出现闪 3 下；上传完成自动消失 */
.gsup-bar{flex-shrink:0;background:#e8f1fd;border-bottom:1px solid #cfe0f8;
  color:#1a4fa0;font-size:12.5px;line-height:1.5;position:relative;z-index:20}
.gsup-bar.flash{animation:gsupFlash .42s ease-in-out 3}
@keyframes gsupFlash{0%,100%{background:#e8f1fd}50%{background:#cfe4ff}}
.gsup-inner{display:flex;align-items:center;gap:8px;padding:0 20px;height:36px}
.gsup-ic{flex:none;font-size:13px}
.gsup-lb{flex:none;color:#3a6fbf}
#gsUploadTarget{background:var(--card);color:#1a4fa0;border:1px solid #b7d1f2;border-radius:7px;
  padding:3px 8px;font-size:12.5px;outline:none;cursor:pointer;max-width:220px;font-weight:600}
#gsUploadTarget:focus{border-color:#5b93e8;box-shadow:0 0 0 3px rgba(91,147,232,.18)}
.gsup-sep{flex:none;color:#a8c3e6}
.gsup-txt{flex:1;color:#5b82bd;font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.gsup-x{flex:none;margin-left:6px;border:none;background:transparent;color:#7ba0d4;
  border-radius:6px;padding:2px 8px;cursor:pointer;font-size:12px;transition:.15s}
.gsup-x:hover{background:#d3e4fb;color:#1a4fa0}
.gsup-prog{flex:none;display:flex;align-items:center;gap:6px;color:#1a4fa0;font-weight:600;
  font-size:12px;font-variant-numeric:tabular-nums;background:#d8e9ff;border-radius:20px;
  padding:2px 10px;white-space:nowrap}
.gsup-prog .gp-bar{width:64px;height:5px;border-radius:3px;background:#bcd8f8;overflow:hidden;flex:none}
.gsup-prog .gp-bar i{display:block;height:100%;width:0;background:#3370ff;border-radius:3px;
  transition:width .18s linear}
.gsup-prog.done{background:#d9f5e6;color:#1a7f4b}
.gsup-prog.err{background:#ffe0e0;color:#c0392b}
@media(max-width:760px){
  .gsup-inner{padding:0 12px;height:auto;min-height:36px;flex-wrap:wrap;gap:6px;padding-top:6px;padding-bottom:6px}
  .gsup-txt{white-space:normal;flex-basis:100%}
}
/* ★2026-09-22 上传卡片（狼哥）：点上传→弹拖拽卡片，绕开「系统文件选择器置顶」 */
#upqCard{position:fixed;inset:0;z-index:12000;display:none}
#upqCard[hidden]{display:none!important}   /* ★2026-09-22 防刷新闪白：CSS 未加载时也不露出 */
/* ★2026-10-03 狼哥：底栏 hidden 不生效（.upc-ft 的 display:flex 盖过浏览器默认 [hidden]）
   → 首次打开时"确认上传"栏仍然显示。这里给明确的 !important 兜底。 */
#upqFt[hidden]{display:none!important}
#upqCard.on{display:block}
#upqCard .upc-mask{position:absolute;inset:0;background:rgba(15,23,42,.42);backdrop-filter:blur(2px)}
/* ★ 2026-09-28 已选文件列表 */
#upqCard .upc-picked{margin:12px 18px 0;border:2px dashed rgba(51,112,255,.35);border-radius:12px;overflow:hidden;background:rgba(51,112,255,.04)}
#upqCard .upc-pk-hd{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;
  font-size:11.5px;font-weight:600;color:var(--sub);border-bottom:1px solid var(--line);background:var(--card)}
#upqCard .upc-pk-size{color:var(--dim);font-weight:400}
#upqCard .upc-pk-list{max-height:190px;overflow-y:auto}
#upqCard .upc-pk-row{display:flex;align-items:center;gap:8px;padding:7px 12px;font-size:12.5px;color:var(--txt);
  border-bottom:1px solid rgba(127,127,127,.08)}
#upqCard .upc-pk-row:last-child{border-bottom:none}
#upqCard .upc-pk-ic{flex:none;font-size:14px}
#upqCard .upc-pk-nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#upqCard .upc-pk-sz{flex:none;font-size:11px;color:var(--dim);font-variant-numeric:tabular-nums}
#upqCard .upc-pk-del{flex:none;border:none;background:transparent;color:var(--dim);cursor:pointer;font-size:13px;padding:2px 4px;border-radius:5px}
#upqCard .upc-pk-del:hover{background:rgba(245,34,45,.10);color:#f5222d}
/* 底部按钮 */
#upqCard .upc-ft{display:flex;gap:9px;justify-content:flex-end;padding:14px 18px 16px}
#upqCard .upc-btn{border-radius:9px;padding:9px 18px;font-size:13px;font-weight:600;cursor:pointer;
  font-family:inherit;transition:.15s;border:1px solid transparent}
#upqCard .upc-btn.ghost{background:transparent;border-color:var(--line);color:var(--txt)}
#upqCard .upc-btn.ghost:hover{border-color:#3370ff;color:#3370ff}
#upqCard .upc-btn.pri{background:#3370ff;border-color:#3370ff;color:#fff}
#upqCard .upc-btn.pri:hover{background:#1d6cf0}
#upqCard .upc-btn.pri:disabled{opacity:.45;cursor:default}
#upqCard .upc-box{position:absolute;left:50%;top:46%;transform:translate(-50%,-50%);
  width:min(460px,92vw);background:var(--card);border:1px solid var(--line);border-radius:16px;
  box-shadow:0 24px 64px rgba(0,0,0,.28)}
/* ★2026-09-28 狼哥：原来 upc-box 是 overflow:hidden → 把往上弹的下拉裁掉了。
   现在不裁，改为内部元素各自圆角。 */
#upqCard .upc-hd{display:flex;align-items:center;justify-content:space-between;padding:14px 18px 0}
#upqCard .upc-t{font-size:14px;font-weight:700;color:var(--txt)}
#upqCard .upc-x{border:none;background:transparent;color:var(--dim);font-size:16px;cursor:pointer;
  width:26px;height:26px;border-radius:7px;line-height:1;transition:.15s}
#upqCard .upc-x:hover{background:var(--bg);color:var(--txt)}
#upqCard .upc-drop{margin:12px 18px 0;border:2px dashed rgba(51,112,255,.35);border-radius:12px;
  background:rgba(51,112,255,.035);padding:26px 16px;text-align:center;cursor:pointer;transition:.18s}
#upqCard .upc-drop:hover,#upqCard .upc-drop.over{border-color:#3370ff;background:rgba(51,112,255,.09)}
#upqCard .upc-drop.over{transform:scale(1.01)}
#upqCard .upc-ico{font-size:30px;line-height:1;margin-bottom:8px;display:block}
#upqCard .upc-drop.over .upc-ico{animation:upcBounce .6s ease-in-out infinite}
@keyframes upcBounce{0%,100%{transform:translateY(0)}50%{transform:translateY(-5px)}}
#upqCard .upc-main{font-size:13.5px;font-weight:600;color:var(--txt)}
#upqCard .upc-sub{font-size:11.5px;color:var(--dim);margin-top:6px;line-height:1.6}
#upqCard .upc-pick{display:inline-block;margin-top:12px;background:#3370ff;color:#fff;border:none;
  border-radius:9px;padding:8px 20px;font-size:12.5px;font-weight:600;cursor:pointer;transition:.15s}
#upqCard .upc-pick:hover{background:#1d6cf0;transform:translateY(-1px)}
#upqCard .upc-lim{margin:12px 18px 0;font-size:11px;color:var(--dim);line-height:1.7;
  background:var(--bg);border-radius:9px;padding:9px 12px}
#upqCard .upc-lim b{color:var(--txt);font-weight:600}
#upqCard .upc-loc{margin:12px 18px 18px;display:flex;align-items:center;gap:10px}
#upqCard .upc-ai{margin:-6px 18px 14px;display:flex;align-items:center;gap:9px;flex-wrap:wrap}
#upqCard .upc-ai-chk{display:flex;align-items:center;gap:6px;cursor:pointer;font-size:12.5px;color:var(--txt)}
#upqCard .upc-ai-chk input{width:15px;height:15px;accent-color:#3370ff;cursor:pointer}
#upqCard .upc-ai-tip{font-size:11px;color:var(--dim)}
#upqCard .upc-loc label{font-size:12px;color:var(--dim);white-space:nowrap;flex:none}
#upqCard .upc-loc select{flex:1;min-width:0;background:var(--card);border:1px solid var(--line);
  border-radius:9px;padding:8px 10px;color:var(--txt);font-size:12.5px;outline:none;cursor:pointer}
#upqCard .upc-loc select:focus{border-color:#3370ff;box-shadow:0 0 0 3px rgba(51,112,255,.12)}
#upqCard .upc-loc .upc-def{font-size:10.5px;color:var(--dim);white-space:nowrap;flex:none}
/* ★ 新建文件夹弹窗（下拉选「＋ 新建文件夹」时弹） */
#upqCard .upc-btn.sm{padding:7px 13px;font-size:12px}
/* 全局拖拽遮罩（拖到驾驶舱任意位置） */
#upqGdrop{position:fixed;inset:0;z-index:11900;display:none;pointer-events:none}
#upqGdrop[hidden]{display:none!important}
#upqGdrop.on{display:flex;align-items:center;justify-content:center}
#upqGdrop .ugd-in{border:3px dashed #3370ff;border-radius:20px;background:rgba(51,112,255,.10);
  backdrop-filter:blur(3px);padding:40px 56px;text-align:center;color:#1d4fd8}
#upqGdrop .ugd-in .u1{font-size:44px;line-height:1}
#upqGdrop .ugd-in .u2{font-size:17px;font-weight:700;margin-top:12px}
#upqGdrop .ugd-in .u3{font-size:12.5px;opacity:.8;margin-top:6px}
/* ★2026-09-22 进度环：完成/失败时的弹跳动效（狼哥：不然不知道成没成） */
.upq-ring.upq-pop{animation:upqPop .5s cubic-bezier(.34,1.56,.64,1)}
@keyframes upqPop{0%{transform:scale(.6)}55%{transform:scale(1.22)}100%{transform:scale(1)}}
/* 上传中：列表锁定展开（鼠标移开也不收） */
.upq.hover .upq-list{display:block}
/* 进度环：处理中流动条纹 */
.upq-bar-proc i{background-image:linear-gradient(45deg,rgba(255,255,255,.42) 25%,transparent 25%,
  transparent 50%,rgba(255,255,255,.42) 50%,rgba(255,255,255,.42) 75%,transparent 75%,transparent);
  background-size:8px 8px;animation:upqProc .6s linear infinite}
@keyframes upqProc{from{background-position:0 0}to{background-position:8px 0}}
/* 上传引导：顶部提示条（引导态·蓝底） */
#gsUploadTip.guide{background:linear-gradient(90deg,#3370ff,#1d6cf0)}
#gsUploadTip.guide .gs-up-arrow{display:inline-block;animation:gsUpBounce 1s ease-in-out infinite}
@keyframes gsUpBounce{0%,100%{transform:translateY(0)}50%{transform:translateY(-4px)}}
@keyframes ceoRecPulse{0%,100%{box-shadow:0 0 0 0 rgba(229,72,77,.4)}50%{box-shadow:0 0 0 6px rgba(229,72,77,0)}}
.ceo-foot .cf-icon.uploading{color:var(--blue);animation:ceoSpin 1s linear infinite}
@keyframes ceoSpin{from{transform:rotate(0)}to{transform:rotate(360deg)}}
/* 输入条末尾 = active 大头(收起成球) */
.ceo-foot .cf-logo{width:44px;height:44px;flex:none;background:transparent;border:none;position:relative;display:flex;align-items:center;justify-content:center;cursor:pointer;padding:0;overflow:visible}
.ceo-foot .cf-logo img{width:100%;height:100%;object-fit:contain;display:block;pointer-events:none;filter:drop-shadow(0 3px 8px rgba(0,0,0,.2))}
.ceo-foot .cf-logo-cnt{position:absolute;top:0;right:0;background:#e5484d;color:#fff;font-size:9px;font-weight:800;min-width:17px;height:17px;border-radius:9px;display:none;align-items:center;justify-content:center;padding:0 4px;box-shadow:0 2px 6px rgba(229,72,77,.5);z-index:3}
/* ★ 09-28 狼哥: 输入框态 机器人logo【右侧】状态灯 */
/* ★ 09-28 狼哥: 状态灯(小点, 放 logo 右上角) */
.ceo-foot .cf-logo{position:relative}
.ceo-foot .cf-dot{position:absolute;top:2px;right:2px;width:7px;height:7px;border-radius:50%;background:#9aa4b2;cursor:pointer;transition:.2s;box-shadow:0 0 0 1.5px var(--card,#fff);z-index:5}
.ceo-foot .cf-dot.on{background:#22c55e}
.ceo-foot .cf-dot.off{background:#ef4444}
.ceo-foot .cf-dot:hover{transform:scale(1.3)}
/* 缩放柄 */
.ceo-win .cz{position:absolute;z-index:6}
.ceo-win .cz.n{top:-3px;left:10px;right:10px;height:7px;cursor:n-resize}
.ceo-win .cz.s{bottom:-3px;left:10px;right:10px;height:7px;cursor:s-resize}
.ceo-win .cz.e{right:-3px;top:12px;bottom:60px;width:7px;cursor:e-resize}
.ceo-win .cz.w{left:-3px;top:12px;bottom:60px;width:7px;cursor:w-resize}
.ceo-win .cz.se{bottom:-3px;right:-3px;width:16px;height:16px;cursor:se-resize}
.ceo-win .cz.sw{bottom:-3px;left:-3px;width:16px;height:16px;cursor:sw-resize}
.ceo-win .cz.ne{top:-3px;right:-3px;width:14px;height:14px;cursor:ne-resize}
.ceo-win .cz.nw{top:-3px;left:-3px;width:14px;height:14px;cursor:nw-resize}

.ceo-win .cz:hover{background:rgba(51,112,255,.16);border-radius:4px}
/* 要事中心 = CEO 对话框「左侧外挂」面板(不占对话框空间, 对话框尺寸恒定) */
.ceo-win.radar-on{/* 对话框宽度不变, 仅外挂面板 */ }
.ceo-mid{flex:1;min-height:0;display:none;position:relative}
.ceo-win.open .ceo-mid{display:flex}
/* 外挂面板: 绝对定位挂在「整个对话框(含head+foot)」上 → 与对话框同高。见下方 .ceo-win>.ceo-radar / #ceoSearch 规则 */
.ceo-radar{position:absolute;right:100%;top:-1px;bottom:-1px;width:230px;margin-right:6px;
  /* ★ 2026-10-17 狼哥：去掉上边框（消息区上方那条实线）*/
  border:1px solid var(--line);border-top:0;border-right:1px solid var(--line);border-radius:14px;
  background:var(--card);box-shadow:0 16px 50px rgba(20,30,60,.2);
  display:flex;flex-direction:column;min-height:0;overflow:hidden;
  opacity:0;visibility:hidden;transform:translateX(14px);pointer-events:none;
  transition:opacity .22s ease,transform .22s cubic-bezier(.2,.8,.3,1),visibility .22s}
.ceo-radar.open{opacity:1;visibility:visible;transform:translateX(0);pointer-events:auto}
/* 窄条态(未展开)不允许外挂面板显示 */
.ceo-win:not(.open) .ceo-radar,.ceo-win:not(.open) .ceo-search{display:none}
.ceo-radar .cr-h{padding:10px 12px;font-size:11px;font-weight:800;color:var(--sub);display:flex;align-items:center;gap:6px;border-bottom:1px solid var(--line);flex:none}
/* 决策清单 tab(需你处理 / 老板风格) */
.ceo-radar .cr-tabs{display:flex;gap:6px;padding:8px 10px 0;flex:none}
.ceo-radar .ctab{flex:1;border:none;background:var(--bg2);color:var(--sub);font-size:11px;font-weight:600;padding:6px 4px;border-radius:8px;cursor:pointer;white-space:nowrap;transition:.15s}
.ceo-radar .ctab.on{background:var(--orange-soft);color:var(--orange);font-weight:700}
/* 老板风格画像 */
.cr-style{padding:8px 10px;overflow-y:auto}
.cr-style .st-hint{font-size:10.5px;color:var(--dim);line-height:1.6;margin-bottom:8px}
.cr-style .trait{display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px solid var(--line)}
.cr-style .trait:last-child{border:none}
.cr-style .trait .lbl{font-size:11px;font-weight:600;color:var(--txt);line-height:1.3;flex:none;max-width:110px}
.cr-style .trait .barr{flex:1;height:6px;background:var(--bg2);border-radius:4px;overflow:hidden}
.cr-style .trait .barr i{display:block;height:100%;border-radius:4px;background:linear-gradient(90deg,#3370ff,#5b8bff)}
.cr-style .trait .pct{width:30px;font-size:10.5px;color:var(--dim);flex:none;text-align:right}
.cr-style .learn{display:flex;align-items:flex-start;gap:7px;background:rgba(47,191,113,.12);color:var(--green);font-size:10.5px;border-radius:9px;padding:8px 10px;margin-top:8px;line-height:1.5}
.cr-style .learn i{width:6px;height:6px;border-radius:50%;background:var(--green);animation:blink 1.4s infinite;flex:none;margin-top:4px}
@keyframes blink{0%,100%{opacity:1}50%{opacity:.3}}
.ceo-radar .cr-h .cnt{margin-left:auto;font-size:10px;color:var(--dim);font-weight:600}
.ceo-radar .cr-close{margin-left:8px;border:none;background:none;color:var(--dim);font-size:12px;cursor:pointer;padding:2px 5px;border-radius:5px;line-height:1}
.ceo-radar .cr-close:hover{background:var(--bg2);color:var(--txt)}
.ceo-radar .cr-list{flex:1;overflow-y:auto;padding:6px 8px}
.ceo-radar .cr-list::-webkit-scrollbar{width:5px}.ceo-radar .cr-list::-webkit-scrollbar-thumb{background:#d5dbe7;border-radius:5px}
.cr-item{border:1px solid transparent;border-radius:9px;padding:8px 9px;margin-bottom:5px;cursor:pointer;line-height:1.4;transition:background .12s}
.cr-item:hover{background:var(--card2);border-color:var(--line)}
.cr-item.cur{background:var(--card2);border-color:#3370ff}
.cr-item .cr-top{display:flex;align-items:center;gap:6px;margin-bottom:3px}
.cr-item .cr-no{flex:none;font-size:10px;font-weight:800;color:#fff;background:#3370ff;border-radius:5px;min-width:18px;height:18px;display:inline-flex;align-items:center;justify-content:center;padding:0 3px}
.cr-item .cr-kind{flex:none;font-size:9px;font-weight:700;padding:1px 5px;border-radius:5px}
.cr-item .cr-kind.k-dec{color:var(--orange);background:var(--orange-soft)}
.cr-item .cr-kind.k-aud{color:#f08c00;background:var(--orange-soft)}
.cr-item .cr-t{font-size:11.5px;font-weight:700;color:var(--txt);line-height:1.4}
.cr-item .cr-d{font-size:10px;color:var(--dim);margin-top:2px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.cr-item .cr-more{font-size:9.5px;color:#3370ff;margin-top:2px;display:none;cursor:pointer}
.cr-item.exp .cr-d{display:block;-webkit-line-clamp:unset}
.cr-item.exp .cr-more{display:inline}
.cr-empty{padding:20px 10px;text-align:center;font-size:11px;color:var(--dim);line-height:1.6}
/* ★产物区（全驾驶舱共用） */
.art-item{position:relative}
.art-item .art-prod{font-size:9.5px;color:var(--dim);margin-left:auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:80px}
.art-dot{width:7px;height:7px;border-radius:50%;background:#f5222d;flex:none;animation:artBreath 1.4s ease-in-out infinite}
@keyframes artBreath{0%,100%{opacity:1}50%{opacity:.35}}
.cr-kind.k-art{color:#3370ff;background:rgba(51,112,255,.1)}
.art-ops{display:none;gap:5px;margin-top:5px;justify-content:flex-end}
.art-item:hover .art-ops{display:flex}
.art-op{border:1px solid var(--line);background:var(--card);color:var(--sub);border-radius:6px;
  font-size:10px;padding:2px 7px;cursor:pointer;line-height:1.5;transition:all .12s}
.art-op:hover{background:#3370ff;color:#fff;border-color:#3370ff}
.art-op-dir{padding:2px 6px}
.art-op-dl{background:#3370ff;color:#fff;border-color:#3370ff;font-weight:600;padding:2px 8px}
.art-op-dl:hover{background:#1f5ae0;border-color:#1f5ae0}
.art-btn-dl{background:#3370ff;color:#fff;border-color:#3370ff}
.art-btn-dl:hover{background:#1f5ae0}
/* 预览弹窗 */
.art-modal{position:fixed;inset:0;background:rgba(10,12,20,.45);z-index:99999;display:flex;align-items:center;justify-content:center;padding:40px}
.art-box{background:var(--card);border-radius:12px;width:min(720px,92vw);max-height:82vh;display:flex;flex-direction:column;box-shadow:0 18px 60px rgba(0,0,0,.32)}
.art-bh{display:flex;align-items:center;gap:8px;padding:13px 16px;border-bottom:1px solid var(--line)}
.art-bh b{font-size:13.5px;color:var(--txt)}
.art-bmeta{font-size:10.5px;color:var(--dim)}
.art-bx{margin-left:auto;border:none;background:transparent;font-size:14px;color:var(--dim);cursor:pointer}
.art-bbody{padding:14px 16px;overflow:auto;font-size:12px;line-height:1.75;color:var(--txt);white-space:normal}
.art-bf{display:flex;gap:8px;justify-content:flex-end;padding:11px 16px;border-top:1px solid var(--line)}
.art-btn{border:1px solid var(--line);background:var(--card2);color:var(--sub);border-radius:7px;font-size:11.5px;padding:5px 12px;cursor:pointer}
.art-btn:hover{background:#3370ff;color:#fff;border-color:#3370ff}
/* ★产物附件 chip（横条形态·可放长名） */
.ceo-foot .cf-att-art{width:auto;max-width:190px;height:26px;border-radius:7px;padding:0 8px;gap:5px;
  background:#eef3ff;border:1px solid #cddcff;display:inline-flex;align-items:center;font-size:11px}
.ceo-foot .cf-att-art .art-ic{font-size:12px;flex:none}
.ceo-foot .cf-att-art .nm{position:static;background:none;color:#2b5bd7;font-size:11px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:130px;cursor:pointer}
.ceo-foot .cf-att-art .nm:hover{text-decoration:underline}
.ceo-foot .cf-att-art .x{position:static;background:transparent;color:#8aa0c8;font-size:11px;width:14px;height:14px;line-height:14px}
.ceo-foot .cf-att-art .x:hover{color:#f5222d}
.cr-bar{display:flex;align-items:center;gap:8px;padding:6px 4px;border-bottom:1px solid var(--line);margin-bottom:6px}
.cr-all{display:flex;align-items:center;gap:4px;font-size:10.5px;color:var(--sub);cursor:pointer;flex:1}
.cr-all input,.cr-ck{width:14px;height:14px;cursor:pointer;accent-color:#3370ff;margin:0}
.cr-batch{border:none;background:#3370ff;color:#fff;font-size:10.5px;font-weight:700;padding:4px 10px;border-radius:8px;cursor:pointer;white-space:nowrap}
.cr-batch:hover{background:#2758e0}
.cr-item .cr-top{display:flex;align-items:center;gap:6px;margin-bottom:3px}
.cr-item .cr-ck{flex:none;margin-right:2px}

/* ===== 聊天记录搜索 · 右侧外挂面板(与对话框同高) ===== */
/* ★★★ 2026-10-03 狼哥：搜索面板要有【独立高度】——
   原 top:-1px;bottom:-1px 跟随父容器；mini 态父容器只有 67px
   → 搜索面板被压成 67px（筛选器跑到视口外）。
   修：改用 min-height + 视口约束，不再跟随 mini 高度。 */
.ceo-search{position:absolute;left:100%;bottom:0;margin-left:6px;width:min(360px,92vw);
  height:min(72vh,620px);min-height:420px;max-height:calc(100vh - 24px);
  background:var(--card,#fff);border:1px solid var(--line,#eee);border-radius:14px;z-index:9600;
  display:flex;flex-direction:column;overflow:visible;
  box-shadow:0 16px 50px rgba(20,30,60,.2);
  opacity:0;visibility:hidden;transform:translateX(-14px);pointer-events:none;
  transition:opacity .22s ease,transform .22s cubic-bezier(.2,.8,.3,1),visibility .22s}
.ceo-search.open{opacity:1;visibility:visible;transform:translateX(0);pointer-events:auto}
/* ★ 问题4/6(09-24): 会话中心双栏（左=会话列表 右=内容），参考飞书 */
.ceo-search .cs-wrap{flex:1;display:flex;min-height:0}
.ceo-search .cs-left{width:168px;flex:none;border-right:1px solid var(--line,#eee);display:flex;flex-direction:column;min-height:0;background:var(--bg2,#fafbfc)}
.ceo-search .cs-left .cl-search{padding:8px;flex:none;border-bottom:1px solid var(--line,#eee)}
.ceo-search .cs-left .cl-search input{width:100%;box-sizing:border-box;border:1px solid var(--line,#e5e8ee);border-radius:8px;padding:6px 9px;font-size:12px;outline:none;background:var(--card,#fff);color:var(--txt,#333)}
.ceo-search .cs-left .cl-search input:focus{border-color:#3370ff}
.ceo-search .cs-left .cl-list{flex:1;overflow-y:auto;padding:4px 6px}
.ceo-search .cs-left .cl-grp{font-size:10px;color:#9aa3b0;font-weight:600;padding:7px 6px 3px;letter-spacing:.3px}
.ceo-search .cs-left .cl-item{display:flex;align-items:center;gap:7px;padding:7px 8px;border-radius:8px;cursor:pointer;font-size:12.5px;color:var(--txt,#333);margin-bottom:1px}
.ceo-search .cs-left .cl-item:hover{background:#eef2f8}
.ceo-search .cs-left .cl-item.on{background:#e6efff;color:#3370ff;font-weight:600}
.ceo-search .cs-left .cl-av{width:22px;height:22px;border-radius:6px;background:#dfe7f5;display:flex;align-items:center;justify-content:center;font-size:11px;flex:none}
.ceo-search .cs-left .cl-nm{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ceo-search .cs-left .cl-badge{font-size:9px;color:#fff;background:#e5484d;border-radius:8px;padding:0 5px;height:15px;line-height:15px;flex:none}
.ceo-search .cs-right{flex:1;display:flex;flex-direction:column;min-width:0}
.ceo-search.cs-sessions .cs-tabs,.ceo-search.cs-sessions .cs-filters{display:none;overflow-x:auto;overflow-y:hidden;flex-wrap:nowrap;scrollbar-width:thin;-ms-overflow-style:none}
.cs-filters::-webkit-scrollbar{height:4px}
.cs-filters::-webkit-scrollbar-thumb{background:rgba(120,130,150,.3);border-radius:2px}
.cs-filters .cs-fl{flex:none;white-space:nowrap}

/* ============================================
 * ★★★ 2026-10-17 狼哥 CSS 补丁（最高优先级）
 *   ① 消息区上方那条横线 = .ceo-foot 的 border-top
 *   ② 处理中状态条被压成 0 高度
 * ============================================ */
.ceo-win .ceo-foot,
.ceo-win.mini .ceo-foot,
.ceo-win.open .ceo-foot,
.ceo-win.open.mini .ceo-foot{
  border-top: 0 !important;
}
/* 状态条不被 flex 压缩 */
.ceo-win .ai-status{
  flex: 0 0 auto !important;
  min-height: 32px !important;
}

/* ★★★ 2026-10-17 狼哥：状态条高度修复
   问题：.ai-status.gone 设了 max-height:0，摘掉 gone 后 max-height 仍为 0 → h=0 看不见
   修法：streaming 态强制恢复高度 */
.ceo-win .ai-status.streaming,
.ceo-win .ai-status.done:not(.gone){
  max-height: 60px !important;
  opacity: 1 !important;
  padding-top: 8px !important;
  padding-bottom: 8px !important;
  margin-bottom: 6px !important;
}

/* ★★★ 2026-10-17 狼哥：消息区横线全清
   ① .spk-foot（消息底部耗时栏）的 border-top 虚线
   ② .ai-toolbox（工具区）的边框
   ③ .ceo-switch-tip 的边框 */
.ceo-win .spk-foot,
.ceo-win .spk-foot.ai-foot{
  border-top: 0 !important;
}
.ceo-win .ai-toolbox{
  border-top: 0 !important;
  border-bottom: 0 !important;
}
.ceo-win .ceo-switch-tip{
  border: 0 !important;
}

/* ═══════════════════════════════════════════════════════════
 * ★ 2026-10-18 狼哥：多行时身份/模型落底行
 *   做法：JS 检测输入框高度 > 40px → 给 cf-box 加 .multi-line 类
 *   单行时不加类 → 保持原布局（身份/模型在左）
 * ═══════════════════════════════════════════════════════════ */
.ceo-foot .cf-box.multi-line > .cf-input-wrap{ order: 1; flex: 1 1 100%; }
.ceo-foot .cf-box.multi-line > .cf-who{ order: 5; }
.ceo-foot .cf-box.multi-line > .cf-model{ order: 6; }
.ceo-foot .cf-box.multi-line > .cf-actions{ order: 7; margin-left: auto; }
