@vitessce/all 3.8.0 → 3.8.2

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,4 +1,4 @@
1
- import { aF as getDefaultExportFromCjs, aG as Raycaster, W as OrthographicCamera, K as PerspectiveCamera, av as Scene, aH as PCFSoftShadowMap, aI as VSMShadowMap, aJ as PCFShadowMap, aK as BasicShadowMap, aL as NoToneMapping, aM as ACESFilmicToneMapping, e as Vector3, V as Vector2, aN as Clock, aO as WebGLRenderer, aP as Camera, x as BufferGeometry, r as Material, aQ as Layers, a1 as Texture, aC as RGBAFormat, ay as UnsignedByteType, C as Color, aj as _extends, aR as THREE, aS as EventDispatcher, aT as MOUSE, aU as TOUCH, aV as Spherical, Q as Quaternion, an as Ray, ak as Plane } from "./index-eNWork9t.js";
1
+ import { aF as getDefaultExportFromCjs, aG as Raycaster, W as OrthographicCamera, K as PerspectiveCamera, av as Scene, aH as PCFSoftShadowMap, aI as VSMShadowMap, aJ as PCFShadowMap, aK as BasicShadowMap, aL as NoToneMapping, aM as ACESFilmicToneMapping, e as Vector3, V as Vector2, aN as Clock, aO as WebGLRenderer, aP as Camera, x as BufferGeometry, r as Material, aQ as Layers, a1 as Texture, aC as RGBAFormat, ay as UnsignedByteType, C as Color, aj as _extends, aR as THREE, aS as EventDispatcher, aT as MOUSE, aU as TOUCH, aV as Spherical, Q as Quaternion, an as Ray, ak as Plane } from "./index-BNUI-w49.js";
2
2
  import * as React from "react";
3
3
  import React__default, { useReducer, useRef, useEffect, useLayoutEffect, useDebugValue, useState, useMemo } from "react";
4
4
  var constants = { exports: {} };
@@ -1,4 +1,4 @@
1
- import { aF as getDefaultExportFromCjs, b0 as requireAssign, b1 as require_export, b2 as require_core, b3 as require_fails, b4 as require_toObject, b5 as require_objectKeys, b6 as require_cof, b7 as require_wks, b8 as require_iterators, b9 as requireWeb_dom_iterable, ba as requireEs6_string_iterator, bb as require_anObject, bc as require_hide, bd as require_ctx, be as require_toLength, bf as require_global, bg as require_objectDp, bh as require_descriptors, bi as require_isObject, bj as require_objectCreate, bk as require_iterDefine, bl as require_iterStep, bm as require_meta, bn as require_isArray, bo as require_iobject, bp as require_setToStringTag, bq as require_aFunction, br as requireIterator, bs as require_propertyDesc, aZ as commonjsGlobal, bt as requireEs6_symbol, bu as requireDefineProperty, bv as require_toIobject, bw as require_objectGopd, bx as require_html, by as require_domCreate, bz as require_library, bA as requireSymbol, bB as require_objectPie, bC as require_has, bD as require_redefine, bE as require_objectAssign, bF as diffCameraState, ao as jsxRuntimeExports } from "./index-eNWork9t.js";
1
+ import { aF as getDefaultExportFromCjs, b0 as requireAssign, b1 as require_export, b2 as require_core, b3 as require_fails, b4 as require_toObject, b5 as require_objectKeys, b6 as require_cof, b7 as require_wks, b8 as require_iterators, b9 as requireWeb_dom_iterable, ba as requireEs6_string_iterator, bb as require_anObject, bc as require_hide, bd as require_ctx, be as require_toLength, bf as require_global, bg as require_objectDp, bh as require_descriptors, bi as require_isObject, bj as require_objectCreate, bk as require_iterDefine, bl as require_iterStep, bm as require_meta, bn as require_isArray, bo as require_iobject, bp as require_setToStringTag, bq as require_aFunction, br as requireIterator, bs as require_propertyDesc, aZ as commonjsGlobal, bt as requireEs6_symbol, bu as requireDefineProperty, bv as require_toIobject, bw as require_objectGopd, bx as require_html, by as require_domCreate, bz as require_library, bA as requireSymbol, bB as require_objectPie, bC as require_has, bD as require_redefine, bE as require_objectAssign, bF as diffCameraState, ao as jsxRuntimeExports } from "./index-BNUI-w49.js";
2
2
  import React__default from "react";
3
3
  var assignExports = requireAssign();
4
4
  const _Object$assign = /* @__PURE__ */ getDefaultExportFromCjs(assignExports);
@@ -1,5 +1,5 @@
1
1
  import { i as inflate_1 } from "./pako.esm-SxljTded.js";
2
- import { aW as BaseDecoder } from "./index-eNWork9t.js";
2
+ import { aW as BaseDecoder } from "./index-BNUI-w49.js";
3
3
  class DeflateDecoder extends BaseDecoder {
4
4
  decodeBlock(buffer) {
5
5
  return inflate_1(new Uint8Array(buffer)).buffer;
@@ -1,7 +1,7 @@
1
1
  import * as React$7 from "react";
2
2
  import React__default, { isValidElement, PureComponent, Component, createElement, createContext, createRef } from "react";
3
3
  import ReactDOM__default, { findDOMNode as findDOMNode$1 } from "react-dom";
4
- import { aZ as commonjsGlobal$1, a_ as requireObjectAssign, aF as getDefaultExportFromCjs$1, a$ as earcut } from "./index-eNWork9t.js";
4
+ import { aZ as commonjsGlobal$1, a_ as requireObjectAssign, aF as getDefaultExportFromCjs$1, a$ as earcut } from "./index-BNUI-w49.js";
5
5
  var promise = {};
6
6
  var hasRequiredPromise;
7
7
  function requirePromise() {
@@ -8963,7 +8963,7 @@ const ViewType$1 = {
8963
8963
  SCATTERPLOT: "scatterplot",
8964
8964
  SPATIAL: "spatial",
8965
8965
  SPATIAL_BETA: "spatialBeta",
8966
- SPATIAL_ACCELERATED: "spatialAccelerated",
8966
+ // SPATIAL_ACCELERATED: 'spatialAccelerated',
8967
8967
  HEATMAP: "heatmap",
8968
8968
  LAYER_CONTROLLER: "layerController",
8969
8969
  LAYER_CONTROLLER_BETA: "layerControllerBeta",
@@ -9131,6 +9131,9 @@ const FileType$1 = {
9131
9131
  OBS_SEGMENTATIONS_OME_TIFF: "obsSegmentations.ome-tiff",
9132
9132
  // GLB
9133
9133
  OBS_SEGMENTATIONS_GLB: "obsSegmentations.glb",
9134
+ // Neuroglancer
9135
+ // Precomputed (mesh) format
9136
+ OBS_SEGMENTATIONS_NG_PRECOMPUTED: "obsSegmentations.ng-precomputed",
9134
9137
  // New file types to support old file types:
9135
9138
  // - cells.json
9136
9139
  OBS_EMBEDDING_CELLS_JSON: "obsEmbedding.cells.json",
@@ -9385,6 +9388,7 @@ const ViewHelpMapping = {
9385
9388
  [FileType$1.OBS_LABELS_MUDATA_ZARR]: DataType$3.OBS_LABELS,
9386
9389
  [FileType$1.FEATURE_LABELS_MUDATA_ZARR]: DataType$3.FEATURE_LABELS,
9387
9390
  [FileType$1.OBS_SEGMENTATIONS_GLB]: DataType$3.OBS_SEGMENTATIONS,
9391
+ [FileType$1.OBS_SEGMENTATIONS_NG_PRECOMPUTED]: DataType$3.OBS_SEGMENTATIONS,
9388
9392
  [FileType$1.IMAGE_SPATIALDATA_ZARR]: DataType$3.IMAGE,
9389
9393
  [FileType$1.LABELS_SPATIALDATA_ZARR]: DataType$3.OBS_SEGMENTATIONS,
9390
9394
  [FileType$1.SHAPES_SPATIALDATA_ZARR]: DataType$3.OBS_SEGMENTATIONS,
@@ -10714,6 +10718,18 @@ const meshGlbSchema = z.object({
10714
10718
  sceneScaleZ: z.number(),
10715
10719
  materialSide: z.enum(["front", "back"])
10716
10720
  }).partial().nullable();
10721
+ const ngSchema = z.object({
10722
+ // TODO: Should this explicitly specify sharded vs. unsharded?
10723
+ // Or can/should that be inferred from the data?
10724
+ dimensionX: z.number(),
10725
+ dimensionY: z.number(),
10726
+ dimensionZ: z.number(),
10727
+ dimensionUnit: z.enum(["nm", "um", "µm", "mm", "cm", "m"]),
10728
+ // TODO: should the following be passed via coordination types instead?
10729
+ projectionScale: z.number(),
10730
+ position: z.array(z.number()).length(3),
10731
+ projectionOrientation: z.array(z.number()).length(4)
10732
+ }).partial().nullable();
10717
10733
  const obsEmbeddingAnndataSchema = annDataObsEmbedding;
10718
10734
  const obsSpotsAnndataSchema = annDataObsLocations;
10719
10735
  const obsPointsAnndataSchema = annDataObsLocations;
@@ -209303,22 +209319,22 @@ async function getDecoder(fileDirectory) {
209303
209319
  const Decoder = await importFn();
209304
209320
  return new Decoder(fileDirectory);
209305
209321
  }
209306
- addDecoder([void 0, 1], () => import("./raw-CRoXFKXe.js").then((m2) => m2.default));
209307
- addDecoder(5, () => import("./lzw-C8NEd7Y4.js").then((m2) => m2.default));
209322
+ addDecoder([void 0, 1], () => import("./raw-CDmwxpDL.js").then((m2) => m2.default));
209323
+ addDecoder(5, () => import("./lzw-BlOU-CBg.js").then((m2) => m2.default));
209308
209324
  addDecoder(6, () => {
209309
209325
  throw new Error("old style JPEG compression is not supported.");
209310
209326
  });
209311
- addDecoder(7, () => import("./jpeg-Sl7J-6mO.js").then((m2) => m2.default));
209312
- addDecoder([8, 32946], () => import("./deflate-BZqpc-jk.js").then((m2) => m2.default));
209313
- addDecoder(32773, () => import("./packbits-BRJrVgsM.js").then((m2) => m2.default));
209327
+ addDecoder(7, () => import("./jpeg-BB_ilRwM.js").then((m2) => m2.default));
209328
+ addDecoder([8, 32946], () => import("./deflate-BmPQfLH1.js").then((m2) => m2.default));
209329
+ addDecoder(32773, () => import("./packbits-BkMUG84m.js").then((m2) => m2.default));
209314
209330
  addDecoder(
209315
209331
  34887,
209316
- () => import("./lerc-z_QbiC-f.js").then(async (m2) => {
209332
+ () => import("./lerc-STi5EC9q.js").then(async (m2) => {
209317
209333
  await m2.zstd.init();
209318
209334
  return m2;
209319
209335
  }).then((m2) => m2.default)
209320
209336
  );
209321
- addDecoder(50001, () => import("./webimage-C6WknL6k.js").then((m2) => m2.default));
209337
+ addDecoder(50001, () => import("./webimage-C4EDX2gd.js").then((m2) => m2.default));
209322
209338
  function copyNewSize(array2, width2, height2, samplesPerPixel = 1) {
209323
209339
  return new (Object.getPrototypeOf(array2)).constructor(width2 * height2 * samplesPerPixel);
209324
209340
  }
@@ -226160,13 +226176,13 @@ function IconButton(props) {
226160
226176
  function ToolMenu(props) {
226161
226177
  const pointerIconAltText = "Pointer tool";
226162
226178
  const lassoIconAltText = "Select lasso";
226163
- const { setActiveTool, activeTool, visibleTools = { pan: true, selectLasso: true }, recenterOnClick = () => {
226179
+ const { setActiveTool, activeTool, visibleTools = { pan: true, selectLasso: true, recenter: true }, recenterOnClick = () => {
226164
226180
  } } = props;
226165
226181
  const { classes: classes2 } = useStyles$s();
226166
226182
  const onRecenterButtonCLick = () => {
226167
226183
  recenterOnClick();
226168
226184
  };
226169
- return jsxRuntimeExports.jsxs("div", { className: classes2.tool, children: [visibleTools.pan && jsxRuntimeExports.jsx(IconTool, { alt: pointerIconAltText, onClick: () => setActiveTool(null), isActive: activeTool === null, children: jsxRuntimeExports.jsx(SvgNearMe, {}) }), visibleTools.selectLasso ? jsxRuntimeExports.jsx(IconTool, { alt: lassoIconAltText, onClick: () => setActiveTool(distEs6Exports$2.SELECTION_TYPE.POLYGON), isActive: activeTool === distEs6Exports$2.SELECTION_TYPE.POLYGON, children: jsxRuntimeExports.jsx(SvgSelectionLasso, {}) }) : null, jsxRuntimeExports.jsx(IconButton, { alt: "click to recenter", onClick: () => onRecenterButtonCLick(), "aria-label": "Recenter scatterplot view", children: jsxRuntimeExports.jsx(CenterFocusStrong, {}) })] });
226185
+ return jsxRuntimeExports.jsxs("div", { className: classes2.tool, children: [visibleTools.pan && jsxRuntimeExports.jsx(IconTool, { alt: pointerIconAltText, onClick: () => setActiveTool(null), isActive: activeTool === null, children: jsxRuntimeExports.jsx(SvgNearMe, {}) }), visibleTools.selectLasso ? jsxRuntimeExports.jsx(IconTool, { alt: lassoIconAltText, onClick: () => setActiveTool(distEs6Exports$2.SELECTION_TYPE.POLYGON), isActive: activeTool === distEs6Exports$2.SELECTION_TYPE.POLYGON, children: jsxRuntimeExports.jsx(SvgSelectionLasso, {}) }) : null, visibleTools.recenter ? jsxRuntimeExports.jsx(IconButton, { alt: "click to recenter", onClick: () => onRecenterButtonCLick(), "aria-label": "Recenter scatterplot view", children: jsxRuntimeExports.jsx(CenterFocusStrong, {}) }) : null] });
226170
226186
  }
226171
226187
  const getCursorWithTool = () => "crosshair";
226172
226188
  const getCursor = (interactionState) => interactionState.isDragging ? "grabbing" : "default";
@@ -226400,7 +226416,7 @@ class AbstractSpatialOrScatterplot extends PureComponent {
226400
226416
  * and Scatterplot components.
226401
226417
  */
226402
226418
  render() {
226403
- const { deckRef, viewState, uuid: uuid2, hideTools, orbitAxis } = this.props;
226419
+ const { deckRef, viewState, uuid: uuid2, hideTools, hideRecenter, orbitAxis } = this.props;
226404
226420
  const { gl, tool } = this.state;
226405
226421
  const layers = this.getLayers();
226406
226422
  const use3d = this.use3d();
@@ -226409,7 +226425,8 @@ class AbstractSpatialOrScatterplot extends PureComponent {
226409
226425
  const useDevicePixels = !use3d && (this.obsSegmentationsData?.shape?.[0] < 1e5 || this.obsLocationsData?.shape?.[1] < 1e5);
226410
226426
  return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx(ToolMenu, { activeTool: tool, setActiveTool: this.onToolChange, visibleTools: {
226411
226427
  pan: showPanTool && !hideTools,
226412
- selectLasso: showCellSelectionTools && !hideTools
226428
+ selectLasso: showCellSelectionTools && !hideTools,
226429
+ recenter: !hideRecenter
226413
226430
  }, recenterOnClick: this.recenter }), jsxRuntimeExports.jsx(DeckGL, { id: `deckgl-overlay-${uuid2}`, ref: deckRef, views: [
226414
226431
  use3d ? new OrbitView({ id: "orbit", controller: true, orbitAxis }) : new OrthographicView({
226415
226432
  id: "ortho"
@@ -232049,21 +232066,14 @@ function DualEmbeddingScatterplotSubscriber(props) {
232049
232066
  function GatingScatterplotOptions(props) {
232050
232067
  const { featureType, gatingFeatureSelectionX, setGatingFeatureSelectionX, gatingFeatureSelectionY, setGatingFeatureSelectionY, gatingFeatureValueTransform, setGatingFeatureValueTransform, gatingFeatureValueTransformCoefficient, setGatingFeatureValueTransformCoefficient, geneSelectOptions, transformOptions } = props;
232051
232068
  const gatingScatterplotOptionsId = $bdb11010cef70236$export$f680877a34711e37();
232069
+ const gatingScatterplotGeneXId = $bdb11010cef70236$export$f680877a34711e37();
232070
+ const gatingScatterplotGeneYId = $bdb11010cef70236$export$f680877a34711e37();
232052
232071
  const { classes: classes2 } = usePlotOptionsStyles();
232053
- const handleGeneSelectChange = (event2) => {
232054
- const { options } = event2.target;
232055
- const newValues = [];
232056
- for (let i2 = 0, l2 = options.length; i2 < l2; i2 += 1) {
232057
- if (options[i2].selected) {
232058
- newValues.push(options[i2].value);
232059
- }
232060
- }
232061
- if (newValues.length === 1 && gatingFeatureSelectionX && !gatingFeatureSelectionY && newValues[0] !== gatingFeatureSelectionX) {
232062
- setGatingFeatureSelectionY(newValues[0]);
232063
- } else if (newValues.length <= 2) {
232064
- setGatingFeatureSelectionX(newValues[0]);
232065
- setGatingFeatureSelectionY(newValues[1]);
232066
- }
232072
+ const handleSelectionX = (event2) => {
232073
+ setGatingFeatureSelectionX(event2.target.value === "" ? null : event2.target.value);
232074
+ };
232075
+ const handleSelectionY = (event2) => {
232076
+ setGatingFeatureSelectionY(event2.target.value === "" ? null : event2.target.value);
232067
232077
  };
232068
232078
  const handleTransformChange = (event2) => {
232069
232079
  setGatingFeatureValueTransform(event2.target.value === "" ? null : event2.target.value);
@@ -232079,11 +232089,13 @@ function GatingScatterplotOptions(props) {
232079
232089
  }
232080
232090
  }
232081
232091
  };
232082
- return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsx(TableCell, { className: classes2.labelCell, variant: "head", scope: "row", children: jsxRuntimeExports.jsx("label", { htmlFor: `scatterplot-gating-gene-select-${gatingScatterplotOptionsId}`, children: capitalize$3(pluralize(featureType, geneSelectOptions?.length)) }) }), jsxRuntimeExports.jsx(TableCell, { className: classes2.inputCell, variant: "body", children: jsxRuntimeExports.jsx(OptionSelect, { multiple: true, className: classes2.select, value: [gatingFeatureSelectionX, gatingFeatureSelectionY].filter((v) => v), onChange: handleGeneSelectChange, inputProps: {
232083
- id: `scatterplot-gating-gene-select-${gatingScatterplotOptionsId}`
232084
- }, children: geneSelectOptions.map((name2) => jsxRuntimeExports.jsx("option", { value: name2, children: name2 }, name2)) }) })] }), jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsx(TableCell, { className: classes2.labelCell, variant: "head", scope: "row", children: jsxRuntimeExports.jsx("label", { htmlFor: `scatterplot-gating-transform-select-${gatingScatterplotOptionsId}`, children: "Transform" }) }), jsxRuntimeExports.jsx(TableCell, { className: classes2.inputCell, variant: "body", children: jsxRuntimeExports.jsx(OptionSelect, { className: classes2.select, value: gatingFeatureValueTransform === null ? "" : gatingFeatureValueTransform, onChange: handleTransformChange, inputProps: {
232092
+ return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsx(TableCell, { className: classes2.labelCell, variant: "head", scope: "row", children: jsxRuntimeExports.jsxs("label", { htmlFor: `scatterplot-gating-gene-select-${gatingScatterplotGeneXId}`, children: [capitalize$3(featureType), " along X"] }) }), jsxRuntimeExports.jsx(TableCell, { className: classes2.inputCell, variant: "body", children: jsxRuntimeExports.jsxs(OptionSelect, { className: classes2.select, value: gatingFeatureSelectionX ?? "", onChange: handleSelectionX, inputProps: {
232093
+ id: `scatterplot-gating-gene-select-${gatingScatterplotGeneXId}`
232094
+ }, children: [jsxRuntimeExports.jsx("option", { value: "", children: "None" }), geneSelectOptions.map((name2) => jsxRuntimeExports.jsx("option", { value: name2, children: name2 }, name2))] }) })] }), jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsx(TableCell, { className: classes2.labelCell, variant: "head", scope: "row", children: jsxRuntimeExports.jsxs("label", { htmlFor: `scatterplot-gating-gene-select-${gatingScatterplotGeneYId}`, children: [capitalize$3(featureType), " along Y"] }) }), jsxRuntimeExports.jsx(TableCell, { className: classes2.inputCell, variant: "body", children: jsxRuntimeExports.jsxs(OptionSelect, { className: classes2.select, value: gatingFeatureSelectionY ?? "", onChange: handleSelectionY, inputProps: {
232095
+ id: `scatterplot-gating-gene-select-${gatingScatterplotGeneYId}`
232096
+ }, children: [jsxRuntimeExports.jsx("option", { value: "", children: "None" }), geneSelectOptions.map((name2) => jsxRuntimeExports.jsx("option", { value: name2, children: name2 }, name2))] }) })] }), jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsx(TableCell, { className: classes2.labelCell, variant: "head", scope: "row", children: jsxRuntimeExports.jsx("label", { htmlFor: `scatterplot-gating-transform-select-${gatingScatterplotOptionsId}`, children: "Transform" }) }), jsxRuntimeExports.jsx(TableCell, { className: classes2.inputCell, variant: "body", children: jsxRuntimeExports.jsx(OptionSelect, { className: classes2.select, value: gatingFeatureValueTransform === null ? "" : gatingFeatureValueTransform, onChange: handleTransformChange, inputProps: {
232085
232097
  id: `scatterplot-gating-transform-select-${gatingScatterplotOptionsId}`
232086
- }, children: transformOptions.map((opt) => jsxRuntimeExports.jsx("option", { value: opt.value === null ? "" : opt.value, children: opt.name }, opt.name)) }) })] }), jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsx(TableCell, { className: classes2.labelCell, variant: "head", scope: "row", children: jsxRuntimeExports.jsx("label", { htmlFor: `scatterplot-gating-transform-coefficient-${gatingScatterplotOptionsId}`, children: "Transform Coefficient" }) }), jsxRuntimeExports.jsx(TableCell, { className: classes2.inputCell, variant: "body", children: jsxRuntimeExports.jsx(TextField, { label: "Transform Coefficient", type: "number", onChange: handleTransformCoefficientChange, value: gatingFeatureValueTransformCoefficient, slotProps: { input: { shrink: true } }, id: `scatterplot-gating-transform-coefficient-${gatingScatterplotOptionsId}` }) })] })] });
232098
+ }, children: transformOptions.map((opt) => jsxRuntimeExports.jsx("option", { value: opt.value === null ? "" : opt.value, children: opt.name }, opt.name)) }) })] }), jsxRuntimeExports.jsxs(TableRow, { children: [jsxRuntimeExports.jsx(TableCell, { className: classes2.labelCell, variant: "head", scope: "row", children: jsxRuntimeExports.jsx("label", { htmlFor: `scatterplot-gating-transform-coefficient-${gatingScatterplotOptionsId}`, children: "Transform Coefficient" }) }), jsxRuntimeExports.jsx(TableCell, { className: classes2.inputCell, variant: "body", children: jsxRuntimeExports.jsx(TextField, { label: "Transform Coefficient", type: "number", onChange: handleTransformCoefficientChange, value: gatingFeatureValueTransformCoefficient, slotProps: { inputLabel: { shrink: true } }, id: `scatterplot-gating-transform-coefficient-${gatingScatterplotOptionsId}` }) })] })] });
232087
232099
  }
232088
232100
  function GatingSubscriber(props) {
232089
232101
  const {
@@ -232104,6 +232116,7 @@ function GatingSubscriber(props) {
232104
232116
  const setComponentHover = useSetComponentHover();
232105
232117
  const setComponentViewInfo = useSetComponentViewInfo(uuid2);
232106
232118
  const [{ dataset, obsType, featureType, featureValueType, embeddingZoom: zoom2, embeddingTargetX: targetX2, embeddingTargetY: targetY2, embeddingTargetZ: targetZ, obsFilter: cellFilter, obsHighlight: cellHighlight, obsSetSelection: cellSetSelection, obsSetColor: cellSetColor, obsColorEncoding: cellColorEncoding, additionalObsSets: additionalCellSets, embeddingObsSetPolygonsVisible: cellSetPolygonsVisible, embeddingObsSetLabelsVisible: cellSetLabelsVisible, embeddingObsSetLabelSize: cellSetLabelSize, embeddingObsRadius: cellRadiusFixed, embeddingObsRadiusMode: cellRadiusMode, embeddingObsOpacity: cellOpacityFixed, embeddingObsOpacityMode: cellOpacityMode, featureValueColormap: geneExpressionColormap, featureValueColormapRange: geneExpressionColormapRange, featureSelection: gatingFeatureSelectionColor, featureValueTransform, featureValueTransformCoefficient, gatingFeatureSelectionX, gatingFeatureSelectionY }, { setEmbeddingZoom: setZoom, setEmbeddingTargetX: setTargetX, setEmbeddingTargetY: setTargetY, setEmbeddingTargetZ: setTargetZ, setObsFilter: setCellFilter, setObsSetSelection: setCellSetSelection, setObsHighlight: setCellHighlight, setObsSetColor: setCellSetColor, setObsColorEncoding: setCellColorEncoding, setAdditionalObsSets: setAdditionalCellSets, setEmbeddingObsSetPolygonsVisible: setCellSetPolygonsVisible, setEmbeddingObsSetLabelsVisible: setCellSetLabelsVisible, setEmbeddingObsSetLabelSize: setCellSetLabelSize, setEmbeddingObsRadius: setCellRadiusFixed, setEmbeddingObsRadiusMode: setCellRadiusMode, setEmbeddingObsOpacity: setCellOpacityFixed, setEmbeddingObsOpacityMode: setCellOpacityMode, setFeatureValueColormap: setGeneExpressionColormap, setFeatureValueColormapRange: setGeneExpressionColormapRange, setFeatureValueTransform, setFeatureValueTransformCoefficient, setGatingFeatureSelectionX, setGatingFeatureSelectionY }] = useCoordination(COMPONENT_COORDINATION_TYPES[ViewType$1.GATING], coordinationScopes);
232119
+ const { embeddingZoom: initialZoom, embeddingTargetX: initialTargetX, embeddingTargetY: initialTargetY } = useInitialCoordination(COMPONENT_COORDINATION_TYPES[ViewType$1.GATING], coordinationScopes);
232107
232120
  const [width2, height2, deckRef] = useDeckCanvasSize();
232108
232121
  const title2 = useMemo$1(() => {
232109
232122
  if (titleOverride) {
@@ -232189,6 +232202,7 @@ function GatingSubscriber(props) {
232189
232202
  ]);
232190
232203
  const [dynamicCellRadius, setDynamicCellRadius] = useState(cellRadiusFixed);
232191
232204
  const [dynamicCellOpacity, setDynamicCellOpacity] = useState(cellOpacityFixed);
232205
+ const [originalViewState, setOriginalViewState] = useState(null);
232192
232206
  const mergedCellSets = useMemo$1(() => mergeObsSets(cellSets, additionalCellSets), [cellSets, additionalCellSets]);
232193
232207
  const setCellSelectionProp = useCallback((v) => {
232194
232208
  setObsSelection(v, additionalCellSets, cellSetColor, setCellSetSelection, setAdditionalCellSets, setCellSetColor, setCellColorEncoding);
@@ -232259,13 +232273,20 @@ function GatingSubscriber(props) {
232259
232273
  setDynamicCellRadius(pointSizeDevicePixels);
232260
232274
  const nextCellOpacityScale = getPointOpacity(zoom2, xRange, yRange, width2, height2, numCells, averageFillDensity);
232261
232275
  setDynamicCellOpacity(nextCellOpacityScale);
232262
- if (typeof targetX2 !== "number" || typeof targetY2 !== "number") {
232276
+ if (typeof initialTargetX !== "number" || typeof initialTargetY !== "number") {
232263
232277
  const newTargetX = xExtent[0] + xRange / 2;
232264
232278
  const newTargetY = yExtent[0] + yRange / 2;
232265
232279
  const newZoom = Math.log2(Math.min(width2 / xRange, height2 / yRange));
232266
- setTargetX(newTargetX);
232267
- setTargetY(-newTargetY);
232268
- setZoom(newZoom);
232280
+ const notYetInitialized = typeof targetX2 !== "number" || typeof targetY2 !== "number";
232281
+ const stillDefaultInitialized = targetX2 === newTargetX && targetY2 === -newTargetY;
232282
+ if (notYetInitialized || stillDefaultInitialized) {
232283
+ setTargetX(newTargetX);
232284
+ setTargetY(-newTargetY);
232285
+ setZoom(newZoom);
232286
+ }
232287
+ setOriginalViewState({ target: [newTargetX, -newTargetY, 0], zoom: newZoom });
232288
+ } else if (!originalViewState) {
232289
+ setOriginalViewState({ target: [initialTargetX, initialTargetY, 0], zoom: initialZoom });
232269
232290
  }
232270
232291
  }
232271
232292
  }, [
@@ -232277,6 +232298,8 @@ function GatingSubscriber(props) {
232277
232298
  width2,
232278
232299
  height2,
232279
232300
  zoom2,
232301
+ initialTargetX,
232302
+ initialTargetY,
232280
232303
  averageFillDensity
232281
232304
  ]);
232282
232305
  const cellSelectionSet = useMemo$1(() => new Set(cellSelection), [cellSelection]);
@@ -232307,19 +232330,20 @@ function GatingSubscriber(props) {
232307
232330
  gatingFeatureSelectionY,
232308
232331
  obsType
232309
232332
  ]);
232333
+ const setViewState = ({ zoom: newZoom, target: target2 }) => {
232334
+ setZoom(newZoom);
232335
+ setTargetX(target2[0]);
232336
+ setTargetY(target2[1]);
232337
+ setTargetZ(target2[2] || 0);
232338
+ };
232310
232339
  return jsxRuntimeExports.jsxs(TitleInfo, { title: title2, info: `${commaNumber(cellsCount)} ${pluralize(obsType, cellsCount)}`, closeButtonVisible, downloadButtonVisible, removeGridComponent, urls: urls2, theme, isReady, helpText, errors, options: jsxRuntimeExports.jsx(ScatterplotOptions, { observationsLabel: obsType, cellRadius: cellRadiusFixed, setCellRadius: setCellRadiusFixed, cellRadiusMode, setCellRadiusMode, cellOpacity: cellOpacityFixed, setCellOpacity: setCellOpacityFixed, cellOpacityMode, setCellOpacityMode, cellSetLabelsVisible, setCellSetLabelsVisible, cellSetLabelSize, setCellSetLabelSize, cellSetPolygonsVisible, setCellSetPolygonsVisible, cellColorEncoding, setCellColorEncoding, geneExpressionColormap, setGeneExpressionColormap, geneExpressionColormapRange, setGeneExpressionColormapRange, children: jsxRuntimeExports.jsx(GatingScatterplotOptions, { featureType, gatingFeatureSelectionX, setGatingFeatureSelectionX, gatingFeatureSelectionY, setGatingFeatureSelectionY, gatingFeatureValueTransform: featureValueTransform, setGatingFeatureValueTransform: (newValue) => {
232311
232340
  setFeatureValueTransform(newValue);
232312
232341
  setTargetX(null);
232313
232342
  setTargetY(null);
232314
232343
  setZoom(null);
232315
- }, gatingFeatureValueTransformCoefficient: featureValueTransformCoefficient, setGatingFeatureValueTransformCoefficient: setFeatureValueTransformCoefficient, geneSelectOptions: featureIndex, transformOptions: VALUE_TRANSFORM_OPTIONS }) }), children: [jsxRuntimeExports.jsx(EmptyMessage, { visible: !(gatingFeatureSelectionX && gatingFeatureSelectionY), message: `Select two ${pluralize(featureType, 2)} in the plot settings.` }), jsxRuntimeExports.jsx(ScatterplotWrapper, { ref: deckRef, uuid: uuid2, theme, hideTools: !(gatingFeatureSelectionX && gatingFeatureSelectionY), viewState: { zoom: zoom2, target: [targetX2, targetY2, targetZ] }, setViewState: ({ zoom: newZoom, target: target2 }) => {
232316
- setZoom(newZoom);
232317
- setTargetX(target2[0]);
232318
- setTargetY(target2[1]);
232319
- setTargetZ(target2[2] || 0);
232320
- }, obsEmbeddingIndex: obsIndex, obsEmbedding: obsXY, cellFilter, cellSelection, cellHighlight, cellColors, cellSetPolygons, cellSetLabelSize, cellSetLabelsVisible, cellSetPolygonsVisible, setCellFilter, setCellSelection: setCellSelectionProp, setCellHighlight, cellRadius, cellOpacity, cellColorEncoding, geneExpressionColormap, geneExpressionColormapRange, setComponentHover: () => {
232344
+ }, gatingFeatureValueTransformCoefficient: featureValueTransformCoefficient, setGatingFeatureValueTransformCoefficient: setFeatureValueTransformCoefficient, geneSelectOptions: featureIndex, transformOptions: VALUE_TRANSFORM_OPTIONS }) }), children: [jsxRuntimeExports.jsx(EmptyMessage, { visible: !(gatingFeatureSelectionX && gatingFeatureSelectionY), message: `Select two ${pluralize(featureType, 2)} in the plot settings.` }), jsxRuntimeExports.jsx(ScatterplotWrapper, { ref: deckRef, uuid: uuid2, theme, hideTools: !(gatingFeatureSelectionX && gatingFeatureSelectionY), hideRecenter: !(gatingFeatureSelectionX && gatingFeatureSelectionY), viewState: { zoom: zoom2, target: [targetX2, targetY2, targetZ] }, setViewState, originalViewState, obsEmbeddingIndex: obsIndex, obsEmbedding: obsXY, cellFilter, cellSelection, cellHighlight, cellColors, cellSetPolygons, cellSetLabelSize, cellSetLabelsVisible, cellSetPolygonsVisible, setCellFilter, setCellSelection: setCellSelectionProp, setCellHighlight, cellRadius, cellOpacity, cellColorEncoding, geneExpressionColormap, geneExpressionColormapRange, setComponentHover: () => {
232321
232345
  setComponentHover(uuid2);
232322
- }, updateViewInfo: setComponentViewInfo, getExpressionValue, getCellIsSelected }), !disableTooltip && jsxRuntimeExports.jsx(ScatterplotTooltipSubscriber, { parentUuid: uuid2, obsHighlight: cellHighlight, width: width2, height: height2, getObsInfo })] });
232346
+ }, updateViewInfo: setComponentViewInfo, getExpressionValue, getCellIsSelected, embeddingPointsVisible: true }), !disableTooltip && jsxRuntimeExports.jsx(ScatterplotTooltipSubscriber, { parentUuid: uuid2, obsHighlight: cellHighlight, width: width2, height: height2, getObsInfo })] });
232323
232347
  }
232324
232348
  var DEFAULT_CONFIG = {
232325
232349
  // minimum relative difference between two compared values,
@@ -248635,7 +248659,7 @@ let Location$1 = class Location {
248635
248659
  }
248636
248660
  resolve(path2) {
248637
248661
  let root2 = new URL(`file://${this.path.endsWith("/") ? this.path : `${this.path}/`}`);
248638
- return new Location(this.store, new URL(path2, root2).pathname);
248662
+ return new Location(this.store, decodeURIComponent(new URL(path2, root2).pathname));
248639
248663
  }
248640
248664
  };
248641
248665
  function root$1(store) {
@@ -253006,12 +253030,12 @@ class ErrorBoundary extends React__default.Component {
253006
253030
  }
253007
253031
  }
253008
253032
  const LazySpatialThree = React__default.lazy(async () => {
253009
- const { SpatialWrapper: SpatialWrapper2 } = await import("./index-CpB0CdZl.js");
253033
+ const { SpatialWrapper: SpatialWrapper2 } = await import("./index-BR7YdakD.js");
253010
253034
  return { default: SpatialWrapper2 };
253011
253035
  });
253012
253036
  const SpatialThreeAdapter = React__default.forwardRef((props, ref2) => jsxRuntimeExports.jsx("div", { ref: ref2, style: { width: "100%", height: "100%" }, children: jsxRuntimeExports.jsx(ErrorBoundary, { children: jsxRuntimeExports.jsx(Suspense, { fallback: jsxRuntimeExports.jsx("div", { children: "Loading..." }), children: jsxRuntimeExports.jsx(LazySpatialThree, { ...props }) }) }) }));
253013
253037
  const LazySpatialAccelerated = React__default.lazy(async () => {
253014
- const { SpatialWrapper: SpatialWrapper2 } = await import("./index-BVFjJIoQ.js");
253038
+ const { SpatialWrapper: SpatialWrapper2 } = await import("./index-BWxI6QUS.js");
253015
253039
  return { default: SpatialWrapper2 };
253016
253040
  });
253017
253041
  const SpatialAcceleratedAdapter = React__default.forwardRef((props, ref2) => jsxRuntimeExports.jsx("div", { ref: ref2, style: { width: "100%", height: "100%" }, children: jsxRuntimeExports.jsx(ErrorBoundary, { children: jsxRuntimeExports.jsx(Suspense, { fallback: jsxRuntimeExports.jsx("div", { children: "Loading..." }), children: jsxRuntimeExports.jsx(LazySpatialAccelerated, { ...props }) }) }) }));
@@ -253216,6 +253240,7 @@ function SpatialSubscriber(props) {
253216
253240
  CoordinationType$1.LEGEND_VISIBLE
253217
253241
  ], coordinationScopes, coordinationScopesBy, CoordinationType$1.POINT_LAYER);
253218
253242
  const is3dMode = spatialRenderingMode === "3D";
253243
+ const shouldUseThree = threeFor3d && is3dMode;
253219
253244
  const [deckWidth, deckHeight, deckRef] = useDeckCanvasSize();
253220
253245
  const [threeWidth, threeHeight, threeRef] = useGridItemSize();
253221
253246
  const width2 = threeFor3d && deckWidth === void 0 ? threeWidth : deckWidth;
@@ -253484,7 +253509,7 @@ function SpatialSubscriber(props) {
253484
253509
  }
253485
253510
  }
253486
253511
  };
253487
- return jsxRuntimeExports.jsxs(TitleInfo, { title: title2, info: subtitle, isSpatial: true, urls: urls2, theme, closeButtonVisible, downloadButtonVisible, removeGridComponent, isReady, errors, children: [is3dMode ? acceleratedFor3d ? jsxRuntimeExports.jsx(SpatialAcceleratedAdapter, { ref: threeRef, uuid: uuid2, width: width2, height: height2, theme, hideTools: !isSelectable, rotation: [rotationX, rotationY, rotationZ], setRotationX, setRotationY, setRotationZ, targetT, targetZ, viewState: isValidViewState ? {
253512
+ return jsxRuntimeExports.jsxs(TitleInfo, { title: title2, info: subtitle, isSpatial: true, urls: urls2, theme, closeButtonVisible, downloadButtonVisible, removeGridComponent, isReady, errors, children: [shouldUseThree ? acceleratedFor3d ? jsxRuntimeExports.jsx(SpatialAcceleratedAdapter, { ref: threeRef, uuid: uuid2, width: width2, height: height2, theme, hideTools: !isSelectable, rotation: [rotationX, rotationY, rotationZ], setRotationX, setRotationY, setRotationZ, targetT, targetZ, viewState: isValidViewState ? {
253488
253513
  zoom: zoom2,
253489
253514
  target: [targetX2, targetY2, targetZ],
253490
253515
  rotationX,
@@ -266211,7 +266236,7 @@ function HiglassGlobalStyles(props) {
266211
266236
  }
266212
266237
  register({ dataFetcher: ZarrMultivecDataFetcher_default, config: ZarrMultivecDataFetcher_default.config }, { pluginType: "dataFetcher" });
266213
266238
  const LazyHiGlassComponent = React__default.lazy(async () => {
266214
- const { HiGlassComponent } = await import("./higlass-DEBJRTUn.js");
266239
+ const { HiGlassComponent } = await import("./higlass-CHvsEtQd.js");
266215
266240
  return { default: HiGlassComponent };
266216
266241
  });
266217
266242
  const HG_SIZE = 800;
@@ -269158,7 +269183,7 @@ function NeuroglancerGlobalStyles(props) {
269158
269183
  const { classes: classes2 } = props;
269159
269184
  return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx(GlobalStyles$3, { styles: globalNeuroglancerCss }), jsxRuntimeExports.jsx(ScopedGlobalStyles, { styles: globalNeuroglancerStyles, parentClassName: classes2.neuroglancerWrapper })] });
269160
269185
  }
269161
- const LazyReactNeuroglancer = React__default.lazy(() => import("./ReactNeuroglancer-CbIsUGfp.js"));
269186
+ const LazyReactNeuroglancer = React__default.lazy(() => import("./ReactNeuroglancer-BoUKguqy.js"));
269162
269187
  function createWorker() {
269163
269188
  return new WorkerFactory();
269164
269189
  }
@@ -269235,6 +269260,108 @@ class NeuroglancerComp extends PureComponent {
269235
269260
  return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx(NeuroglancerGlobalStyles, { classes: classes2 }), jsxRuntimeExports.jsx("div", { className: classes2.neuroglancerWrapper, children: jsxRuntimeExports.jsx(Suspense, { fallback: jsxRuntimeExports.jsx("div", { children: "Loading..." }), children: jsxRuntimeExports.jsx(LazyReactNeuroglancer, { brainMapsClientId: "NOT_A_VALID_ID", viewerState, onViewerStateChanged: this.onViewerStateChanged, bundleRoot: this.bundleRoot, cellColorMapping, ref: this.onRef }) }) })] });
269236
269261
  }
269237
269262
  }
269263
+ const DEFAULT_NG_PROPS = {
269264
+ layout: "3d",
269265
+ position: [0, 0, 0],
269266
+ projectionOrientation: [0, 0, 0, 1],
269267
+ projectionScale: 1024,
269268
+ crossSectionScale: 1
269269
+ };
269270
+ function toPrecomputedSource(url) {
269271
+ if (!url) {
269272
+ return void 0;
269273
+ }
269274
+ return `precomputed://${url}`;
269275
+ }
269276
+ const UNIT_TO_NM = {
269277
+ nm: 1,
269278
+ um: 1e3,
269279
+ µm: 1e3,
269280
+ mm: 1e6,
269281
+ cm: 1e7,
269282
+ m: 1e9
269283
+ };
269284
+ function isInNanometerRange(value2, unit2, minNm = 1, maxNm = 100) {
269285
+ const n3 = typeof value2 === "number" ? value2 : Number(value2);
269286
+ if (!Number.isFinite(n3))
269287
+ return false;
269288
+ const factor = unit2 && UNIT_TO_NM[unit2];
269289
+ if (!factor)
269290
+ return false;
269291
+ const nm = n3 * factor;
269292
+ return nm >= minNm && nm <= maxNm;
269293
+ }
269294
+ function normalizeDimensionsToNanometers(opts2) {
269295
+ const { dimensionUnit, dimensionX, dimensionY, dimensionZ } = opts2;
269296
+ if (!dimensionUnit || !dimensionX || !dimensionY || !dimensionZ) {
269297
+ console.warn("Missing dimension info");
269298
+ }
269299
+ const xNm = isInNanometerRange(dimensionX, dimensionUnit);
269300
+ const yNm = isInNanometerRange(dimensionY, dimensionUnit);
269301
+ const zNm = isInNanometerRange(dimensionZ, dimensionUnit);
269302
+ if (!xNm || !yNm || !zNm) {
269303
+ console.warn("Dimension was converted to nm units");
269304
+ }
269305
+ return {
269306
+ x: xNm ? [dimensionX, dimensionUnit] : [1, "nm"],
269307
+ y: yNm ? [dimensionY, dimensionUnit] : [1, "nm"],
269308
+ z: zNm ? [dimensionZ, dimensionUnit] : [1, "nm"]
269309
+ };
269310
+ }
269311
+ function extractDataTypeEntities(loaders, dataset, dataType) {
269312
+ const datasetEntry = loaders?.[dataset];
269313
+ const internMap = datasetEntry?.loaders?.[dataType];
269314
+ if (!internMap || typeof internMap.entries !== "function")
269315
+ return [];
269316
+ return Array.from(internMap.entries()).map(([key2, loader2]) => {
269317
+ const url = loader2?.url ?? loader2?.dataSource?.url ?? void 0;
269318
+ const fileUid = key2?.fileUid ?? loader2?.coordinationValues?.fileUid ?? void 0;
269319
+ const { position: position2, projectionOrientation, projectionScale, crossSectionScale } = loader2?.options ?? {};
269320
+ const isPrecomputed = loader2?.fileType.includes("precomputed");
269321
+ if (!isPrecomputed) {
269322
+ console.warn("Filetype needs to be precomputed");
269323
+ }
269324
+ return {
269325
+ key: key2,
269326
+ type: "segmentation",
269327
+ fileUid,
269328
+ layout: DEFAULT_NG_PROPS.layout,
269329
+ url,
269330
+ source: toPrecomputedSource(url),
269331
+ name: fileUid ?? key2?.name ?? "segmentation",
269332
+ // For precomputed: nm is the unit used
269333
+ dimensions: normalizeDimensionsToNanometers(loader2?.options),
269334
+ // If not provided, no error, but difficult to see the data
269335
+ position: Array.isArray(position2) && position2.length === 3 ? position2 : DEFAULT_NG_PROPS.position,
269336
+ // If not provided, will have a default orientation
269337
+ projectionOrientation: Array.isArray(projectionOrientation) && projectionOrientation.length === 4 ? projectionOrientation : DEFAULT_NG_PROPS.projectionOrientation,
269338
+ projectionScale: Number.isFinite(projectionScale) ? projectionScale : DEFAULT_NG_PROPS.projectionScale,
269339
+ crossSectionScale: Number.isFinite(crossSectionScale) ? crossSectionScale : DEFAULT_NG_PROPS.crossSectionScale
269340
+ };
269341
+ });
269342
+ }
269343
+ function useExtractOptionsForNg(loaders, dataset, dataType) {
269344
+ const extractedEntities = useMemo$1(() => extractDataTypeEntities(loaders, dataset, dataType), [loaders, dataset, dataType]);
269345
+ const layers = useMemo$1(() => extractedEntities.filter((t4) => t4.source).map((t4) => ({
269346
+ type: t4.type,
269347
+ source: t4.source,
269348
+ segments: [],
269349
+ name: t4.name || "segmentation"
269350
+ })), [extractedEntities]);
269351
+ const viewerState = useMemo$1(() => ({
269352
+ dimensions: extractedEntities[0]?.dimensions,
269353
+ position: extractedEntities[0]?.position,
269354
+ crossSectionScale: extractedEntities[0]?.crossSectionScale,
269355
+ projectionOrientation: extractedEntities[0]?.projectionOrientation,
269356
+ projectionScale: extractedEntities[0]?.projectionScale,
269357
+ layers,
269358
+ layout: extractedEntities[0].layout
269359
+ }));
269360
+ return [viewerState];
269361
+ }
269362
+ function useNeuroglancerViewerState(loaders, dataset, isRequired, coordinationSetters, initialCoordinationValues, matchOn) {
269363
+ return useExtractOptionsForNg(loaders, dataset, DataType$3.OBS_SEGMENTATIONS);
269364
+ }
269238
269365
  /**
269239
269366
  * @license
269240
269367
  * Copyright 2010-2023 Three.js Authors
@@ -298850,10 +298977,6 @@ const multiplyQuat = (a2, b2) => {
298850
298977
  const conjQuat = (q) => [-q[0], -q[1], -q[2], q[3]];
298851
298978
  const rad2deg = (r3) => r3 * 180 / Math.PI;
298852
298979
  const deg2rad = (d) => d * Math.PI / 180;
298853
- function isValidState(viewerState) {
298854
- const { projectionScale, projectionOrientation, position: position2, dimensions } = viewerState || {};
298855
- return dimensions !== void 0 && typeof projectionScale === "number" && Array.isArray(projectionOrientation) && projectionOrientation.length === 4 && Array.isArray(position2) && position2.length === 3;
298856
- }
298857
298980
  function valueGreaterThanEpsilon(a2, b2, epsilon3) {
298858
298981
  if (Array.isArray(a2) && Array.isArray(b2) && a2.length === b2.length) {
298859
298982
  return a2.some((val, i2) => Math.abs(val - b2[i2]) > epsilon3);
@@ -298865,8 +298988,6 @@ function valueGreaterThanEpsilon(a2, b2, epsilon3) {
298865
298988
  }
298866
298989
  const nearEq = (a2, b2, epsilon3) => Number.isFinite(a2) && Number.isFinite(b2) ? Math.abs(a2 - b2) <= epsilon3 : a2 === b2;
298867
298990
  function diffCameraState(prev2, next4) {
298868
- if (!isValidState(next4))
298869
- return { changed: false, scale: false, pos: false, rot: false };
298870
298991
  const eps = EPSILON_KEYS_MAPPING_NG;
298871
298992
  const scale2 = valueGreaterThanEpsilon(prev2?.projectionScale, next4?.projectionScale, eps.projectionScale);
298872
298993
  const posHard = valueGreaterThanEpsilon(prev2?.position, next4?.position, eps.position);
@@ -298913,7 +299034,7 @@ function rgbToHex$1(rgb2) {
298913
299034
  return typeof rgb2 === "string" ? rgb2 : `#${rgb2.map((c2) => c2.toString(16).padStart(2, "0")).join("")}`;
298914
299035
  }
298915
299036
  function NeuroglancerSubscriber(props) {
298916
- const { coordinationScopes: coordinationScopesRaw, closeButtonVisible, downloadButtonVisible, removeGridComponent, theme, title: title2 = "Neuroglancer", helpText = ViewHelpMapping.NEUROGLANCER, viewerState: initialViewerState } = props;
299037
+ const { coordinationScopes: coordinationScopesRaw, closeButtonVisible, downloadButtonVisible, removeGridComponent, theme, title: title2 = "Neuroglancer", helpText = ViewHelpMapping.NEUROGLANCER } = props;
298917
299038
  const loaders = useLoaders();
298918
299039
  const coordinationScopes = useCoordinationScopes(coordinationScopesRaw);
298919
299040
  const [{
@@ -298945,11 +299066,12 @@ function NeuroglancerSubscriber(props) {
298945
299066
  setSpatialRotationOrbit: setRotationOrbit,
298946
299067
  setSpatialZoom: setZoom
298947
299068
  }] = useCoordination(COMPONENT_COORDINATION_TYPES[ViewType$1.NEUROGLANCER], coordinationScopes);
298948
- const latestViewerStateRef = useRef(initialViewerState);
298949
- const initialRotationPushedRef = useRef(false);
298950
299069
  const { classes: classes2 } = useStyles$4();
298951
299070
  const [{ obsSets: cellSets }] = useObsSetsData(loaders, dataset, false, { setObsSetSelection: setCellSetSelection, setObsSetColor: setCellSetColor }, { cellSetSelection, obsSetColor: cellSetColor }, { obsType });
298952
299071
  const [{ obsIndex }] = useObsEmbeddingData(loaders, dataset, true, {}, {}, { obsType, embeddingType: mapping });
299072
+ const [initalViewerState] = useNeuroglancerViewerState(loaders, dataset);
299073
+ const latestViewerStateRef = useRef(initalViewerState);
299074
+ const initialRotationPushedRef = useRef(false);
298953
299075
  const ngRotPushAtRef = useRef(0);
298954
299076
  const lastInteractionSource = useRef(null);
298955
299077
  const applyNgUpdateTimeoutRef = useRef(null);
@@ -298996,7 +299118,7 @@ function NeuroglancerSubscriber(props) {
298996
299118
  return;
298997
299119
  const zRef = Number.isFinite(spatialZoom) ? spatialZoom : 0;
298998
299120
  initialRenderCalibratorRef.current = makeVitNgZoomCalibrator(projectionScale, zRef);
298999
- const [px2 = 0, py2 = 0, pz2 = 0] = Array.isArray(position2) ? position2 : [0, 0, 0];
299121
+ const [px2 = 0, py2 = 0, pz2 = 0] = position2;
299000
299122
  const tX = Number.isFinite(spatialTargetX) ? spatialTargetX : 0;
299001
299123
  const tY = Number.isFinite(spatialTargetY) ? spatialTargetY : 0;
299002
299124
  translationOffsetRef.current = [px2 - tX, py2 - tY, pz2];
@@ -357324,6 +357446,22 @@ class SpatialDataObsEmbeddingLoader extends ObsEmbeddingAnndataLoader {
357324
357446
  this.tablePath = this.options.tablePath;
357325
357447
  }
357326
357448
  }
357449
+ class PrecomputedMeshSource {
357450
+ constructor({ url, requestInit: requestInit2 }) {
357451
+ this.url = url;
357452
+ this.requestInit = requestInit2;
357453
+ }
357454
+ }
357455
+ class PrecomputedMeshDataLoader extends AbstractTwoStepLoader {
357456
+ /* eslint-disable class-methods-use-this */
357457
+ async load(url) {
357458
+ return new LoaderResult({
357459
+ obsIndex: null,
357460
+ obsSegmentations: {},
357461
+ obsSegmentationsType: "mesh"
357462
+ }, url);
357463
+ }
357464
+ }
357327
357465
  const decoder = new TextDecoder("utf-8");
357328
357466
  const decodeUtf8 = (buffer2) => decoder.decode(buffer2);
357329
357467
  const encoder = new TextEncoder();
@@ -379109,6 +379247,7 @@ const baseFileTypes = [
379109
379247
  ...makeZarrFileTypes(FileType$1.OBS_EMBEDDING_SPATIALDATA_ZARR, DataType$3.OBS_EMBEDDING, SpatialDataObsEmbeddingLoader, SpatialDataTableSource, obsEmbeddingSpatialdataSchema),
379110
379248
  ...makeZarrFileTypes(FileType$1.FEATURE_LABELS_SPATIALDATA_ZARR, DataType$3.FEATURE_LABELS, FeatureLabelsAnndataLoader, SpatialDataTableSource, featureLabelsAnndataSchema),
379111
379249
  makeFileType(FileType$1.OBS_SEGMENTATIONS_GLB, DataType$3.OBS_SEGMENTATIONS, GlbDataLoader, GlbSource, meshGlbSchema),
379250
+ makeFileType(FileType$1.OBS_SEGMENTATIONS_NG_PRECOMPUTED, DataType$3.OBS_SEGMENTATIONS, PrecomputedMeshDataLoader, PrecomputedMeshSource, ngSchema),
379112
379251
  // All legacy file types
379113
379252
  makeFileType(FileType$1.OBS_FEATURE_MATRIX_EXPRESSION_MATRIX_ZARR, DataType$3.OBS_FEATURE_MATRIX, MatrixZarrAsObsFeatureMatrixLoader, ZarrDataSource, z.null()),
379114
379253
  makeFileType(FileType$1.IMAGE_RASTER_JSON, DataType$3.IMAGE, RasterJsonAsImageLoader, JsonSource, rasterJsonSchema),
@@ -1,7 +1,7 @@
1
- import { G as Group, M as Matrix4, T as TrianglesDrawMode, a as TriangleFanDrawMode, b as TriangleStripDrawMode, R as REVISION, L as Loader, c as LoaderUtils, F as FileLoader, d as MeshPhysicalMaterial, V as Vector2, C as Color, S as SpotLight, P as PointLight, D as DirectionalLight, e as Vector3, I as InstancedMesh, Q as Quaternion, O as Object3D, f as TextureLoader, g as ImageBitmapLoader, B as BufferAttribute, h as InterleavedBuffer, i as LinearMipmapLinearFilter, N as NearestMipmapLinearFilter, j as LinearMipmapNearestFilter, k as NearestMipmapNearestFilter, l as LinearFilter, m as NearestFilter, n as RepeatWrapping, o as MirroredRepeatWrapping, p as ClampToEdgeWrapping, q as PointsMaterial, r as Material, s as LineBasicMaterial, t as MeshStandardMaterial, u as DoubleSide, v as MeshBasicMaterial, w as PropertyBinding, x as BufferGeometry, y as SkinnedMesh, z as Mesh, A as LineSegments, E as Line$1, H as LineLoop, J as Points, K as PerspectiveCamera, U as MathUtils, W as OrthographicCamera, X as Skeleton, Y as InterpolateDiscrete, Z as InterpolateLinear, _ as AnimationClip, $ as Bone, a0 as InterleavedBufferAttribute, a1 as Texture, a2 as VectorKeyframeTrack, a3 as QuaternionKeyframeTrack, a4 as NumberKeyframeTrack, a5 as FrontSide, a6 as Interpolant, a7 as Box3, a8 as Sphere, a9 as InstancedBufferGeometry, aa as Float32BufferAttribute, ab as InstancedInterleavedBuffer, ac as WireframeGeometry, ad as ShaderMaterial, ae as UniformsUtils, af as UniformsLib, ag as Vector4, ah as Line3, ai as SphereGeometry, aj as _extends, ak as Plane, al as Triangle, am as BackSide, an as Ray$1, ao as jsxRuntimeExports, ap as Matrix3, aq as CoordinationType, ar as Data3DTexture, as as RedFormat, at as FloatType, au as getImageSize, av as Scene } from "./index-eNWork9t.js";
1
+ import { G as Group, M as Matrix4, T as TrianglesDrawMode, a as TriangleFanDrawMode, b as TriangleStripDrawMode, R as REVISION, L as Loader, c as LoaderUtils, F as FileLoader, d as MeshPhysicalMaterial, V as Vector2, C as Color, S as SpotLight, P as PointLight, D as DirectionalLight, e as Vector3, I as InstancedMesh, Q as Quaternion, O as Object3D, f as TextureLoader, g as ImageBitmapLoader, B as BufferAttribute, h as InterleavedBuffer, i as LinearMipmapLinearFilter, N as NearestMipmapLinearFilter, j as LinearMipmapNearestFilter, k as NearestMipmapNearestFilter, l as LinearFilter, m as NearestFilter, n as RepeatWrapping, o as MirroredRepeatWrapping, p as ClampToEdgeWrapping, q as PointsMaterial, r as Material, s as LineBasicMaterial, t as MeshStandardMaterial, u as DoubleSide, v as MeshBasicMaterial, w as PropertyBinding, x as BufferGeometry, y as SkinnedMesh, z as Mesh, A as LineSegments, E as Line$1, H as LineLoop, J as Points, K as PerspectiveCamera, U as MathUtils, W as OrthographicCamera, X as Skeleton, Y as InterpolateDiscrete, Z as InterpolateLinear, _ as AnimationClip, $ as Bone, a0 as InterleavedBufferAttribute, a1 as Texture, a2 as VectorKeyframeTrack, a3 as QuaternionKeyframeTrack, a4 as NumberKeyframeTrack, a5 as FrontSide, a6 as Interpolant, a7 as Box3, a8 as Sphere, a9 as InstancedBufferGeometry, aa as Float32BufferAttribute, ab as InstancedInterleavedBuffer, ac as WireframeGeometry, ad as ShaderMaterial, ae as UniformsUtils, af as UniformsLib, ag as Vector4, ah as Line3, ai as SphereGeometry, aj as _extends, ak as Plane, al as Triangle, am as BackSide, an as Ray$1, ao as jsxRuntimeExports, ap as Matrix3, aq as CoordinationType, ar as Data3DTexture, as as RedFormat, at as FloatType, au as getImageSize, av as Scene } from "./index-BNUI-w49.js";
2
2
  import * as React from "react";
3
3
  import { useRef, useEffect, useState, forwardRef } from "react";
4
- import { u as useThree, a as useFrame, c as create, e as extend, b as createPortal, O as OrbitControls, C as Canvas } from "./OrbitControls-Cz9DCZ2j.js";
4
+ import { u as useThree, a as useFrame, c as create, e as extend, b as createPortal, O as OrbitControls, C as Canvas } from "./OrbitControls-CeIrm0B5.js";
5
5
  const isPromise = (promise) => typeof promise === "object" && typeof promise.then === "function";
6
6
  const globalCache = [];
7
7
  function shallowEqualArrays(arrA, arrB, equal = (a, b) => a === b) {
@@ -5027,7 +5027,7 @@ const Text = /* @__PURE__ */ React.forwardRef(({
5027
5027
  const {
5028
5028
  Text: TextMeshImpl,
5029
5029
  preloadFont
5030
- } = suspend(async () => import("./troika-three-text.esm-B0ld0YMM.js"), []);
5030
+ } = suspend(async () => import("./troika-three-text.esm-C8Q3aJRr.js"), []);
5031
5031
  const invalidate = useThree(({
5032
5032
  invalidate: invalidate2
5033
5033
  }) => invalidate2);
@@ -1,6 +1,6 @@
1
- import { aw as log, ax as isEqual, ar as Data3DTexture, as as RedFormat, ay as UnsignedByteType, l as LinearFilter, az as RedIntegerFormat, aA as UnsignedIntType, m as NearestFilter, e as Vector3, V as Vector2, ag as Vector4, ae as UniformsUtils, aq as CoordinationType, aB as WebGLMultipleRenderTargets, aC as RGBAFormat, av as Scene, W as OrthographicCamera, ad as ShaderMaterial, z as Mesh, aD as PlaneGeometry, ao as jsxRuntimeExports, aE as GLSL3, am as BackSide } from "./index-eNWork9t.js";
1
+ import { aw as log, ax as isEqual, ar as Data3DTexture, as as RedFormat, ay as UnsignedByteType, l as LinearFilter, az as RedIntegerFormat, aA as UnsignedIntType, m as NearestFilter, e as Vector3, V as Vector2, ag as Vector4, ae as UniformsUtils, aq as CoordinationType, aB as WebGLMultipleRenderTargets, aC as RGBAFormat, av as Scene, W as OrthographicCamera, ad as ShaderMaterial, z as Mesh, aD as PlaneGeometry, ao as jsxRuntimeExports, aE as GLSL3, am as BackSide } from "./index-BNUI-w49.js";
2
2
  import { useRef, useState, useMemo, useEffect, useCallback } from "react";
3
- import { u as useThree, a as useFrame, O as OrbitControls, C as Canvas } from "./OrbitControls-Cz9DCZ2j.js";
3
+ import { u as useThree, a as useFrame, O as OrbitControls, C as Canvas } from "./OrbitControls-CeIrm0B5.js";
4
4
  const LogLevel = {
5
5
  INFO: "info",
6
6
  WARN: "warn",
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { bQ, bO, bM, bP, bN, bL, bR } from "./index-eNWork9t.js";
1
+ import { bQ, bO, bM, bP, bN, bL, bR } from "./index-BNUI-w49.js";
2
2
  import { useComplexCoordination, useComplexCoordinationSecondary, useCoordination, useCoordinationScopes, useCoordinationScopesBy, useGridItemSize, useMultiCoordinationScopesNonNull, useMultiCoordinationScopesSecondaryNonNull, usePageModeView } from "@vitessce/vit-s";
3
3
  export {
4
4
  bQ as PluginAsyncFunction,
@@ -1,4 +1,4 @@
1
- import { aW as BaseDecoder } from "./index-eNWork9t.js";
1
+ import { aW as BaseDecoder } from "./index-BNUI-w49.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 { aF as getDefaultExportFromCjs, aW as BaseDecoder, aX as LercParameters, aY as LercAddCompression } from "./index-eNWork9t.js";
2
+ import { aF as getDefaultExportFromCjs, aW as BaseDecoder, aX as LercParameters, aY as LercAddCompression } from "./index-BNUI-w49.js";
3
3
  var LercDecode = { exports: {} };
4
4
  var hasRequiredLercDecode;
5
5
  function requireLercDecode() {
@@ -1,4 +1,4 @@
1
- import { aW as BaseDecoder } from "./index-eNWork9t.js";
1
+ import { aW as BaseDecoder } from "./index-BNUI-w49.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 { aW as BaseDecoder } from "./index-eNWork9t.js";
1
+ import { aW as BaseDecoder } from "./index-BNUI-w49.js";
2
2
  class PackbitsDecoder extends BaseDecoder {
3
3
  decodeBlock(buffer) {
4
4
  const dataView = new DataView(buffer);
@@ -1,4 +1,4 @@
1
- import { aW as BaseDecoder } from "./index-eNWork9t.js";
1
+ import { aW as BaseDecoder } from "./index-BNUI-w49.js";
2
2
  class RawDecoder extends BaseDecoder {
3
3
  decodeBlock(buffer) {
4
4
  return buffer;
@@ -1,4 +1,4 @@
1
- import { bG as MeshDistanceMaterial, bH as MeshDepthMaterial, bI as RGBADepthPacking, ae as UniformsUtils, bJ as ShaderChunk, a9 as InstancedBufferGeometry, a8 as Sphere, a7 as Box3, am as BackSide, u as DoubleSide, z as Mesh, a5 as FrontSide, v as MeshBasicMaterial, C as Color, e as Vector3, M as Matrix4, V as Vector2, ap as Matrix3, ag as Vector4, a1 as Texture, l as LinearFilter, aD as PlaneGeometry, x as BufferGeometry, aa as Float32BufferAttribute, bK as InstancedBufferAttribute } from "./index-eNWork9t.js";
1
+ import { bG as MeshDistanceMaterial, bH as MeshDepthMaterial, bI as RGBADepthPacking, ae as UniformsUtils, bJ as ShaderChunk, a9 as InstancedBufferGeometry, a8 as Sphere, a7 as Box3, am as BackSide, u as DoubleSide, z as Mesh, a5 as FrontSide, v as MeshBasicMaterial, C as Color, e as Vector3, M as Matrix4, V as Vector2, ap as Matrix3, ag as Vector4, a1 as Texture, l as LinearFilter, aD as PlaneGeometry, x as BufferGeometry, aa as Float32BufferAttribute, bK as InstancedBufferAttribute } from "./index-BNUI-w49.js";
2
2
  function workerBootstrap() {
3
3
  var modules = /* @__PURE__ */ Object.create(null);
4
4
  function registerModule(ref, callback) {
@@ -1,4 +1,4 @@
1
- import { aW as BaseDecoder } from "./index-eNWork9t.js";
1
+ import { aW as BaseDecoder } from "./index-BNUI-w49.js";
2
2
  class WebImageDecoder extends BaseDecoder {
3
3
  constructor() {
4
4
  super();
@@ -1 +1 @@
1
- {"version":3,"file":"base-plugins.d.ts","sourceRoot":"","sources":["../src/base-plugins.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base-plugins.d.ts","sourceRoot":"","sources":["../src/base-plugins.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { FileType, DataType, ViewType, CoordinationType, AsyncFunctionType, COMPONENT_COORDINATION_TYPES, ALT_ZARR_STORE_TYPES, } from '@vitessce/constants-internal';
2
2
  import { PluginFileType, PluginJointFileType, PluginViewType, PluginCoordinationType, PluginAsyncFunction, } from '@vitessce/plugins';
3
- import { z, obsEmbeddingCsvSchema, obsSetsCsvSchema, obsSpotsCsvSchema, obsPointsCsvSchema, obsLocationsCsvSchema, obsLabelsCsvSchema, featureLabelsCsvSchema, sampleSetsCsvSchema, obsSetsAnndataSchema, sampleSetsAnndataSchema, obsEmbeddingAnndataSchema, obsSpotsAnndataSchema, obsPointsAnndataSchema, obsLocationsAnndataSchema, obsLabelsAnndataSchema, obsFeatureMatrixAnndataSchema, obsFeatureColumnsAnndataSchema, obsSegmentationsAnndataSchema, featureLabelsAnndataSchema, sampleEdgesAnndataSchema, comparisonMetadataAnndataSchema, featureStatsAnndataSchema, featureSetStatsAnndataSchema, obsSetStatsAnndataSchema, rasterJsonSchema, anndataZarrSchema, anndataH5adSchema, spatialdataZarrSchema, anndataCellsZarrSchema, anndataCellSetsZarrSchema, anndataExpressionMatrixZarrSchema, cellsJsonSchema, imageOmeZarrSchema, imageOmeTiffSchema, imageSpatialdataSchema, obsSegmentationsOmeTiffSchema, obsSegmentationsOmeZarrSchema, obsSegmentationsSpatialdataSchema, obsFeatureMatrixSpatialdataSchema, obsSpotsSpatialdataSchema, obsPointsSpatialdataSchema, obsSetsSpatialdataSchema, obsEmbeddingSpatialdataSchema, obsSetPath, rgbArray, obsSetsSchema, imageLayerObj, cellsLayerObj, neighborhoodsLayerObj, moleculesLayerObj, meshGlbSchema, } from '@vitessce/schemas';
3
+ import { z, obsEmbeddingCsvSchema, obsSetsCsvSchema, obsSpotsCsvSchema, obsPointsCsvSchema, obsLocationsCsvSchema, obsLabelsCsvSchema, featureLabelsCsvSchema, sampleSetsCsvSchema, obsSetsAnndataSchema, sampleSetsAnndataSchema, obsEmbeddingAnndataSchema, obsSpotsAnndataSchema, obsPointsAnndataSchema, obsLocationsAnndataSchema, obsLabelsAnndataSchema, obsFeatureMatrixAnndataSchema, obsFeatureColumnsAnndataSchema, obsSegmentationsAnndataSchema, featureLabelsAnndataSchema, sampleEdgesAnndataSchema, comparisonMetadataAnndataSchema, featureStatsAnndataSchema, featureSetStatsAnndataSchema, obsSetStatsAnndataSchema, rasterJsonSchema, anndataZarrSchema, anndataH5adSchema, spatialdataZarrSchema, anndataCellsZarrSchema, anndataCellSetsZarrSchema, anndataExpressionMatrixZarrSchema, cellsJsonSchema, imageOmeZarrSchema, imageOmeTiffSchema, imageSpatialdataSchema, obsSegmentationsOmeTiffSchema, obsSegmentationsOmeZarrSchema, obsSegmentationsSpatialdataSchema, obsFeatureMatrixSpatialdataSchema, obsSpotsSpatialdataSchema, obsPointsSpatialdataSchema, obsSetsSpatialdataSchema, obsEmbeddingSpatialdataSchema, obsSetPath, rgbArray, obsSetsSchema, imageLayerObj, cellsLayerObj, neighborhoodsLayerObj, moleculesLayerObj, meshGlbSchema, ngSchema, } from '@vitessce/schemas';
4
4
  // Register view type plugins
5
5
  import { DescriptionSubscriber } from '@vitessce/description';
6
6
  import { ObsSetsManagerSubscriber } from '@vitessce/obs-sets-manager';
@@ -37,7 +37,9 @@ import {
37
37
  // OME
38
38
  OmeZarrLoader, OmeZarrAsObsSegmentationsLoader,
39
39
  // SpatialData
40
- SpatialDataTableSource, SpatialDataShapesSource, SpatialDataPointsSource, SpatialDataImageLoader, SpatialDataLabelsLoader, SpatialDataObsSpotsLoader, SpatialDataObsPointsLoader, SpatialDataObsSegmentationsLoader, SpatialDataObsSetsLoader, SpatialDataObsEmbeddingLoader, } from '@vitessce/spatial-zarr';
40
+ SpatialDataTableSource, SpatialDataShapesSource, SpatialDataPointsSource, SpatialDataImageLoader, SpatialDataLabelsLoader, SpatialDataObsSpotsLoader, SpatialDataObsPointsLoader, SpatialDataObsSegmentationsLoader, SpatialDataObsSetsLoader, SpatialDataObsEmbeddingLoader,
41
+ // NG precomputed
42
+ NgPrecomputedMeshSource, NgPrecomputedMeshLoader, } from '@vitessce/spatial-zarr';
41
43
  import { OmeTiffAsObsSegmentationsLoader, OmeTiffLoader, OmeTiffSource, } from '@vitessce/ome-tiff';
42
44
  import { GlbSource, GlbLoader, } from '@vitessce/glb';
43
45
  // Joint file types
@@ -157,6 +159,7 @@ export const baseFileTypes = [
157
159
  ...makeZarrFileTypes(FileType.OBS_EMBEDDING_SPATIALDATA_ZARR, DataType.OBS_EMBEDDING, SpatialDataObsEmbeddingLoader, SpatialDataTableSource, obsEmbeddingSpatialdataSchema),
158
160
  ...makeZarrFileTypes(FileType.FEATURE_LABELS_SPATIALDATA_ZARR, DataType.FEATURE_LABELS, FeatureLabelsAnndataLoader, SpatialDataTableSource, featureLabelsAnndataSchema),
159
161
  makeFileType(FileType.OBS_SEGMENTATIONS_GLB, DataType.OBS_SEGMENTATIONS, GlbLoader, GlbSource, meshGlbSchema),
162
+ makeFileType(FileType.OBS_SEGMENTATIONS_NG_PRECOMPUTED, DataType.OBS_SEGMENTATIONS, NgPrecomputedMeshLoader, NgPrecomputedMeshSource, ngSchema),
160
163
  // All legacy file types
161
164
  makeFileType(FileType.OBS_FEATURE_MATRIX_EXPRESSION_MATRIX_ZARR, DataType.OBS_FEATURE_MATRIX, MatrixZarrAsObsFeatureMatrixLoader, ZarrDataSource, z.null()),
162
165
  makeFileType(FileType.IMAGE_RASTER_JSON, DataType.IMAGE, RasterJsonAsImageLoader, JsonSource, rasterJsonSchema),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vitessce/all",
3
- "version": "3.8.0",
3
+ "version": "3.8.2",
4
4
  "author": "HIDIVE Lab at HMS",
5
5
  "homepage": "http://vitessce.io",
6
6
  "repository": {
@@ -17,38 +17,38 @@
17
17
  ],
18
18
  "dependencies": {
19
19
  "zod": "^3.21.4",
20
- "@vitessce/styles": "3.8.0",
21
- "@vitessce/constants-internal": "3.8.0",
22
- "@vitessce/abstract": "3.8.0",
23
- "@vitessce/error": "3.8.0",
24
- "@vitessce/csv": "3.8.0",
25
- "@vitessce/description": "3.8.0",
26
- "@vitessce/feature-list": "3.8.0",
27
- "@vitessce/genomic-profiles": "3.8.0",
28
- "@vitessce/heatmap": "3.8.0",
29
- "@vitessce/glb": "3.8.0",
30
- "@vitessce/json": "3.8.0",
31
- "@vitessce/layer-controller": "3.8.0",
32
- "@vitessce/layer-controller-beta": "3.8.0",
33
- "@vitessce/link-controller": "3.8.0",
34
- "@vitessce/obs-sets-manager": "3.8.0",
35
- "@vitessce/ome-tiff": "3.8.0",
36
- "@vitessce/plugins": "3.8.0",
37
- "@vitessce/scatterplot-embedding": "3.8.0",
38
- "@vitessce/scatterplot-gating": "3.8.0",
39
- "@vitessce/schemas": "3.8.0",
40
- "@vitessce/spatial": "3.8.0",
41
- "@vitessce/spatial-beta": "3.8.0",
42
- "@vitessce/statistical-plots": "3.8.0",
43
- "@vitessce/status": "3.8.0",
44
- "@vitessce/vit-s": "3.8.0",
45
- "@vitessce/zarr": "3.8.0",
46
- "@vitessce/globals": "3.8.0",
47
- "@vitessce/spatial-zarr": "3.8.0",
48
- "@vitessce/spatial-three": "3.8.0",
49
- "@vitessce/spatial-accelerated": "3.8.0",
50
- "@vitessce/biomarker-select": "3.8.0",
51
- "@vitessce/neuroglancer": "3.8.0"
20
+ "@vitessce/styles": "3.8.2",
21
+ "@vitessce/constants-internal": "3.8.2",
22
+ "@vitessce/abstract": "3.8.2",
23
+ "@vitessce/error": "3.8.2",
24
+ "@vitessce/csv": "3.8.2",
25
+ "@vitessce/description": "3.8.2",
26
+ "@vitessce/feature-list": "3.8.2",
27
+ "@vitessce/genomic-profiles": "3.8.2",
28
+ "@vitessce/heatmap": "3.8.2",
29
+ "@vitessce/glb": "3.8.2",
30
+ "@vitessce/json": "3.8.2",
31
+ "@vitessce/layer-controller": "3.8.2",
32
+ "@vitessce/layer-controller-beta": "3.8.2",
33
+ "@vitessce/link-controller": "3.8.2",
34
+ "@vitessce/obs-sets-manager": "3.8.2",
35
+ "@vitessce/ome-tiff": "3.8.2",
36
+ "@vitessce/plugins": "3.8.2",
37
+ "@vitessce/scatterplot-embedding": "3.8.2",
38
+ "@vitessce/scatterplot-gating": "3.8.2",
39
+ "@vitessce/schemas": "3.8.2",
40
+ "@vitessce/spatial": "3.8.2",
41
+ "@vitessce/spatial-beta": "3.8.2",
42
+ "@vitessce/statistical-plots": "3.8.2",
43
+ "@vitessce/status": "3.8.2",
44
+ "@vitessce/vit-s": "3.8.2",
45
+ "@vitessce/zarr": "3.8.2",
46
+ "@vitessce/globals": "3.8.2",
47
+ "@vitessce/spatial-zarr": "3.8.2",
48
+ "@vitessce/spatial-three": "3.8.2",
49
+ "@vitessce/spatial-accelerated": "3.8.2",
50
+ "@vitessce/biomarker-select": "3.8.2",
51
+ "@vitessce/neuroglancer": "3.8.2"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@types/react": "^18.0.28",
@@ -73,6 +73,7 @@ import {
73
73
  neighborhoodsLayerObj,
74
74
  moleculesLayerObj,
75
75
  meshGlbSchema,
76
+ ngSchema,
76
77
  } from '@vitessce/schemas';
77
78
 
78
79
  // Register view type plugins
@@ -180,6 +181,9 @@ import {
180
181
  SpatialDataObsSegmentationsLoader,
181
182
  SpatialDataObsSetsLoader,
182
183
  SpatialDataObsEmbeddingLoader,
184
+ // NG precomputed
185
+ NgPrecomputedMeshSource,
186
+ NgPrecomputedMeshLoader,
183
187
  } from '@vitessce/spatial-zarr';
184
188
 
185
189
  import {
@@ -339,6 +343,7 @@ export const baseFileTypes = [
339
343
  ...makeZarrFileTypes(FileType.FEATURE_LABELS_SPATIALDATA_ZARR, DataType.FEATURE_LABELS, FeatureLabelsAnndataLoader, SpatialDataTableSource, featureLabelsAnndataSchema),
340
344
 
341
345
  makeFileType(FileType.OBS_SEGMENTATIONS_GLB, DataType.OBS_SEGMENTATIONS, GlbLoader, GlbSource, meshGlbSchema),
346
+ makeFileType(FileType.OBS_SEGMENTATIONS_NG_PRECOMPUTED, DataType.OBS_SEGMENTATIONS, NgPrecomputedMeshLoader, NgPrecomputedMeshSource, ngSchema),
342
347
  // All legacy file types
343
348
  makeFileType(FileType.OBS_FEATURE_MATRIX_EXPRESSION_MATRIX_ZARR, DataType.OBS_FEATURE_MATRIX, MatrixZarrAsObsFeatureMatrixLoader, ZarrDataSource, z.null()),
344
349
  makeFileType(FileType.IMAGE_RASTER_JSON, DataType.IMAGE, RasterJsonAsImageLoader, JsonSource, rasterJsonSchema),