@363045841yyt/klinechart 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import { KLineData } from '../types/price';
2
- import { VisibleRange } from './layout/pane';
2
+ import { VisibleRange, UpdateLevel } from './layout/pane';
3
3
  import { InteractionController } from './controller/interaction';
4
4
  import { PaneRenderer } from './paneRenderer';
5
5
  import { MarkerManager, CustomMarkerEntity } from './marker/registry';
@@ -40,7 +40,8 @@ export type PaneSpec = {
40
40
  capabilities?: Partial<PaneCapabilities>;
41
41
  };
42
42
  export type PaneRendererDom = {
43
- plotCanvas: HTMLCanvasElement;
43
+ mainCanvas: HTMLCanvasElement;
44
+ overlayCanvas: HTMLCanvasElement;
44
45
  yAxisCanvas: HTMLCanvasElement;
45
46
  };
46
47
  export type ChartOptions = {
@@ -91,6 +92,7 @@ export declare class Chart {
91
92
  private opt;
92
93
  private data;
93
94
  private raf;
95
+ private pendingUpdateLevel;
94
96
  private viewport;
95
97
  private paneRenderers;
96
98
  private markerManager;
@@ -153,8 +155,11 @@ export declare class Chart {
153
155
  getAllRenderers(): RendererPlugin[];
154
156
  /** 更新用户设置(触发重绘) */
155
157
  updateSettings(settings: Record<string, boolean>): void;
156
- /** 绘制一帧 */
157
- draw(): void;
158
+ /**
159
+ * 绘制一帧
160
+ * @param level 更新级别,决定渲染哪些层
161
+ */
162
+ draw(level?: UpdateLevel): void;
158
163
  /**
159
164
  * 应用渲染状态(由 Vue/Store 层在状态更新后调用)
160
165
  * Chart 不拥有业务 SSOT,只负责接收参数并渲染
@@ -280,8 +285,11 @@ export declare class Chart {
280
285
  getContentWidth(): number;
281
286
  /** 容器尺寸变化时调用 */
282
287
  resize(): void;
283
- /** 请求下一帧重绘(RAF 合并) */
284
- scheduleDraw(): void;
288
+ /**
289
+ * 请求下一帧重绘(RAF 合并,支持分层更新)
290
+ * @param level 更新级别,默认为 All
291
+ */
292
+ scheduleDraw(level?: UpdateLevel): void;
285
293
  /** 销毁图表实例 */
286
294
  destroy(): Promise<void>;
287
295
  /** 初始化所有 pane */
@@ -150,6 +150,13 @@ export declare class IndicatorScheduler {
150
150
  private dirtyWmsrConfig;
151
151
  private dirtyKstConfig;
152
152
  private dirtyFastkConfig;
153
+ private dirtyRsiState;
154
+ private dirtyCciState;
155
+ private dirtyStochState;
156
+ private dirtyMomState;
157
+ private dirtyWmsrState;
158
+ private dirtyKstState;
159
+ private dirtyFastkState;
153
160
  /**
154
161
  * 设置 PluginHost,用于读写 StateStore
155
162
  */
@@ -3,6 +3,17 @@ import { PriceRange } from '../scale/price';
3
3
  import { PriceScale } from '../scale/priceScale';
4
4
  import { MarkerManager } from '../marker/registry';
5
5
  import { PaneCapabilities, PaneRole } from '../../plugin';
6
+ /**
7
+ * 更新级别枚举 - 用于双层 Canvas 架构
8
+ * Main: 只更新主画布(K线、指标等静态内容)
9
+ * Overlay: 只更新覆盖层(十字线、Tooltip等动态内容)
10
+ * All: 更新所有层
11
+ */
12
+ export declare enum UpdateLevel {
13
+ Main = "main",
14
+ Overlay = "overlay",
15
+ All = "all"
16
+ }
6
17
  export type VisibleRange = {
7
18
  start: number;
8
19
  end: number;
@@ -1,5 +1,6 @@
1
1
  export type PaneRendererDom = {
2
- plotCanvas: HTMLCanvasElement;
2
+ mainCanvas: HTMLCanvasElement;
3
+ overlayCanvas: HTMLCanvasElement;
3
4
  yAxisCanvas: HTMLCanvasElement;
4
5
  };
5
6
  export type PaneRendererOptions = {
@@ -9,3 +9,4 @@ export declare const FONT_FAMILY = "\"Trebuchet MS\", Roboto, Ubuntu, sans-serif
9
9
  export declare function getFont(size: number, options?: {
10
10
  bold?: boolean;
11
11
  }): string;
12
+ export declare function setCanvasFont(ctx: CanvasRenderingContext2D, font: string): void;
@@ -0,0 +1,21 @@
1
+ type MetricEntry = {
2
+ count: number;
3
+ totalTime: number;
4
+ };
5
+ type MetricBucket = Record<string, MetricEntry>;
6
+ type CanvasProfilerMetrics = {
7
+ ctxMethods: MetricBucket;
8
+ ctxProps: MetricBucket;
9
+ canvasProps: MetricBucket;
10
+ ctxMethodSources: Record<string, MetricBucket>;
11
+ };
12
+ declare global {
13
+ interface Window {
14
+ __KMAP_CANVAS_PROFILER_INSTALLED__?: boolean;
15
+ __KMAP_CANVAS_PROFILER_METRICS__?: CanvasProfilerMetrics;
16
+ showCanvasReport?: () => void;
17
+ resetCanvasReport?: () => void;
18
+ }
19
+ }
20
+ export declare function installCanvasProfiler(): void;
21
+ export {};
@@ -1,4 +1,5 @@
1
1
  import { RendererPlugin, RenderContext, PaneInfo, RendererPluginWithHost, PluginHost } from './types';
2
+ import { UpdateLevel } from '../core/layout/pane';
2
3
  /** 渲染器错误事件(裁剪后,不含大数据) */
3
4
  export interface RendererErrorEvent {
4
5
  name: string;
@@ -55,8 +56,8 @@ export declare class RendererPluginManager {
55
56
  private getMergedRenderers;
56
57
  /** 获取指定 pane 的渲染器(已缓存,无穿透) */
57
58
  getRenderers(paneId: string): RendererPlugin[];
58
- /** 渲染指定 pane(带错误隔离) */
59
- render(paneId: string, context: RenderContext): RendererErrorEvent[];
59
+ /** 渲染指定 pane(带错误隔离,支持按 UpdateLevel 过滤) */
60
+ render(paneId: string, context: RenderContext, level?: UpdateLevel): RendererErrorEvent[];
60
61
  /** 渲染指定名称的插件(带错误隔离,用于系统渲染器) */
61
62
  renderPlugin(name: string, context: RenderContext): RendererErrorEvent[];
62
63
  /** 启用/禁用渲染器(修改独立状态,不影响原始插件对象) */
@@ -226,6 +226,8 @@ export interface RenderContext {
226
226
  yAxisCtx?: CanvasRenderingContext2D;
227
227
  xAxisCtx?: CanvasRenderingContext2D;
228
228
  borderCtx?: CanvasRenderingContext2D;
229
+ /** 覆盖层 Canvas 上下文(用于十字线、Tooltip 等动态内容) */
230
+ overlayCtx?: CanvasRenderingContext2D;
229
231
  /** 当前缩放级别(1 ~ zoomLevels) */
230
232
  zoomLevel?: number;
231
233
  /** 总缩放级别数 */
@@ -396,6 +398,13 @@ export interface RendererPlugin {
396
398
  * 用于时间轴、全局边框等需要单独控制渲染时机的场景
397
399
  */
398
400
  isSystem?: boolean;
401
+ /**
402
+ * 渲染器所属层,决定 UpdateLevel 过滤行为
403
+ * - 'main': 低频/静态内容,随主画布一起渲染
404
+ * - 'overlay': 高频/动态内容,可在 overlay-only 更新时独立重绘
405
+ * 未指定时默认为 'main'(向后兼容)
406
+ */
407
+ layer?: 'main' | 'overlay';
399
408
  /** 渲染方法 */
400
409
  draw(context: RenderContext): void;
401
410
  /** 数据更新时回调 */
@@ -113,15 +113,7 @@ export interface CrosshairTimeLabelOptions {
113
113
  paddingX?: number;
114
114
  paddingY?: number;
115
115
  }
116
- /**
117
- * 在底部时间轴上绘制"十字线日期标签"
118
- * 说明:该函数假设时间轴背景/刻度已绘制完(即 drawTimeAxis 之后调用)。
119
- */
120
116
  export declare function drawCrosshairTimeLabel(ctx: CanvasRenderingContext2D, opts: CrosshairTimeLabelOptions): void;
121
- /**
122
- * 在右侧价格轴上绘制"十字线价格标签"
123
- * 说明:该函数假设价格轴背景/刻度已绘制完(即 drawPriceAxis 之后调用)。
124
- */
125
117
  export declare function drawCrosshairPriceLabel(ctx: CanvasRenderingContext2D, opts: CrosshairPriceLabelOptions): void;
126
118
  /** 绘制"最新价水平虚线"(画在 plotCanvas 的 world 坐标系:需在 translate(-scrollLeft,0) 之后调用) */
127
119
  export declare function drawLastPriceDashedLine(ctx: CanvasRenderingContext2D, opts: LastPriceLineOptions): void;
@@ -141,10 +133,6 @@ export interface AxisPriceLabelOptions {
141
133
  textColor?: string;
142
134
  fontSize?: number;
143
135
  }
144
- /**
145
- * 在右侧价格轴上绘制价格标签
146
- * 与 drawCrosshairPriceLabel 类似,但简化了参数(价格直接传入,无需计算)
147
- */
148
136
  export declare function drawAxisPriceLabel(ctx: CanvasRenderingContext2D, opts: AxisPriceLabelOptions): void;
149
137
  export interface AxisTimeLabelOptions {
150
138
  x: number;
@@ -159,8 +147,4 @@ export interface AxisTimeLabelOptions {
159
147
  fontSize?: number;
160
148
  paddingX?: number;
161
149
  }
162
- /**
163
- * 在底部时间轴上绘制时间标签
164
- * 与 drawCrosshairTimeLabel 类似,但 labelX 是屏幕坐标(已处理 scrollLeft)
165
- */
166
150
  export declare function drawAxisTimeLabel(ctx: CanvasRenderingContext2D, opts: AxisTimeLabelOptions): void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@363045841yyt/klinechart",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "A lightweight financial K-line charting library with first-class AI Agent support, crisp ResizeObserver-driven rendering, and plugin-based architecture. Focused on quantitative trading scenarios with TradingView-level interaction experience.",
5
5
  "author": "363045841 <slslswbsy@qq.com>",
6
6
  "license": "MIT",
@@ -51,6 +51,7 @@
51
51
  "build-only": "vite build",
52
52
  "build:demo": "vite build --config vite.demo.config.ts",
53
53
  "preview": "vite preview",
54
+ "preview:demo": "vite preview --config vite.demo.config.ts",
54
55
  "type-check": "vue-tsc --build",
55
56
  "test:unit": "vitest",
56
57
  "format": "prettier --write --experimental-cli src/",