@jigonzalez930209/scichart-engine 0.1.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.
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Theme - Visual styling configuration for SciChart
3
+ *
4
+ * Provides customizable themes for the chart including:
5
+ * - Grid styling
6
+ * - Axis styling
7
+ * - Legend styling
8
+ * - Cursor styling
9
+ */
10
+ export interface GridTheme {
11
+ /** Grid visibility */
12
+ visible: boolean;
13
+ /** Major grid line color */
14
+ majorColor: string;
15
+ /** Minor grid line color */
16
+ minorColor: string;
17
+ /** Major grid line width */
18
+ majorWidth: number;
19
+ /** Minor grid line width */
20
+ minorWidth: number;
21
+ /** Line dash pattern for major lines [dash, gap] */
22
+ majorDash: number[];
23
+ /** Line dash pattern for minor lines [dash, gap] */
24
+ minorDash: number[];
25
+ /** Show minor grid lines */
26
+ showMinor: boolean;
27
+ /** Number of minor divisions between major lines */
28
+ minorDivisions: number;
29
+ }
30
+ export interface AxisTheme {
31
+ /** Axis line color */
32
+ lineColor: string;
33
+ /** Axis line width */
34
+ lineWidth: number;
35
+ /** Tick mark color */
36
+ tickColor: string;
37
+ /** Tick mark length */
38
+ tickLength: number;
39
+ /** Label color */
40
+ labelColor: string;
41
+ /** Label font size */
42
+ labelSize: number;
43
+ /** Axis title color */
44
+ titleColor: string;
45
+ /** Axis title font size */
46
+ titleSize: number;
47
+ /** Font family */
48
+ fontFamily: string;
49
+ }
50
+ export interface LegendTheme {
51
+ /** Legend visibility */
52
+ visible: boolean;
53
+ /** Position */
54
+ position: "top-left" | "top-right" | "bottom-left" | "bottom-right";
55
+ /** Background color */
56
+ backgroundColor: string;
57
+ /** Border color */
58
+ borderColor: string;
59
+ /** Border radius */
60
+ borderRadius: number;
61
+ /** Text color */
62
+ textColor: string;
63
+ /** Font size */
64
+ fontSize: number;
65
+ /** Font family */
66
+ fontFamily: string;
67
+ /** Padding inside legend */
68
+ padding: number;
69
+ /** Gap between items */
70
+ itemGap: number;
71
+ /** Color swatch size */
72
+ swatchSize: number;
73
+ }
74
+ export interface CursorTheme {
75
+ /** Cursor line color */
76
+ lineColor: string;
77
+ /** Cursor line width */
78
+ lineWidth: number;
79
+ /** Cursor line dash pattern */
80
+ lineDash: number[];
81
+ /** Tooltip background color */
82
+ tooltipBackground: string;
83
+ /** Tooltip border color */
84
+ tooltipBorder: string;
85
+ /** Tooltip text color */
86
+ tooltipColor: string;
87
+ /** Tooltip font size */
88
+ tooltipSize: number;
89
+ }
90
+ export interface ChartTheme {
91
+ /** Theme name */
92
+ name: string;
93
+ /** Background color */
94
+ backgroundColor: string;
95
+ /** Plot area border color */
96
+ plotBorderColor: string;
97
+ /** Grid theme */
98
+ grid: GridTheme;
99
+ /** X-axis theme */
100
+ xAxis: AxisTheme;
101
+ /** Y-axis theme */
102
+ yAxis: AxisTheme;
103
+ /** Legend theme */
104
+ legend: LegendTheme;
105
+ /** Cursor theme */
106
+ cursor: CursorTheme;
107
+ }
108
+ export declare const DARK_THEME: ChartTheme;
109
+ export declare const MIDNIGHT_THEME: ChartTheme;
110
+ /** Light theme - Clean white background */
111
+ export declare const LIGHT_THEME: ChartTheme;
112
+ /** Electrochemistry theme - Professional blue tones */
113
+ export declare const ELECTROCHEM_THEME: ChartTheme;
114
+ /**
115
+ * Create a custom theme by merging with base theme
116
+ */
117
+ export declare function createTheme(base: ChartTheme, overrides: Partial<ChartTheme>): ChartTheme;
118
+ /**
119
+ * Get a theme by name
120
+ */
121
+ export declare function getThemeByName(name: string): ChartTheme;
122
+ /** Default theme export */
123
+ export declare const DEFAULT_THEME: ChartTheme;
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Core type definitions for SciChart Engine
3
+ */
4
+ /** 2D point */
5
+ export interface Point {
6
+ x: number;
7
+ y: number;
8
+ }
9
+ /** Rectangular bounds */
10
+ export interface Bounds {
11
+ xMin: number;
12
+ xMax: number;
13
+ yMin: number;
14
+ yMax: number;
15
+ }
16
+ /** Range tuple [min, max] */
17
+ export type Range = [number, number];
18
+ export type ScaleType = "linear" | "log";
19
+ export interface AxisOptions {
20
+ /** Scale type */
21
+ scale?: ScaleType;
22
+ /** Axis label (e.g., 'E / V') */
23
+ label?: string;
24
+ /** Unit for formatting (e.g., 'V', 'A') */
25
+ unit?: string;
26
+ /** Unit prefix: 'auto' for automatic (µ, n, m, etc.) */
27
+ prefix?: "auto" | "µ" | "n" | "m" | "" | "k" | "M";
28
+ /** Fixed minimum value */
29
+ min?: number;
30
+ /** Fixed maximum value */
31
+ max?: number;
32
+ /** Enable autoscaling */
33
+ auto?: boolean;
34
+ }
35
+ export type SeriesType = "line" | "scatter" | "line+scatter";
36
+ export interface SeriesData {
37
+ /** X values (potential, time, etc.) */
38
+ x: Float32Array | Float64Array;
39
+ /** Y values (current, charge, etc.) */
40
+ y: Float32Array | Float64Array;
41
+ }
42
+ export interface SeriesStyle {
43
+ /** Line/point color (hex or rgb) */
44
+ color?: string;
45
+ /** Line width in pixels */
46
+ width?: number;
47
+ /** Opacity (0-1) */
48
+ opacity?: number;
49
+ /** For scatter: point size */
50
+ pointSize?: number;
51
+ /** Smoothing factor (0 = none, 1 = full) */
52
+ smoothing?: number;
53
+ }
54
+ export interface SeriesOptions {
55
+ /** Unique identifier */
56
+ id: string;
57
+ /** Series type */
58
+ type: SeriesType;
59
+ /** Data arrays */
60
+ data: SeriesData;
61
+ /** Visual style */
62
+ style?: SeriesStyle;
63
+ /** Visibility */
64
+ visible?: boolean;
65
+ /** Cycle number (for CV) */
66
+ cycle?: number;
67
+ }
68
+ export interface SeriesUpdateData {
69
+ /** New X values */
70
+ x?: Float32Array | Float64Array;
71
+ /** New Y values */
72
+ y?: Float32Array | Float64Array;
73
+ /** If true, append to existing data; if false, replace */
74
+ append?: boolean;
75
+ }
76
+ export interface ChartOptions {
77
+ /** Target container element */
78
+ container: HTMLDivElement;
79
+ /** X-axis configuration */
80
+ xAxis?: AxisOptions;
81
+ /** Y-axis configuration */
82
+ yAxis?: AxisOptions;
83
+ /** Background color (overrides theme) */
84
+ background?: string;
85
+ /** Device pixel ratio (default: window.devicePixelRatio) */
86
+ devicePixelRatio?: number;
87
+ /** Theme name or custom theme object */
88
+ theme?: string | object;
89
+ /** Show legend (default: from theme) */
90
+ showLegend?: boolean;
91
+ /** Initial legend position {x, y} in pixels relative to chart area */
92
+ legendPosition?: {
93
+ x: number;
94
+ y: number;
95
+ };
96
+ /** Show in-chart controls (default: false) */
97
+ showControls?: boolean;
98
+ }
99
+ export interface ZoomOptions {
100
+ /** X-axis range [min, max] */
101
+ x?: Range;
102
+ /** Y-axis range [min, max] */
103
+ y?: Range;
104
+ /** Animate the transition */
105
+ animate?: boolean;
106
+ }
107
+ export interface CursorOptions {
108
+ /** Enable cursor */
109
+ enabled?: boolean;
110
+ /** Snap to nearest data point */
111
+ snap?: boolean;
112
+ /** Show crosshair lines */
113
+ crosshair?: boolean;
114
+ /** Custom tooltip formatter */
115
+ formatter?: (x: number, y: number, seriesId: string) => string;
116
+ }
117
+ export interface ZoomEvent {
118
+ x: Range;
119
+ y: Range;
120
+ }
121
+ export interface PanEvent {
122
+ deltaX: number;
123
+ deltaY: number;
124
+ }
125
+ export interface HoverEvent {
126
+ point: Point;
127
+ seriesId: string;
128
+ dataIndex: number;
129
+ }
130
+ export interface ClickEvent {
131
+ point: Point;
132
+ seriesId?: string;
133
+ dataIndex?: number;
134
+ }
135
+ /** Chart event map for type-safe event handling */
136
+ export interface ChartEventMap {
137
+ zoom: ZoomEvent;
138
+ pan: PanEvent;
139
+ hover: HoverEvent | null;
140
+ click: ClickEvent;
141
+ resize: {
142
+ width: number;
143
+ height: number;
144
+ };
145
+ render: {
146
+ fps: number;
147
+ frameTime: number;
148
+ };
149
+ legendMove: {
150
+ x: number;
151
+ y: number;
152
+ };
153
+ autoScale: undefined;
154
+ }
155
+ /** GPU uniform values */
156
+ export interface Uniforms {
157
+ scale: [number, number];
158
+ translate: [number, number];
159
+ color: [number, number, number, number];
160
+ resolution: [number, number];
161
+ }
162
+ /** Buffer configuration */
163
+ export interface BufferConfig {
164
+ usage: "static" | "dynamic" | "stream";
165
+ data: Float32Array;
166
+ }
167
+ /** Render state */
168
+ export interface RenderState {
169
+ needsRender: boolean;
170
+ lastFrameTime: number;
171
+ frameCount: number;
172
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * LTTB (Largest-Triangle-Three-Buckets) Downsampling Algorithm
3
+ *
4
+ * This algorithm downsamples time-series data while preserving visual features.
5
+ * It's much better than naive sampling for preserving peaks and valleys.
6
+ *
7
+ * Reference: https://skemman.is/bitstream/1946/15343/3/SS_MSthesis.pdf
8
+ */
9
+ export interface DownsampleResult {
10
+ x: Float32Array;
11
+ y: Float32Array;
12
+ /** Original indices of selected points */
13
+ indices: Uint32Array;
14
+ }
15
+ /**
16
+ * Downsample data using LTTB algorithm
17
+ *
18
+ * @param x - X values (e.g., potential)
19
+ * @param y - Y values (e.g., current)
20
+ * @param targetPoints - Number of output points
21
+ * @returns Downsampled data
22
+ */
23
+ export declare function lttbDownsample(x: Float32Array | Float64Array, y: Float32Array | Float64Array, targetPoints: number): DownsampleResult;
24
+ /**
25
+ * Min-Max per bucket downsampling
26
+ *
27
+ * Simpler alternative to LTTB that preserves extremes in each bucket.
28
+ * Uses 2 points per bucket (min and max), so output is ~2x target.
29
+ */
30
+ export declare function minMaxDownsample(x: Float32Array | Float64Array, y: Float32Array | Float64Array, bucketCount: number): DownsampleResult;
31
+ /**
32
+ * Calculate optimal target points based on canvas width
33
+ */
34
+ export declare function calculateTargetPoints(dataLength: number, canvasWidth: number, pointsPerPixel?: number): number;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Downsampling Web Worker
3
+ *
4
+ * Performs CPU-intensive downsampling off the main thread.
5
+ *
6
+ * Usage:
7
+ * ```typescript
8
+ * const worker = new Worker(new URL('./downsample.worker.ts', import.meta.url));
9
+ *
10
+ * worker.postMessage({
11
+ * type: 'downsample',
12
+ * x: xArray,
13
+ * y: yArray,
14
+ * targetPoints: 1000,
15
+ * algorithm: 'lttb'
16
+ * });
17
+ *
18
+ * worker.onmessage = (e) => {
19
+ * const { x, y, indices } = e.data;
20
+ * chart.setDownsampledData(x, y);
21
+ * };
22
+ * ```
23
+ */
24
+ interface DownsampleRequestMessage {
25
+ type: 'downsample';
26
+ id?: string;
27
+ x: Float32Array | Float64Array;
28
+ y: Float32Array | Float64Array;
29
+ targetPoints: number;
30
+ algorithm?: 'lttb' | 'minmax';
31
+ }
32
+ interface DownsampleResponseMessage {
33
+ type: 'downsample-result';
34
+ id?: string;
35
+ x: Float32Array;
36
+ y: Float32Array;
37
+ indices: Uint32Array;
38
+ originalLength: number;
39
+ duration: number;
40
+ }
41
+ interface ErrorMessage {
42
+ type: 'error';
43
+ id?: string;
44
+ error: string;
45
+ }
46
+ export type { DownsampleRequestMessage, DownsampleResponseMessage, ErrorMessage };
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@jigonzalez930209/scichart-engine",
3
+ "version": "0.1.0",
4
+ "author": "jigonzalez930209",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/jigonzalez930209/scichart-engine.git"
9
+ },
10
+ "keywords": [
11
+ "chart",
12
+ "webgl",
13
+ "scientific",
14
+ "performance",
15
+ "data-visualization",
16
+ "react",
17
+ "electrochemical"
18
+ ],
19
+ "description": "A high-performance scientific charting engine for web applications.",
20
+ "type": "module",
21
+ "main": "./dist/scichart-engine.umd.js",
22
+ "module": "./dist/scichart-engine.es.js",
23
+ "types": "./dist/index.d.ts",
24
+ "exports": {
25
+ ".": {
26
+ "types": "./dist/index.d.ts",
27
+ "import": "./dist/scichart-engine.es.js",
28
+ "require": "./dist/scichart-engine.umd.js"
29
+ }
30
+ },
31
+ "files": [
32
+ "dist",
33
+ "README.md",
34
+ "LICENSE"
35
+ ],
36
+ "peerDependencies": {
37
+ "react": ">=16.8.0",
38
+ "react-dom": ">=16.8.0"
39
+ },
40
+ "devDependencies": {
41
+ "@types/node": "^25.0.3",
42
+ "@types/react": "^18.2.0",
43
+ "@types/react-dom": "^18.2.0",
44
+ "typescript": "^5.2.2",
45
+ "vite": "^5.0.0",
46
+ "vite-plugin-dts": "^3.6.0",
47
+ "vitepress": "^1.0.0-rc.31"
48
+ },
49
+ "scripts": {
50
+ "dev": "vite",
51
+ "build": "tsc && vite build -c vite.config.lib.ts",
52
+ "preview": "vite preview",
53
+ "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
54
+ "docs:dev": "vitepress dev docs",
55
+ "docs:build": "vitepress build docs",
56
+ "docs:preview": "vitepress preview docs"
57
+ }
58
+ }