@hema-to/regl-scatterplot 1.14.1-hemato.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.
- package/LICENSE +21 -0
- package/README.md +1110 -0
- package/dist/regl-scatterplot.esm.d.ts +126 -0
- package/dist/regl-scatterplot.esm.js +9962 -0
- package/dist/regl-scatterplot.js +9385 -0
- package/dist/regl-scatterplot.min.js +8 -0
- package/dist/types.d.ts +306 -0
- package/package.json +100 -0
- package/src/bg.fs +13 -0
- package/src/bg.vs +16 -0
- package/src/constants.js +189 -0
- package/src/index.js +4654 -0
- package/src/kdbush-class.js +369 -0
- package/src/kdbush-worker.js +20 -0
- package/src/kdbush.js +69 -0
- package/src/lasso-manager/constants.js +7 -0
- package/src/lasso-manager/create-long-press-animations.js +257 -0
- package/src/lasso-manager/create-long-press-elements.js +68 -0
- package/src/lasso-manager/index.js +781 -0
- package/src/lasso-manager/utils.js +40 -0
- package/src/point-simple.fs +10 -0
- package/src/point-update.fs +21 -0
- package/src/point-update.vs +13 -0
- package/src/point.fs +22 -0
- package/src/point.vs +124 -0
- package/src/renderer.js +252 -0
- package/src/spline-curve-worker.js +271 -0
- package/src/spline-curve.js +23 -0
- package/src/types.d.ts +306 -0
- package/src/utils.js +598 -0
package/package.json
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hema-to/regl-scatterplot",
|
|
3
|
+
"version": "1.14.1-hemato.0",
|
|
4
|
+
"description": "A WebGL-Powered Scalable Interactive Scatter Plot Library",
|
|
5
|
+
"author": "Fritz Lekschas",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"scatterplot",
|
|
8
|
+
"2d scatter",
|
|
9
|
+
"interactive data visualization",
|
|
10
|
+
"regl",
|
|
11
|
+
"WebGL",
|
|
12
|
+
"embedding plot"
|
|
13
|
+
],
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"type": "module",
|
|
16
|
+
"main": "dist/regl-scatterplot.js",
|
|
17
|
+
"module": "dist/regl-scatterplot.esm.js",
|
|
18
|
+
"types": "dist/regl-scatterplot.esm.d.ts",
|
|
19
|
+
"files": [
|
|
20
|
+
"src/*",
|
|
21
|
+
"dist/*"
|
|
22
|
+
],
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "npm run build-library; npm run build-demo",
|
|
28
|
+
"build-library": "rm -rf dist/*; rollup -c; cp src/types.d.ts dist/; sed -i 's/\\.\\/renderer/\\.\\/regl-scatterplot.esm/g' dist/types.d.ts; tsc dist/*.esm.js --allowJs --declaration --emitDeclarationOnly",
|
|
29
|
+
"build-demo": "vite build",
|
|
30
|
+
"deploy": "npm run build-demo; touch docs/.nojekyll; gh-pages -d docs -t --git git",
|
|
31
|
+
"lint": "biome check --write .",
|
|
32
|
+
"precommit": "npm run test",
|
|
33
|
+
"prepublishOnly": "npm run test; rm -rf dist/*; npm run build;",
|
|
34
|
+
"prerelease": "rm -rf dist/*; npm run build; zip -r dist.zip dist",
|
|
35
|
+
"pretest": "npm run lint",
|
|
36
|
+
"prestart": "cp scripts/pre-commit .git/hooks/ && chmod +x .git/hooks/pre-commit && echo 'pre-commit hook copied'",
|
|
37
|
+
"start": "vite --port=3000",
|
|
38
|
+
"test": "vitest run",
|
|
39
|
+
"coverage": "vitest run --coverage"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@flekschas/utils": "^0.32.2",
|
|
43
|
+
"dom-2d-camera": "^2.2.6",
|
|
44
|
+
"earcut": "^3.0.1",
|
|
45
|
+
"gl-matrix": "~3.4.3",
|
|
46
|
+
"pub-sub-es": "~3.0.0",
|
|
47
|
+
"regl": "~2.1.1",
|
|
48
|
+
"regl-line": "~1.1.1"
|
|
49
|
+
},
|
|
50
|
+
"peerDependencies": {
|
|
51
|
+
"pub-sub-es": "~3.0.0",
|
|
52
|
+
"regl": "~2.1.1"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@babel/core": "^7.26.0",
|
|
56
|
+
"@babel/plugin-transform-regenerator": "^7.25.9",
|
|
57
|
+
"@babel/polyfill": "^7.12.1",
|
|
58
|
+
"@babel/preset-env": "^7.26.0",
|
|
59
|
+
"@biomejs/biome": "^1.9.4",
|
|
60
|
+
"@rollup/plugin-babel": "^6.0.3",
|
|
61
|
+
"@rollup/plugin-commonjs": "^28.0.1",
|
|
62
|
+
"@rollup/plugin-json": "^6.0.0",
|
|
63
|
+
"@rollup/plugin-node-resolve": "^15.3.0",
|
|
64
|
+
"@rollup/plugin-terser": "^0.4.3",
|
|
65
|
+
"@tweakpane/core": "^2.0.5",
|
|
66
|
+
"@types/d3-scale": "^4.0.6",
|
|
67
|
+
"@types/node": "^22.9.3",
|
|
68
|
+
"@vitest/browser": "^3.0.9",
|
|
69
|
+
"@vitest/coverage-v8": "^3.0.9",
|
|
70
|
+
"apache-arrow": "^18.0.0",
|
|
71
|
+
"browser-env": "^3.3.0",
|
|
72
|
+
"d3-axis": "^3.0.0",
|
|
73
|
+
"d3-random": "^3.0.1",
|
|
74
|
+
"d3-scale": "^4.0.2",
|
|
75
|
+
"d3-selection": "^3.0.0",
|
|
76
|
+
"esm": "^3.2.25",
|
|
77
|
+
"gh-pages": "^6.2.0",
|
|
78
|
+
"merge": "^2.1.1",
|
|
79
|
+
"playwright": "^1.49.0",
|
|
80
|
+
"rollup": "^4.27.4",
|
|
81
|
+
"rollup-plugin-filesize": "^10.0.0",
|
|
82
|
+
"tweakpane": "^4.0.5",
|
|
83
|
+
"typescript": "~5.7.2",
|
|
84
|
+
"vite": "^6.2.3",
|
|
85
|
+
"vite-plugin-virtual-html-template": "^1.1.0",
|
|
86
|
+
"vitest": "^3.0.9"
|
|
87
|
+
},
|
|
88
|
+
"engines": {
|
|
89
|
+
"npm": ">=7.0.0",
|
|
90
|
+
"node": ">=20.0.0"
|
|
91
|
+
},
|
|
92
|
+
"homepage": "https://github.com/flekschas/regl-scatterplot",
|
|
93
|
+
"repository": {
|
|
94
|
+
"type": "git",
|
|
95
|
+
"url": "git://github.com/flekschas/regl-scatterplot.git"
|
|
96
|
+
},
|
|
97
|
+
"bugs": {
|
|
98
|
+
"url": "https://github.com/flekschas/regl-scatterplot/issues"
|
|
99
|
+
}
|
|
100
|
+
}
|
package/src/bg.fs
ADDED
package/src/bg.vs
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
const VERTEX_SHADER = `
|
|
2
|
+
precision mediump float;
|
|
3
|
+
|
|
4
|
+
uniform mat4 modelViewProjection;
|
|
5
|
+
|
|
6
|
+
attribute vec2 position;
|
|
7
|
+
|
|
8
|
+
varying vec2 uv;
|
|
9
|
+
|
|
10
|
+
void main () {
|
|
11
|
+
uv = position;
|
|
12
|
+
gl_Position = modelViewProjection * vec4(-1.0 + 2.0 * uv.x, 1.0 - 2.0 * uv.y, 0, 1);
|
|
13
|
+
}
|
|
14
|
+
`;
|
|
15
|
+
|
|
16
|
+
export default VERTEX_SHADER;
|
package/src/constants.js
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cubicIn,
|
|
3
|
+
cubicInOut,
|
|
4
|
+
cubicOut,
|
|
5
|
+
linear,
|
|
6
|
+
quadIn,
|
|
7
|
+
quadInOut,
|
|
8
|
+
quadOut,
|
|
9
|
+
} from '@flekschas/utils';
|
|
10
|
+
|
|
11
|
+
export const AUTO = 'auto';
|
|
12
|
+
|
|
13
|
+
export const COLOR_NORMAL_IDX = 0;
|
|
14
|
+
export const COLOR_ACTIVE_IDX = 1;
|
|
15
|
+
export const COLOR_HOVER_IDX = 2;
|
|
16
|
+
export const COLOR_BG_IDX = 3;
|
|
17
|
+
export const COLOR_NUM_STATES = 4;
|
|
18
|
+
export const FLOAT_BYTES = Float32Array.BYTES_PER_ELEMENT;
|
|
19
|
+
export const GL_EXTENSIONS = [
|
|
20
|
+
'OES_texture_float',
|
|
21
|
+
'OES_element_index_uint',
|
|
22
|
+
'WEBGL_color_buffer_float',
|
|
23
|
+
'EXT_float_blend',
|
|
24
|
+
];
|
|
25
|
+
export const CLEAR_OPTIONS = {
|
|
26
|
+
color: [0, 0, 0, 0], // Transparent background color
|
|
27
|
+
depth: 1,
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export const MOUSE_MODE_PANZOOM = 'panZoom';
|
|
31
|
+
export const MOUSE_MODE_LASSO = 'lasso';
|
|
32
|
+
export const MOUSE_MODE_ROTATE = 'rotate';
|
|
33
|
+
export const MOUSE_MODES = [
|
|
34
|
+
MOUSE_MODE_PANZOOM,
|
|
35
|
+
MOUSE_MODE_LASSO,
|
|
36
|
+
MOUSE_MODE_ROTATE,
|
|
37
|
+
];
|
|
38
|
+
export const DEFAULT_MOUSE_MODE = MOUSE_MODE_PANZOOM;
|
|
39
|
+
|
|
40
|
+
// Easing
|
|
41
|
+
export const EASING_FNS = {
|
|
42
|
+
cubicIn,
|
|
43
|
+
cubicInOut,
|
|
44
|
+
cubicOut,
|
|
45
|
+
linear,
|
|
46
|
+
quadIn,
|
|
47
|
+
quadInOut,
|
|
48
|
+
quadOut,
|
|
49
|
+
};
|
|
50
|
+
export const DEFAULT_EASING = cubicInOut;
|
|
51
|
+
|
|
52
|
+
export const CONTINUOUS = 'continuous';
|
|
53
|
+
export const CATEGORICAL = 'categorical';
|
|
54
|
+
export const VALUE_ZW_DATA_TYPES = [CONTINUOUS, CATEGORICAL];
|
|
55
|
+
|
|
56
|
+
// Default lasso
|
|
57
|
+
export const LASSO_CLEAR_ON_DESELECT = 'deselect';
|
|
58
|
+
export const LASSO_CLEAR_ON_END = 'lassoEnd';
|
|
59
|
+
export const LASSO_CLEAR_EVENTS = [LASSO_CLEAR_ON_DESELECT, LASSO_CLEAR_ON_END];
|
|
60
|
+
export const LASSO_BRUSH_MIN_MIN_DIST = 3;
|
|
61
|
+
export const DEFAULT_LASSO_COLOR = [0, 0.666666667, 1, 1];
|
|
62
|
+
export const DEFAULT_LASSO_LINE_WIDTH = 2;
|
|
63
|
+
export const DEFAULT_LASSO_INITIATOR = false;
|
|
64
|
+
export const DEFAULT_LASSO_INITIATOR_BACKGROUND = 'rgba(255, 255, 255, 0.1)';
|
|
65
|
+
export const DEFAULT_LASSO_MIN_DELAY = 10;
|
|
66
|
+
export const DEFAULT_LASSO_MIN_DIST = 3;
|
|
67
|
+
export const DEFAULT_LASSO_CLEAR_EVENT = LASSO_CLEAR_ON_END;
|
|
68
|
+
export const DEFAULT_LASSO_ON_LONG_PRESS = false;
|
|
69
|
+
export const DEFAULT_LASSO_LONG_PRESS_TIME = 750;
|
|
70
|
+
export const DEFAULT_LASSO_LONG_PRESS_AFTER_EFFECT_TIME = 500;
|
|
71
|
+
export const DEFAULT_LASSO_LONG_PRESS_EFFECT_DELAY = 100;
|
|
72
|
+
export const DEFAULT_LASSO_LONG_PRESS_REVERT_EFFECT_TIME = 250;
|
|
73
|
+
export const DEFAULT_LASSO_BRUSH_SIZE = 24;
|
|
74
|
+
export const DEFAULT_LASSO_MODE = null;
|
|
75
|
+
|
|
76
|
+
// Key mapping
|
|
77
|
+
export const KEY_ACTION_INTERSECT = 'intersect';
|
|
78
|
+
export const KEY_ACTION_LASSO = 'lasso';
|
|
79
|
+
export const KEY_ACTION_ROTATE = 'rotate';
|
|
80
|
+
export const KEY_ACTION_MERGE = 'merge';
|
|
81
|
+
export const KEY_ACTION_REMOVE = 'remove';
|
|
82
|
+
export const KEY_ACTIONS = [
|
|
83
|
+
KEY_ACTION_LASSO,
|
|
84
|
+
KEY_ACTION_ROTATE,
|
|
85
|
+
KEY_ACTION_INTERSECT,
|
|
86
|
+
KEY_ACTION_MERGE,
|
|
87
|
+
KEY_ACTION_REMOVE,
|
|
88
|
+
];
|
|
89
|
+
export const KEY_ALT = 'alt';
|
|
90
|
+
export const KEY_CMD = 'cmd';
|
|
91
|
+
export const KEY_CTRL = 'ctrl';
|
|
92
|
+
export const KEY_META = 'meta';
|
|
93
|
+
export const KEY_SHIFT = 'shift';
|
|
94
|
+
export const KEYS = [KEY_ALT, KEY_CMD, KEY_CTRL, KEY_META, KEY_SHIFT];
|
|
95
|
+
export const DEFAULT_ACTION_KEY_MAP = {
|
|
96
|
+
[KEY_ACTION_REMOVE]: KEY_ALT,
|
|
97
|
+
[KEY_ACTION_ROTATE]: KEY_ALT,
|
|
98
|
+
[KEY_ACTION_LASSO]: KEY_SHIFT,
|
|
99
|
+
[KEY_ACTION_MERGE]: KEY_CMD,
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// Default attribute
|
|
103
|
+
export const DEFAULT_DATA_ASPECT_RATIO = 1;
|
|
104
|
+
export const DEFAULT_WIDTH = AUTO;
|
|
105
|
+
export const DEFAULT_HEIGHT = AUTO;
|
|
106
|
+
export const DEFAULT_GAMMA = 1;
|
|
107
|
+
|
|
108
|
+
// Default styles
|
|
109
|
+
export const MIN_POINT_SIZE = 1;
|
|
110
|
+
export const DEFAULT_POINT_SCALE_MODE = 'asinh';
|
|
111
|
+
export const DEFAULT_POINT_SIZE = 6;
|
|
112
|
+
export const DEFAULT_POINT_SIZE_SELECTED = 2;
|
|
113
|
+
export const DEFAULT_POINT_OUTLINE_WIDTH = 2;
|
|
114
|
+
export const DEFAULT_SIZE_BY = null;
|
|
115
|
+
export const DEFAULT_POINT_CONNECTION_SIZE = 2;
|
|
116
|
+
export const DEFAULT_POINT_CONNECTION_SIZE_ACTIVE = 2;
|
|
117
|
+
export const DEFAULT_POINT_CONNECTION_SIZE_BY = null;
|
|
118
|
+
export const DEFAULT_POINT_CONNECTION_OPACITY = null;
|
|
119
|
+
export const DEFAULT_POINT_CONNECTION_OPACITY_BY = null;
|
|
120
|
+
export const DEFAULT_POINT_CONNECTION_OPACITY_ACTIVE = 0.66;
|
|
121
|
+
export const DEFAULT_OPACITY = 1;
|
|
122
|
+
export const DEFAULT_OPACITY_BY = null;
|
|
123
|
+
export const DEFAULT_OPACITY_BY_DENSITY_FILL = 0.15;
|
|
124
|
+
export const DEFAULT_OPACITY_BY_DENSITY_DEBOUNCE_TIME = 25;
|
|
125
|
+
export const DEFAULT_OPACITY_INACTIVE_MAX = 1;
|
|
126
|
+
export const DEFAULT_OPACITY_INACTIVE_SCALE = 1;
|
|
127
|
+
|
|
128
|
+
// Default colors
|
|
129
|
+
export const DEFAULT_COLORMAP = [];
|
|
130
|
+
export const DEFAULT_COLOR_BY = null;
|
|
131
|
+
export const DEFAULT_COLOR_NORMAL = [0.66, 0.66, 0.66, DEFAULT_OPACITY];
|
|
132
|
+
export const DEFAULT_COLOR_ACTIVE = [0, 0.55, 1, 1];
|
|
133
|
+
export const DEFAULT_COLOR_HOVER = [1, 1, 1, 1];
|
|
134
|
+
export const DEFAULT_COLOR_BG = [0, 0, 0, 1];
|
|
135
|
+
export const DEFAULT_POINT_CONNECTION_COLOR_BY = null;
|
|
136
|
+
export const DEFAULT_POINT_CONNECTION_COLOR_NORMAL = [0.66, 0.66, 0.66, 0.2];
|
|
137
|
+
export const DEFAULT_POINT_CONNECTION_COLOR_ACTIVE = [0, 0.55, 1, 1];
|
|
138
|
+
export const DEFAULT_POINT_CONNECTION_COLOR_HOVER = [1, 1, 1, 1];
|
|
139
|
+
|
|
140
|
+
// Annotations
|
|
141
|
+
export const DEFAULT_ANNOTATION_LINE_COLOR = [1, 1, 1, 0.5];
|
|
142
|
+
export const DEFAULT_ANNOTATION_LINE_WIDTH = 1;
|
|
143
|
+
export const DEFAULT_ANNOTATION_HVLINE_LIMIT = 1000;
|
|
144
|
+
|
|
145
|
+
// Default view
|
|
146
|
+
export const DEFAULT_TARGET = [0, 0];
|
|
147
|
+
export const DEFAULT_DISTANCE = 1;
|
|
148
|
+
export const DEFAULT_ROTATION = 0;
|
|
149
|
+
// biome-ignore format: the array should not be formatted
|
|
150
|
+
export const DEFAULT_VIEW = new Float32Array([
|
|
151
|
+
1, 0, 0, 0,
|
|
152
|
+
0, 1, 0, 0,
|
|
153
|
+
0, 0, 1, 0,
|
|
154
|
+
0, 0, 0, 1,
|
|
155
|
+
]);
|
|
156
|
+
|
|
157
|
+
// Error codes
|
|
158
|
+
export const IMAGE_LOAD_ERROR = 'IMAGE_LOAD_ERROR';
|
|
159
|
+
|
|
160
|
+
// Default misc
|
|
161
|
+
export const DEFAULT_BACKGROUND_IMAGE = null;
|
|
162
|
+
export const DEFAULT_SHOW_RETICLE = false;
|
|
163
|
+
export const DEFAULT_RETICLE_COLOR = [1, 1, 1, 0.5];
|
|
164
|
+
export const DEFAULT_DESELECT_ON_DBL_CLICK = true;
|
|
165
|
+
export const DEFAULT_DESELECT_ON_ESCAPE = true;
|
|
166
|
+
export const DEFAULT_SHOW_POINT_CONNECTIONS = false;
|
|
167
|
+
export const DEFAULT_POINT_CONNECTION_MAX_INT_POINTS_PER_SEGMENT = 100;
|
|
168
|
+
export const DEFAULT_POINT_CONNECTION_INT_POINTS_TOLERANCE = 1 / 500;
|
|
169
|
+
export const DEFAULT_POINT_SIZE_MOUSE_DETECTION = 'auto';
|
|
170
|
+
export const DEFAULT_PERFORMANCE_MODE = false;
|
|
171
|
+
export const SINGLE_CLICK_DELAY = 200;
|
|
172
|
+
export const LONG_CLICK_TIME = 500;
|
|
173
|
+
export const Z_NAMES = new Set(['z', 'valueZ', 'valueA', 'value1', 'category']);
|
|
174
|
+
export const W_NAMES = new Set(['w', 'valueW', 'valueB', 'value2', 'value']);
|
|
175
|
+
export const DEFAULT_IMAGE_LOAD_TIMEOUT = 15000;
|
|
176
|
+
export const DEFAULT_SPATIAL_INDEX_USE_WORKER = undefined;
|
|
177
|
+
export const DEFAULT_CAMERA_IS_FIXED = false;
|
|
178
|
+
export const DEFAULT_ANTI_ALIASING = 0.5;
|
|
179
|
+
export const DEFAULT_PIXEL_ALIGNED = false;
|
|
180
|
+
export const DEFAULT_LASSO_TYPE = 'lasso';
|
|
181
|
+
export const SKIP_DEPRECATION_VALUE_TRANSLATION = Symbol(
|
|
182
|
+
'SKIP_DEPRECATION_VALUE_TRANSLATION',
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
// Error messages
|
|
186
|
+
export const ERROR_POINTS_NOT_DRAWN = 'Points have not been drawn';
|
|
187
|
+
export const ERROR_INSTANCE_IS_DESTROYED = 'The instance was already destroyed';
|
|
188
|
+
export const ERROR_IS_DRAWING =
|
|
189
|
+
'Ignoring draw call as the previous draw call has not yet finished. To avoid this warning `await` the draw call.';
|