@vitessce/scatterplot 3.7.0 → 3.8.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.
@@ -1,5 +1,5 @@
1
1
  import { i as inflate_1 } from "./pako.esm-SxljTded.js";
2
- import { B as BaseDecoder } from "./index-3MaQoF6s.js";
2
+ import { B as BaseDecoder } from "./index-BumwWP-J.js";
3
3
  class DeflateDecoder extends BaseDecoder {
4
4
  decodeBlock(buffer) {
5
5
  return inflate_1(new Uint8Array(buffer)).buffer;
@@ -105941,22 +105941,22 @@ function addDecoder(cases, importFn) {
105941
105941
  }
105942
105942
  cases.forEach((c2) => registry$1.set(c2, importFn));
105943
105943
  }
105944
- addDecoder([void 0, 1], () => import("./raw-B5fgnX06.js").then((m2) => m2.default));
105945
- addDecoder(5, () => import("./lzw-bq1KhCJW.js").then((m2) => m2.default));
105944
+ addDecoder([void 0, 1], () => import("./raw-DrfOM6es.js").then((m2) => m2.default));
105945
+ addDecoder(5, () => import("./lzw-TJDvnCZk.js").then((m2) => m2.default));
105946
105946
  addDecoder(6, () => {
105947
105947
  throw new Error("old style JPEG compression is not supported.");
105948
105948
  });
105949
- addDecoder(7, () => import("./jpeg-Dd3Whsa_.js").then((m2) => m2.default));
105950
- addDecoder([8, 32946], () => import("./deflate-B_q2mNjQ.js").then((m2) => m2.default));
105951
- addDecoder(32773, () => import("./packbits-Dhncj7No.js").then((m2) => m2.default));
105949
+ addDecoder(7, () => import("./jpeg-Dgjm5b-q.js").then((m2) => m2.default));
105950
+ addDecoder([8, 32946], () => import("./deflate-BxyEnrsG.js").then((m2) => m2.default));
105951
+ addDecoder(32773, () => import("./packbits-CUf4ETKT.js").then((m2) => m2.default));
105952
105952
  addDecoder(
105953
105953
  34887,
105954
- () => import("./lerc-DG3xbTk6.js").then(async (m2) => {
105954
+ () => import("./lerc-C4YXyd73.js").then(async (m2) => {
105955
105955
  await m2.zstd.init();
105956
105956
  return m2;
105957
105957
  }).then((m2) => m2.default)
105958
105958
  );
105959
- addDecoder(50001, () => import("./webimage-CWwSjMxu.js").then((m2) => m2.default));
105959
+ addDecoder(50001, () => import("./webimage-ol5Hkbkz.js").then((m2) => m2.default));
105960
105960
  function decodeRowAcc(row, stride) {
105961
105961
  let length2 = row.length - stride;
105962
105962
  let offset2 = 0;
@@ -137879,6 +137879,9 @@ function getOnHoverCallback(obsIndex, setObsHighlight, setComponentHover) {
137879
137879
  }
137880
137880
  };
137881
137881
  }
137882
+ const ROTATION_THRESHOLD = 1;
137883
+ const ZOOM_THRESHOLD = 0.01;
137884
+ const TRANSLATION_THRESHOLD = 2;
137882
137885
  class AbstractSpatialOrScatterplot extends PureComponent {
137883
137886
  constructor(props) {
137884
137887
  super(props);
@@ -137886,6 +137889,7 @@ class AbstractSpatialOrScatterplot extends PureComponent {
137886
137889
  gl: null,
137887
137890
  tool: null
137888
137891
  };
137892
+ this.lastApplied = null;
137889
137893
  this.viewport = null;
137890
137894
  this.onViewStateChange = this.onViewStateChange.bind(this);
137891
137895
  this.onInitializeViewInfo = this.onInitializeViewInfo.bind(this);
@@ -137909,6 +137913,23 @@ class AbstractSpatialOrScatterplot extends PureComponent {
137909
137913
  spatialAxisFixed
137910
137914
  } = this.props;
137911
137915
  const use3d = this.use3d();
137916
+ let targetChanged = false;
137917
+ if (nextViewState.target && viewState.target) {
137918
+ const dx = Math.abs((nextViewState.target[0] ?? 0) - (viewState.target[0] ?? 0));
137919
+ const dy = Math.abs((nextViewState.target[1] ?? 0) - (viewState.target[1] ?? 0));
137920
+ const scale2 = 2 ** (nextViewState.zoom ?? 0);
137921
+ const dxPx = Math.abs(dx) * scale2;
137922
+ const dyPx = Math.abs(dy) * scale2;
137923
+ targetChanged = dxPx > TRANSLATION_THRESHOLD || dyPx > TRANSLATION_THRESHOLD;
137924
+ }
137925
+ const prev2 = this.lastApplied || viewState;
137926
+ const zoomChanged = Math.abs((nextViewState.zoom ?? 0) - (prev2.zoom ?? 0)) > ZOOM_THRESHOLD;
137927
+ const orbitChanged = Math.abs((nextViewState.rotationOrbit ?? 0) - (prev2.rotationOrbit ?? 0)) > ROTATION_THRESHOLD;
137928
+ const xChanged = Math.abs((nextViewState.rotationX ?? 0) - (prev2.rotationX ?? 0)) > ROTATION_THRESHOLD;
137929
+ if (!(zoomChanged || orbitChanged || xChanged || targetChanged)) {
137930
+ return;
137931
+ }
137932
+ this.lastApplied = nextViewState;
137912
137933
  setViewState({
137913
137934
  ...nextViewState,
137914
137935
  // If the axis is fixed, just use the current target in state i.e don't change target.
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { A, E, S, a, b, f, e, d, c } from "./index-3MaQoF6s.js";
1
+ import { A, E, S, a, b, f, e, d, c } from "./index-BumwWP-J.js";
2
2
  export {
3
3
  A as AbstractSpatialOrScatterplot,
4
4
  E as EmptyMessage,
@@ -1,4 +1,4 @@
1
- import { B as BaseDecoder } from "./index-3MaQoF6s.js";
1
+ import { B as BaseDecoder } from "./index-BumwWP-J.js";
2
2
  const dctZigZag = new Int32Array([
3
3
  0,
4
4
  1,
@@ -1,5 +1,5 @@
1
1
  import { i as inflate_1 } from "./pako.esm-SxljTded.js";
2
- import { g as getDefaultExportFromCjs, B as BaseDecoder } from "./index-3MaQoF6s.js";
2
+ import { g as getDefaultExportFromCjs, B as BaseDecoder } from "./index-BumwWP-J.js";
3
3
  const LercParameters = {
4
4
  AddCompression: 1
5
5
  };
@@ -1,4 +1,4 @@
1
- import { B as BaseDecoder } from "./index-3MaQoF6s.js";
1
+ import { B as BaseDecoder } from "./index-BumwWP-J.js";
2
2
  const MIN_BITS = 9;
3
3
  const CLEAR_CODE = 256;
4
4
  const EOI_CODE = 257;
@@ -1,4 +1,4 @@
1
- import { B as BaseDecoder } from "./index-3MaQoF6s.js";
1
+ import { B as BaseDecoder } from "./index-BumwWP-J.js";
2
2
  class PackbitsDecoder extends BaseDecoder {
3
3
  decodeBlock(buffer) {
4
4
  const dataView = new DataView(buffer);
@@ -1,4 +1,4 @@
1
- import { B as BaseDecoder } from "./index-3MaQoF6s.js";
1
+ import { B as BaseDecoder } from "./index-BumwWP-J.js";
2
2
  class RawDecoder extends BaseDecoder {
3
3
  decodeBlock(buffer) {
4
4
  return buffer;
@@ -1,4 +1,4 @@
1
- import { B as BaseDecoder } from "./index-3MaQoF6s.js";
1
+ import { B as BaseDecoder } from "./index-BumwWP-J.js";
2
2
  class WebImageDecoder extends BaseDecoder {
3
3
  constructor() {
4
4
  super();
@@ -10,6 +10,7 @@ export default class AbstractSpatialOrScatterplot {
10
10
  gl: null;
11
11
  tool: null;
12
12
  };
13
+ lastApplied: object | null;
13
14
  viewport: object | null;
14
15
  /**
15
16
  * Called by DeckGL upon a viewState change,
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractSpatialOrScatterplot.d.ts","sourceRoot":"","sources":["../../src/shared-spatial-scatterplot/AbstractSpatialOrScatterplot.js"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH;IACE,wBAeC;IAZC;;;MAGC;IAED,wBAAoB;IAStB;;;;;;;OAOG;IACH,gDAFG;QAAuB,SAAS,EAAxB,MAAM;KAChB,QAWA;IAED;;;;;OAKG;IACH,mCAFG;QAA0B,QAAQ,EAA1B,MAAM;KAChB,QAGA;IAED;;;;;OAKG;IACH,uBAFW,MAAM,QAIhB;IAED;;;;;OAKG;IACH,mBAFW,MAAM,QAQhB;IAgBD,qCAgFC;IAwCD;;MAEE;IAEF,iBAAa;IA1Ib;;;;;OAKG;IAEH,aALa,MAAM,EAAE,CAOpB;IAuFD;;;;;OAKG;IACH,iFAsBC;IAED;;OAEG;IAEH,2BAEC;IAQD;;;OAGG;IAEH,SAHa,OAAO,CAKnB;IAED;;;OAGG;IACH,sBA6DC;CACF"}
1
+ {"version":3,"file":"AbstractSpatialOrScatterplot.d.ts","sourceRoot":"","sources":["../../src/shared-spatial-scatterplot/AbstractSpatialOrScatterplot.js"],"names":[],"mappings":"AAQA;;;;;GAKG;AACH;IACE,wBAeC;IAZC;;;MAGC;IACD,2BAAuB;IACvB,wBAAoB;IAStB;;;;;;;OAOG;IACH,gDAFG;QAAuB,SAAS,EAAxB,MAAM;KAChB,QAoCA;IAED;;;;;OAKG;IACH,mCAFG;QAA0B,QAAQ,EAA1B,MAAM;KAChB,QAGA;IAED;;;;;OAKG;IACH,uBAFW,MAAM,QAIhB;IAED;;;;;OAKG;IACH,mBAFW,MAAM,QAQhB;IAgBD,qCAgFC;IAwCD;;MAEE;IAEF,iBAAa;IA1Ib;;;;;OAKG;IAEH,aALa,MAAM,EAAE,CAOpB;IAuFD;;;;;OAKG;IACH,iFAsBC;IAED;;OAEG;IAEH,2BAEC;IAQD;;;OAGG;IAEH,SAHa,OAAO,CAKnB;IAED;;;OAGG;IACH,sBA6DC;CACF"}
@@ -3,6 +3,9 @@ import React, { PureComponent } from 'react';
3
3
  import { deck, DEFAULT_GL_OPTIONS } from '@vitessce/gl';
4
4
  import ToolMenu from './ToolMenu.js';
5
5
  import { getCursor, getCursorWithTool } from './cursor.js';
6
+ const ROTATION_THRESHOLD = 1;
7
+ const ZOOM_THRESHOLD = 0.01;
8
+ const TRANSLATION_THRESHOLD = 2;
6
9
  /**
7
10
  * Abstract class component intended to be inherited by
8
11
  * the Spatial and Scatterplot class components.
@@ -16,6 +19,7 @@ export default class AbstractSpatialOrScatterplot extends PureComponent {
16
19
  gl: null,
17
20
  tool: null,
18
21
  };
22
+ this.lastApplied = null;
19
23
  this.viewport = null;
20
24
  this.onViewStateChange = this.onViewStateChange.bind(this);
21
25
  this.onInitializeViewInfo = this.onInitializeViewInfo.bind(this);
@@ -35,6 +39,31 @@ export default class AbstractSpatialOrScatterplot extends PureComponent {
35
39
  onViewStateChange({ viewState: nextViewState }) {
36
40
  const { setViewState, viewState, spatialAxisFixed, } = this.props;
37
41
  const use3d = this.use3d();
42
+ // Begin changes for neuroglancer.
43
+ // The following logic reduces the number of viewState updates emitted,
44
+ // which thereby reduces the number of re-renders required of Neuroglancer
45
+ // (when the Neuroglancer view is coordinated with a DeckGL-based Spatial view).
46
+ let targetChanged = false;
47
+ if (nextViewState.target && viewState.target) {
48
+ const dx = Math.abs((nextViewState.target[0] ?? 0) - (viewState.target[0] ?? 0));
49
+ const dy = Math.abs((nextViewState.target[1] ?? 0) - (viewState.target[1] ?? 0));
50
+ const scale = 2 ** (nextViewState.zoom ?? 0);
51
+ const dxPx = Math.abs(dx) * scale;
52
+ const dyPx = Math.abs(dy) * scale;
53
+ targetChanged = dxPx > TRANSLATION_THRESHOLD || dyPx > TRANSLATION_THRESHOLD;
54
+ }
55
+ const prev = this.lastApplied || viewState;
56
+ const zoomChanged = Math.abs((nextViewState.zoom ?? 0) - (prev.zoom ?? 0))
57
+ > ZOOM_THRESHOLD;
58
+ const orbitChanged = Math.abs((nextViewState.rotationOrbit ?? 0) - (prev.rotationOrbit ?? 0))
59
+ > ROTATION_THRESHOLD;
60
+ const xChanged = Math.abs((nextViewState.rotationX ?? 0) - (prev.rotationX ?? 0))
61
+ > ROTATION_THRESHOLD;
62
+ if (!(zoomChanged || orbitChanged || xChanged || targetChanged)) {
63
+ return;
64
+ }
65
+ this.lastApplied = nextViewState;
66
+ // End changes for neuroglancer.
38
67
  setViewState({
39
68
  ...nextViewState,
40
69
  // If the axis is fixed, just use the current target in state i.e don't change target.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vitessce/scatterplot",
3
- "version": "3.7.0",
3
+ "version": "3.8.0",
4
4
  "author": "HIDIVE Lab at HMS",
5
5
  "homepage": "http://vitessce.io",
6
6
  "repository": {
@@ -21,19 +21,19 @@
21
21
  "d3-quadtree": "^1.0.7",
22
22
  "lodash-es": "^4.17.21",
23
23
  "react-aria": "^3.28.0",
24
- "@vitessce/styles": "3.7.0",
25
- "@vitessce/constants-internal": "3.7.0",
26
- "@vitessce/gl": "3.7.0",
27
- "@vitessce/icons": "3.7.0",
28
- "@vitessce/tooltip": "3.7.0",
29
- "@vitessce/utils": "3.7.0",
30
- "@vitessce/vit-s": "3.7.0"
24
+ "@vitessce/styles": "3.8.0",
25
+ "@vitessce/constants-internal": "3.8.0",
26
+ "@vitessce/gl": "3.8.0",
27
+ "@vitessce/icons": "3.8.0",
28
+ "@vitessce/tooltip": "3.8.0",
29
+ "@vitessce/utils": "3.8.0",
30
+ "@vitessce/vit-s": "3.8.0"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@testing-library/jest-dom": "^6.6.3",
34
34
  "@testing-library/react": "^16.3.0",
35
- "react": "^18.0.0",
36
- "react-dom": "^18.0.0",
35
+ "react": "18.3.1",
36
+ "react-dom": "18.3.1",
37
37
  "vite": "^7.0.0",
38
38
  "vitest": "^3.1.4"
39
39
  },
@@ -3,6 +3,9 @@ import { deck, DEFAULT_GL_OPTIONS } from '@vitessce/gl';
3
3
  import ToolMenu from './ToolMenu.js';
4
4
  import { getCursor, getCursorWithTool } from './cursor.js';
5
5
 
6
+ const ROTATION_THRESHOLD = 1;
7
+ const ZOOM_THRESHOLD = 0.01;
8
+ const TRANSLATION_THRESHOLD = 2;
6
9
  /**
7
10
  * Abstract class component intended to be inherited by
8
11
  * the Spatial and Scatterplot class components.
@@ -17,7 +20,7 @@ export default class AbstractSpatialOrScatterplot extends PureComponent {
17
20
  gl: null,
18
21
  tool: null,
19
22
  };
20
-
23
+ this.lastApplied = null;
21
24
  this.viewport = null;
22
25
  this.onViewStateChange = this.onViewStateChange.bind(this);
23
26
  this.onInitializeViewInfo = this.onInitializeViewInfo.bind(this);
@@ -40,6 +43,31 @@ export default class AbstractSpatialOrScatterplot extends PureComponent {
40
43
  setViewState, viewState, spatialAxisFixed,
41
44
  } = this.props;
42
45
  const use3d = this.use3d();
46
+ // Begin changes for neuroglancer.
47
+ // The following logic reduces the number of viewState updates emitted,
48
+ // which thereby reduces the number of re-renders required of Neuroglancer
49
+ // (when the Neuroglancer view is coordinated with a DeckGL-based Spatial view).
50
+ let targetChanged = false;
51
+ if (nextViewState.target && viewState.target) {
52
+ const dx = Math.abs((nextViewState.target[0] ?? 0) - (viewState.target[0] ?? 0));
53
+ const dy = Math.abs((nextViewState.target[1] ?? 0) - (viewState.target[1] ?? 0));
54
+ const scale = 2 ** (nextViewState.zoom ?? 0);
55
+ const dxPx = Math.abs(dx) * scale;
56
+ const dyPx = Math.abs(dy) * scale;
57
+ targetChanged = dxPx > TRANSLATION_THRESHOLD || dyPx > TRANSLATION_THRESHOLD;
58
+ }
59
+ const prev = this.lastApplied || viewState;
60
+ const zoomChanged = Math.abs((nextViewState.zoom ?? 0) - (prev.zoom ?? 0))
61
+ > ZOOM_THRESHOLD;
62
+ const orbitChanged = Math.abs((nextViewState.rotationOrbit ?? 0) - (prev.rotationOrbit ?? 0))
63
+ > ROTATION_THRESHOLD;
64
+ const xChanged = Math.abs((nextViewState.rotationX ?? 0) - (prev.rotationX ?? 0))
65
+ > ROTATION_THRESHOLD;
66
+ if (!(zoomChanged || orbitChanged || xChanged || targetChanged)) {
67
+ return;
68
+ }
69
+ this.lastApplied = nextViewState;
70
+ // End changes for neuroglancer.
43
71
  setViewState({
44
72
  ...nextViewState,
45
73
  // If the axis is fixed, just use the current target in state i.e don't change target.