@baron1996/klinecharts-runtime 0.2.3 → 0.4.0

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.
Files changed (54) hide show
  1. package/README.md +1 -1
  2. package/dist/drawing/capabilities.d.ts +36 -0
  3. package/dist/drawing/capabilities.d.ts.map +1 -0
  4. package/dist/drawing/capabilities.js +1 -0
  5. package/dist/drawing/legacy-runtime-capability.d.ts +8 -0
  6. package/dist/drawing/legacy-runtime-capability.d.ts.map +1 -0
  7. package/dist/drawing/legacy-runtime-capability.js +92 -0
  8. package/dist/drawing/projection-service.d.ts +80 -0
  9. package/dist/drawing/projection-service.d.ts.map +1 -0
  10. package/dist/drawing/projection-service.js +523 -0
  11. package/dist/drawing/runtime-capability-descriptor.d.ts +28 -0
  12. package/dist/drawing/runtime-capability-descriptor.d.ts.map +1 -0
  13. package/dist/drawing/runtime-capability-descriptor.js +1 -0
  14. package/dist/drawing/scene-runtime-factory.d.ts +15 -0
  15. package/dist/drawing/scene-runtime-factory.d.ts.map +1 -0
  16. package/dist/drawing/scene-runtime-factory.js +27 -0
  17. package/dist/drawing/session-controller.d.ts +53 -0
  18. package/dist/drawing/session-controller.d.ts.map +1 -0
  19. package/dist/drawing/session-controller.js +339 -0
  20. package/dist/drawing/workspace-events.d.ts +66 -0
  21. package/dist/drawing/workspace-events.d.ts.map +1 -0
  22. package/dist/drawing/workspace-events.js +12 -0
  23. package/dist/drawing/workspace-runtime.d.ts +60 -0
  24. package/dist/drawing/workspace-runtime.d.ts.map +1 -0
  25. package/dist/drawing/workspace-runtime.js +328 -0
  26. package/dist/index.d.ts +10 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +10 -1
  29. package/dist/runtime.d.ts +29 -3
  30. package/dist/runtime.d.ts.map +1 -1
  31. package/dist/runtime.js +97 -1
  32. package/dist/time-series-runtime-styles.d.ts +2 -0
  33. package/dist/time-series-runtime-styles.d.ts.map +1 -0
  34. package/dist/time-series-runtime-styles.js +98 -0
  35. package/dist/time-series-runtime.d.ts +3 -0
  36. package/dist/time-series-runtime.d.ts.map +1 -0
  37. package/dist/time-series-runtime.js +301 -0
  38. package/dist/time-series-types.d.ts +42 -0
  39. package/dist/time-series-types.d.ts.map +1 -0
  40. package/dist/time-series-types.js +1 -0
  41. package/dist/toolbar/standard-toolbar-styles.d.ts.map +1 -1
  42. package/dist/toolbar/standard-toolbar-styles.js +18 -0
  43. package/dist/toolbar/standard-toolbar.d.ts +4 -2
  44. package/dist/toolbar/standard-toolbar.d.ts.map +1 -1
  45. package/dist/toolbar/standard-toolbar.js +187 -31
  46. package/dist/toolbar/toolbar-icons.d.ts +26 -0
  47. package/dist/toolbar/toolbar-icons.d.ts.map +1 -1
  48. package/dist/toolbar/toolbar-icons.js +13 -0
  49. package/dist/toolbar/toolbar-tools.d.ts +6 -1
  50. package/dist/toolbar/toolbar-tools.d.ts.map +1 -1
  51. package/dist/toolbar/toolbar-tools.js +6 -0
  52. package/dist/types.d.ts +7 -4
  53. package/dist/types.d.ts.map +1 -1
  54. package/package.json +4 -3
package/README.md CHANGED
@@ -4,7 +4,7 @@ Browser editing runtime and standard annotation toolbar for deterministic KLineC
4
4
  ChartScene files.
5
5
 
6
6
  ```bash
7
- npm install --save-exact @baron1996/kline-scene-schema@0.2.3 @baron1996/klinecharts-runtime@0.2.3
7
+ npm install --save-exact @baron1996/kline-scene-schema@0.4.0 @baron1996/klinecharts-runtime@0.4.0
8
8
  ```
9
9
 
10
10
  ```ts
@@ -0,0 +1,36 @@
1
+ import type { ChartScene, Drawing } from '@baron1996/kline-scene-schema';
2
+ import type { EngineDrawingSnapshot, EnginePixelCoordinate, MainSeriesPresentation } from '@baron1996/klinecharts-adapter';
3
+ import type { HostActionDescriptor, RuntimeCapabilityDescriptor } from './runtime-capability-descriptor.js';
4
+ /** 公共 Drawing 能力;工具栏与所有正式交互式图表 Runtime 共用。 */
5
+ export interface DrawingRuntimeCapability {
6
+ startDrawing(type: Drawing['type'], options?: {
7
+ readonly text?: string;
8
+ readonly id?: string;
9
+ readonly styles?: Drawing['styles'];
10
+ }): string;
11
+ listDrawings(): readonly EngineDrawingSnapshot[];
12
+ getDrawing(id: string): EngineDrawingSnapshot | undefined;
13
+ updateDrawingStyles(id: string, styles: Drawing['styles']): EngineDrawingSnapshot;
14
+ updateDrawingText(id: string, text: string): EngineDrawingSnapshot;
15
+ removeDrawing(id: string): boolean;
16
+ requestDrawingDelete(id: string): void;
17
+ selectDrawing(id: string | null): void;
18
+ getSelectedDrawingId(): string | undefined;
19
+ hitTestDrawing(point: EnginePixelCoordinate): string | null;
20
+ }
21
+ export interface RuntimeAuxiliaryCapability {
22
+ getRuntimeCapabilityDescriptor(options?: {
23
+ readonly hostActions?: readonly HostActionDescriptor[];
24
+ }): RuntimeCapabilityDescriptor;
25
+ exportArtifact(fileName?: string): {
26
+ readonly bytes: Uint8Array;
27
+ readonly mediaType: 'application/json';
28
+ readonly fileName: string;
29
+ };
30
+ setValueAxisScale(scale: 'linear' | 'logarithmic'): Promise<ChartScene>;
31
+ setMainSeriesPresentation(presentation: MainSeriesPresentation): {
32
+ readonly activeType: string;
33
+ };
34
+ requestHostAction(actionId: string, drawingId?: string | null): void;
35
+ }
36
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../src/drawing/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,UAAU,EACV,OAAO,EACP,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EACX,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EACX,oBAAoB,EACpB,2BAA2B,EAC3B,MAAM,oCAAoC,CAAC;AAG5C,8CAA8C;AAC9C,MAAM,WAAW,wBAAwB;IACxC,YAAY,CACX,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EACrB,OAAO,CAAC,EAAE;QACT,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;KACpC,GACC,MAAM,CAAC;IACV,YAAY,IAAI,SAAS,qBAAqB,EAAE,CAAC;IACjD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAAC;IAC1D,mBAAmB,CAClB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,GACvB,qBAAqB,CAAC;IACzB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,qBAAqB,CAAC;IACnE,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACvC,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAAC;IAC3C,cAAc,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,GAAG,IAAI,CAAC;CAC5D;AAED,MAAM,WAAW,0BAA0B;IAC1C,8BAA8B,CAAC,OAAO,CAAC,EAAE;QACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;KACvD,GAAG,2BAA2B,CAAC;IAChC,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG;QAClC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;QAC3B,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;QACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,iBAAiB,CAAC,KAAK,EAAE,QAAQ,GAAG,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACxE,yBAAyB,CACxB,YAAY,EAAE,sBAAsB,GAClC;QAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;CACrE"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ import type { Period, SceneOverlay } from '@baron1996/kline-scene-schema';
2
+ import type { EngineDrawingSnapshot } from '@baron1996/klinecharts-adapter';
3
+ /**
4
+ * Legacy SceneOverlay → 公共 Drawing 快照的只读视图。
5
+ * 不构造 DrawingDocument,不改动 Legacy 状态与事件。
6
+ */
7
+ export declare function overlayToDrawingSnapshot(overlay: SceneOverlay, period: Period): EngineDrawingSnapshot;
8
+ //# sourceMappingURL=legacy-runtime-capability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-runtime-capability.d.ts","sourceRoot":"","sources":["../../src/drawing/legacy-runtime-capability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,MAAM,EACN,YAAY,EACZ,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAE5E;;;GAGG;AACH,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,MAAM,GACZ,qBAAqB,CAcvB"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Legacy SceneOverlay → 公共 Drawing 快照的只读视图。
3
+ * 不构造 DrawingDocument,不改动 Legacy 状态与事件。
4
+ */
5
+ export function overlayToDrawingSnapshot(overlay, period) {
6
+ const granularity = structuredClone(period);
7
+ const geometry = overlayGeometry(overlay, granularity);
8
+ return {
9
+ id: overlay.id,
10
+ type: overlay.type,
11
+ target: { paneRole: 'candle', yAxisRole: 'primary' },
12
+ geometry,
13
+ styles: structuredClone(overlay.styles),
14
+ locked: overlay.locked,
15
+ visible: overlay.visible,
16
+ zLevel: overlay.zLevel,
17
+ mode: overlay.mode,
18
+ };
19
+ }
20
+ function overlayGeometry(overlay, granularity) {
21
+ const result = {};
22
+ switch (overlay.type) {
23
+ case 'horizontalStraightLine':
24
+ case 'priceLine':
25
+ result.value = overlay.anchor.value;
26
+ break;
27
+ case 'simpleTag':
28
+ result.value = overlay.anchor.value;
29
+ result.text = overlay.text ?? '';
30
+ break;
31
+ case 'verticalStraightLine':
32
+ result.time = overlay.anchor.timestamp;
33
+ break;
34
+ case 'horizontalRayLine':
35
+ case 'horizontalSegment':
36
+ result.value = overlay.value;
37
+ result.startTime = overlay.startTimestamp;
38
+ result.endTime = overlay.endTimestamp;
39
+ break;
40
+ case 'verticalRayLine':
41
+ case 'verticalSegment':
42
+ result.time = overlay.timestamp;
43
+ result.startValue = overlay.startValue;
44
+ result.endValue = overlay.endValue;
45
+ break;
46
+ case 'rayLine':
47
+ case 'segment':
48
+ case 'straightLine':
49
+ case 'fibonacciLine':
50
+ case 'priceChannelLine':
51
+ case 'parallelStraightLine':
52
+ case 'brush':
53
+ result.points = overlay.points.map((point) => ({
54
+ timestamp: point.timestamp,
55
+ value: point.value,
56
+ granularity: structuredClone(granularity),
57
+ }));
58
+ break;
59
+ case 'simpleAnnotation':
60
+ case 'callout':
61
+ case 'text':
62
+ result.point = {
63
+ timestamp: overlay.point.timestamp,
64
+ value: overlay.point.value,
65
+ granularity: structuredClone(granularity),
66
+ };
67
+ result.text = overlay.text ?? '';
68
+ break;
69
+ case 'crossLine':
70
+ result.point = {
71
+ timestamp: overlay.point.timestamp,
72
+ value: overlay.point.value,
73
+ granularity: structuredClone(granularity),
74
+ };
75
+ break;
76
+ case 'rectangle':
77
+ case 'arrow':
78
+ case 'priceMeasurement':
79
+ result.start = {
80
+ timestamp: overlay.start.timestamp,
81
+ value: overlay.start.value,
82
+ granularity: structuredClone(granularity),
83
+ };
84
+ result.end = {
85
+ timestamp: overlay.end.timestamp,
86
+ value: overlay.end.value,
87
+ granularity: structuredClone(granularity),
88
+ };
89
+ break;
90
+ }
91
+ return result;
92
+ }
@@ -0,0 +1,80 @@
1
+ import type { Drawing, DrawingDocument, Period, ValueAxis } from '@baron1996/kline-scene-schema';
2
+ import { type ProjectionScene, type ResolvedAxisBinding } from '@baron1996/klinecharts-adapter';
3
+ export type { ProjectionScene } from '@baron1996/klinecharts-adapter';
4
+ export interface DrawingTimeAnchor {
5
+ readonly timestamp: number;
6
+ readonly granularity: Period;
7
+ }
8
+ export type ProjectedBucketKind = 'exact' | 'first-child' | 'containing-interval' | 'outside-data-range';
9
+ export interface ProjectedTimeBucket {
10
+ readonly kind: ProjectedBucketKind;
11
+ readonly startTimestamp: number;
12
+ readonly endTimestamp: number;
13
+ readonly dataIndex: number | null;
14
+ }
15
+ export interface ProjectedAnchor {
16
+ readonly timestamp: number;
17
+ readonly granularity: Period;
18
+ readonly value: number | null;
19
+ readonly bucket: ProjectedTimeBucket;
20
+ }
21
+ export interface ProjectedDrawing {
22
+ readonly drawing: Drawing;
23
+ readonly binding: ResolvedAxisBinding;
24
+ readonly anchors: readonly ProjectedAnchor[];
25
+ readonly visible: boolean;
26
+ }
27
+ export interface ProjectedDrawingDocument {
28
+ readonly scopeKey: string;
29
+ readonly timezone: string;
30
+ readonly drawings: readonly ProjectedDrawing[];
31
+ }
32
+ export interface ProjectDrawingInput {
33
+ readonly scene: ProjectionScene;
34
+ readonly drawing: Drawing;
35
+ readonly valueAxes: readonly ValueAxis[];
36
+ readonly path: string;
37
+ }
38
+ export interface ReverseProjectAnchorInput {
39
+ readonly original: DrawingTimeAnchor;
40
+ readonly editingScenePeriod: Period;
41
+ readonly targetTimestamp: number;
42
+ readonly data: readonly {
43
+ readonly timestamp: number;
44
+ }[];
45
+ readonly scenePeriod: Period;
46
+ readonly timezone: string;
47
+ }
48
+ export interface ReverseProjectDrawingInput {
49
+ readonly scene: ProjectionScene;
50
+ readonly drawing: Drawing;
51
+ readonly valueAxes: readonly ValueAxis[];
52
+ readonly path: string;
53
+ readonly horizontal?: {
54
+ readonly targetTimestamp: number;
55
+ readonly editingScenePeriod: Period;
56
+ };
57
+ readonly vertical?: {
58
+ readonly values: readonly number[];
59
+ };
60
+ }
61
+ /**
62
+ * 纯时间桶、22 种几何与反投影核心;不持有 Adapter/引擎,输入输出深拷贝。
63
+ */
64
+ export declare class DrawingProjectionService {
65
+ #private;
66
+ addPeriod(timestamp: number, period: Period, timezone: string): number;
67
+ projectDrawing(input: ProjectDrawingInput): ProjectedDrawing;
68
+ projectDocument(input: {
69
+ readonly scene: ProjectionScene;
70
+ readonly drawings: DrawingDocument;
71
+ }): ProjectedDrawingDocument;
72
+ reverseProjectAnchor(input: ReverseProjectAnchorInput): DrawingTimeAnchor;
73
+ reverseProjectDrawing(input: ReverseProjectDrawingInput): Drawing;
74
+ }
75
+ interface GeometryAnchorEntry {
76
+ readonly anchor: DrawingTimeAnchor;
77
+ readonly value: number | null;
78
+ }
79
+ export declare function geometryAnchors(drawing: Drawing, defaultGranularity: Period): readonly GeometryAnchorEntry[];
80
+ //# sourceMappingURL=projection-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection-service.d.ts","sourceRoot":"","sources":["../../src/drawing/projection-service.ts"],"names":[],"mappings":"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"}