@fusion.dev/helix-plot 0.0.0-dev

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 (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +147 -0
  3. package/dist/connect-plot/connect-plot.d.ts +125 -0
  4. package/dist/connect-plot/connect-plot.d.ts.map +1 -0
  5. package/dist/connect-plot/connect-plot.js +130 -0
  6. package/dist/connect-plot/connect-plot.js.map +1 -0
  7. package/dist/connect-spatial-heatmap/connect-spatial-heatmap.d.ts +43 -0
  8. package/dist/connect-spatial-heatmap/connect-spatial-heatmap.d.ts.map +1 -0
  9. package/dist/connect-spatial-heatmap/connect-spatial-heatmap.js +15 -0
  10. package/dist/connect-spatial-heatmap/connect-spatial-heatmap.js.map +1 -0
  11. package/dist/connect-spatial-scatter-chart/connect-spatial-scatter-chart.d.ts +34 -0
  12. package/dist/connect-spatial-scatter-chart/connect-spatial-scatter-chart.d.ts.map +1 -0
  13. package/dist/connect-spatial-scatter-chart/connect-spatial-scatter-chart.js +7 -0
  14. package/dist/connect-spatial-scatter-chart/connect-spatial-scatter-chart.js.map +1 -0
  15. package/dist/connect-spatial-surface-chart/connect-spatial-surface-chart.d.ts +39 -0
  16. package/dist/connect-spatial-surface-chart/connect-spatial-surface-chart.d.ts.map +1 -0
  17. package/dist/connect-spatial-surface-chart/connect-spatial-surface-chart.js +7 -0
  18. package/dist/connect-spatial-surface-chart/connect-spatial-surface-chart.js.map +1 -0
  19. package/dist/index.d.ts +5 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +5 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/three/heatmap-driver.d.ts +36 -0
  24. package/dist/three/heatmap-driver.d.ts.map +1 -0
  25. package/dist/three/heatmap-driver.js +120 -0
  26. package/dist/three/heatmap-driver.js.map +1 -0
  27. package/dist/three/index.d.ts +4 -0
  28. package/dist/three/index.d.ts.map +1 -0
  29. package/dist/three/index.js +4 -0
  30. package/dist/three/index.js.map +1 -0
  31. package/dist/three/scatter-driver.d.ts +38 -0
  32. package/dist/three/scatter-driver.d.ts.map +1 -0
  33. package/dist/three/scatter-driver.js +85 -0
  34. package/dist/three/scatter-driver.js.map +1 -0
  35. package/dist/three/stage.d.ts +66 -0
  36. package/dist/three/stage.d.ts.map +1 -0
  37. package/dist/three/stage.js +446 -0
  38. package/dist/three/stage.js.map +1 -0
  39. package/dist/three/surface-driver.d.ts +39 -0
  40. package/dist/three/surface-driver.d.ts.map +1 -0
  41. package/dist/three/surface-driver.js +150 -0
  42. package/dist/three/surface-driver.js.map +1 -0
  43. package/package.json +68 -0
@@ -0,0 +1,446 @@
1
+ import { pageBudget } from '@fusion.dev/helix-core';
2
+ import { BufferGeometry, CanvasTexture, Float32BufferAttribute, LineBasicMaterial, LineSegments, PerspectiveCamera, Raycaster, Scene, Spherical, Sprite, SpriteMaterial, Vector2, Vector3, WebGLRenderer, } from 'three';
3
+ import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
4
+ const STEP = Math.PI / 12;
5
+ const DURATION = 250;
6
+ const DRAG = 4;
7
+ export const HALF = 1;
8
+ const ease = (at) => (at < 0.5 ? 2 * at * at : 1 - (-2 * at + 2) ** 2 / 2);
9
+ export const tickText = (value) => String(Number(value.toPrecision(6)));
10
+ export const inBox = (axis, value) => {
11
+ const [low, high] = axis.range;
12
+ return high === low ? 0 : ((value - low) / (high - low)) * 2 * HALF - HALF;
13
+ };
14
+ const ring = () => {
15
+ const canvas = document.createElement('canvas');
16
+ canvas.width = canvas.height = 64;
17
+ const context = canvas.getContext('2d');
18
+ if (context) {
19
+ context.beginPath();
20
+ context.arc(32, 32, 24, 0, Math.PI * 2);
21
+ context.lineWidth = 6;
22
+ context.strokeStyle = '#fff';
23
+ context.stroke();
24
+ }
25
+ return new CanvasTexture(canvas);
26
+ };
27
+ const gridLines = (axes) => {
28
+ const lines = [];
29
+ const line = (from, to) => {
30
+ lines.push(...from, ...to);
31
+ };
32
+ const h = HALF;
33
+ for (const a of [-h, h]) {
34
+ for (const b of [-h, h]) {
35
+ line([-h, a, b], [h, a, b]);
36
+ line([a, -h, b], [a, h, b]);
37
+ line([a, b, -h], [a, b, h]);
38
+ }
39
+ }
40
+ for (const x of axes.x.ticks.map((tick) => inBox(axes.x, tick))) {
41
+ line([x, -h, -h], [x, -h, h]);
42
+ line([x, -h, -h], [x, h, -h]);
43
+ }
44
+ for (const z of axes.z.ticks.map((tick) => inBox(axes.z, tick))) {
45
+ line([-h, -h, z], [h, -h, z]);
46
+ line([-h, -h, z], [-h, h, z]);
47
+ }
48
+ for (const y of axes.y.ticks.map((tick) => inBox(axes.y, tick))) {
49
+ line([-h, y, -h], [h, y, -h]);
50
+ line([-h, y, -h], [-h, y, h]);
51
+ }
52
+ return lines;
53
+ };
54
+ export const createStage = (container, options) => {
55
+ const still = () => window.matchMedia?.('(prefers-reduced-motion: reduce)').matches ?? false;
56
+ const renderer = new WebGLRenderer({ alpha: true, antialias: true });
57
+ const screen = window.devicePixelRatio || 1;
58
+ const touch = window.matchMedia?.('(pointer: coarse)').matches ?? false;
59
+ renderer.setPixelRatio(options.density ?? (touch ? Math.min(screen, 2) : Math.min(Math.max(screen * 1.5, 2), 3)));
60
+ renderer.setClearColor(0x000000, 0);
61
+ const canvas = renderer.domElement;
62
+ canvas.style.cssText = 'position:absolute;inset:0;width:100%;height:100%;display:block';
63
+ container.append(canvas);
64
+ const labels = document.createElement('div');
65
+ labels.setAttribute('aria-hidden', 'true');
66
+ labels.style.cssText = 'position:absolute;inset:0;pointer-events:none;overflow:hidden';
67
+ container.append(labels);
68
+ const scene = new Scene();
69
+ const camera = new PerspectiveCamera(35, 1, 0.1, 100);
70
+ camera.position
71
+ .set(3.4, 2.4, 3.8)
72
+ .setLength((Math.sqrt(3) * HALF * 1.1) / Math.sin((35 / 2) * (Math.PI / 180)));
73
+ const controls = new OrbitControls(camera, canvas);
74
+ controls.target.set(0, -0.2 * HALF, 0);
75
+ camera.position.add(controls.target);
76
+ controls.update();
77
+ controls.enableDamping = false;
78
+ controls.enablePan = false;
79
+ controls.minDistance = 2.5;
80
+ controls.maxDistance = 12;
81
+ controls.rotateSpeed = 0.7;
82
+ const gridMaterial = new LineBasicMaterial({ opacity: 0.35, transparent: true });
83
+ const grid = new LineSegments(new BufferGeometry(), gridMaterial);
84
+ scene.add(grid);
85
+ const ringTexture = ring();
86
+ const marker = new Sprite(new SpriteMaterial({ depthTest: false, map: ringTexture }));
87
+ marker.visible = false;
88
+ marker.renderOrder = 1;
89
+ scene.add(marker);
90
+ let axes;
91
+ let colors;
92
+ let font = 'sans-serif';
93
+ let stopped = false;
94
+ let press;
95
+ let hover;
96
+ let place;
97
+ let placed;
98
+ let tracked;
99
+ const tellTracked = () => {
100
+ if (!tracked) {
101
+ return;
102
+ }
103
+ const now = tracked.points.map((point) => point.clone().project(camera));
104
+ const at = now.some((on) => on.z > 1)
105
+ ? undefined
106
+ : now.map((on) => ({ x: (on.x + 1) / 2, y: (1 - on.y) / 2 }));
107
+ const was = tracked.was;
108
+ const moved = at === undefined || was === undefined
109
+ ? at !== was
110
+ : at.some((one, index) => {
111
+ const other = was[index];
112
+ return Math.abs(one.x - other.x) > 1e-4 || Math.abs(one.y - other.y) > 1e-4;
113
+ });
114
+ if (moved) {
115
+ tracked.was = at;
116
+ tracked.heard(at);
117
+ }
118
+ };
119
+ const tellPlace = () => {
120
+ let at;
121
+ if (marker.visible) {
122
+ const on = marker.position.clone().project(camera);
123
+ at = on.z > 1 ? undefined : { x: (on.x + 1) / 2, y: (1 - on.y) / 2 };
124
+ }
125
+ const moved = at === undefined || placed === undefined
126
+ ? at !== placed
127
+ : Math.abs(at.x - placed.x) > 1e-4 || Math.abs(at.y - placed.y) > 1e-4;
128
+ if (moved) {
129
+ placed = at;
130
+ place?.(at);
131
+ }
132
+ };
133
+ const drawLabels = () => {
134
+ if (!axes || !colors) {
135
+ labels.replaceChildren();
136
+ return;
137
+ }
138
+ const width = container.clientWidth;
139
+ const height = container.clientHeight;
140
+ const marks = [];
141
+ const label = (at, text, strong = false) => {
142
+ const on = at.clone().project(camera);
143
+ if (on.z > 1) {
144
+ return;
145
+ }
146
+ const mark = document.createElement('span');
147
+ mark.textContent = text;
148
+ const size = strong ? 'var(--helix-text-sm, 13px)' : 'var(--helix-text-xs, 11px)';
149
+ const weight = strong ? 'var(--helix-weight-semibold, 600)' : 'var(--helix-weight-medium, 500)';
150
+ mark.style.cssText = `position:absolute;left:${((on.x + 1) / 2) * width}px;top:${((1 - on.y) / 2) * height}px;translate:-50% -50%;white-space:nowrap;font-family:${font};font-size:${size};font-weight:${weight};line-height:1;color:${strong ? colors?.ink : colors?.quiet};text-shadow:0 0 3px ${colors?.ground},0 0 3px ${colors?.ground}`;
151
+ marks.push(mark);
152
+ };
153
+ const h = HALF;
154
+ const { x, y, z } = axes;
155
+ for (const tick of x.ticks) {
156
+ label(new Vector3(inBox(x, tick), -h, h + 0.12), tickText(tick));
157
+ }
158
+ for (const tick of z.ticks) {
159
+ label(new Vector3(h + 0.12, -h, inBox(z, tick)), tickText(tick));
160
+ }
161
+ for (const tick of y.ticks.slice(1)) {
162
+ label(new Vector3(-h - 0.12, inBox(y, tick), h), tickText(tick));
163
+ }
164
+ label(new Vector3(0, -h, h + 0.35), x.name, true);
165
+ label(new Vector3(h + 0.62, -h, 0), z.name, true);
166
+ label(new Vector3(-h, h + 0.28, h), y.name, true);
167
+ labels.replaceChildren(...marks);
168
+ for (const mark of marks) {
169
+ const half = mark.offsetWidth / 2;
170
+ const left = Number.parseFloat(mark.style.left);
171
+ const kept = Math.min(Math.max(left, half + 4), width - half - 4);
172
+ if (kept !== left) {
173
+ mark.style.left = `${kept}px`;
174
+ }
175
+ }
176
+ };
177
+ let visible = true;
178
+ let pending = 0;
179
+ let dirty = true;
180
+ const invalidate = () => {
181
+ dirty = true;
182
+ if (!pending && !stopped && visible && container.isConnected) {
183
+ pending = requestAnimationFrame(tick);
184
+ }
185
+ };
186
+ let turn;
187
+ const tick = (now) => {
188
+ pending = 0;
189
+ if (stopped || !visible || !container.isConnected) {
190
+ return;
191
+ }
192
+ if (turn) {
193
+ const through = Math.min((now - turn.start) / DURATION, 1);
194
+ const eased = ease(through);
195
+ const along = new Spherical(turn.from.radius, turn.from.phi + (turn.to.phi - turn.from.phi) * eased, turn.from.theta + (turn.to.theta - turn.from.theta) * eased);
196
+ camera.position.setFromSpherical(along).add(controls.target);
197
+ camera.lookAt(controls.target);
198
+ dirty = true;
199
+ if (through >= 1) {
200
+ turn = undefined;
201
+ }
202
+ }
203
+ if (!dirty) {
204
+ return;
205
+ }
206
+ dirty = false;
207
+ renderer.render(scene, camera);
208
+ drawLabels();
209
+ tellPlace();
210
+ tellTracked();
211
+ if (turn && !pending) {
212
+ pending = requestAnimationFrame(tick);
213
+ }
214
+ };
215
+ controls.addEventListener('change', invalidate);
216
+ const seen = typeof IntersectionObserver === 'function'
217
+ ? new IntersectionObserver((entries) => {
218
+ visible = entries.at(-1)?.isIntersecting ?? true;
219
+ if (visible) {
220
+ invalidate();
221
+ }
222
+ })
223
+ : undefined;
224
+ seen?.observe(container);
225
+ let framed;
226
+ const fit = () => {
227
+ if (!framed) {
228
+ return;
229
+ }
230
+ const { high, low } = framed;
231
+ const toward = camera.position.clone().sub(controls.target).normalize();
232
+ const right = new Vector3(0, 1, 0).cross(toward).normalize();
233
+ const up = toward.clone().cross(right).normalize();
234
+ const tanUp = Math.tan((camera.fov * Math.PI) / 360);
235
+ const tanAcross = tanUp * camera.aspect;
236
+ const corners = [];
237
+ for (const x of [low.x, high.x]) {
238
+ for (const y of [low.y, high.y]) {
239
+ for (const z of [low.z, high.z]) {
240
+ corners.push(new Vector3(x, y, z));
241
+ }
242
+ }
243
+ }
244
+ const distanceFrom = (center) => {
245
+ let far = 0;
246
+ for (const corner of corners) {
247
+ const off = corner.clone().sub(center);
248
+ const ahead = off.dot(toward);
249
+ far = Math.max(far, ahead + Math.abs(off.dot(right)) / tanAcross, ahead + Math.abs(off.dot(up)) / tanUp);
250
+ }
251
+ return far;
252
+ };
253
+ const center = low.clone().add(high).multiplyScalar(0.5);
254
+ let distance = distanceFrom(center);
255
+ for (let round = 0; round < 4; round++) {
256
+ let [left, rightmost, bottom, top] = [Infinity, -Infinity, Infinity, -Infinity];
257
+ for (const corner of corners) {
258
+ const off = corner.clone().sub(center);
259
+ const depth = Math.max(distance - off.dot(toward), 1e-6);
260
+ const across = off.dot(right) / depth / tanAcross;
261
+ const rise = off.dot(up) / depth / tanUp;
262
+ left = Math.min(left, across);
263
+ rightmost = Math.max(rightmost, across);
264
+ bottom = Math.min(bottom, rise);
265
+ top = Math.max(top, rise);
266
+ }
267
+ center
268
+ .add(right.clone().multiplyScalar(((left + rightmost) / 2) * tanAcross * distance))
269
+ .add(up.clone().multiplyScalar(((bottom + top) / 2) * tanUp * distance));
270
+ distance = distanceFrom(center);
271
+ }
272
+ distance *= 1.06;
273
+ controls.target.copy(center);
274
+ camera.position.copy(center).add(toward.multiplyScalar(distance));
275
+ controls.minDistance = distance * 0.35;
276
+ controls.maxDistance = distance * 3;
277
+ camera.lookAt(controls.target);
278
+ controls.update();
279
+ };
280
+ const resize = () => {
281
+ const width = Math.max(container.clientWidth, 1);
282
+ const height = Math.max(container.clientHeight, 1);
283
+ renderer.setSize(width, height, false);
284
+ camera.aspect = width / height;
285
+ camera.updateProjectionMatrix();
286
+ fit();
287
+ invalidate();
288
+ };
289
+ const sized = typeof ResizeObserver === 'function' ? new ResizeObserver(() => resize()) : undefined;
290
+ sized?.observe(container);
291
+ resize();
292
+ const restored = () => invalidate();
293
+ canvas.addEventListener('webglcontextrestored', restored);
294
+ const holder = {
295
+ release: () => renderer.forceContextLoss(),
296
+ restore: () => renderer.forceContextRestore(),
297
+ };
298
+ pageBudget().join(holder);
299
+ const nearby = typeof IntersectionObserver === 'function'
300
+ ? new IntersectionObserver((entries) => {
301
+ if (entries.at(-1)?.isIntersecting ?? true) {
302
+ pageBudget().near(holder);
303
+ }
304
+ else {
305
+ pageBudget().far(holder, performance.now());
306
+ }
307
+ }, { rootMargin: '50%' })
308
+ : undefined;
309
+ nearby?.observe(container);
310
+ const raycaster = new Raycaster();
311
+ const pickAt = (event) => {
312
+ const box = canvas.getBoundingClientRect();
313
+ raycaster.setFromCamera(new Vector2(((event.clientX - box.left) / box.width) * 2 - 1, -((event.clientY - box.top) / box.height) * 2 + 1), camera);
314
+ return options.pick(raycaster);
315
+ };
316
+ const kindOf = (event) => event.pointerType === 'touch' || event.pointerType === 'pen' ? event.pointerType : 'mouse';
317
+ let down;
318
+ let hovered = -1;
319
+ const onDown = (event) => {
320
+ down = { x: event.clientX, y: event.clientY };
321
+ };
322
+ const onUp = (event) => {
323
+ const was = down;
324
+ down = undefined;
325
+ if (!was || Math.hypot(event.clientX - was.x, event.clientY - was.y) >= DRAG) {
326
+ return;
327
+ }
328
+ press?.(pickAt(event), kindOf(event));
329
+ };
330
+ const hoverTo = (next, kind) => {
331
+ if (next !== hovered) {
332
+ hovered = next;
333
+ canvas.style.cursor = next >= 0 ? 'pointer' : '';
334
+ hover?.(next, kind);
335
+ }
336
+ };
337
+ const onMove = (event) => {
338
+ if (down || event.pointerType === 'touch') {
339
+ return;
340
+ }
341
+ hoverTo(pickAt(event), kindOf(event));
342
+ };
343
+ const onLeave = (event) => {
344
+ if (event.pointerType !== 'touch') {
345
+ hoverTo(-1, kindOf(event));
346
+ }
347
+ };
348
+ canvas.addEventListener('pointerdown', onDown);
349
+ canvas.addEventListener('pointerup', onUp);
350
+ canvas.addEventListener('pointermove', onMove);
351
+ canvas.addEventListener('pointerleave', onLeave);
352
+ return {
353
+ frame: (low, high, toward) => {
354
+ framed = { high: high.clone(), low: low.clone() };
355
+ if (toward) {
356
+ camera.position.copy(controls.target).add(toward.clone().normalize());
357
+ }
358
+ fit();
359
+ invalidate();
360
+ },
361
+ invalidate,
362
+ onHover: (listener) => {
363
+ hover = listener;
364
+ return () => {
365
+ hover = undefined;
366
+ };
367
+ },
368
+ onPlace: (listener) => {
369
+ place = listener;
370
+ listener(placed);
371
+ return () => {
372
+ place = undefined;
373
+ };
374
+ },
375
+ onPress: (listener) => {
376
+ press = listener;
377
+ return () => {
378
+ press = undefined;
379
+ };
380
+ },
381
+ scene,
382
+ setAxes: (next, nextColors, nextFont) => {
383
+ axes = next;
384
+ colors = nextColors;
385
+ font = nextFont;
386
+ grid.geometry.dispose();
387
+ const lines = new BufferGeometry();
388
+ lines.setAttribute('position', new Float32BufferAttribute(gridLines(next), 3));
389
+ grid.geometry = lines;
390
+ gridMaterial.color.setStyle(nextColors.quiet);
391
+ marker.material.color.setStyle(nextColors.ink);
392
+ invalidate();
393
+ },
394
+ setMarker: (at) => {
395
+ marker.visible = at !== undefined;
396
+ if (at) {
397
+ marker.position.copy(at);
398
+ marker.scale.set(0.16, 0.16, 1);
399
+ }
400
+ invalidate();
401
+ },
402
+ stop: () => {
403
+ stopped = true;
404
+ cancelAnimationFrame(pending);
405
+ seen?.disconnect();
406
+ sized?.disconnect();
407
+ nearby?.disconnect();
408
+ pageBudget().leave(holder);
409
+ canvas.removeEventListener('webglcontextrestored', restored);
410
+ canvas.removeEventListener('pointerdown', onDown);
411
+ canvas.removeEventListener('pointerup', onUp);
412
+ canvas.removeEventListener('pointermove', onMove);
413
+ canvas.removeEventListener('pointerleave', onLeave);
414
+ controls.dispose();
415
+ grid.geometry.dispose();
416
+ gridMaterial.dispose();
417
+ marker.material.dispose();
418
+ ringTexture.dispose();
419
+ renderer.dispose();
420
+ canvas.remove();
421
+ labels.remove();
422
+ },
423
+ track: (points, heard) => {
424
+ tracked = { heard, points: points.map((point) => point.clone()) };
425
+ invalidate();
426
+ return () => {
427
+ tracked = undefined;
428
+ };
429
+ },
430
+ turnBy: (across, up, animate) => {
431
+ const from = new Spherical().setFromVector3(camera.position.clone().sub(controls.target));
432
+ const to = from.clone();
433
+ to.theta += across * STEP;
434
+ to.phi = Math.min(Math.max(to.phi - up * STEP, 0.15), Math.PI / 2 - 0.02);
435
+ if (!animate || still()) {
436
+ camera.position.setFromSpherical(to).add(controls.target);
437
+ camera.lookAt(controls.target);
438
+ invalidate();
439
+ return;
440
+ }
441
+ turn = { from, start: performance.now(), to };
442
+ invalidate();
443
+ },
444
+ };
445
+ };
446
+ //# sourceMappingURL=stage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage.js","sourceRoot":"","sources":["../../src/three/stage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { SpatialSurfaceChartDriver } from '../connect-spatial-surface-chart/connect-spatial-surface-chart.js';
2
+ /** How the three.js surface driver behaves where the page does not say. */
3
+ export interface ThreeSurfaceDriverOptions {
4
+ /**
5
+ * How many pixels the drawing has for each of the page's. By default, on a
6
+ * screen worked with a mouse, half as many again as the screen has, at
7
+ * least two and at most three; on a touch screen, as many as the screen
8
+ * has, at most two.
9
+ */
10
+ density?: number | undefined;
11
+ }
12
+ /**
13
+ * Draws a Spatial Surface Chart's grid as a surface in three dimensions with
14
+ * three.js. Pass it to `connectSpatialSurfaceChart` with the element to draw in, which
15
+ * the chart holds in its plot:
16
+ *
17
+ * ```js
18
+ * import { connectSpatialSurfaceChart } from '@fusion.dev/helix-plot'
19
+ * import { threeSurfaceDriver } from '@fusion.dev/helix-plot/three'
20
+ *
21
+ * connectSpatialSurfaceChart(chart, threeSurfaceDriver(chart.querySelector('div')))
22
+ * ```
23
+ *
24
+ * **Each reading is a corner of the surface**, at its place across and in
25
+ * depth and as high as its reading, in a box with a grid on its floor and
26
+ * two of its walls. The surface is shaded along the ramp from
27
+ * `--spatial-surface-chart-low` to `--spatial-surface-chart-high`, lit from above, and ruled along
28
+ * the grid. A place the table has no reading for leaves a hole rather than a
29
+ * pit.
30
+ *
31
+ * **Dragging turns the box, and the wheel and a pinch bring it nearer.**
32
+ * Shift with an arrow on the chart turns it a step. It never turns by itself.
33
+ * It draws only while something moves, asks for no frames at rest, and
34
+ * shares the page's WebGL contexts with every three.js drawing Helix makes.
35
+ *
36
+ * The renderer is the driver's own, and `disconnect()` frees it.
37
+ */
38
+ export declare const threeSurfaceDriver: (container: HTMLElement, options?: ThreeSurfaceDriverOptions) => SpatialSurfaceChartDriver;
39
+ //# sourceMappingURL=surface-driver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-driver.d.ts","sourceRoot":"","sources":["../../src/three/surface-driver.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,yBAAyB,EAE1B,MAAM,mEAAmE,CAAA;AAM1E,2EAA2E;AAC3E,MAAM,WAAW,yBAAyB;IACxC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,kBAAkB,cAClB,WAAW,YACb,yBAAyB,KACjC,yBA2KF,CAAA"}