/* AI 学习对话侧边栏 */
/* v4.0.6：去掉 overflow:hidden 改为 overflow-x:hidden，让 .acp-mic-panel 浮层可溢出 AI 面板边界不被裁切；
   overflow-y:visible 让浮窗 z-index 上层显示（垂直方向允许弹出头部外） */
#ai-chat-panel{display:flex;flex-direction:column;height:100%;min-height:0;background:#fff;border:1px solid #d9e1ec;border-radius:14px;overflow-x:hidden;box-shadow:0 4px 14px rgba(31,49,78,.07);min-width:0;position:relative}
#ai-chat-panel[hidden]{display:none}
/* ── 拖拽手柄：面板左缘，拖拽调整宽度（视口 20%~60%）── */
.acp-drag{position:absolute;left:-5px;top:0;bottom:0;width:10px;cursor:col-resize;z-index:6;touch-action:none}
.acp-drag::after{content:'';position:absolute;left:4px;top:50%;transform:translateY(-50%);width:3px;height:46px;border-radius:2px;background:#c3d2e6;transition:background .15s}
.acp-drag:hover::after,.acp-drag:active::after{background:#3478f6}
.acp-drag:active{cursor:col-resize}
.acp-head{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid #e6ebf2;background:linear-gradient(135deg,#f0f6ff,#fff);flex-shrink:0}  /* v4.0.6：移除 position:relative——不再作为弹窗锚点 */
.acp-title{font-size:13px;font-weight:800;color:#1e3a5f;flex:1;min-width:0}
.acp-sub{display:block;font-size:11px;font-weight:500;color:#7b879a;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.acp-actions{display:flex;gap:4px}
.acp-btn{border:1px solid #cfdbea;background:#fff;border-radius:8px;padding:3px 8px;font-size:12px;cursor:pointer;color:#475569}
.acp-btn:hover{background:#f1f5f9}
.acp-messages{flex:1;min-height:0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:10px;background:#f8fafc}
/* ── 历史分页条（面板顶部）：默认只加载最新 10 条，更早的翻页查看 ── */
.acp-pagebar{display:flex;align-items:center;gap:6px;padding:6px 10px;border-bottom:1px solid #e6ebf2;background:#f8fafc;flex-shrink:0}
.acp-pagebar[hidden]{display:none}
.acp-page-info{flex:1;text-align:center;font-size:11.5px;color:#64748b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.acp-page-btn{border:1px solid #cfdbea;background:#fff;border-radius:7px;padding:3px 10px;font-size:12px;cursor:pointer;color:#334155;white-space:nowrap}
.acp-page-btn:hover:not(:disabled){background:#eaf2ff;border-color:#3478f6;color:#1d4ed8}
.acp-page-btn:disabled{opacity:.45;cursor:not-allowed}
.acp-page-latest{border:1px solid #9adbc8;background:#fff;color:#0f766e;border-radius:7px;padding:3px 8px;font-size:11.5px;cursor:pointer;white-space:nowrap}
.acp-page-latest:hover{background:#e6f8f1}
.acp-msg{display:flex;max-width:100%}
.acp-msg-user{justify-content:flex-end}
.acp-msg-ai{justify-content:flex-start}
.acp-bubble{max-width:88%;min-width:0;padding:8px 11px;border-radius:12px;font-size:13px;line-height:1.55;overflow-wrap:break-word;box-shadow:0 1px 2px rgba(31,49,78,.06)}
.acp-msg-user .acp-bubble{background:#3478f6;color:#fff;border-bottom-right-radius:3px}
.acp-msg-ai .acp-bubble{background:#fff;border:1px solid #e2e8f0;border-bottom-left-radius:3px;color:#1e293b}
.acp-msg-ai.streaming .acp-bubble{background:#fffbe6;border-color:#f3d97a}
.acp-raw{white-space:pre-wrap;font-family:ui-monospace,Consolas,monospace;font-size:12.5px;margin:0}
.acp-cursor{opacity:.5}
.acp-think{color:#94a3b8;font-style:italic;display:inline-flex;align-items:center;gap:4px;animation:acp-think-pulse 1.2s ease-in-out infinite}
@keyframes acp-think-pulse{0%,100%{opacity:.45}50%{opacity:1}}
.acp-mermaid{overflow-x:auto;margin:.4em 0}
/* mermaid v11 会在 <svg> 上写内联 style="max-width:<自然宽>px"，覆盖本规则；
   加 !important 强制按气泡宽度缩放，避免内存等宽示意图超出气泡被遮挡 */
.acp-mermaid svg{max-width:100% !important;height:auto;display:block;margin:0 auto}
.acp-bubble h1,.acp-bubble h2,.acp-bubble h3,.acp-bubble h4{font-size:14px;margin:.4em 0}
.acp-bubble p{margin:.35em 0}
.acp-bubble ul,.acp-bubble ol{margin:.35em 0;padding-left:1.4em}
.acp-bubble table{border-collapse:collapse;font-size:12px;margin:.4em 0}
.acp-bubble th,.acp-bubble td{border:1px solid #e2e8f0;padding:3px 7px}
.acp-bubble code{background:#eef2f7;border-radius:4px;padding:1px 4px;font-size:12px}
/* 代码块：浅色底 + 语法着色（轻量高亮 token 由 ai-chat-panel.js 生成） */
.acp-bubble pre{background:#f8fafc;color:#334155;border:1px solid #e2e8f0;border-radius:8px;padding:8px 10px;overflow-x:auto;margin:.4em 0}
.acp-bubble pre code{background:none;color:inherit;padding:0;font-family:ui-monospace,Consolas,monospace;font-size:12px;line-height:1.55;white-space:pre}
.acp-tok-c{color:#8494a7;font-style:italic}
.acp-tok-s{color:#16a34a}
.acp-tok-p{color:#7c3aed}
.acp-tok-k{color:#2563eb;font-weight:600}
.acp-tok-n{color:#d97706}
.acp-tok-f{color:#0f766e}
.acp-code-apply{position:relative}
.acp-apply-btn{margin:0 0 6px;padding:3px 9px;font-size:11.5px;border:1px solid #235fc7;border-radius:7px;background:linear-gradient(135deg,#3478f6,#235fc7);color:#fff;cursor:pointer;transition:box-shadow .15s,transform .15s,filter .15s}
.acp-apply-btn:hover{filter:brightness(1.1);box-shadow:0 0 0 2px rgba(52,120,246,.28);transform:translateY(-1px)}
/* ── 推荐追问：AI 回答末尾的可点击问题，点击即继续提问 ── */
.acp-suggests{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px;border-top:1px dashed #e2e8f0;padding-top:7px}
.acp-suggest-chip{border:1px solid #cfdbea;background:#f8fafc;color:#1e3a5f;border-radius:999px;padding:3px 10px;font-size:12px;cursor:pointer;text-align:left;line-height:1.45;transition:background .15s,border-color .15s,color .15s,transform .15s,box-shadow .15s}
.acp-suggest-chip:hover{background:#eaf2ff;border-color:#3478f6;color:#1d4ed8;transform:translateY(-1px);box-shadow:0 2px 6px rgba(52,120,246,.2)}
/* ── 技能执行结果：AI 指令操作编辑器后的回报行（成功绿/失败红，悬停 title 看详情）── */
.acp-skill-result{margin:8px 2px 2px;padding:5px 9px;font-size:12px;line-height:1.5;border-radius:7px;cursor:help;word-break:break-all}
.acp-skill-result.ok{background:#ecfdf5;border:1px solid #a7f3d0;color:#065f46}
.acp-skill-result.fail{background:#fef2f2;border:1px solid #fecaca;color:#991b1b}
.acp-input-row{display:flex;gap:6px;padding:9px;border-top:1px solid #e6ebf2;background:#fff;flex-shrink:0;align-items:flex-end}
.acp-input{flex:1;border:1px solid #cfdbea;border-radius:9px;padding:7px 9px;font-size:13px;resize:none;outline:none;font-family:inherit;min-height:36px;max-height:90px;box-sizing:border-box}
.acp-input:focus{border-color:#3478f6}
.acp-send{border:none;border-radius:9px;padding:8px 13px;font-size:13px;font-weight:700;background:linear-gradient(135deg,#3478f6,#235fc7);color:#fff;cursor:pointer}
.acp-send:disabled{opacity:.5;cursor:not-allowed}
.acp-stop{border:1px solid #c43d55;border-radius:9px;padding:8px 12px;font-size:13px;font-weight:700;background:#fff;color:#c43d55;cursor:pointer}
.acp-notice{margin:8px 10px 0;padding:7px 10px;border-radius:8px;font-size:12px;background:#fff7ed;border:1px solid #fcd9a4;color:#9a5b13;flex-shrink:0}
/* AI 问答按钮：顶栏内联按钮（右上角用户信息按钮左侧），不再浮动 */
#acp-toggle{border:1px solid #cfdbea;border-radius:8px;padding:5px 11px;font-size:12.5px;font-weight:700;cursor:pointer;background:#fff;color:#1e3a5f;white-space:nowrap;flex-shrink:0;line-height:1.35}
#acp-toggle:hover{background:#eaf2ff;border-color:#3478f6;color:#1d4ed8}
#acp-toggle[hidden]{display:none}
/* 窄屏（≤900px，与 backend-toolbar 文字隐藏断点一致）：AI 问答按钮只保留图标 */
@media(max-width:900px){#acp-toggle .acp-toggle-txt{display:none}}

/* ── 语音输入面板 + 底部录音按钮（v4.0 STT） ──
   顶部 ⚙🎤 仅是「设置入口」：点开 → 选麦克风 → 点 ✓ 确定 → 关掉；不参与录音流程
   底部 🎙️ 才是真正录音按钮：与「发送」并列；按下开始录音 → 再次按下/静音/60s 上限自动结束 → 转写填入输入框 */
/* v4.0.6 弹窗定位改为 position:fixed + JS 显式设置 top/left：⚙🎤 按钮的 getBoundingClientRect()
   原因：.acp-mic-panel 与 .acp-mic-set 是兄弟节点（不是父子），CSS 没法把弹窗锚到按钮下方——
   用 position:absolute 会锚到最近的 positioned 祖先（#ai-chat-panel），导致弹窗跑到面板左上角
   完全错位（用户看不到、以为按钮没响应）。fixed + JS 坐标是最稳的方案。
   AI 面板已改用 overflow-x:hidden，弹窗可溢出 AI 面板下边界不被裁切。视口右边界由 JS clamp。 */
.acp-mic-set{position:relative}  /* 保留作为 ⚙🎤 active 态视觉锚的 [aria-expanded="true"] 圆角参考 */
.acp-mic-panel{position:fixed;top:0;left:0;z-index:60;min-width:240px;max-width:min(320px,calc(100vw - 24px));padding:10px 12px;border:1px solid #cfdbea;border-radius:10px;background:#f8fafc;box-shadow:0 6px 20px rgba(31,49,78,.22);display:flex;flex-direction:column;gap:8px;white-space:nowrap}
/* 修复：display:flex 会覆盖 HTML [hidden] 默认的 display:none；显式覆盖保证面板能正常隐藏 */
.acp-mic-panel[hidden]{display:none !important}
.acp-mic-row{display:flex;align-items:center;gap:8px;min-width:0}
.acp-mic-label{font-size:11px;color:#64748b;font-weight:700;white-space:nowrap;flex-shrink:0}
.acp-mic-select{flex:1;min-width:0;max-width:200px;border:1px solid #cfdbea;border-radius:7px;padding:4px 7px;font-size:12px;background:#fff;color:#334155;outline:none;cursor:pointer;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}
.acp-mic-select:focus{border-color:#3478f6}
.acp-mic-confirm{border:none;border-radius:7px;padding:6px 12px;font-size:12px;font-weight:700;cursor:pointer;background:linear-gradient(135deg,#3478f6,#235fc7);color:#fff;line-height:1.35;transition:filter .15s ease;white-space:nowrap}
.acp-mic-confirm:hover{filter:brightness(1.08)}
.acp-mic-confirm:active{transform:scale(0.97)}
/* ⚙🎤 按钮在弹窗打开时的 active 态（toggle 视觉提示） */
.acp-mic-set[aria-expanded="true"]{background:#eaf2ff;border-color:#3478f6;color:#1d4ed8}

/* 顶部 ⚙🎤 按钮内的当前设备名（默认时显示「默认」）；窄屏可省略文字仅保留图标 */
.acp-mic-set .acp-mic-current{margin-left:3px;font-size:11px;font-weight:600;color:#475569;max-width:80px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;vertical-align:middle}
@media(max-width:900px){.acp-mic-set .acp-mic-current{display:none}}

/* 底部输入栏旁的录音按钮：与发送按钮同高，外观稍弱（不抢主操作）
   - 默认（🎙️）：白底 + 蓝边，与 #acp-send 视觉对等但更克制
   - 录音中（⏹ data-recording="1"）：红底白字 + 脉冲动画，提示用户「点击停止」 */
.acp-mic-rec{flex-shrink:0;border:1px solid #3478f6;border-radius:9px;padding:0 9px;height:36px;font-size:17px;line-height:1;background:#fff;color:#3478f6;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;min-width:36px;transition:all .15s ease}
.acp-mic-rec:hover{background:#eff6ff;border-color:#1d4ed8}
.acp-mic-rec:active{transform:scale(0.96)}
.acp-mic-rec[data-recording="1"]{background:linear-gradient(135deg,#dc2626,#b91c1c);color:#fff;border-color:#b91c1c;animation:acp-mic-pulse 1.2s ease-in-out infinite}
.acp-mic-rec[data-recording="1"]:hover{filter:brightness(1.08)}
.acp-mic-rec:disabled{opacity:.5;cursor:not-allowed}
@keyframes acp-mic-pulse{0%,100%{box-shadow:0 0 0 0 rgba(239,68,68,.4)}50%{box-shadow:0 0 0 6px rgba(239,68,68,0)}}
