scichart-engine 1.9.1 → 1.10.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.
Files changed (37) hide show
  1. package/README.md +39 -2
  2. package/dist/core/chart/ChartAxisManager.d.ts +61 -0
  3. package/dist/core/chart/ChartCore.d.ts +27 -15
  4. package/dist/core/chart/ChartPluginBridge.d.ts +33 -0
  5. package/dist/core/chart/ChartRenderLoop.d.ts +98 -0
  6. package/dist/core/chart/ChartRenderer.d.ts +1 -0
  7. package/dist/core/chart/ChartStateManager.d.ts +52 -0
  8. package/dist/core/chart/types.d.ts +2 -1
  9. package/dist/index-DSspeT94.js +2431 -0
  10. package/dist/index-DSspeT94.js.map +1 -0
  11. package/dist/{index.core-9MC7hRn3.js → index.core-BbUNB-sR.js} +1813 -1237
  12. package/dist/index.core-BbUNB-sR.js.map +1 -0
  13. package/dist/index.d.ts +2 -2
  14. package/dist/plugins/forecasting/algorithms.d.ts +6 -0
  15. package/dist/plugins/forecasting/exports.d.ts +3 -0
  16. package/dist/plugins/forecasting/index.d.ts +11 -0
  17. package/dist/plugins/forecasting/types.d.ts +88 -0
  18. package/dist/plugins/index.d.ts +1 -0
  19. package/dist/plugins/tools/tooltip/templates/AnnotationTemplate.d.ts +1 -1
  20. package/dist/plugins/tools/tooltip/templates/CrosshairTemplate.d.ts +10 -1
  21. package/dist/plugins/tools/tooltip/templates/DefaultTemplate.d.ts +1 -1
  22. package/dist/plugins/tools/tooltip/templates/HeatmapTemplate.d.ts +1 -1
  23. package/dist/plugins/tools/tooltip/templates/MinimalTemplate.d.ts +1 -1
  24. package/dist/plugins/tools/tooltip/templates/RangeTemplate.d.ts +1 -1
  25. package/dist/plugins/tools/tooltip/templates/ScientificTemplate.d.ts +1 -1
  26. package/dist/plugins/tools/tooltip/types.d.ts +1 -1
  27. package/dist/plugins/tools.js +1 -1
  28. package/dist/scichart-engine.full.js +2427 -2209
  29. package/dist/scichart-engine.full.js.map +1 -1
  30. package/dist/scichart-engine.js +1 -1
  31. package/dist/theme/colorSchemes.d.ts +56 -0
  32. package/dist/theme/index.d.ts +1 -0
  33. package/dist/types.d.ts +2 -0
  34. package/package.json +5 -1
  35. package/dist/index-Btz_voey.js +0 -2403
  36. package/dist/index-Btz_voey.js.map +0 -1
  37. package/dist/index.core-9MC7hRn3.js.map +0 -1
package/README.md CHANGED
@@ -12,6 +12,8 @@ A high-performance, WebGL-powered scientific charting engine built for precision
12
12
  - **📊 Specialized Series**: Support for Lines, Scatter (SDF symbols), Step charts, Band series, Area charts, **Candlesticks** (OHLC), and **Stacked Charts**.
13
13
  - **↕️ Multi-Axis Engine**: Independent scales and units with axis-specific scrolling and zooming.
14
14
  - **📏 Professional Tooling**: Real-time Statistics panel, Annotations (Lines/Shapes/Text), and **high-fidelity SVG/PNG export**.
15
+ - **🎨 Color Schemes**: **5 professional palettes** with 20 colors each for multi-series charts, auto-assigned when colors aren't specified.
16
+ - **✨ Interactive Legend**: Hover over series in legend to **bring to front** and highlight with distinct color.
15
17
  - **🔌 Extensible**: **Plugin System** with lifecycle hooks for custom drawing and data analysis.
16
18
  - **⚛️ Framework First**: Native React support via hooks and high-level components.
17
19
  - **🎨 Dynamic Theming**: Sleek built-in themes (Light/Midnight) with support for custom CSS-based skins.
@@ -58,14 +60,49 @@ import { createChart } from 'scichart-engine';
58
60
 
59
61
  const chart = createChart({
60
62
  container: document.getElementById('chart-container'),
61
- title: 'Real-time Signal'
63
+ theme: 'dark',
64
+ colorScheme: 'vibrant', // Auto-assigns colors from vibrant palette
65
+ showLegend: true
62
66
  });
63
67
 
68
+ // Series without explicit colors get auto-assigned from the scheme
64
69
  chart.addSeries({
65
- id: 'signal',
70
+ id: 'signal1',
66
71
  type: 'line',
67
72
  data: { x: [...], y: [...] }
68
73
  });
74
+
75
+ chart.addSeries({
76
+ id: 'signal2',
77
+ type: 'line',
78
+ data: { x: [...], y: [...] }
79
+ });
80
+
81
+ // Change color scheme at runtime
82
+ chart.setColorScheme('ocean');
83
+ ```
84
+
85
+ ### Multi-Series with Color Schemes
86
+
87
+ ```typescript
88
+ // Create chart with 20+ series - colors auto-cycle
89
+ const chart = createChart({
90
+ container: document.getElementById('chart'),
91
+ colorScheme: 'neon', // 'vibrant', 'pastel', 'neon', 'earth', 'ocean'
92
+ showLegend: true
93
+ });
94
+
95
+ // Add multiple series - colors assigned automatically
96
+ for (let i = 0; i < 20; i++) {
97
+ chart.addSeries({
98
+ id: `series${i}`,
99
+ name: `Dataset ${i + 1}`,
100
+ type: 'line',
101
+ data: generateData(i)
102
+ });
103
+ }
104
+
105
+ // Hover over series in legend → brings to front + highlights! ✨
69
106
  ```
70
107
 
71
108
  ## 📖 Documentation
@@ -0,0 +1,61 @@
1
+ import { Scale } from '../../scales';
2
+ import { AxisOptions } from '../../types';
3
+ import { Series } from '../Series';
4
+
5
+ export interface AxisManagerContext {
6
+ xAxisOptions: AxisOptions;
7
+ xScale: Scale;
8
+ yAxisOptionsMap: Map<string, AxisOptions>;
9
+ yScales: Map<string, Scale>;
10
+ primaryYAxisId: string;
11
+ series: Map<string, Series>;
12
+ requestRender: () => void;
13
+ }
14
+ export declare class ChartAxisManager {
15
+ private ctx;
16
+ constructor(ctx: AxisManagerContext);
17
+ /**
18
+ * Add a new Y axis dynamically
19
+ */
20
+ addYAxis(options: AxisOptions): string;
21
+ /**
22
+ * Remove a Y axis by ID
23
+ */
24
+ removeYAxis(id: string): boolean;
25
+ /**
26
+ * Update Y axis configuration
27
+ */
28
+ updateYAxis(id: string, options: Partial<AxisOptions>): void;
29
+ /**
30
+ * Update X axis configuration
31
+ */
32
+ updateXAxis(options: Partial<AxisOptions>): void;
33
+ /**
34
+ * Get Y axis configuration by ID
35
+ */
36
+ getYAxis(id: string): AxisOptions | undefined;
37
+ /**
38
+ * Get all Y axes configurations
39
+ */
40
+ getAllYAxes(): AxisOptions[];
41
+ /**
42
+ * Get the primary Y axis ID
43
+ */
44
+ getPrimaryYAxisId(): string;
45
+ /**
46
+ * Get X axis configuration
47
+ */
48
+ getXAxis(): AxisOptions;
49
+ /**
50
+ * Get X scale
51
+ */
52
+ getXScale(): Scale;
53
+ /**
54
+ * Get Y scale by axis ID
55
+ */
56
+ getYScale(axisId?: string): Scale | undefined;
57
+ /**
58
+ * Get all Y scales
59
+ */
60
+ getAllYScales(): Map<string, Scale>;
61
+ }
@@ -2,7 +2,7 @@ import { ChartOptions, AxisOptions, SeriesOptions, HeatmapOptions, SeriesUpdateD
2
2
  import { EventEmitter } from '../EventEmitter';
3
3
  import { Series } from '../Series';
4
4
  import { Scale } from '../../scales';
5
- import { ChartTheme } from '../../theme';
5
+ import { ChartTheme, ColorScheme } from '../../theme';
6
6
  import { Annotation } from '../annotations';
7
7
  import { SelectedPoint, SelectionMode, HitTestResult, SelectionConfig } from '../selection';
8
8
  import { ResponsiveConfig, ResponsiveState } from '../responsive';
@@ -32,24 +32,20 @@ export declare class ChartImpl implements Chart {
32
32
  private get yScale();
33
33
  theme: ChartTheme;
34
34
  baseTheme: ChartTheme;
35
+ private colorScheme;
35
36
  private cursorOptions;
36
37
  private cursorPosition;
37
38
  private showLegend;
38
39
  private legend;
39
40
  private originalSeriesStyles;
41
+ private hoveredSeriesId;
40
42
  private showControls;
41
43
  private toolbarOptions?;
42
44
  private controls;
43
- private animationFrameId;
44
- private needsFullRender;
45
- private needsOverlayRender;
46
45
  private _isDestroyed;
47
46
  private autoScroll;
48
47
  private showStatistics;
49
48
  private initQueueId;
50
- private initStarted;
51
- private frameCount;
52
- private lastRenderTime;
53
49
  private commandQueue;
54
50
  private annotationQueue;
55
51
  private annotationIdCounter;
@@ -60,14 +56,13 @@ export declare class ChartImpl implements Chart {
60
56
  private selectionRect;
61
57
  private pluginManager;
62
58
  private initialOptions;
59
+ private pluginBridge;
60
+ private axisManager;
61
+ private stateManager;
62
+ private renderLoop;
63
63
  setXScale(scale: Scale): void;
64
64
  setYScale(yAxisId: string, scale: Scale): void;
65
65
  get analysis(): any;
66
- private animationEngine;
67
- private animationConfig;
68
- get animations(): ChartAnimationConfig;
69
- private selectionManager;
70
- private responsiveManager;
71
66
  get tooltip(): any;
72
67
  get loading(): any;
73
68
  get deltaTool(): any;
@@ -84,6 +79,12 @@ export declare class ChartImpl implements Chart {
84
79
  get themeEditor(): any;
85
80
  get sync(): any;
86
81
  get brokenAxis(): any;
82
+ get forecasting(): any;
83
+ private animationEngine;
84
+ private animationConfig;
85
+ get animations(): ChartAnimationConfig;
86
+ private selectionManager;
87
+ private responsiveManager;
87
88
  constructor(options: ChartOptions);
88
89
  /**
89
90
  * Start the chart initialization (called by queue system)
@@ -103,6 +104,15 @@ export declare class ChartImpl implements Chart {
103
104
  private toggleLegend;
104
105
  private initLegend;
105
106
  setTheme(theme: string | ChartTheme): void;
107
+ /**
108
+ * Set the color scheme for multi-series charts
109
+ * @param scheme - Color scheme name ('vibrant', 'pastel', 'neon', 'earth', 'ocean') or ColorScheme object
110
+ */
111
+ setColorScheme(scheme: string | ColorScheme): void;
112
+ /**
113
+ * Get the current color scheme
114
+ */
115
+ getColorScheme(): ColorScheme;
106
116
  getPlotArea(): {
107
117
  x: number;
108
118
  y: number;
@@ -299,15 +309,17 @@ export declare class ChartImpl implements Chart {
299
309
  * Load state from URL hash
300
310
  */
301
311
  fromUrlHash(hash: string, compressed?: boolean): void;
302
- use(plugin: import('../../plugins').ChartPlugin): void;
312
+ use(plugin: any): Promise<void>;
303
313
  resize(): void;
304
314
  requestRender(): void;
305
315
  requestOverlayRender(): void;
306
- render(full?: boolean): void;
316
+ /**
317
+ * Trigger an immediate full render (public API compatibility)
318
+ */
319
+ render(): void;
307
320
  private pixelToDataX;
308
321
  private pixelToDataY;
309
322
  private startRenderLoop;
310
- private scheduleRenderFrame;
311
323
  on<K extends keyof ChartEventMap>(e: K, h: (d: ChartEventMap[K]) => void): void;
312
324
  off<K extends keyof ChartEventMap>(e: K, h: (d: ChartEventMap[K]) => void): void;
313
325
  destroy(): void;
@@ -0,0 +1,33 @@
1
+ import { PluginManagerImpl } from '../../plugins';
2
+
3
+ export declare class ChartPluginBridge {
4
+ private pluginManager;
5
+ constructor(pluginManager: PluginManagerImpl);
6
+ private getAPI;
7
+ get analysis(): any;
8
+ get tooltip(): any;
9
+ get loading(): any;
10
+ get deltaTool(): any;
11
+ get peakTool(): any;
12
+ get regression(): any;
13
+ get radar(): any;
14
+ get ml(): any;
15
+ get snapshot(): any;
16
+ get dataExport(): any;
17
+ get roi(): any;
18
+ get videoRecorder(): any;
19
+ get offscreen(): any;
20
+ get virtualization(): any;
21
+ get themeEditor(): any;
22
+ get sync(): any;
23
+ get brokenAxis(): any;
24
+ get forecasting(): any;
25
+ /**
26
+ * Get a plugin API by name
27
+ */
28
+ getPlugin<T = any>(name: string): T | null;
29
+ /**
30
+ * Get all plugin names
31
+ */
32
+ getPluginNames(): string[];
33
+ }
@@ -0,0 +1,98 @@
1
+ import { NativeWebGLRenderer } from '../../renderer/NativeWebGLRenderer';
2
+ import { OverlayRenderer } from '../OverlayRenderer';
3
+ import { Series } from '../Series';
4
+ import { Scale } from '../../scales';
5
+ import { Bounds, AxisOptions, CursorOptions, PlotArea, ChartEventMap } from '../../types';
6
+ import { EventEmitter } from '../EventEmitter';
7
+ import { SelectionManager } from '../selection';
8
+ import { PluginManagerImpl } from '../../plugins';
9
+
10
+ export interface RenderLoopContext {
11
+ webglCanvas: HTMLCanvasElement;
12
+ overlayCanvas: HTMLCanvasElement;
13
+ overlayCtx: CanvasRenderingContext2D;
14
+ container: HTMLDivElement;
15
+ series: Map<string, Series>;
16
+ viewBounds: Bounds;
17
+ xScale: Scale;
18
+ yScales: Map<string, Scale>;
19
+ yAxisOptionsMap: Map<string, AxisOptions>;
20
+ xAxisOptions: AxisOptions;
21
+ primaryYAxisId: string;
22
+ renderer: NativeWebGLRenderer;
23
+ overlay: OverlayRenderer;
24
+ backgroundColor: [number, number, number, number];
25
+ plotAreaBackground: [number, number, number, number];
26
+ cursorOptions: CursorOptions | null;
27
+ cursorPosition: {
28
+ x: number;
29
+ y: number;
30
+ } | null;
31
+ selectionRect: {
32
+ x: number;
33
+ y: number;
34
+ width: number;
35
+ height: number;
36
+ } | null;
37
+ events: EventEmitter<ChartEventMap>;
38
+ selectionManager: SelectionManager;
39
+ hoveredSeriesId: string | null;
40
+ pluginManager: PluginManagerImpl;
41
+ updateSeriesBuffer: (s: Series) => void;
42
+ getPlotArea: () => PlotArea;
43
+ pixelToDataX: (px: number) => number;
44
+ pixelToDataY: (py: number, yAxisId?: string) => number;
45
+ get yScale(): Scale;
46
+ }
47
+ export declare class ChartRenderLoop {
48
+ private ctx;
49
+ private animationFrameId;
50
+ private needsFullRender;
51
+ private needsOverlayRender;
52
+ private frameCount;
53
+ private lastRenderTime;
54
+ private initStarted;
55
+ constructor(ctx: RenderLoopContext);
56
+ /**
57
+ * Mark that initialization has started
58
+ */
59
+ startInit(): void;
60
+ /**
61
+ * Check if init has started
62
+ */
63
+ isInitStarted(): boolean;
64
+ /**
65
+ * Request a full render (WebGL + overlay)
66
+ */
67
+ requestRender(): void;
68
+ /**
69
+ * Request overlay-only render
70
+ */
71
+ requestOverlayRender(): void;
72
+ /**
73
+ * Schedule render on next animation frame
74
+ */
75
+ private scheduleRenderFrame;
76
+ /**
77
+ * Cancel any pending render
78
+ */
79
+ cancelPendingRender(): void;
80
+ /**
81
+ * Perform the actual rendering
82
+ */
83
+ private performRender;
84
+ /**
85
+ * Get render statistics
86
+ */
87
+ getStats(): {
88
+ frameCount: number;
89
+ lastRenderTime: number;
90
+ hasPendingRender: boolean;
91
+ needsFullRender: boolean;
92
+ needsOverlayRender: boolean;
93
+ };
94
+ /**
95
+ * Reset frame counter
96
+ */
97
+ resetFrameCount(): void;
98
+ }
@@ -38,6 +38,7 @@ export interface RenderContext {
38
38
  pixelToDataX: (px: number) => number;
39
39
  pixelToDataY: (py: number) => number;
40
40
  selectionManager: SelectionManager;
41
+ hoveredSeriesId: string | null;
41
42
  }
42
43
  /**
43
44
  * Prepare series data for WebGL rendering
@@ -0,0 +1,52 @@
1
+ import { Annotation } from '../annotations';
2
+ import { Series } from '../Series';
3
+ import { AxisOptions } from '../../types';
4
+ import { Scale } from '../../scales';
5
+ import { PluginManagerImpl } from '../../plugins';
6
+ import { ChartState, SerializeOptions, DeserializeOptions } from '../../serialization';
7
+
8
+ export interface StateManagerContext {
9
+ viewBounds: {
10
+ xMin: number;
11
+ xMax: number;
12
+ yMin: number;
13
+ yMax: number;
14
+ };
15
+ xAxisOptions: AxisOptions;
16
+ xScale: Scale;
17
+ yScales: Map<string, Scale>;
18
+ primaryYAxisId: string;
19
+ series: Map<string, Series>;
20
+ pluginManager: PluginManagerImpl;
21
+ showLegend: boolean;
22
+ showControls: boolean;
23
+ showStatistics: boolean;
24
+ autoScroll: boolean;
25
+ getAnnotations: () => Annotation[];
26
+ clearAnnotations: () => void;
27
+ addAnnotation: (annotation: Annotation) => void;
28
+ updateYAxis: (id: string, options: Partial<AxisOptions>) => void;
29
+ removeSeries: (id: string) => void;
30
+ addSeries: (options: any) => void;
31
+ requestRender: () => void;
32
+ }
33
+ export declare class ChartStateManager {
34
+ private ctx;
35
+ constructor(ctx: StateManagerContext);
36
+ /**
37
+ * Export complete chart state
38
+ */
39
+ serialize(options?: SerializeOptions): ChartState;
40
+ /**
41
+ * Restore chart from saved state
42
+ */
43
+ deserialize(state: ChartState, options?: DeserializeOptions): void;
44
+ /**
45
+ * Convert current state to URL-safe hash
46
+ */
47
+ toUrlHash(compress?: boolean): string;
48
+ /**
49
+ * Load state from URL hash
50
+ */
51
+ fromUrlHash(hash: string, compressed?: boolean): void;
52
+ }
@@ -57,6 +57,7 @@ export interface Chart {
57
57
  readonly themeEditor: any;
58
58
  readonly sync: any;
59
59
  readonly brokenAxis: any;
60
+ readonly forecasting: any;
60
61
  addAnnotation(annotation: Annotation): string;
61
62
  removeAnnotation(id: string): boolean;
62
63
  updateAnnotation(id: string, updates: Partial<Annotation>): void;
@@ -161,7 +162,7 @@ export interface Chart {
161
162
  setXScale(scale: any): void;
162
163
  setYScale(yAxisId: string, scale: any): void;
163
164
  /** Use a plugin */
164
- use(plugin: ChartPlugin): void;
165
+ use(plugin: ChartPlugin | any): Promise<void>;
165
166
  /** Destroy the chart and cleanup resources */
166
167
  destroy(): void;
167
168
  }