Files
wecom_it_smart_desk/docs/01-产品文档/02-会话管理/原型-REQ-会话-001-工具栏统一设计v1.3-删除IntegrationZone坐席.archive.html
T

545 lines
22 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>工具栏统一设计 v1.3 - 删除 IntegrationZone 旧坐席按钮</title>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif;
background: linear-gradient(135deg, #e0e7ff 0%, #f3e8ff 50%, #fce7f3 100%);
color: #1a1a1a;
padding: 24px;
line-height: 1.5;
-webkit-font-smoothing: antialiased;
min-height: 100vh;
}
h1 { font-size: 22px; font-weight: 600; letter-spacing: -0.02em; margin-bottom: 8px; color: #1a1a1a; }
h2 { font-size: 17px; font-weight: 600; letter-spacing: -0.01em; margin: 32px 0 12px; color: #1a1a1a; }
h3 { font-size: 14px; font-weight: 600; margin: 12px 0 8px; color: #333; }
.meta { color: #6b7280; font-size: 12.5px; margin-bottom: 20px; }
/* === ChatPanel 整体 === */
.chatpanel-mock {
width: 100%;
max-width: 720px;
margin: 0 auto;
background: rgba(255, 255, 255, 0.85);
backdrop-filter: blur(20px) saturate(180%);
-webkit-backdrop-filter: blur(20px) saturate(180%);
border: 1px solid rgba(255, 255, 255, 0.9);
border-radius: 16px;
box-shadow: 0 8px 32px rgba(99, 102, 241, 0.1);
overflow: hidden;
position: relative;
}
.chatpanel-mock-header {
padding: 12px 16px;
border-bottom: 1px solid rgba(99, 102, 241, 0.1);
background: rgba(255, 255, 255, 0.5);
font-size: 13px;
color: #6b7280;
display: flex;
align-items: center;
gap: 8px;
}
.chatpanel-mock-header .dot { width: 8px; height: 8px; border-radius: 50%; background: #10b981; }
/* === 消息流区域 === */
.chatpanel-mock-messages {
min-height: 200px;
padding: 20px 16px;
background: linear-gradient(180deg, #fafbfc 0%, #f5f7fa 100%);
}
.mock-msg {
max-width: 70%;
padding: 8px 12px;
border-radius: 12px;
margin-bottom: 8px;
font-size: 13px;
line-height: 1.5;
}
.mock-msg.user {
margin-left: auto;
background: linear-gradient(135deg, #6366f1, #8b5cf6);
color: #fff;
}
.mock-msg.ai {
background: rgba(255, 255, 255, 0.8);
color: #1a1a1a;
border: 1px solid rgba(99, 102, 241, 0.1);
}
.mock-msg .meta { font-size: 10.5px; opacity: 0.7; margin-bottom: 2px; color: #6b7280; }
.mock-msg.user .meta { color: rgba(255, 255, 255, 0.7); }
/* === InputBar(消息发送框) === */
.inputbar-mock {
background: rgba(255, 255, 255, 0.7);
backdrop-filter: blur(20px) saturate(180%);
-webkit-backdrop-filter: blur(20px) saturate(180%);
border-top: 1px solid rgba(99, 102, 241, 0.15);
padding: 12px 16px 16px;
position: relative;
}
/* === 4 按钮工具栏(InputBar 内上方居中) === */
.glass-toolbar {
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
padding: 8px 16px;
margin: 0 auto 12px;
width: fit-content;
background: rgba(255, 255, 255, 0.55);
backdrop-filter: blur(28px) saturate(180%);
-webkit-backdrop-filter: blur(28px) saturate(180%);
border: 1px solid rgba(255, 255, 255, 0.7);
border-radius: 20px;
box-shadow:
0 1px 0 rgba(255, 255, 255, 0.9) inset,
0 -1px 0 rgba(99, 102, 241, 0.08) inset,
0 2px 4px rgba(99, 102, 241, 0.05),
0 8px 16px rgba(99, 102, 241, 0.08),
0 24px 48px rgba(99, 102, 241, 0.05);
position: relative;
}
.glass-toolbar::before {
content: "";
position: absolute;
inset: 0;
border-radius: 20px;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.6) 0%, rgba(255, 255, 255, 0.1) 40%, transparent 60%);
pointer-events: none;
}
.glass-toolbar::after {
content: "";
position: absolute;
inset: 0;
border-radius: 20px;
background: radial-gradient(circle at 20% 20%, rgba(99, 102, 241, 0.15) 0%, transparent 50%),
radial-gradient(circle at 80% 80%, rgba(236, 72, 153, 0.12) 0%, transparent 50%);
pointer-events: none;
z-index: 0;
}
/* === 4 按钮(40px 圆形玻璃) === */
.glass-btn {
width: 40px;
height: 40px;
border: 1px solid rgba(255, 255, 255, 0.6);
background: rgba(255, 255, 255, 0.55);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border-radius: 50%;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
-webkit-tap-highlight-color: transparent;
position: relative;
z-index: 2;
box-shadow:
0 1px 0 rgba(255, 255, 255, 0.9) inset,
0 -1px 0 rgba(0, 0, 0, 0.04) inset,
0 1px 2px rgba(0, 0, 0, 0.04),
0 2px 4px rgba(0, 0, 0, 0.04);
overflow: visible;
}
.glass-btn:hover {
background: rgba(255, 255, 255, 0.75);
transform: translateY(-1px) scale(1.06);
box-shadow:
0 1px 0 rgba(255, 255, 255, 1) inset,
0 -1px 0 rgba(0, 0, 0, 0.04) inset,
0 2px 4px rgba(0, 0, 0, 0.06),
0 8px 16px rgba(99, 102, 241, 0.15);
}
.glass-btn:active { transform: translateY(0) scale(0.95); }
.glass-btn svg { width: 22px; height: 22px; display: block; }
/* === 坐席按钮(图片头像 44px) === */
.agent-btn {
width: 44px;
height: 44px;
border-radius: 50%;
border: 2px solid transparent;
cursor: pointer;
position: relative;
z-index: 2;
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
-webkit-tap-highlight-color: transparent;
overflow: visible;
padding: 0;
background: linear-gradient(135deg, #6366f1 0%, #a855f7 50%, #ec4899 100%) padding-box;
}
.agent-btn::before {
content: "";
position: absolute;
inset: -2px;
border-radius: 50%;
background: linear-gradient(135deg, #6366f1 0%, #a855f7 50%, #ec4899 100%);
z-index: -1;
}
.agent-btn img {
width: 100%;
height: 100%;
border-radius: 50%;
object-fit: cover;
object-position: center 15%;
display: block;
}
.agent-btn:hover { transform: translateY(-1px) scale(1.05); }
/* === 状态徽标(头像右下角小圆点) === */
.agent-badge {
position: absolute;
bottom: 0;
right: 0;
width: 12px;
height: 12px;
border-radius: 50%;
border: 2px solid white;
z-index: 3;
box-shadow: 0 1px 2px rgba(0,0,0,0.2);
}
.agent-badge.is-online { background: #10b981; }
.agent-badge.is-urgent { background: #ef4444; }
.agent-badge.is-waiting { background: #f59e0b; }
.agent-badge.is-offline { background: #9ca3af; }
.agent-badge.is-end { background: #3b82f6; }
/* === InputBar 输入框 === */
.inputbar-mock-field {
width: 100%;
min-height: 60px;
background: rgba(255, 255, 255, 0.5);
border: 1px solid rgba(99, 102, 241, 0.12);
border-radius: 12px;
padding: 10px 14px;
font-size: 13px;
color: #9ca3af;
line-height: 1.6;
}
/* === 演示容器 === */
.demo-block {
background: rgba(255, 255, 255, 0.6);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border: 1px solid rgba(255, 255, 255, 0.7);
border-radius: 18px;
padding: 24px;
margin-bottom: 20px;
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.9) inset, 0 8px 16px rgba(99, 102, 241, 0.06);
}
.demo-label { font-size: 11.5px; color: #6b7280; text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 14px; font-weight: 500; }
.compare-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
}
.compare-panel {
background: rgba(255, 255, 255, 0.5);
border: 1px solid rgba(99, 102, 241, 0.15);
border-radius: 12px;
padding: 16px;
}
.compare-panel.before {
border-left: 4px solid #f59e0b;
}
.compare-panel.after {
border-left: 4px solid #10b981;
}
.compare-title { font-size: 13px; font-weight: 600; margin-bottom: 12px; }
.compare-panel.before .compare-title { color: #b45309; }
.compare-panel.after .compare-title { color: #047857; }
/* === 旧的 IntegrationZone 锁图标按钮(演示用) === */
.legacy-call-agent {
display: inline-flex;
align-items: center;
gap: 6px;
height: 32px;
padding: 6px 14px;
background: rgba(255, 255, 255, 0.7);
border: 1px solid #e5e7eb;
border-radius: 16px;
font-size: 13px;
color: #6b7280;
text-decoration: line-through;
opacity: 0.5;
}
.legacy-call-agent .icon { font-size: 14px; }
/* 红色删除线标注(演示用) */
.red-x {
color: #ef4444;
font-weight: 700;
font-size: 18px;
margin-left: 4px;
}
.note { background: rgba(254, 243, 199, 0.6); border-left: 3px solid #d97706; padding: 12px 16px; border-radius: 4px; font-size: 12.5px; color: #78350f; margin: 16px 0; backdrop-filter: blur(10px); }
.note-success { background: rgba(209, 250, 229, 0.6); border-left: 3px solid #10b981; padding: 12px 16px; border-radius: 4px; font-size: 12.5px; color: #064e3b; margin: 16px 0; backdrop-filter: blur(10px); }
.note-error { background: rgba(254, 226, 226, 0.6); border-left: 3px solid #ef4444; padding: 12px 16px; border-radius: 4px; font-size: 12.5px; color: #7f1d1d; margin: 16px 0; backdrop-filter: blur(10px); }
table { width: 100%; border-collapse: collapse; margin: 16px 0; font-size: 12.5px; }
thead tr { background: rgba(255, 255, 255, 0.6); }
th { border: 1px solid rgba(99, 102, 241, 0.15); padding: 8px; text-align: left; font-weight: 600; }
td { border: 1px solid rgba(99, 102, 241, 0.15); padding: 8px; }
</style>
</head>
<body>
<svg width="0" height="0" style="position: absolute;">
<defs>
<linearGradient id="g-emoji" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" stop-color="#fde68a"/><stop offset="60%" stop-color="#fbbf24"/><stop offset="100%" stop-color="#d97706"/>
</linearGradient>
<radialGradient id="g-emoji-blush" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="rgba(244, 63, 94, 0.4)"/>
<stop offset="100%" stop-color="rgba(244, 63, 94, 0)"/>
</radialGradient>
<linearGradient id="g-highlight" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="white" stop-opacity="0.7"/>
<stop offset="100%" stop-color="white" stop-opacity="0"/>
</linearGradient>
<linearGradient id="g-doc-body" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#ffffff"/><stop offset="100%" stop-color="#dbeafe"/>
</linearGradient>
<linearGradient id="g-doc-fold" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#c7d2fe"/><stop offset="100%" stop-color="#6366f1"/>
</linearGradient>
<linearGradient id="g-doc-text" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#6366f1"/><stop offset="100%" stop-color="#a855f7"/>
</linearGradient>
<linearGradient id="g-mic-body" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="#c4b5fd"/><stop offset="50%" stop-color="#8b5cf6"/><stop offset="100%" stop-color="#6d28d9"/>
</linearGradient>
<linearGradient id="g-mic-shine" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="white" stop-opacity="0.65"/><stop offset="100%" stop-color="white" stop-opacity="0"/>
</linearGradient>
</defs>
</svg>
<h1>工具栏统一设计 v1.3 — 删除 IntegrationZone 旧"人工坐席"按钮</h1>
<p class="meta">v1.2 基础 + 删除 IntegrationZone.vue 中的锁图标按钮 · InputBar 工具栏 4 按钮保持(emoji / 文件 / 语音 / 坐席头像),位置保持 InputBar 内上方居中 · 2026-08-04</p>
<div class="note-error">
⚠️ <strong>v1.2 → v1.3 我之前的错误理解</strong>(用户截图澄清):<br>
• 我误把"删除坐席按钮"理解为删除 InputBar 工具栏里的头像按钮,导致 v1.3 砍到 3 按钮 + 错移到底部<br>
• 用户的真实意图(截图标注"去掉"指向锁图标按钮):<br>
&nbsp;&nbsp;- ❌ 删除 <strong>IntegrationZone.vue 中的"人工坐席"按钮(带锁图标 🔒)</strong><br>
&nbsp;&nbsp;- ✅ 保留 InputBar 工具栏 <strong>4 按钮</strong>emoji / 文件 / 语音 / 坐席头像)<br>
&nbsp;&nbsp;- ✅ 位置保持 <strong>InputBar 内上方居中</strong>v1.2 位置不动)
</div>
<div class="note-success">
<strong>v1.3 正确做法</strong>(修正后):<br>
• 仅改 <strong>IntegrationZone.vue</strong>:删除坐席按钮 + 周边相关样式/计算<br>
<strong>InputBar.vue 不动</strong>(v1.2 的 4 按钮工具栏已经在 InputBar 内上方居中,符合期望)<br>
• helper 文件(inputBarCallAgentState.ts / integrationZoneLogic.ts<strong>保留不动</strong>(仍可能被未来其他场景调用)
</div>
<h2>🎯 v1.3 目标对比(Before / After</h2>
<div class="demo-block">
<div class="compare-grid">
<!-- BEFORE: v1.2 当前状态 -->
<div class="compare-panel before">
<div class="compare-title">v1.2(当前线上状态)</div>
<div style="text-align: center; padding: 12px; background: rgba(254, 243, 199, 0.4); border-radius: 10px;">
<!-- 旧 IntegrationZone 坐席按钮(带锁图标) -->
<div style="margin-bottom: 14px;">
<span class="legacy-call-agent"><span class="icon">🔒</span> 人工坐席</span>
<span class="red-x"></span>
</div>
<!-- InputBar 4 按钮工具栏(保留) -->
<div class="glass-toolbar" style="margin-bottom: 8px;">
<button class="glass-btn" title="表情">
<svg viewBox="0 0 24 24" fill="none">
<circle cx="12" cy="12" r="9" fill="url(#g-emoji)"/>
<ellipse cx="12" cy="6" rx="6" ry="2.5" fill="url(#g-highlight)"/>
<ellipse cx="6.5" cy="14" rx="1.5" ry="1" fill="url(#g-emoji-blush)"/>
<ellipse cx="17.5" cy="14" rx="1.5" ry="1" fill="url(#g-emoji-blush)"/>
<ellipse cx="8.5" cy="11" rx="1.4" ry="1.6" fill="#1e1b4b"/>
<ellipse cx="15.5" cy="11" rx="1.4" ry="1.6" fill="#1e1b4b"/>
<circle cx="8.9" cy="10.4" r="0.5" fill="white"/>
<circle cx="15.9" cy="10.4" r="0.5" fill="white"/>
<path d="M8 15 Q12 18 16 15" fill="none" stroke="#1e1b4b" stroke-width="1.6" stroke-linecap="round"/>
</svg>
</button>
<button class="glass-btn" title="文件">
<svg viewBox="0 0 24 24" fill="none">
<path d="M4 2 L14 2 L20 8 L20 20 L4 20 Z" fill="url(#g-doc-body)" stroke="#818cf8" stroke-width="0.8"/>
<path d="M14 2 L14 8 L20 8" fill="url(#g-doc-fold)" stroke="#818cf8" stroke-width="0.8"/>
<rect x="7" y="11.5" width="10" height="0.8" rx="0.4" fill="url(#g-doc-text)"/>
</svg>
</button>
<button class="glass-btn" title="语音输入">
<svg viewBox="0 0 24 24" fill="none">
<rect x="8" y="2" width="8" height="13" rx="4" fill="url(#g-mic-body)"/>
<path d="M3 12 Q3 18 12 18 Q21 18 21 12" fill="none" stroke="url(#g-mic-body)" stroke-width="2"/>
<line x1="12" y1="18" x2="12" y2="22" stroke="url(#g-mic-body)" stroke-width="2"/>
</svg>
</button>
<button class="agent-btn" title="客服在线">
<img src="./agent-avatar-v0.8.jpg" alt="客服"/>
<span class="agent-badge is-online"></span>
</button>
</div>
<div class="inputbar-mock-field" style="min-height: 36px; padding: 6px 12px; font-size: 12px;">请输入消息...</div>
</div>
<div style="font-size: 12px; color: #92400e; margin-top: 8px;">
⚠️ <strong>问题</strong>: IntegrationZone 旧"人工坐席"按钮 + InputBar 工具栏头像按钮 = 两个坐席入口并存,用户感知重复
</div>
</div>
<!-- AFTER: v1.3 目标 -->
<div class="compare-panel after">
<div class="compare-title">v1.3(目标状态)</div>
<div style="text-align: center; padding: 12px; background: rgba(209, 250, 229, 0.4); border-radius: 10px;">
<!-- IntegrationZone 区域:坐席按钮已删除 -->
<div style="margin-bottom: 14px; height: 32px; display: flex; align-items: center; justify-content: center; color: #9ca3af; font-size: 11.5px;">
<span style="opacity: 0.5;">IntegrationZone 坐席按钮已删除)</span>
</div>
<!-- InputBar 4 按钮工具栏(保留) -->
<div class="glass-toolbar" style="margin-bottom: 8px;">
<button class="glass-btn" title="表情">
<svg viewBox="0 0 24 24" fill="none">
<circle cx="12" cy="12" r="9" fill="url(#g-emoji)"/>
<ellipse cx="12" cy="6" rx="6" ry="2.5" fill="url(#g-highlight)"/>
<ellipse cx="6.5" cy="14" rx="1.5" ry="1" fill="url(#g-emoji-blush)"/>
<ellipse cx="17.5" cy="14" rx="1.5" ry="1" fill="url(#g-emoji-blush)"/>
<ellipse cx="8.5" cy="11" rx="1.4" ry="1.6" fill="#1e1b4b"/>
<ellipse cx="15.5" cy="11" rx="1.4" ry="1.6" fill="#1e1b4b"/>
<circle cx="8.9" cy="10.4" r="0.5" fill="white"/>
<circle cx="15.9" cy="10.4" r="0.5" fill="white"/>
<path d="M8 15 Q12 18 16 15" fill="none" stroke="#1e1b4b" stroke-width="1.6" stroke-linecap="round"/>
</svg>
</button>
<button class="glass-btn" title="文件">
<svg viewBox="0 0 24 24" fill="none">
<path d="M4 2 L14 2 L20 8 L20 20 L4 20 Z" fill="url(#g-doc-body)" stroke="#818cf8" stroke-width="0.8"/>
<path d="M14 2 L14 8 L20 8" fill="url(#g-doc-fold)" stroke="#818cf8" stroke-width="0.8"/>
<rect x="7" y="11.5" width="10" height="0.8" rx="0.4" fill="url(#g-doc-text)"/>
</svg>
</button>
<button class="glass-btn" title="语音输入">
<svg viewBox="0 0 24 24" fill="none">
<rect x="8" y="2" width="8" height="13" rx="4" fill="url(#g-mic-body)"/>
<path d="M3 12 Q3 18 12 18 Q21 18 21 12" fill="none" stroke="url(#g-mic-body)" stroke-width="2"/>
<line x1="12" y1="18" x2="12" y2="22" stroke="url(#g-mic-body)" stroke-width="2"/>
</svg>
</button>
<button class="agent-btn" title="客服在线">
<img src="./agent-avatar-v0.8.jpg" alt="客服"/>
<span class="agent-badge is-online"></span>
</button>
</div>
<div class="inputbar-mock-field" style="min-height: 36px; padding: 6px 12px; font-size: 12px;">请输入消息...</div>
</div>
<div style="font-size: 12px; color: #065f46; margin-top: 8px;">
<strong>效果</strong>: 仅 InputBar 工具栏头像按钮作为坐席入口,IntegrationZone 锁图标按钮消失,避免视觉冗余
</div>
</div>
</div>
</div>
<h2>📊 v1.2 vs v1.3 改动对比</h2>
<table>
<thead>
<tr>
<th>维度</th>
<th>v1.2(当前)</th>
<th><strong>v1.3(目标)</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>IntegrationZone 坐席按钮</strong></td>
<td>🔒 显示在 InputBar 上方(带锁图标)</td>
<td><strong>❌ 完全删除</strong></td>
</tr>
<tr>
<td><strong>InputBar 工具栏按钮数</strong></td>
<td>4emoji / 文件 / 语音 / 坐席头像)</td>
<td><strong>4 不变</strong>emoji / 文件 / 语音 / 坐席头像)</td>
</tr>
<tr>
<td><strong>工具栏位置</strong></td>
<td>InputBar 内上方居中</td>
<td><strong>InputBar 内上方居中(不变)</strong></td>
</tr>
<tr>
<td><strong>坐席入口数量</strong></td>
<td>2 个(IntegrationZone + InputBar 工具栏)</td>
<td><strong>1 个(仅 InputBar 工具栏头像)</strong></td>
</tr>
<tr>
<td>代码改动范围</td>
<td></td>
<td><strong>仅 IntegrationZone.vue</strong>InputBar.vue 不动)</td>
</tr>
<tr>
<td>helper 文件(inputBarCallAgentState.ts / integrationZoneLogic.ts</td>
<td>存在</td>
<td><strong>保留不动</strong>(仍可能被未来调用)</td>
</tr>
</tbody>
</table>
<h2>🛠️ 需要修改的文件清单</h2>
<table>
<thead>
<tr>
<th>文件</th>
<th>改动</th>
<th>影响</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>src/frontend-h5/src/components/chat/IntegrationZone.vue</code></td>
<td><strong>删除</strong> 坐席按钮的 template 段、script 段、style 段</td>
<td>仅本文件,局部删除</td>
</tr>
<tr>
<td><code>src/frontend-h5/src/components/chat/InputBar.vue</code></td>
<td><strong>不动</strong>v1.2 已经正确)</td>
<td></td>
</tr>
<tr>
<td><code>src/frontend-h5/src/components/chat/inputBarCallAgentState.ts</code></td>
<td><strong>不动</strong>helper 保留)</td>
<td></td>
</tr>
<tr>
<td><code>src/frontend-h5/src/components/chat/integrationZoneLogic.ts</code></td>
<td><strong>不动</strong>helper 保留)</td>
<td></td>
</tr>
<tr>
<td><code>src/frontend-h5/src/components/chat/IntegrationZone.test.ts</code></td>
<td>删除坐席按钮相关测试用例(如有)</td>
<td>测试同步更新</td>
</tr>
</tbody>
</table>
<h2>⚠️ 注意事项</h2>
<ol style="margin-left: 20px; line-height: 1.8; font-size: 13px;">
<li><strong>坐席 store action 仍可用</strong><code>store.shakeAgent()</code> 等方法不会被删除,InputBar 工具栏头像按钮仍调用它们</li>
<li><strong>整合区其他元素保留</strong>:状态条、引导语等其他整合区元素(如有)保持不变,只删除坐席按钮</li>
<li><strong>helper 函数保留</strong><code>computeCallAgentState</code> / <code>computeIntegrationBtnClass</code> / <code>computeCallAction</code> 等函数仍导出,可被未来其他场景复用</li>
<li><strong>已回滚到 v1.2</strong>v1.3 错误实现已通过 jumpserver-V2 紧急回滚到 v1.2,本任务在 v1.2 基础上修改 IntegrationZone.vue</li>
</ol>
<p style="margin-top: 32px; padding-top: 16px; border-top: 1px solid rgba(99, 102, 241, 0.15); color: #6b7280; font-size: 11.5px;">
v1.3 删除 IntegrationZone 旧坐席按钮 · 2026-08-04 · Duckula 主理人 · 等待用户拍板进入开发
</p>
</body>
</html>