feat(chart): emit zoom completion payload

This commit is contained in:
李启源
2026-07-21 12:09:00 +08:00
parent e5ce7375cb
commit 32e8cf5856
14 changed files with 461 additions and 21 deletions

View File

@@ -26,17 +26,20 @@
标注布局硬编码使用 `placement: 'top'`移除了智能placement选择逻辑。当标注靠近顶部边界时标签可能渲染到SVG视口外用户看不见。
**失败场景**:
```
顶部边界附近的标注y=0.95)→ placement='top' 无边界检查
→ box.y 变为负值 → 标签渲染到 SVG 视口上方,用户看不见
```
**修复方案**:
1. 添加 `isPlacementWithinBounds()` 函数检查placement是否在边界内
2. 添加 `chooseBestPlacement()` 函数尝试所有8个placement选项选择第一个完全在边界内的
3. 更新 `layoutAnnotations()` 仅在没有手动偏移时使用智能placement选择
**代码变更**:
- 新增 `isPlacementWithinBounds()` 函数
- 新增 `chooseBestPlacement()` 函数
- 修改 `layoutAnnotations()` 使用智能placement
@@ -51,6 +54,7 @@
**问题描述**:
`findAnnotationSeriesCandidates()` 计算了插值点和最近采样点,但使用插值点计算距离(用于选择系列),却返回最近采样点作为锚点。这导致:
1. 连续数据丢失精度 - 标注跳到最近采样点而非用户点击位置
2. 距离计算与锚点不匹配
@@ -158,11 +162,13 @@
## 验证结果
### 类型检查
```bash
✅ pnpm typecheck - 通过
```
### 单元测试
```bash
✅ pnpm test
Test Files 12 passed (12)
@@ -170,11 +176,13 @@
```
### 代码规范
```bash
✅ pnpm lint - 无警告
```
### 测试更新
- `markup.test.ts`: 3个测试更新插值点期望
- `WaveformChart.test.ts`: 2个测试更新智能placement期望
@@ -183,12 +191,14 @@
## 影响分析
### 功能影响
1. **标注精度提升** - 使用插值点提供更精确的标注定位
2. **布局智能化** - 自动选择最佳placement避免标签超出边界
3. **拖动体验改进** - 修复视觉跳动和伪造的移动事件
4. **边缘情况处理** - 修复隐藏轨道和竞态条件
### 兼容性
- **破坏性变更**: 标注现在使用插值点而非最近采样点
- **迁移**: 现有标注数据无需修改,只影响新创建的标注
- **行为**: 用户会注意到标注更精确地出现在点击位置
@@ -198,6 +208,7 @@
## 总结
本次代码审查共发现10个问题均已修复并通过测试验证。修复主要集中在
- **正确性**: 边界检查、插值一致性、状态管理
- **用户体验**: 智能placement、精确标注定位、消除视觉跳动
- **健壮性**: 边缘情况处理、竞态条件修复