@baron1996/klinecharts-adapter 0.3.0 → 0.4.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.
- package/dist/adapter.d.ts +27 -2
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +645 -26
- package/dist/conversion/chart-options.d.ts.map +1 -1
- package/dist/conversion/chart-options.js +6 -0
- package/dist/conversion/overlays.d.ts +2 -1
- package/dist/conversion/overlays.d.ts.map +1 -1
- package/dist/conversion/overlays.js +1 -1
- package/dist/conversion/price.d.ts.map +1 -1
- package/dist/conversion/price.js +10 -39
- package/dist/drawing/engine-port.d.ts +71 -0
- package/dist/drawing/engine-port.d.ts.map +1 -0
- package/dist/drawing/engine-port.js +1 -0
- package/dist/drawing/interaction-normalization.d.ts +18 -0
- package/dist/drawing/interaction-normalization.d.ts.map +1 -0
- package/dist/drawing/interaction-normalization.js +61 -0
- package/dist/drawing/kline-projection-policy.d.ts +8 -0
- package/dist/drawing/kline-projection-policy.d.ts.map +1 -0
- package/dist/drawing/kline-projection-policy.js +69 -0
- package/dist/drawing/overlay-conversion.d.ts +9 -0
- package/dist/drawing/overlay-conversion.d.ts.map +1 -0
- package/dist/drawing/overlay-conversion.js +245 -0
- package/dist/drawing/projection-policy.d.ts +34 -0
- package/dist/drawing/projection-policy.d.ts.map +1 -0
- package/dist/drawing/projection-policy.js +10 -0
- package/dist/drawing/time-series-projection-policy.d.ts +6 -0
- package/dist/drawing/time-series-projection-policy.d.ts.map +1 -0
- package/dist/drawing/time-series-projection-policy.js +28 -0
- package/dist/engine.d.ts +2 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +14 -1
- package/dist/extensions/price-measurement.d.ts +1 -1
- package/dist/extensions/price-measurement.d.ts.map +1 -1
- package/dist/extensions/price-measurement.js +8 -2
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/main-series-presentation.d.ts +35 -0
- package/dist/main-series-presentation.d.ts.map +1 -0
- package/dist/main-series-presentation.js +52 -0
- package/dist/time-series/adapter.d.ts +25 -2
- package/dist/time-series/adapter.d.ts.map +1 -1
- package/dist/time-series/adapter.js +889 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ChartScene, Drawing, TimeSeriesScene, ValueAxis } from '@baron1996/kline-scene-schema';
|
|
2
|
+
export type DrawingProjectionErrorCode = 'DRAWING_TARGET_INVALID' | 'DRAWING_PROJECTION_INVALID' | 'VALUE_AXIS_SCALE_UNSUPPORTED';
|
|
3
|
+
export declare class DrawingProjectionError extends Error {
|
|
4
|
+
readonly code: DrawingProjectionErrorCode;
|
|
5
|
+
readonly path: string;
|
|
6
|
+
constructor(code: DrawingProjectionErrorCode, path: string, message: string);
|
|
7
|
+
}
|
|
8
|
+
export type ProjectionScene = {
|
|
9
|
+
readonly kind: 'chart';
|
|
10
|
+
readonly document: ChartScene;
|
|
11
|
+
} | {
|
|
12
|
+
readonly kind: 'time-series';
|
|
13
|
+
readonly document: TimeSeriesScene;
|
|
14
|
+
};
|
|
15
|
+
export interface ResolvedAxisBinding {
|
|
16
|
+
readonly paneRole: string;
|
|
17
|
+
readonly yAxisRole: 'primary';
|
|
18
|
+
readonly valuePrecision: number;
|
|
19
|
+
readonly scale: 'linear' | 'logarithmic';
|
|
20
|
+
}
|
|
21
|
+
export interface ResolveAxisBindingInput {
|
|
22
|
+
readonly scene: ProjectionScene;
|
|
23
|
+
readonly drawing: Drawing;
|
|
24
|
+
readonly valueAxes: readonly ValueAxis[];
|
|
25
|
+
readonly path: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 纯 Drawing 轴绑定策略:只解析 paneRole/yAxisRole/valuePrecision/scale,
|
|
29
|
+
* 不持有引擎、不实现时间/几何算法,不接收引擎实例或像素输入。
|
|
30
|
+
*/
|
|
31
|
+
export interface DrawingProjectionPolicy {
|
|
32
|
+
resolveAxisBinding(input: ResolveAxisBindingInput): ResolvedAxisBinding;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=projection-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection-policy.d.ts","sourceRoot":"","sources":["../../src/drawing/projection-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,UAAU,EACV,OAAO,EACP,eAAe,EACf,SAAS,EACT,MAAM,+BAA+B,CAAC;AAEvC,MAAM,MAAM,0BAA0B,GACnC,wBAAwB,GACxB,4BAA4B,GAC5B,8BAA8B,CAAC;AAElC,qBAAa,sBAAuB,SAAQ,KAAK;IAChD,SAAgB,IAAI,EAAE,0BAA0B,CAAC;IACjD,SAAgB,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,0BAA0B,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAMlF;AAED,MAAM,MAAM,eAAe,GACxB;IACA,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;CAC7B,GACD;IACA,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;CAClC,CAAC;AAEL,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,aAAa,CAAC;CACzC;AAED,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,SAAS,EAAE,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACvC,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,mBAAmB,CAAC;CACxE"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type DrawingProjectionPolicy, type ResolveAxisBindingInput, type ResolvedAxisBinding } from './projection-policy.js';
|
|
2
|
+
/** 时间序列场景薄绑定策略;只接受公共 time-series / primary 轴。 */
|
|
3
|
+
export declare class TimeSeriesDrawingProjectionPolicy implements DrawingProjectionPolicy {
|
|
4
|
+
resolveAxisBinding(input: ResolveAxisBindingInput): ResolvedAxisBinding;
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=time-series-projection-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-series-projection-policy.d.ts","sourceRoot":"","sources":["../../src/drawing/time-series-projection-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,MAAM,wBAAwB,CAAC;AAEhC,iDAAiD;AACjD,qBAAa,iCAAkC,YAAW,uBAAuB;IACzE,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,GAAG,mBAAmB;CA2C9E"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { DrawingProjectionError, } from './projection-policy.js';
|
|
2
|
+
/** 时间序列场景薄绑定策略;只接受公共 time-series / primary 轴。 */
|
|
3
|
+
export class TimeSeriesDrawingProjectionPolicy {
|
|
4
|
+
resolveAxisBinding(input) {
|
|
5
|
+
const { scene, drawing, valueAxes, path } = input;
|
|
6
|
+
if (scene.kind !== 'time-series') {
|
|
7
|
+
throw new DrawingProjectionError('DRAWING_PROJECTION_INVALID', path, 'TimeSeriesDrawingProjectionPolicy requires a time-series Scene.');
|
|
8
|
+
}
|
|
9
|
+
const target = drawing.target;
|
|
10
|
+
if (target.paneRole !== 'time-series' ||
|
|
11
|
+
target.yAxisRole !== 'primary') {
|
|
12
|
+
throw new DrawingProjectionError('DRAWING_TARGET_INVALID', `${path}/target`, 'TimeSeries drawings must target time-series / primary.');
|
|
13
|
+
}
|
|
14
|
+
const sharedPrecision = scene.document.series[0]?.precision;
|
|
15
|
+
const axis = valueAxes.find((candidate) => candidate.paneRole === 'time-series' &&
|
|
16
|
+
candidate.yAxisRole === 'primary');
|
|
17
|
+
if (axis === undefined ||
|
|
18
|
+
axis.valuePrecision !== sharedPrecision) {
|
|
19
|
+
throw new DrawingProjectionError('DRAWING_TARGET_INVALID', `${path}/target`, 'TimeSeries primary binding precision must equal the shared series precision.');
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
paneRole: 'time-series',
|
|
23
|
+
yAxisRole: 'primary',
|
|
24
|
+
valuePrecision: axis.valuePrecision,
|
|
25
|
+
scale: 'linear',
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
package/dist/engine.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export type KLineChartsModule = typeof import('klinecharts');
|
|
|
4
4
|
export interface EngineHandle {
|
|
5
5
|
readonly chart: Chart;
|
|
6
6
|
readonly module: KLineChartsModule;
|
|
7
|
+
/** 显式复位引擎点击仲裁状态;每次绘制开始前调用,避免快速连续绘制的首击被吞。 */
|
|
8
|
+
readonly resetClickArbitration: () => void;
|
|
7
9
|
}
|
|
8
10
|
/** 按固定顺序创建并初始化唯一的 KLineCharts 引擎。 */
|
|
9
11
|
export declare function createEngine(container: HTMLElement, scene: ChartScene): Promise<EngineHandle>;
|
package/dist/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAUzC,MAAM,MAAM,iBAAiB,GAAG,cAAc,aAAa,CAAC,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAUzC,MAAM,MAAM,iBAAiB,GAAG,cAAc,aAAa,CAAC,CAAC;AAE7D,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,4CAA4C;IAC5C,QAAQ,CAAC,qBAAqB,EAAE,MAAM,IAAI,CAAC;CAC3C;AA+CD,qCAAqC;AACrC,wBAAsB,YAAY,CACjC,SAAS,EAAE,WAAW,EACtB,KAAK,EAAE,UAAU,GACf,OAAO,CAAC,YAAY,CAAC,CAmCvB"}
|
package/dist/engine.js
CHANGED
|
@@ -2,6 +2,15 @@ import { SceneError } from '@baron1996/kline-scene-schema';
|
|
|
2
2
|
import { toKLineChartsOptions } from './conversion/chart-options.js';
|
|
3
3
|
import { createStaticDataLoader } from './static-data-loader.js';
|
|
4
4
|
import { KLINECHARTS_ENGINE_VERSION, KLINECHARTS_RUNTIME_VERSION, SUPPORTED_KLINECHARTS_RUNTIME_VERSIONS, } from './version.js';
|
|
5
|
+
function resolveClickArbitrationReset(chart) {
|
|
6
|
+
const eventHandler = chart
|
|
7
|
+
._chartEvent?._event;
|
|
8
|
+
const reset = eventHandler?._resetClickTimeout;
|
|
9
|
+
if (eventHandler === undefined || typeof reset !== 'function') {
|
|
10
|
+
throw new SceneError('RUNTIME_INIT_FAILED', '/runtime', `KLineCharts ${KLINECHARTS_ENGINE_VERSION} 内部点击仲裁复位钩子不可用;引擎私有结构可能已变化。`);
|
|
11
|
+
}
|
|
12
|
+
return reset.bind(eventHandler);
|
|
13
|
+
}
|
|
5
14
|
function assertRuntimeIdentity(scene, actualEngineVersion) {
|
|
6
15
|
if (scene.runtime.engine !== 'klinecharts' ||
|
|
7
16
|
scene.runtime.engineVersion !== KLINECHARTS_ENGINE_VERSION ||
|
|
@@ -33,5 +42,9 @@ export async function createEngine(container, scene) {
|
|
|
33
42
|
});
|
|
34
43
|
chart.setPeriod(structuredClone(scene.period));
|
|
35
44
|
chart.setDataLoader(createStaticDataLoader(scene.data));
|
|
36
|
-
return {
|
|
45
|
+
return {
|
|
46
|
+
chart,
|
|
47
|
+
module: engine,
|
|
48
|
+
resetClickArbitration: resolveClickArbitrationReset(chart),
|
|
49
|
+
};
|
|
37
50
|
}
|
|
@@ -2,7 +2,7 @@ import type { registerOverlay } from 'klinecharts';
|
|
|
2
2
|
type KLineOverlayTemplate = Parameters<typeof registerOverlay>[0];
|
|
3
3
|
export interface PriceMeasurementDisplay {
|
|
4
4
|
readonly absoluteChange: number;
|
|
5
|
-
readonly percentageChange: number;
|
|
5
|
+
readonly percentageChange: number | null;
|
|
6
6
|
readonly label: string;
|
|
7
7
|
}
|
|
8
8
|
/** 仅派生显示值;绝对变化、百分比和 label 永不写入 Scene。 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"price-measurement.d.ts","sourceRoot":"","sources":["../../src/extensions/price-measurement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AAOlE,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"price-measurement.d.ts","sourceRoot":"","sources":["../../src/extensions/price-measurement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AAOlE,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACvB;AAED,yCAAyC;AACzC,wBAAgB,6BAA6B,CAC5C,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,GACpB,uBAAuB,CA4BzB;AAED,wCAAwC;AACxC,eAAO,MAAM,uBAAuB,EAAE,oBA6CrC,CAAC"}
|
|
@@ -7,13 +7,19 @@ function signedFixed(value, precision) {
|
|
|
7
7
|
export function derivePriceMeasurementDisplay(startValue, endValue, pricePrecision) {
|
|
8
8
|
if (!Number.isFinite(startValue) ||
|
|
9
9
|
!Number.isFinite(endValue) ||
|
|
10
|
-
startValue <= 0 ||
|
|
11
10
|
!Number.isInteger(pricePrecision) ||
|
|
12
11
|
pricePrecision < 0 ||
|
|
13
12
|
pricePrecision > 16) {
|
|
14
|
-
throw new SceneError('SCENE_SCHEMA_INVALID', '/overlays/priceMeasurement', 'Price measurement display inputs must be
|
|
13
|
+
throw new SceneError('SCENE_SCHEMA_INVALID', '/overlays/priceMeasurement', 'Price measurement display inputs must be finite numbers and a 0..16 precision.');
|
|
15
14
|
}
|
|
16
15
|
const absoluteChange = endValue - startValue;
|
|
16
|
+
if (startValue === 0) {
|
|
17
|
+
return {
|
|
18
|
+
absoluteChange,
|
|
19
|
+
percentageChange: null,
|
|
20
|
+
label: `${signedFixed(absoluteChange, pricePrecision)} (—%)`,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
17
23
|
const percentageChange = absoluteChange / startValue * 100;
|
|
18
24
|
return {
|
|
19
25
|
absoluteChange,
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
export * from './adapter.js';
|
|
2
|
+
export * from './drawing/kline-projection-policy.js';
|
|
3
|
+
export * from './drawing/engine-port.js';
|
|
4
|
+
export * from './drawing/interaction-normalization.js';
|
|
5
|
+
export * from './drawing/overlay-conversion.js';
|
|
6
|
+
export * from './drawing/projection-policy.js';
|
|
7
|
+
export * from './drawing/time-series-projection-policy.js';
|
|
2
8
|
export * from './errors.js';
|
|
9
|
+
export * from './main-series-presentation.js';
|
|
3
10
|
export * from './extensions/register.js';
|
|
4
11
|
export * from './interaction/dragging.js';
|
|
5
12
|
export * from './interaction/hit-testing.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,sCAAsC,CAAC;AACrD,cAAc,0BAA0B,CAAC;AACzC,cAAc,wCAAwC,CAAC;AACvD,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4CAA4C,CAAC;AAC3D,cAAc,aAAa,CAAC;AAC5B,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
export * from './adapter.js';
|
|
2
|
+
export * from './drawing/kline-projection-policy.js';
|
|
3
|
+
export * from './drawing/engine-port.js';
|
|
4
|
+
export * from './drawing/interaction-normalization.js';
|
|
5
|
+
export * from './drawing/overlay-conversion.js';
|
|
6
|
+
export * from './drawing/projection-policy.js';
|
|
7
|
+
export * from './drawing/time-series-projection-policy.js';
|
|
2
8
|
export * from './errors.js';
|
|
9
|
+
export * from './main-series-presentation.js';
|
|
3
10
|
export * from './extensions/register.js';
|
|
4
11
|
export * from './interaction/dragging.js';
|
|
5
12
|
export * from './interaction/hit-testing.js';
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { ChartScene } from '@baron1996/kline-scene-schema';
|
|
2
|
+
export type MainSeriesPresentationErrorCode = 'MAIN_SERIES_PRESENTATION_INVALID' | 'MAIN_SERIES_PRESENTATION_UNSUPPORTED' | 'MAIN_SERIES_PRESENTATION_APPLY_FAILED' | 'MAIN_SERIES_PRESENTATION_ROLLBACK_FAILED';
|
|
3
|
+
export declare class MainSeriesPresentationError extends Error {
|
|
4
|
+
readonly code: MainSeriesPresentationErrorCode;
|
|
5
|
+
readonly path: string;
|
|
6
|
+
constructor(code: MainSeriesPresentationErrorCode, path: string, message: string);
|
|
7
|
+
}
|
|
8
|
+
/** 产品唯一 area 收盘价折线展示配置;值来源固定为 close。 */
|
|
9
|
+
export declare const STANDARD_CLOSE_LINE_PRESENTATION: {
|
|
10
|
+
readonly type: "area";
|
|
11
|
+
readonly value: "close";
|
|
12
|
+
readonly line: {
|
|
13
|
+
readonly color: "rgba(41, 98, 255, 1)";
|
|
14
|
+
readonly size: 2;
|
|
15
|
+
};
|
|
16
|
+
readonly backgroundColor: "rgba(0, 0, 0, 0)";
|
|
17
|
+
readonly smooth: false;
|
|
18
|
+
readonly pointVisible: false;
|
|
19
|
+
};
|
|
20
|
+
export type MainSeriesPresentation = {
|
|
21
|
+
readonly type: 'candle_solid' | 'candle_stroke' | 'candle_up_stroke' | 'candle_down_stroke' | 'ohlc';
|
|
22
|
+
} | typeof STANDARD_CLOSE_LINE_PRESENTATION;
|
|
23
|
+
export type ActiveMainSeriesType = 'candle_solid' | 'candle_stroke' | 'candle_up_stroke' | 'candle_down_stroke' | 'ohlc' | 'area';
|
|
24
|
+
export interface MainSeriesPresentationResult {
|
|
25
|
+
readonly activeType: ActiveMainSeriesType;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 主序列展示端口;只由 K 线 Adapter 实现,与 Drawing 引擎端口分离。
|
|
29
|
+
* 输入必须是完整 discriminated union,禁止从其他字段或引擎默认值兜底。
|
|
30
|
+
*/
|
|
31
|
+
export interface MainSeriesPresentationPort {
|
|
32
|
+
applyMainSeriesPresentation(presentation: MainSeriesPresentation): MainSeriesPresentationResult;
|
|
33
|
+
}
|
|
34
|
+
export declare function presentationToSceneCandle(scene: ChartScene, presentation: MainSeriesPresentation): ChartScene;
|
|
35
|
+
//# sourceMappingURL=main-series-presentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main-series-presentation.d.ts","sourceRoot":"","sources":["../src/main-series-presentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,MAAM,MAAM,+BAA+B,GACxC,kCAAkC,GAClC,sCAAsC,GACtC,uCAAuC,GACvC,0CAA0C,CAAC;AAE9C,qBAAa,2BAA4B,SAAQ,KAAK;IACrD,SAAgB,IAAI,EAAE,+BAA+B,CAAC;IACtD,SAAgB,IAAI,EAAE,MAAM,CAAC;gBAG5B,IAAI,EAAE,+BAA+B,EACrC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM;CAOhB;AAED,wCAAwC;AACxC,eAAO,MAAM,gCAAgC;;;;;;;;;;CAOnC,CAAC;AAEX,MAAM,MAAM,sBAAsB,GAC/B;IACA,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,eAAe,GAAG,kBAAkB,GACjE,oBAAoB,GAAG,MAAM,CAAC;CAChC,GACD,OAAO,gCAAgC,CAAC;AAE3C,MAAM,MAAM,oBAAoB,GAC7B,cAAc,GACd,eAAe,GACf,kBAAkB,GAClB,oBAAoB,GACpB,MAAM,GACN,MAAM,CAAC;AAEV,MAAM,WAAW,4BAA4B;IAC5C,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;CAC1C;AAED;;;GAGG;AACH,MAAM,WAAW,0BAA0B;IAC1C,2BAA2B,CAC1B,YAAY,EAAE,sBAAsB,GAClC,4BAA4B,CAAC;CAChC;AAED,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,UAAU,EACjB,YAAY,EAAE,sBAAsB,GAClC,UAAU,CAgCZ"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export class MainSeriesPresentationError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
path;
|
|
4
|
+
constructor(code, path, message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = 'MainSeriesPresentationError';
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.path = path;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/** 产品唯一 area 收盘价折线展示配置;值来源固定为 close。 */
|
|
12
|
+
export const STANDARD_CLOSE_LINE_PRESENTATION = {
|
|
13
|
+
type: 'area',
|
|
14
|
+
value: 'close',
|
|
15
|
+
line: { color: 'rgba(41, 98, 255, 1)', size: 2 },
|
|
16
|
+
backgroundColor: 'rgba(0, 0, 0, 0)',
|
|
17
|
+
smooth: false,
|
|
18
|
+
pointVisible: false,
|
|
19
|
+
};
|
|
20
|
+
export function presentationToSceneCandle(scene, presentation) {
|
|
21
|
+
if (presentation.type === 'area') {
|
|
22
|
+
return {
|
|
23
|
+
...structuredClone(scene),
|
|
24
|
+
chart: {
|
|
25
|
+
...structuredClone(scene.chart),
|
|
26
|
+
candle: {
|
|
27
|
+
...structuredClone(scene.chart.candle),
|
|
28
|
+
type: 'area',
|
|
29
|
+
area: {
|
|
30
|
+
value: presentation.value,
|
|
31
|
+
line: {
|
|
32
|
+
color: presentation.line.color,
|
|
33
|
+
size: presentation.line.size,
|
|
34
|
+
},
|
|
35
|
+
backgroundColor: presentation.backgroundColor,
|
|
36
|
+
smooth: presentation.smooth,
|
|
37
|
+
pointVisible: presentation.pointVisible,
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const candle = structuredClone(scene.chart.candle);
|
|
44
|
+
delete candle.area;
|
|
45
|
+
return {
|
|
46
|
+
...structuredClone(scene),
|
|
47
|
+
chart: {
|
|
48
|
+
...structuredClone(scene.chart),
|
|
49
|
+
candle: { ...candle, type: presentation.type },
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
@@ -1,17 +1,40 @@
|
|
|
1
|
-
import type { TimeSeriesPoint, TimeSeriesScene } from '@baron1996/kline-scene-schema';
|
|
1
|
+
import type { Drawing, TimeSeriesPoint, TimeSeriesScene } from '@baron1996/kline-scene-schema';
|
|
2
|
+
import type { DrawingEnginePort, EngineDrawingEvent, EngineDrawingSnapshot, EngineDrawingStartRequest, EnginePixelCoordinate, EnginePointProjection } from '../drawing/engine-port.js';
|
|
2
3
|
export interface TimeSeriesAdapterCrosshair {
|
|
3
4
|
readonly timestamp: number | null;
|
|
4
5
|
readonly values: Readonly<Record<string, number | null>> | null;
|
|
5
6
|
}
|
|
6
7
|
export type TimeSeriesAdapterCrosshairListener = (event: TimeSeriesAdapterCrosshair) => void;
|
|
7
8
|
/** TimeSeriesScene 与 KLineCharts 之间的唯一受控边界。 */
|
|
8
|
-
export declare class TimeSeriesChartsAdapter {
|
|
9
|
+
export declare class TimeSeriesChartsAdapter implements DrawingEnginePort {
|
|
9
10
|
#private;
|
|
10
11
|
private constructor();
|
|
11
12
|
static create(container: HTMLElement, value: unknown): Promise<TimeSeriesChartsAdapter>;
|
|
13
|
+
/** 显式 Workspace factory:时间序列场景 + DrawingDocument。 */
|
|
14
|
+
static createWorkspace(container: HTMLElement, value: unknown): Promise<TimeSeriesChartsAdapter>;
|
|
15
|
+
get sceneKind(): 'chart' | 'time-series';
|
|
16
|
+
restoreDrawings(drawings: readonly EngineDrawingSnapshot[]): void;
|
|
17
|
+
startDrawing(request: EngineDrawingStartRequest): string;
|
|
18
|
+
listDrawings(): readonly EngineDrawingSnapshot[];
|
|
19
|
+
getDrawing(id: string): EngineDrawingSnapshot | undefined;
|
|
20
|
+
updateDrawingStyles(id: string, styles: Drawing['styles']): EngineDrawingSnapshot;
|
|
21
|
+
updateDrawingText(id: string, text: string): EngineDrawingSnapshot;
|
|
22
|
+
removeDrawing(id: string): boolean;
|
|
23
|
+
restoreDrawing(snapshot: EngineDrawingSnapshot): void;
|
|
24
|
+
selectDrawing(id: string | null): void;
|
|
25
|
+
hitTestDrawing(point: EnginePixelCoordinate): string | null;
|
|
26
|
+
projectToPixel(anchor: {
|
|
27
|
+
readonly timestamp?: number;
|
|
28
|
+
readonly value?: number;
|
|
29
|
+
}, _paneRole: string): EnginePointProjection;
|
|
30
|
+
unprojectFromPixel(point: EnginePixelCoordinate, _paneRole: string): EnginePointProjection;
|
|
31
|
+
setMutationsEnabled(enabled: boolean): void;
|
|
32
|
+
subscribeDrawingEvents(listener: (event: EngineDrawingEvent) => void): () => void;
|
|
12
33
|
subscribeCrosshair(listener: TimeSeriesAdapterCrosshairListener): () => void;
|
|
13
34
|
setSeriesVisible(seriesId: string, visible: boolean): TimeSeriesScene;
|
|
14
35
|
replaceData(data: readonly TimeSeriesPoint[]): TimeSeriesScene;
|
|
36
|
+
/** 同结构场景替换:period/data/viewport 原子更新,series 结构必须一致。 */
|
|
37
|
+
replaceScene(value: TimeSeriesScene): TimeSeriesScene;
|
|
15
38
|
exportScene(): TimeSeriesScene;
|
|
16
39
|
dispose(): void;
|
|
17
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/time-series/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,eAAe,EACf,eAAe,
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/time-series/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,OAAO,EAEP,eAAe,EACf,eAAe,EAEf,MAAM,+BAA+B,CAAC;AAsCvC,OAAO,KAAK,EACX,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,EACrB,MAAM,2BAA2B,CAAC;AAUnC,MAAM,WAAW,0BAA0B;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;CAChE;AAED,MAAM,MAAM,kCAAkC,GAAG,CAChD,KAAK,EAAE,0BAA0B,KAC7B,IAAI,CAAC;AAoIV,+CAA+C;AAC/C,qBAAa,uBAAwB,YAAW,iBAAiB;;IA+ChE,OAAO;WA4Ba,MAAM,CACzB,SAAS,EAAE,WAAW,EACtB,KAAK,EAAE,OAAO,GACZ,OAAO,CAAC,uBAAuB,CAAC;IA8EnC,qDAAqD;WACjC,eAAe,CAClC,SAAS,EAAE,WAAW,EACtB,KAAK,EAAE,OAAO,GACZ,OAAO,CAAC,uBAAuB,CAAC;IA6vBnC,IAAW,SAAS,IAAI,OAAO,GAAG,aAAa,CAE9C;IAEM,eAAe,CACrB,QAAQ,EAAE,SAAS,qBAAqB,EAAE,GACxC,IAAI;IAQA,YAAY,CAAC,OAAO,EAAE,yBAAyB,GAAG,MAAM;IA6BxD,YAAY,IAAI,SAAS,qBAAqB,EAAE;IAQhD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS;IAMzD,mBAAmB,CACzB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,GACvB,qBAAqB;IA8BjB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,qBAAqB;IA2BlE,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAKlC,cAAc,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI;IAiCrD,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAKtC,cAAc,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,GAAG,IAAI;IAM3D,cAAc,CACpB,MAAM,EAAE;QAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAChE,SAAS,EAAE,MAAM,GACf,qBAAqB;IAKjB,kBAAkB,CACxB,KAAK,EAAE,qBAAqB,EAC5B,SAAS,EAAE,MAAM,GACf,qBAAqB;IAKjB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAK3C,sBAAsB,CAC5B,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAC3C,MAAM,IAAI;IAON,kBAAkB,CACxB,QAAQ,EAAE,kCAAkC,GAC1C,MAAM,IAAI;IAMN,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,eAAe;IAqCrE,WAAW,CAAC,IAAI,EAAE,SAAS,eAAe,EAAE,GAAG,eAAe;IA2CrE,uDAAuD;IAChD,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,eAAe;IA6CrD,WAAW,IAAI,eAAe;IAK9B,OAAO,IAAI,IAAI;CAmBtB"}
|