标注能力(P0):设计与实施计划
状态:P0.1 / P0.2 / P0.3 已实现并发布(见下方「实施结果」)。起因:盘点图表覆盖度时发现,「目标线 / 阈值线 / 异常点 / 目标区间」 这类标注在业务里出现频率极高(预算线、SLA 阈值、告警线、目标区间),而本库完全没有 —— 它比「再多一种图表类型」更能解决实际诉求:一条目标线能顶掉很多"想要新图表"的需求。
1. 定位与边界
- 不引入新的系列类型。标注是坐标系上的图层:数据来自 option、几何来 自坐标轴的比例尺,
与系列数据无关,因此不该混进
series里(否则图例、堆叠、数据索引都会被它污染)。 - 与已有的三个组件同族:
GridLines(网格线)、Crosshair(准星)、Highlight(高亮)—— 标注是它们的"用户可配置版本"。 - 明确不做:地图 / 地理。重(地理数据 + 投影 + 交互),生态里有专业方案,需要的应用可通过 自定义系列注册口自行接入。这条应写进定位文档,避免每次都被问一遍。
2. 接口草案(option 形态)
annotation: {
// 标注线:水平/垂直线,可按数值或类目定位
lines: [
{ axis: 'y', value: 3000, text: '目标 3000', color: '#f59e0b', dashed: true, textPosition: 'end' },
{ axis: 'x', value: '18', text: '上线' },
],
// 标注点:在坐标系里定位一个点(异常点 / 事件点)
points: [{ x: '18', y: 2100, text: '异常点', color: '#ef4444', symbol: 'circle' }],
// 标注区间:沿某轴的一段(达标区 / 维护窗口)
areas: [{ axis: 'y', from: 0, to: 1000, color: 'rgba(16,185,129,0.08)', text: '达标区' }],
}
约束:
- 纯数据、可序列化(与快照 / DSL 一致;不出现函数,
text由调用方给字符串)。 - 定位走现有比例尺:数值轴按值、类目轴按类目名或下标、时间轴按时间戳/日期串。
- 越界的标注不画(不裁剪成半条线),并在诊断里给出提示 —— 与现有
validate*系列的结构化诊断同款。 - 图层位置:在系列之上、工具层之下(标注要被系列遮住还是压住?→ 压住 ✓ 因为它是"说明")。
3. 渲染与像素纪律
- 复用
GridLines的绘制入口与Axis的比例尺,不新造坐标系。 - 文字与线段都要进
stylePaintPad口径的落墨盒(__localBox/__paintWorldBox), 否则会重演「墨迹超出盒子 → 脏矩形/离屏缓存切掉半截」那类问题(引擎文档里有专门的铁律)。 - 标注随缩 放 / 平移 / 联动一起动:它读比例尺,不读像素,因此天然跟随(与
GridLines一致)。
4. 交互
- 默认不参与命中(点标注不应抢走下面的数据点);
tooltip里以独立行显示当前标注值(可选,后续)。 - 悬停高亮不作用于标注(避免与系列高亮混淆)。
5. 验收(照本仓既有惯例)
- 单测:三类标注的定位(数值轴 / 类目轴 / 时间轴)、越界不画、序列化往返(存盘 → 载入 → 再出图一致)。
- 真浏览器:新增示例页(一条目标线 + 一个异常点 + 一段达标区),截图人工复核;
并接入现有的示例页冒烟(
e2e/examples-smoke.spec.ts,判据是"内容像素占比")。 - 门禁:
lint / types:check / build / 单测 / e2e全绿(verify:full)。 - 像素:与「无标注」的同一张图对照,除标注覆盖区域外不得有差异(这条能挡住"画标注时把别的图层带歪")。
6. 分期
| 期 |
|---|