Files
wecom_it_smart_desk/docs/01-产品文档/02-会话管理/原型-REQ-会话-001-工具栏统一设计v1.5-宝石嵌入式工具栏.archive.html
T

496 lines
22 KiB
HTML
Raw Normal View History

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>工具栏统一设计 v1.5 - 宝石嵌入式工具栏</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; }
/* === 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;
}
/* === 普通工具栏(Before:扁平胶囊,5 按钮居中) === */
.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 2px 4px rgba(99, 102, 241, 0.05),
0 8px 16px rgba(99, 102, 241, 0.08);
position: relative;
}
.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 2px rgba(0,0,0,0.04), 0 2px 4px rgba(0,0,0,0.04);
}
.glass-btn:hover { background: rgba(255,255,255,0.75); transform: translateY(-1px) scale(1.06); }
.glass-btn:active { transform: translateY(0) scale(0.95); }
.glass-btn svg { width: 22px; height: 22px; display: block; }
/* === 坐席按钮(普通,Before 用) === */
.agent-btn {
width: 44px;
height: 44px;
border-radius: 50%;
border: 2px solid transparent;
cursor: pointer;
position: relative;
z-index: 2;
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-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; }
/* === 宝石嵌入式工具栏(After / v1.5 === */
/* 容器:高度留出隆起 + 宝石探出的空间 */
.gem-toolbar {
position: relative;
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
width: fit-content;
height: 84px;
margin: 0 auto 12px;
}
/* 镜片/花瓣形轨道背景(SVG,两端窄、中间隆起) */
.gem-toolbar-bg {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
z-index: 0;
pointer-events: none;
overflow: visible;
filter: drop-shadow(0 6px 16px rgba(99, 102, 241, 0.28));
}
/* 工具栏内按钮行(5 个,坐席为第 3 个居中) */
.gem-row { position: relative; z-index: 2; display: flex; align-items: center; justify-content: center; gap: 12px; }
/* 坐席按钮 = 宝石,第 3 位,向上探出轨道形成镶嵌感 */
.gem-toolbar .agent-btn.gem {
width: 46px;
height: 46px;
transform: translateY(-18px);
z-index: 3;
box-shadow:
0 0 0 3px rgba(255, 255, 255, 0.6),
0 0 0 5px rgba(168, 85, 247, 0.35),
0 6px 14px rgba(99, 102, 241, 0.4),
0 2px 6px rgba(99, 102, 241, 0.25);
}
/* 宝石高光(左上斜向反光,模拟切面) */
.gem-toolbar .agent-btn.gem::after {
content: "";
position: absolute;
inset: 0;
border-radius: 50%;
background: linear-gradient(135deg, rgba(255,255,255,0.55) 0%, rgba(255,255,255,0.05) 38%, transparent 55%);
pointer-events: none;
}
.gem-toolbar .glass-btn { z-index: 2; }
/* === 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);
}
.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; }
.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-info { background: rgba(219, 234, 254, 0.6); border-left: 3px solid #3b82f6; padding: 12px 16px; border-radius: 4px; font-size: 12.5px; color: #1e3a8a; 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-group" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#a5b4fc"/><stop offset="100%" stop-color="#c4b5fd"/>
</linearGradient>
<linearGradient id="g-group-strong" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#6366f1"/><stop offset="50%" stop-color="#a855f7"/><stop offset="100%" stop-color="#ec4899"/>
</linearGradient>
<!-- 宝石轨道渐变 -->
<linearGradient id="g-rail" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#818cf8" stop-opacity="0.55"/>
<stop offset="50%" stop-color="#c4b5fd" stop-opacity="0.95"/>
<stop offset="100%" stop-color="#818cf8" stop-opacity="0.55"/>
</linearGradient>
<linearGradient id="g-rail-gloss" x1="50%" y1="0%" x2="50%" y2="100%">
<stop offset="0%" stop-color="white" stop-opacity="0.85"/>
<stop offset="45%" stop-color="white" stop-opacity="0.15"/>
<stop offset="100%" stop-color="white" stop-opacity="0"/>
</linearGradient>
<radialGradient id="g-gem-cradle" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="rgba(99,102,241,0.35)"/>
<stop offset="100%" stop-color="rgba(99,102,241,0)"/>
</radialGradient>
</defs>
</svg>
<h1>工具栏统一设计 v1.5 — 宝石嵌入式工具栏</h1>
<p class="meta">v1.4 基础(5 按钮、坐席居中)+ 工具栏重构为「两端窄、中间隆起」的镜片轨道,人工坐席头像像宝石一样镶嵌于隆起处 · 2026-08-05</p>
<div class="note-info">
💎 <strong>v1.5 改动说明(基于 v1.4</strong><br>
<strong>工具栏形态重构</strong>:由扁平胶囊改为「镜片/花瓣形轨道」——两端上下窄,向中间平滑隆起<br>
<strong>人工坐席 = 宝石</strong>:头像按钮(46px)嵌在轨道中央隆起处,上半部微微探出轨道边缘,像镶在托座里的宝石(带白色内环 + 紫色光晕 + 左上切面高光)<br>
<strong>4 个工具按钮</strong>emoji / 文件 / 语音 / 群聊)分布在隆起两侧的纤细轨道上,左右对称<br>
• 按钮数仍为 <strong>5</strong>emoji / 文件 / <strong>坐席(宝石·居中)</strong> / 语音 / 群聊),仅形态与视觉权重变化<br>
• IntegrationZone.vue 仍保持 v1.3 已删除坐席按钮的状态
</div>
<h2>🎯 v1.5 目标对比(Before / After</h2>
<div class="demo-block">
<div class="compare-grid">
<!-- BEFORE: v1.4 扁平胶囊 -->
<div class="compare-panel before">
<div class="compare-title">v1.4(上一版:扁平胶囊,居中)</div>
<div style="text-align: center; padding: 12px; background: rgba(254, 243, 199, 0.4); border-radius: 10px;">
<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="agent-btn" title="客服在线">
<img src="./agent-avatar-v0.8.jpg" alt="客服"/>
<span class="agent-badge is-online"></span>
</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="glass-btn" title="群聊">
<svg viewBox="0 0 24 24" fill="none">
<circle cx="8" cy="9" r="2.2" fill="url(#g-group)"/>
<path d="M5 16 Q5 13 8 13 Q11 13 11 16 Z" fill="url(#g-group)"/>
<circle cx="16" cy="9" r="2.2" fill="url(#g-group)"/>
<path d="M13 16 Q13 13 16 13 Q19 13 19 16 Z" fill="url(#g-group)"/>
<circle cx="12" cy="10.5" r="2.8" fill="url(#g-group-strong)"/>
<path d="M8.5 18.5 Q8.5 14 12 14 Q15.5 14 15.5 18.5 Z" fill="url(#g-group-strong)"/>
</svg>
</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>: 均匀扁平胶囊,坐席仅为其中一枚普通按钮,缺乏视觉焦点
</div>
</div>
<!-- AFTER: v1.5 宝石嵌入 -->
<div class="compare-panel after">
<div class="compare-title">v1.5(目标:宝石嵌入式)</div>
<div style="text-align: center; padding: 12px; background: rgba(209, 250, 229, 0.4); border-radius: 10px;">
<!-- 宝石嵌入式工具栏 -->
<div class="gem-toolbar">
<svg class="gem-toolbar-bg" viewBox="0 0 242 84" preserveAspectRatio="xMidYMid meet">
<!-- 隆起处的宝石托座光晕 -->
<ellipse cx="121" cy="42" rx="40" ry="34" fill="url(#g-gem-cradle)"/>
<!-- 镜片/花瓣形轨道主体 -->
<path d="M 18 30
C 55 30, 95 14, 121 14
C 147 14, 187 30, 224 30
L 224 54
C 187 54, 147 70, 121 70
C 95 70, 55 54, 18 54 Z"
fill="url(#g-rail)" stroke="rgba(255,255,255,0.85)" stroke-width="1.2"/>
<!-- 轨道顶部高光(玻璃质感) -->
<path d="M 18 30
C 55 30, 95 14, 121 14
C 147 14, 187 30, 224 30"
fill="none" stroke="url(#g-rail-gloss)" stroke-width="3" stroke-linecap="round"/>
</svg>
<div class="gem-row">
<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="agent-btn gem" title="客服在线">
<img src="./agent-avatar-v0.8.jpg" alt="客服"/>
<span class="agent-badge is-online"></span>
</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="glass-btn" title="群聊">
<svg viewBox="0 0 24 24" fill="none">
<circle cx="8" cy="9" r="2.2" fill="url(#g-group)"/>
<path d="M5 16 Q5 13 8 13 Q11 13 11 16 Z" fill="url(#g-group)"/>
<circle cx="16" cy="9" r="2.2" fill="url(#g-group)"/>
<path d="M13 16 Q13 13 16 13 Q19 13 19 16 Z" fill="url(#g-group)"/>
<circle cx="12" cy="10.5" r="2.8" fill="url(#g-group-strong)"/>
<path d="M8.5 18.5 Q8.5 14 12 14 Q15.5 14 15.5 18.5 Z" fill="url(#g-group-strong)"/>
</svg>
</button>
</div>
</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>: 纤细轨道两端窄、中央隆起托住宝石坐席,形成明确视觉焦点,工具按钮对称分布两侧
</div>
</div>
</div>
</div>
<h2>📊 v1.4 vs v1.5 改动对比</h2>
<table>
<thead>
<tr>
<th>维度</th>
<th>v1.4(扁平胶囊)</th>
<th><strong>v1.5(宝石嵌入式)</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>工具栏形态</strong></td>
<td>均匀扁平胶囊(border-radius 20px</td>
<td><strong>镜片/花瓣形轨道:两端上下窄,中央平滑隆起</strong></td>
</tr>
<tr>
<td><strong>人工坐席按钮</strong></td>
<td>普通头像按钮,居中但平铺</td>
<td><strong>宝石:嵌于中央隆起,上半探出轨道,带白环+紫晕+切面高光</strong></td>
</tr>
<tr>
<td><strong>工具按钮位置</strong></td>
<td>均匀分布在胶囊内</td>
<td><strong>对称分布在隆起两侧的纤细轨道上</strong></td>
</tr>
<tr>
<td><strong>视觉焦点</strong></td>
<td>弱(5 按钮等权)</td>
<td><strong>强(坐席=宝石,天然视觉中心)</strong></td>
</tr>
<tr>
<td><strong>按钮数</strong></td>
<td>5</td>
<td><strong>5 不变</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/InputBar.vue</code></td>
<td><strong></strong>:工具栏容器改为镜片轨道(SVG 背景 + flex 行);坐席按钮加 .gem 样式(translateY 镶嵌 + 白环/紫晕/高光);工具按钮改为对称分布</td>
<td>本文件工具栏局部重构</td>
</tr>
<tr>
<td><code>src/frontend-h5/src/components/chat/IntegrationZone.vue</code></td>
<td><strong>不动</strong>v1.3 已删除坐席按钮)</td>
<td></td>
</tr>
<tr>
<td><code>inputBarCallAgentState.ts</code> / <code>integrationZoneLogic.ts</code></td>
<td><strong>不动</strong>helper 保留)</td>
<td></td>
</tr>
<tr>
<td><code>InputBar.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>轨道弧度</strong>:当前为平滑镜片曲线;若想要更「尖」的叶子形或更「圆」的胶囊,可调 SVG path 控制点</li>
<li><strong>宝石探出量</strong>:坐席按钮 <code>translateY(-18px)</code> 控制探出高度,可调大/调小</li>
<li><strong>宝石光晕</strong>:白环(3px)+紫晕(5px)+外发光,若觉得过重可减小或去掉紫晕</li>
<li><strong>工具按钮在纤细轨道上的溢出</strong>:两端轨道高约 24px、按钮 40px,按钮会略探出轨道上下边缘——这是「图标浮于细轨」的预期效果;如想完全收进轨道,可加高两端或缩小按钮</li>
<li><strong>头像占位图</strong><code>./agent-avatar-v0.8.jpg</code> 为占位路径,实际集成时替换</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.5 宝石嵌入式工具栏 · 2026-08-05 · Duckula 主理人 · 等待用户拍板进入开发
</p>
</body>
</html>