@vitessce/launcher 3.9.8 → 3.9.10

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 { aG as getDefaultExportFromCjs, aH as Raycaster, W as OrthographicCamera, K as PerspectiveCamera, av as Scene, aI as PCFSoftShadowMap, aJ as VSMShadowMap, aK as PCFShadowMap, aL as BasicShadowMap, aM as NoToneMapping, aN as ACESFilmicToneMapping, e as Vector3, V as Vector2, aO as Clock, aP as WebGLRenderer, aQ as Camera, x as BufferGeometry, r as Material, aR as Layers, a1 as Texture, aC as RGBAFormat, ay as UnsignedByteType, C as Color, aj as _extends, aS as THREE, aT as EventDispatcher, aU as MOUSE, aV as TOUCH, aW as Spherical, Q as Quaternion, an as Ray, ak as Plane } from "./index-DBTEa182.js";
1
+ import { aG as getDefaultExportFromCjs, aH as Raycaster, W as OrthographicCamera, K as PerspectiveCamera, av as Scene, aI as PCFSoftShadowMap, aJ as VSMShadowMap, aK as PCFShadowMap, aL as BasicShadowMap, aM as NoToneMapping, aN as ACESFilmicToneMapping, e as Vector3, V as Vector2, aO as Clock, aP as WebGLRenderer, aQ as Camera, x as BufferGeometry, r as Material, aR as Layers, a1 as Texture, aC as RGBAFormat, ay as UnsignedByteType, C as Color, aj as _extends, aS as THREE, aT as EventDispatcher, aU as MOUSE, aV as TOUCH, aW as Spherical, Q as Quaternion, an as Ray, ak as Plane } from "./index-dq5Rjqj6.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 { aG as getDefaultExportFromCjs, b1 as requireAssign, b2 as require_export, b3 as require_core, b4 as require_fails, b5 as require_toObject, b6 as require_objectKeys, b7 as require_cof, b8 as require_wks, b9 as require_iterators, ba as requireWeb_dom_iterable, bb as requireEs6_string_iterator, bc as require_anObject, bd as require_hide, be as require_ctx, bf as require_toLength, bg as require_global, bh as require_objectDp, bi as require_descriptors, bj as require_isObject, bk as require_objectCreate, bl as require_iterDefine, bm as require_iterStep, bn as require_meta, bo as require_isArray, bp as require_iobject, bq as require_setToStringTag, br as require_aFunction, bs as requireIterator, bt as require_propertyDesc, a_ as commonjsGlobal, bu as requireEs6_symbol, bv as requireDefineProperty, bw as require_toIobject, bx as require_objectGopd, by as require_html, bz as require_domCreate, bA as require_library, bB as requireSymbol, bC as require_objectPie, bD as require_has, bE as require_redefine, bF as require_objectAssign, bG as diffCameraState, ao as jsxRuntimeExports } from "./index-DBTEa182.js";
1
+ import { aG as getDefaultExportFromCjs, b1 as requireAssign, b2 as require_export, b3 as require_core, b4 as require_fails, b5 as require_toObject, b6 as require_objectKeys, b7 as require_cof, b8 as require_wks, b9 as require_iterators, ba as requireWeb_dom_iterable, bb as requireEs6_string_iterator, bc as require_anObject, bd as require_hide, be as require_ctx, bf as require_toLength, bg as require_global, bh as require_objectDp, bi as require_descriptors, bj as require_isObject, bk as require_objectCreate, bl as require_iterDefine, bm as require_iterStep, bn as require_meta, bo as require_isArray, bp as require_iobject, bq as require_setToStringTag, br as require_aFunction, bs as requireIterator, bt as require_propertyDesc, a_ as commonjsGlobal, bu as requireEs6_symbol, bv as requireDefineProperty, bw as require_toIobject, bx as require_objectGopd, by as require_html, bz as require_domCreate, bA as require_library, bB as requireSymbol, bC as require_objectPie, bD as require_has, bE as require_redefine, bF as require_objectAssign, bG as diffCameraState, ao as jsxRuntimeExports } from "./index-dq5Rjqj6.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 { aX as BaseDecoder } from "./index-DBTEa182.js";
2
+ import { aX as BaseDecoder } from "./index-dq5Rjqj6.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 { a_ as commonjsGlobal$1, a$ as requireObjectAssign, aG as getDefaultExportFromCjs$1, b0 as earcut } from "./index-DBTEa182.js";
4
+ import { a_ as commonjsGlobal$1, a$ as requireObjectAssign, aG as getDefaultExportFromCjs$1, b0 as earcut } from "./index-dq5Rjqj6.js";
5
5
  var promise = {};
6
6
  var hasRequiredPromise;
7
7
  function requirePromise() {
@@ -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-DBTEa182.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-dq5Rjqj6.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-D_ACWA92.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-EUhjZYox.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-BqEm25-I.js"), []);
5030
+ } = suspend(async () => import("./troika-three-text.esm-C5MetR4O.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, aE as useEventCallback, ao as jsxRuntimeExports, aF as GLSL3, am as BackSide } from "./index-DBTEa182.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, aE as useEventCallback, ao as jsxRuntimeExports, aF as GLSL3, am as BackSide } from "./index-dq5Rjqj6.js";
2
2
  import { useRef, useState, useMemo, useEffect, Suspense } from "react";
3
- import { u as useThree, a as useFrame, O as OrbitControls, C as Canvas } from "./OrbitControls-D_ACWA92.js";
3
+ import { u as useThree, a as useFrame, O as OrbitControls, C as Canvas } from "./OrbitControls-EUhjZYox.js";
4
4
  const LogLevel = {
5
5
  INFO: "info",
6
6
  WARN: "warn",
@@ -11106,6 +11106,7 @@ const FileType$1 = {
11106
11106
  OBS_LABELS_MUDATA_ZARR: "obsLabels.mudata.zarr",
11107
11107
  FEATURE_LABELS_MUDATA_ZARR: "featureLabels.mudata.zarr",
11108
11108
  GENOMIC_PROFILES_ZARR: "genomic-profiles.zarr",
11109
+ GENOMIC_PROFILES_ZARR_ZIP: "genomic-profiles.zarr.zip",
11109
11110
  NEIGHBORHOODS_JSON: "neighborhoods.json",
11110
11111
  // OME-TIFF
11111
11112
  IMAGE_OME_TIFF: "image.ome-tiff",
@@ -11400,6 +11401,7 @@ const ViewHelpMapping = {
11400
11401
  [FileType$1.OBS_LABELS_MOLECULES_JSON]: DataType$3.OBS_LABELS,
11401
11402
  // For old file types
11402
11403
  [FileType$1.GENOMIC_PROFILES_ZARR]: DataType$3.GENOMIC_PROFILES,
11404
+ [FileType$1.GENOMIC_PROFILES_ZARR_ZIP]: DataType$3.GENOMIC_PROFILES,
11403
11405
  [FileType$1.NEIGHBORHOODS_JSON]: DataType$3.NEIGHBORHOODS
11404
11406
  });
11405
11407
  ({
@@ -11564,6 +11566,10 @@ const ALT_ZARR_STORE_TYPES = {
11564
11566
  },
11565
11567
  [FileType$1.OBS_EMBEDDING_SPATIALDATA_ZARR]: {
11566
11568
  zip: FileType$1.OBS_EMBEDDING_SPATIALDATA_ZARR_ZIP
11569
+ },
11570
+ // For genomic profiles:
11571
+ [FileType$1.GENOMIC_PROFILES_ZARR]: {
11572
+ zip: FileType$1.GENOMIC_PROFILES_ZARR_ZIP
11567
11573
  }
11568
11574
  };
11569
11575
  [
@@ -211827,22 +211833,22 @@ async function getDecoder(fileDirectory) {
211827
211833
  const Decoder = await importFn();
211828
211834
  return new Decoder(fileDirectory);
211829
211835
  }
211830
- addDecoder([void 0, 1], () => import("./raw-BChW8Bv2.js").then((m2) => m2.default));
211831
- addDecoder(5, () => import("./lzw-GyLKEjHd.js").then((m2) => m2.default));
211836
+ addDecoder([void 0, 1], () => import("./raw-CgEyy76y.js").then((m2) => m2.default));
211837
+ addDecoder(5, () => import("./lzw-Clq2S7lv.js").then((m2) => m2.default));
211832
211838
  addDecoder(6, () => {
211833
211839
  throw new Error("old style JPEG compression is not supported.");
211834
211840
  });
211835
- addDecoder(7, () => import("./jpeg-BztqQwoS.js").then((m2) => m2.default));
211836
- addDecoder([8, 32946], () => import("./deflate-D0JH4rkz.js").then((m2) => m2.default));
211837
- addDecoder(32773, () => import("./packbits-DJsZJlYo.js").then((m2) => m2.default));
211841
+ addDecoder(7, () => import("./jpeg-ZLpwudQ0.js").then((m2) => m2.default));
211842
+ addDecoder([8, 32946], () => import("./deflate-DdUMPfPX.js").then((m2) => m2.default));
211843
+ addDecoder(32773, () => import("./packbits-CoBPy7Ka.js").then((m2) => m2.default));
211838
211844
  addDecoder(
211839
211845
  34887,
211840
- () => import("./lerc-9qrJ4PEa.js").then(async (m2) => {
211846
+ () => import("./lerc-ClZhA-Ay.js").then(async (m2) => {
211841
211847
  await m2.zstd.init();
211842
211848
  return m2;
211843
211849
  }).then((m2) => m2.default)
211844
211850
  );
211845
- addDecoder(50001, () => import("./webimage-BlgQb3bb.js").then((m2) => m2.default));
211851
+ addDecoder(50001, () => import("./webimage-Cqw15JzH.js").then((m2) => m2.default));
211846
211852
  function copyNewSize(array2, width2, height2, samplesPerPixel = 1) {
211847
211853
  return new (Object.getPrototypeOf(array2)).constructor(width2 * height2 * samplesPerPixel);
211848
211854
  }
@@ -256404,12 +256410,12 @@ class ErrorBoundary extends React__default.Component {
256404
256410
  }
256405
256411
  }
256406
256412
  const LazySpatialThree = React__default.lazy(async () => {
256407
- const { SpatialWrapper: SpatialWrapper2 } = await import("./index-1U4gELip.js");
256413
+ const { SpatialWrapper: SpatialWrapper2 } = await import("./index-HfN7ntLr.js");
256408
256414
  return { default: SpatialWrapper2 };
256409
256415
  });
256410
256416
  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 }) }) }) }));
256411
256417
  const LazySpatialAccelerated = React__default.lazy(async () => {
256412
- const { SpatialWrapper: SpatialWrapper2 } = await import("./index-D2vPxKer.js");
256418
+ const { SpatialWrapper: SpatialWrapper2 } = await import("./index-RsK7cASr.js");
256413
256419
  return { default: SpatialWrapper2 };
256414
256420
  });
256415
256421
  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 }) }) }) }));
@@ -266282,7 +266288,7 @@ function PointLayerController(props) {
266282
266288
  const [coloringTabIndex, setColoringTabIndex] = useState(0);
266283
266289
  const { featureIndex } = pointMatrixIndicesData || {};
266284
266290
  const hasSelectedFeatures = Array.isArray(featureSelection) && featureSelection.length > 0;
266285
- return jsxRuntimeExports.jsxs(Grid$1, { className: lcClasses.layerControllerGrid, children: [jsxRuntimeExports.jsxs(Paper, { elevation: 4, className: lcClasses.layerControllerRoot, children: [jsxRuntimeExports.jsxs(Grid$1, { container: true, direction: "row", justifyContent: "space-between", children: [jsxRuntimeExports.jsx(Grid$1, { size: 1, children: jsxRuntimeExports.jsx(Button, { onClick: handleVisibleChange, className: menuClasses.imageLayerVisibleButton, "aria-label": "Toggle layer visibility", children: jsxRuntimeExports.jsx(Visibility, {}) }) }), jsxRuntimeExports.jsx(Grid$1, { size: 1, children: jsxRuntimeExports.jsx(ChannelColorPickerMenu, { theme, color: color2, setColor: setColor2, palette, isStaticColor, isColormap, featureValueColormap, visible }) }), jsxRuntimeExports.jsx(Grid$1, { size: 6, children: jsxRuntimeExports.jsx(Typography, { className: menuClasses.imageLayerName, children: label2 }) }), jsxRuntimeExports.jsx(Grid$1, { size: 2, children: jsxRuntimeExports.jsx(Slider, { value: opacity2, min: 0, max: 1, step: 1e-3, onChange: handleOpacityChange, className: menuClasses.imageLayerOpacitySlider, orientation: "horizontal", "aria-label": `Adjust opacity for layer ${label2}` }) }), jsxRuntimeExports.jsx(Grid$1, { size: 1, children: jsxRuntimeExports.jsx(PointLayerEllipsisMenu, { featureSelection, obsColorEncoding, setObsColorEncoding, featureValueColormapRange, setFeatureValueColormapRange, tooltipsVisible, setTooltipsVisible, tooltipCrosshairsVisible, setTooltipCrosshairsVisible, legendVisible, setLegendVisible, featureFilterMode, setFeatureFilterMode }) }), jsxRuntimeExports.jsxs(Grid$1, { size: 1, container: true, direction: "row", children: [jsxRuntimeExports.jsx(SvgPoints, { className: classes2.layerTypePointIcon }), null] })] }), loadingDoneFraction < 1 ? jsxRuntimeExports.jsx(Grid$1, { size: 12, container: true, direction: "column", justifyContent: "space-between", className: classes2.pointFeatureControllerGrid, children: jsxRuntimeExports.jsx(LinearProgress, { variant: loadingDoneFraction === 0 ? "indeterminate" : "determinate", value: loadingDoneFraction * 100 }) }) : null, null] }), hasSelectedFeatures ? jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [featureSelection.map((featureName) => jsxRuntimeExports.jsx(LayerPerFeatureController, { theme, featureName, featureColor, setFeatureColor, spatialLayerColor, featureIndex, featureValueColormap, featureSelection, setFeatureSelection, obsColorEncoding, loadingDoneFraction, opacity: opacity2, handleOpacityChange }, featureName)), jsxRuntimeExports.jsx(Grid$1, { className: lcClasses.layerControllerGrid, children: jsxRuntimeExports.jsx(Paper, { elevation: 2, className: lcClasses.layerControllerSubRow, children: jsxRuntimeExports.jsxs(Grid$1, { container: true, direction: "row", justifyContent: "space-between", children: [jsxRuntimeExports.jsx(Grid$1, { size: 1, children: jsxRuntimeExports.jsx(Button, { onClick: () => setFeatureFilterMode(featureFilterMode === "featureSelection" ? null : "featureSelection"), className: menuClasses.imageLayerVisibleButton, "aria-label": "Toggle visibility of unselected points", children: featureFilterMode === "featureSelection" ? jsxRuntimeExports.jsx(VisibilityOffIcon, {}) : jsxRuntimeExports.jsx(VisibilityIcon, {}) }) }), jsxRuntimeExports.jsx(Grid$1, { size: 1, children: jsxRuntimeExports.jsx(ChannelColorPickerMenu, { theme, color: getDefaultColor("dark"), setColor: null, isStaticColor: true, isColormap: false, visible: true }) }), jsxRuntimeExports.jsx(Grid$1, { size: 6, children: jsxRuntimeExports.jsx(Typography, { className: menuClasses.imageLayerName, children: "Unselected" }) }), jsxRuntimeExports.jsx(Grid$1, { size: 2, sx: { paddingRight: "12px", overflow: "visible" }, children: jsxRuntimeExports.jsx(Slider, { value: opacity2, min: 0, max: 1, step: 1e-3, onChange: handleOpacityChange, className: menuClasses.imageLayerOpacitySlider, orientation: "horizontal", "aria-label": "Adjust opacity for unselected layer" }) }), jsxRuntimeExports.jsx(Grid$1, { size: 1, children: jsxRuntimeExports.jsx(SvgPoints, { className: classes2.layerTypePointIcon }) })] }) }) })] }) : null] });
266291
+ return jsxRuntimeExports.jsxs(Grid$1, { className: lcClasses.layerControllerGrid, children: [jsxRuntimeExports.jsxs(Paper, { elevation: 4, className: lcClasses.layerControllerRoot, children: [jsxRuntimeExports.jsxs(Grid$1, { container: true, direction: "row", justifyContent: "space-between", children: [jsxRuntimeExports.jsx(Grid$1, { size: 1, children: jsxRuntimeExports.jsx(Button, { onClick: handleVisibleChange, className: menuClasses.imageLayerVisibleButton, "aria-label": "Toggle layer visibility", children: jsxRuntimeExports.jsx(Visibility, {}) }) }), jsxRuntimeExports.jsx(Grid$1, { size: 1, children: jsxRuntimeExports.jsx(ChannelColorPickerMenu, { theme, color: color2, setColor: setColor2, palette, isStaticColor, isColormap, featureValueColormap, visible }) }), jsxRuntimeExports.jsx(Grid$1, { size: 6, children: jsxRuntimeExports.jsx(Typography, { className: menuClasses.imageLayerName, children: label2 }) }), jsxRuntimeExports.jsx(Grid$1, { size: 2, children: jsxRuntimeExports.jsx(Slider, { value: opacity2, min: 0, max: 1, step: 1e-3, onChange: handleOpacityChange, className: menuClasses.imageLayerOpacitySlider, orientation: "horizontal", "aria-label": `Adjust opacity for layer ${label2}` }) }), jsxRuntimeExports.jsx(Grid$1, { size: 1, children: jsxRuntimeExports.jsx(PointLayerEllipsisMenu, { featureSelection, obsColorEncoding, setObsColorEncoding, featureValueColormapRange, setFeatureValueColormapRange, tooltipsVisible, setTooltipsVisible, tooltipCrosshairsVisible, setTooltipCrosshairsVisible, legendVisible, setLegendVisible, featureFilterMode, setFeatureFilterMode }) }), jsxRuntimeExports.jsxs(Grid$1, { size: 1, container: true, direction: "row", children: [jsxRuntimeExports.jsx(SvgPoints, { className: classes2.layerTypePointIcon }), null] })] }), loadingDoneFraction < 1 ? jsxRuntimeExports.jsx(Grid$1, { size: 12, container: true, direction: "column", justifyContent: "space-between", className: classes2.pointFeatureControllerGrid, children: jsxRuntimeExports.jsx(LinearProgress, { variant: loadingDoneFraction === 0 ? "indeterminate" : "determinate", value: loadingDoneFraction * 100 }) }) : null, null] }), layerPerFeatureForPoints && hasSelectedFeatures ? jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [featureSelection.map((featureName) => jsxRuntimeExports.jsx(LayerPerFeatureController, { theme, featureName, featureColor, setFeatureColor, spatialLayerColor, featureIndex, featureValueColormap, featureSelection, setFeatureSelection, obsColorEncoding, loadingDoneFraction, opacity: opacity2, handleOpacityChange }, featureName)), jsxRuntimeExports.jsx(Grid$1, { className: lcClasses.layerControllerGrid, children: jsxRuntimeExports.jsx(Paper, { elevation: 2, className: lcClasses.layerControllerSubRow, children: jsxRuntimeExports.jsxs(Grid$1, { container: true, direction: "row", justifyContent: "space-between", children: [jsxRuntimeExports.jsx(Grid$1, { size: 1, children: jsxRuntimeExports.jsx(Button, { onClick: () => setFeatureFilterMode(featureFilterMode === "featureSelection" ? null : "featureSelection"), className: menuClasses.imageLayerVisibleButton, "aria-label": "Toggle visibility of unselected points", children: featureFilterMode === "featureSelection" ? jsxRuntimeExports.jsx(VisibilityOffIcon, {}) : jsxRuntimeExports.jsx(VisibilityIcon, {}) }) }), jsxRuntimeExports.jsx(Grid$1, { size: 1, children: jsxRuntimeExports.jsx(ChannelColorPickerMenu, { theme, color: getDefaultColor("dark"), setColor: null, isStaticColor: true, isColormap: false, visible: true }) }), jsxRuntimeExports.jsx(Grid$1, { size: 6, children: jsxRuntimeExports.jsx(Typography, { className: menuClasses.imageLayerName, children: "Unselected" }) }), jsxRuntimeExports.jsx(Grid$1, { size: 2, sx: { paddingRight: "12px", overflow: "visible" }, children: jsxRuntimeExports.jsx(Slider, { value: opacity2, min: 0, max: 1, step: 1e-3, onChange: handleOpacityChange, className: menuClasses.imageLayerOpacitySlider, orientation: "horizontal", "aria-label": "Adjust opacity for unselected layer" }) }), jsxRuntimeExports.jsx(Grid$1, { size: 1, children: jsxRuntimeExports.jsx(SvgPoints, { className: classes2.layerTypePointIcon }) })] }) }) })] }) : null] });
266286
266292
  }
266287
266293
  const useStyles$e = makeStyles()(() => ({
266288
266294
  layerTypeSegmentationIcon: {
@@ -271593,7 +271599,7 @@ function HiglassGlobalStyles(props) {
271593
271599
  }
271594
271600
  register({ dataFetcher: ZarrMultivecDataFetcher_default, config: ZarrMultivecDataFetcher_default.config }, { pluginType: "dataFetcher" });
271595
271601
  const LazyHiGlassComponent = React__default.lazy(async () => {
271596
- const { HiGlassComponent } = await import("./higlass-PHabY4jK.js");
271602
+ const { HiGlassComponent } = await import("./higlass-BQr7sqN0.js");
271597
271603
  return { default: HiGlassComponent };
271598
271604
  });
271599
271605
  const HG_SIZE = 800;
@@ -274541,7 +274547,7 @@ function NeuroglancerGlobalStyles(props) {
274541
274547
  const { classes: classes2 } = props;
274542
274548
  return jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx(GlobalStyles$3, { styles: globalNeuroglancerCss }), jsxRuntimeExports.jsx(ScopedGlobalStyles, { styles: globalNeuroglancerStyles, parentClassName: classes2.neuroglancerWrapper })] });
274543
274549
  }
274544
- const LazyReactNeuroglancer = React__default.lazy(() => import("./ReactNeuroglancer-DJRTUBG7.js"));
274550
+ const LazyReactNeuroglancer = React__default.lazy(() => import("./ReactNeuroglancer-Du5EgkkS.js"));
274545
274551
  function createWorker() {
274546
274552
  const worker = new WorkerFactory$1();
274547
274553
  worker.AsyncComputationWorker = WorkerFactory;
@@ -360952,7 +360958,9 @@ const fileTypeToExtensions = {
360952
360958
  // TODO: how to handle h5ad-based AnnData (since needs reference JSON file).
360953
360959
  // Perhaps just assume one H5AD+one JSON (or .ref.json) file correspond to each other?
360954
360960
  [FileType$1.SPATIALDATA_ZARR]: [".sd.zarr", ".sdata.zarr", ".spatialdata.zarr"],
360955
- [FileType$1.SPATIALDATA_ZARR_ZIP]: [".sd.zarr.zip", ".sdata.zarr.zip", ".spatialdata.zarr.zip"]
360961
+ [FileType$1.SPATIALDATA_ZARR_ZIP]: [".sd.zarr.zip", ".sdata.zarr.zip", ".spatialdata.zarr.zip"],
360962
+ [FileType$1.GENOMIC_PROFILES_ZARR]: [".multivec.zarr"],
360963
+ [FileType$1.GENOMIC_PROFILES_ZARR_ZIP]: [".multivec.zarr.zip"]
360956
360964
  };
360957
360965
  const fileTypeToClass = {
360958
360966
  // OME-TIFF
@@ -360978,7 +360986,9 @@ const ZARR_FILETYPES = [
360978
360986
  FileType$1.IMAGE_OME_ZARR,
360979
360987
  FileType$1.IMAGE_OME_ZARR_ZIP,
360980
360988
  FileType$1.OBS_SEGMENTATIONS_OME_ZARR,
360981
- FileType$1.OBS_SEGMENTATIONS_OME_ZARR_ZIP
360989
+ FileType$1.OBS_SEGMENTATIONS_OME_ZARR_ZIP,
360990
+ FileType$1.GENOMIC_PROFILES_ZARR,
360991
+ FileType$1.GENOMIC_PROFILES_ZARR_ZIP
360982
360992
  ];
360983
360993
  function urlToFileType(url) {
360984
360994
  const match2 = Object.entries(fileTypeToExtensions).find(
@@ -362048,11 +362058,21 @@ class AnnDataSource extends ZarrDataSource {
362048
362058
  categoriesValues = await this.getFlatArrDecompressed(`${prefix2}/${categories}`);
362049
362059
  }
362050
362060
  } else if (encodingType === "categorical") {
362051
- const { dtype } = await open$1(storeRoot.resolve(`${path2}/categories`), { kind: "array" });
362052
- if (dtype === "v2:object" || dtype === "|O") {
362061
+ const categoriesZattrs = await this.getJson(`${path2}/categories/.zattrs`);
362062
+ const categoriesEncodingType = categoriesZattrs?.["encoding-type"];
362063
+ if (categoriesEncodingType === "nullable-string-array") {
362064
+ categoriesValues = await this.getFlatArrDecompressed(`${path2}/categories/values`);
362065
+ } else if (categoriesEncodingType === "string-array") {
362053
362066
  categoriesValues = await this.getFlatArrDecompressed(`${path2}/categories`);
362067
+ } else {
362068
+ const { dtype } = await open$1(storeRoot.resolve(`${path2}/categories`), { kind: "array" });
362069
+ if (dtype === "v2:object" || dtype === "|O") {
362070
+ categoriesValues = await this.getFlatArrDecompressed(`${path2}/categories`);
362071
+ }
362054
362072
  }
362055
362073
  codesPath = `${path2}/codes`;
362074
+ } else if (encodingType === "nullable-string-array") {
362075
+ return this.getFlatArrDecompressed(`${path2}/values`);
362056
362076
  } else if (encodingType === "string-array") {
362057
362077
  return this.getFlatArrDecompressed(path2);
362058
362078
  } else {
@@ -363216,16 +363236,25 @@ let FeatureStatsAnndataLoader$1 = class FeatureStatsAnndataLoader extends Abstra
363216
363236
  return this.dataSource.loadDataFrameIndex(dfPath);
363217
363237
  }
363218
363238
  async loadDataFrame(dfPath) {
363219
- const [featureId2, featureFoldChange, featureSignificance] = await Promise.all([
363220
- this.loadFeatureNames(dfPath),
363221
- this.loadFoldChanges(dfPath),
363222
- this.loadSignificances(dfPath)
363223
- ]);
363224
- return {
363225
- featureId: featureId2,
363226
- featureFoldChange,
363227
- featureSignificance
363228
- };
363239
+ try {
363240
+ const [featureId2, featureFoldChange, featureSignificance] = await Promise.all([
363241
+ this.loadFeatureNames(dfPath),
363242
+ this.loadFoldChanges(dfPath),
363243
+ this.loadSignificances(dfPath)
363244
+ ]);
363245
+ return {
363246
+ featureId: featureId2,
363247
+ featureFoldChange,
363248
+ featureSignificance
363249
+ };
363250
+ } catch (e3) {
363251
+ log$b.warn("Dataframe not found at", dfPath);
363252
+ return {
363253
+ featureId: [],
363254
+ featureFoldChange: [],
363255
+ featureSignificance: []
363256
+ };
363257
+ }
363229
363258
  }
363230
363259
  /**
363231
363260
  *
@@ -363252,7 +363281,7 @@ let FeatureStatsAnndataLoader$1 = class FeatureStatsAnndataLoader extends Abstra
363252
363281
  * @returns {Promise<LoaderResult<FeatureStatsData>>}
363253
363282
  */
363254
363283
  async loadMulti(volcanoOptions) {
363255
- const { analysisType: targetAnalysisType = "rank_genes_groups" } = this.options;
363284
+ const { analysisType: targetAnalysisType = "pydeseq2" } = this.options;
363256
363285
  const { sampleSetSelection, obsSetSelection } = volcanoOptions || {};
363257
363286
  const rawObsSetSelection = obsSetSelection;
363258
363287
  const rawSampleSetSelection = sampleSetSelection;
@@ -364429,7 +364458,7 @@ class SpatialDataObsPointsLoader extends AbstractTwoStepLoader {
364429
364458
  }
364430
364459
  let locations;
364431
364460
  const formatVersion = await this.dataSource.getPointsFormatVersion(path2);
364432
- if (formatVersion === "0.1") {
364461
+ if (formatVersion === "0.1" || formatVersion === "0.2") {
364433
364462
  locations = await this.dataSource.loadPoints(path2);
364434
364463
  } else {
364435
364464
  throw new UnknownSpatialDataFormatError("Only points format version 0.1 is supported.");
@@ -364448,7 +364477,7 @@ class SpatialDataObsPointsLoader extends AbstractTwoStepLoader {
364448
364477
  }
364449
364478
  let locationsFeatureIndex;
364450
364479
  const formatVersion = await this.dataSource.getPointsFormatVersion(path2);
364451
- if (formatVersion === "0.1") {
364480
+ if (formatVersion === "0.1" || formatVersion === "0.2") {
364452
364481
  locationsFeatureIndex = await this.dataSource.loadPointsFeatureIds(path2);
364453
364482
  } else {
364454
364483
  throw new UnknownSpatialDataFormatError("Only points format version 0.1 is supported.");
@@ -364460,7 +364489,7 @@ class SpatialDataObsPointsLoader extends AbstractTwoStepLoader {
364460
364489
  const { path: path2, featureIndexColumn, mortonCodeColumn } = this.options;
364461
364490
  let locations;
364462
364491
  const formatVersion = await this.dataSource.getPointsFormatVersion(path2);
364463
- if (formatVersion === "0.1") {
364492
+ if (formatVersion === "0.1" || formatVersion === "0.2") {
364464
364493
  locations = await this.dataSource.loadPointsInRect(path2, bounds2, signal, featureIndexColumn, mortonCodeColumn);
364465
364494
  } else {
364466
364495
  throw new UnknownSpatialDataFormatError("Only points format version 0.1 is supported.");
@@ -364492,10 +364521,8 @@ class SpatialDataObsPointsLoader extends AbstractTwoStepLoader {
364492
364521
  // and for the presence of morton_code_2d and feature_index columns.
364493
364522
  this.dataSource.supportsLoadPointsInRect(path2, featureIndexColumnName, mortonCodeColumn)
364494
364523
  ]);
364495
- const isSupportedVersion = formatVersion === "0.1";
364496
- const boundingBox = zattrs?.bounding_box;
364497
- const hasBoundingBox2D = typeof boundingBox?.x_max === "number" && typeof boundingBox?.x_min === "number" && typeof boundingBox?.y_max === "number" && typeof boundingBox?.y_min === "number";
364498
- return isSupportedVersion && hasBoundingBox2D && hasRequiredColumnsAndRowGroupSize;
364524
+ const isSupportedVersion = formatVersion === "0.1" || formatVersion === "0.2";
364525
+ return isSupportedVersion && hasRequiredColumnsAndRowGroupSize;
364499
364526
  }
364500
364527
  async load() {
364501
364528
  const [modelMatrix2, supportsTiling] = await Promise.all([
@@ -364533,7 +364560,7 @@ class SpatialDataObsPointsLoader extends AbstractTwoStepLoader {
364533
364560
  featureIds,
364534
364561
  obsPointsModelMatrix: modelMatrix2,
364535
364562
  // Return 'tiled' if the morton_code_2d column
364536
- // and bounding_box metadata are present,
364563
+ // is present,
364537
364564
  // and the row group size is small enough.
364538
364565
  // Otherwise, return 'full'.
364539
364566
  obsPointsTilingType: supportsTiling ? "tiled" : "full",
@@ -374042,6 +374069,7 @@ function sdataMortonQueryRectAux(boundingBox, origRect) {
374042
374069
  const mortonIntervals = zcoverRectangle(normRect[0][0], normRect[0][1], normRect[1][0], normRect[1][1], 16, null, true);
374043
374070
  return mortonIntervals;
374044
374071
  }
374072
+ const MORTON_CODE_EXTREME_VALUE_INDICATOR = 0;
374045
374073
  async function getParquetModule() {
374046
374074
  const module2 = await import(
374047
374075
  /* webpackIgnore: true */
@@ -374120,7 +374148,7 @@ async function _loadParquetSchemaBytes({ queryClient, store }, parquetPath, part
374120
374148
  if (!tailBytes || tailBytes.length < TAIL_LENGTH) {
374121
374149
  throw new Error(`Failed to load parquet footerLength for ${partZeroPath}`);
374122
374150
  }
374123
- const footerLength = new DataView(tailBytes.buffer).getInt32(0, true);
374151
+ const footerLength = new DataView(tailBytes.buffer, tailBytes.byteOffset, tailBytes.byteLength).getInt32(0, true);
374124
374152
  const magic = new TextDecoder().decode(tailBytes.slice(4, 8));
374125
374153
  if (magic !== "PAR1") {
374126
374154
  throw new Error("Invalid Parquet file: missing PAR1 magic number");
@@ -374167,22 +374195,22 @@ async function _loadParquetMetadataByPart({ queryClient, store }, parquetPath) {
374167
374195
  } catch (error2) {
374168
374196
  if (error2.message.includes("Failed to load parquet footerLength")) {
374169
374197
  numParts = partIndex;
374198
+ log$b.info(`Found ${numParts} parts for parquet path ${parquetPath}; An above "Failed to load parquet footerLength" error is expected for the subsequent part.`);
374170
374199
  }
374171
374200
  }
374172
374201
  } while (numParts === void 0);
374202
+ const numRows = allMetadata.map((part) => part.metadata.fileMetadata().numRows());
374203
+ const numRowGroups = allMetadata.map((part) => part.metadata.numRowGroups());
374204
+ const numRowsPerGroup = allMetadata.map((part) => part.metadata.rowGroup(0).numRows());
374173
374205
  const metadata2 = {
374174
- numRows: 0,
374175
- numRowGroups: 0,
374176
- numRowsPerGroup: 0,
374177
- schema: null
374178
- };
374179
- if (allMetadata.length > 0) {
374180
- const firstPart = allMetadata[0];
374181
- metadata2.numRows = allMetadata.reduce((sum2, part) => sum2 + part.metadata.fileMetadata().numRows(), 0);
374182
- metadata2.numRowGroups = allMetadata.reduce((sum2, part) => sum2 + part.metadata.numRowGroups(), 0);
374183
- metadata2.numRowsPerGroup = firstPart.metadata.rowGroup(0).numRows();
374184
- metadata2.schema = firstPart.schema.schema;
374185
- }
374206
+ totalNumRows: numRows.reduce((a2, b2) => a2 + b2, 0),
374207
+ totalNumRowGroups: numRowGroups.reduce((a2, b2) => a2 + b2, 0),
374208
+ // Array of count per part (length equal to numParts).
374209
+ numRowsByPart: numRows,
374210
+ numRowGroupsByPart: numRowGroups,
374211
+ numRowsPerGroupByPart: numRowsPerGroup,
374212
+ schema: allMetadata?.[0]?.schema?.schema
374213
+ };
374186
374214
  const result = {
374187
374215
  ...metadata2,
374188
374216
  // TODO: extract metadata per part and rowGroup into plain objects that match the hyparquet parquetMetadata() return value?
@@ -374206,8 +374234,8 @@ async function _loadParquetRowGroupByGroupIndex({ queryClient, store }, parquetP
374206
374234
  const store2 = ctx.meta?.store;
374207
374235
  const { readParquetRowGroup } = await _getParquetModule({ queryClient: queryClient2 });
374208
374236
  const allMetadata = await _loadParquetMetadataByPart({ queryClient: queryClient2, store: store2 }, parquetPath);
374209
- if (rowGroupIndex < 0 || rowGroupIndex >= allMetadata.numRowGroups) {
374210
- throw new Error(`Row group index ${rowGroupIndex} is out of bounds for parquet table with ${allMetadata.numRowGroups} row groups.`);
374237
+ if (rowGroupIndex < 0 || rowGroupIndex >= allMetadata.totalNumRowGroups) {
374238
+ throw new Error(`Row group index ${rowGroupIndex} is out of bounds for parquet table with ${allMetadata.totalNumRowGroups} row groups.`);
374211
374239
  }
374212
374240
  let partIndex;
374213
374241
  let cumulativeRowGroups = 0;
@@ -374317,9 +374345,9 @@ async function _bisectRowGroupsRight({ queryClient, store }, parquetPath, column
374317
374345
  );
374318
374346
  const store2 = ctx.meta?.store;
374319
374347
  const allMetadata = await _loadParquetMetadataByPart({ queryClient: queryClient2, store: store2 }, parquetPath);
374320
- const { numRowGroups } = allMetadata;
374348
+ const { totalNumRowGroups } = allMetadata;
374321
374349
  let lo = 0;
374322
- let hi = numRowGroups;
374350
+ let hi = totalNumRowGroups;
374323
374351
  while (lo < hi) {
374324
374352
  const cachedInRange = await getCachedInRange(queryClient2, parquetPath, columnName, lo, hi);
374325
374353
  const betterLo = cachedInRange.slice().reverse().find((c2) => c2.index > lo && targetValue >= c2.max);
@@ -374722,11 +374750,12 @@ class SpatialDataTableSource extends AnnDataSource {
374722
374750
  const { queryClient } = this;
374723
374751
  const { store } = this.storeRoot;
374724
374752
  const allMetadata = await _loadParquetMetadataByPart({ queryClient, store }, parquetPath);
374725
- const { numRowsPerGroup } = allMetadata;
374726
- const numRowsTotal = allMetadata.numRows;
374727
- if (numRowsPerGroup >= 1e5) {
374753
+ const { numRowsPerGroupByPart } = allMetadata;
374754
+ const numRowsTotal = allMetadata.totalNumRows;
374755
+ const maxNumRowsPerGroup = Math.max(...numRowsPerGroupByPart);
374756
+ if (maxNumRowsPerGroup >= 1e5) {
374728
374757
  if (numRowsTotal > 5e6) {
374729
- throw new Error(`The Parquet table at ${parquetPath} has ${numRowsTotal} total rows, which necessitates tiled loading, but it was not possible because the row group size is too large (${numRowsPerGroup}). See the Vitessce documentation at Data Troubleshooting -> Points for more details.`);
374758
+ throw new Error(`The Parquet table at ${parquetPath} has ${numRowsTotal} total rows, which necessitates tiled loading, but it was not possible because the row group size is too large (${maxNumRowsPerGroup}). See the Vitessce documentation at Data Troubleshooting -> Points for more details.`);
374730
374759
  }
374731
374760
  return false;
374732
374761
  }
@@ -374750,7 +374779,7 @@ class SpatialDataTableSource extends AnnDataSource {
374750
374779
  * @param {string[]|undefined} columns An optional list of column names to load.
374751
374780
  * @returns
374752
374781
  */
374753
- async loadParquetTableInRect(parquetPath, tileBbox, allPointsBbox, signal, featureIndexColumnName, mortonCodeColumn) {
374782
+ async loadParquetTableInRect(parquetPath, tileBbox, signal, featureIndexColumnName, mortonCodeColumn) {
374754
374783
  const { queryClient } = this;
374755
374784
  const { store } = this.storeRoot;
374756
374785
  const mortonCodeColumnName = mortonCodeColumn ?? "morton_code_2d";
@@ -374775,15 +374804,46 @@ class SpatialDataTableSource extends AnnDataSource {
374775
374804
  } else {
374776
374805
  tileBboxes = [tileBbox];
374777
374806
  }
374807
+ const firstRowGroupTable = await _loadParquetRowGroupByGroupIndex({ queryClient, store }, parquetPath, 0);
374808
+ const xColumnForBoundingBox = firstRowGroupTable.getChild("x");
374809
+ const yColumnForBoundingBox = firstRowGroupTable.getChild("y");
374810
+ const mortonCodeColumnForBoundingBox = firstRowGroupTable.getChild(mortonCodeColumnName);
374811
+ const boundingBoxMaxNumRows = Math.min(4, firstRowGroupTable.numRows);
374812
+ const firstMortonCodes = range$e(boundingBoxMaxNumRows).map((i2) => mortonCodeColumnForBoundingBox.get(i2));
374813
+ const boundingBoxNumRows = firstMortonCodes.filter((code2) => code2 === MORTON_CODE_EXTREME_VALUE_INDICATOR).length;
374814
+ const boundingBoxXValues = range$e(boundingBoxNumRows).map((i2) => xColumnForBoundingBox.get(i2));
374815
+ const boundingBoxYValues = range$e(boundingBoxNumRows).map((i2) => yColumnForBoundingBox.get(i2));
374816
+ const xMin = Math.min(...boundingBoxXValues);
374817
+ const xMax = Math.max(...boundingBoxXValues);
374818
+ const yMin = Math.min(...boundingBoxYValues);
374819
+ const yMax = Math.max(...boundingBoxYValues);
374820
+ const allPointsBbox = {
374821
+ x_min: xMin,
374822
+ x_max: xMax,
374823
+ y_min: yMin,
374824
+ y_max: yMax
374825
+ };
374778
374826
  const rowGroupIndicesPerTile = await Promise.all(tileBboxes.map(async (subTileBbox) => _rectToRowGroupIndices({ queryClient, store }, parquetPath, subTileBbox, allPointsBbox, mortonCodeColumnName)));
374779
374827
  const uniqueCoveredRowGroupIndices = Array.from(new Set(rowGroupIndicesPerTile.flat())).toSorted((a2, b2) => a2 - b2);
374780
374828
  const allMetadata = await _loadParquetMetadataByPart({ queryClient, store }, parquetPath);
374781
- const { numRowsPerGroup } = allMetadata;
374782
- const numRowGroups = uniqueCoveredRowGroupIndices.length;
374783
- const totalNumRows = numRowsPerGroup * numRowGroups;
374784
- const xArr = new Float32Array(totalNumRows);
374785
- const yArr = new Float32Array(totalNumRows);
374786
- const featureIndexArr = new Uint32Array(totalNumRows);
374829
+ const { numRowsPerGroupByPart, numRowGroupsByPart } = allMetadata;
374830
+ const rowGroupIToNumRows = (rowGroupI) => {
374831
+ let currPartIndex = 0;
374832
+ let prevTotalRowGroupCount = 0;
374833
+ for (let partIndex = 0; partIndex < numRowGroupsByPart.length; partIndex++) {
374834
+ const numRowGroupsInPart = numRowGroupsByPart[partIndex];
374835
+ if (prevTotalRowGroupCount <= rowGroupI && rowGroupI < prevTotalRowGroupCount + numRowGroupsInPart) {
374836
+ currPartIndex = partIndex;
374837
+ break;
374838
+ }
374839
+ prevTotalRowGroupCount += numRowGroupsInPart;
374840
+ }
374841
+ return numRowsPerGroupByPart[currPartIndex];
374842
+ };
374843
+ const totalNumRowsToLoad = uniqueCoveredRowGroupIndices.reduce((acc, rowGroupI) => acc + rowGroupIToNumRows(rowGroupI), 0);
374844
+ const xArr = new Float32Array(totalNumRowsToLoad);
374845
+ const yArr = new Float32Array(totalNumRowsToLoad);
374846
+ const featureIndexArr = new Uint32Array(totalNumRowsToLoad);
374787
374847
  const rowGroupTables = await Promise.all(uniqueCoveredRowGroupIndices.map(async (rowGroupIndex) => _loadParquetRowGroupByGroupIndex({ queryClient, store }, parquetPath, rowGroupIndex)));
374788
374848
  let rowOffset = 0;
374789
374849
  rowGroupTables.forEach((table2) => {
@@ -374796,7 +374856,7 @@ class SpatialDataTableSource extends AnnDataSource {
374796
374856
  xArr.set(xColumn.toArray(), rowOffset);
374797
374857
  yArr.set(yColumn.toArray(), rowOffset);
374798
374858
  featureIndexArr.set(featureIndexColumn.toArray(), rowOffset);
374799
- rowOffset += numRowsPerGroup;
374859
+ rowOffset += table2.numRows;
374800
374860
  });
374801
374861
  return {
374802
374862
  data: {
@@ -374804,7 +374864,7 @@ class SpatialDataTableSource extends AnnDataSource {
374804
374864
  y: yArr,
374805
374865
  featureIndices: featureIndexArr
374806
374866
  },
374807
- shape: [3, totalNumRows]
374867
+ shape: [3, totalNumRowsToLoad]
374808
374868
  };
374809
374869
  }
374810
374870
  }
@@ -380896,7 +380956,7 @@ class SpatialDataPointsSource extends SpatialDataTableSource {
380896
380956
  const zattrs = await this.loadSpatialDataElementAttrs(path2);
380897
380957
  const formatVersion = zattrs.spatialdata_attrs.version;
380898
380958
  const encodingType = zattrs["encoding-type"];
380899
- if (encodingType === "ngff:points" && !(formatVersion === "0.1")) {
380959
+ if (encodingType === "ngff:points" && !(formatVersion === "0.1" || formatVersion === "0.2")) {
380900
380960
  throw new Error(`Unexpected version for points spatialdata_attrs: ${formatVersion}`);
380901
380961
  }
380902
380962
  return formatVersion;
@@ -380999,16 +381059,11 @@ class SpatialDataPointsSource extends SpatialDataTableSource {
380999
381059
  const zattrs = await this.loadSpatialDataElementAttrs(elementPath);
381000
381060
  const {
381001
381061
  // axes,
381002
- spatialdata_attrs: spatialDataAttrs,
381003
- // The bounding box (extent) of all points.
381004
- // Required for un-normalization from uints back to floats.
381005
- // TODO: decide whether these will be stored here or somewhere else.
381006
- // Reference: https://github.com/vitessce/vitessce-python/pull/476#issuecomment-3362656956
381007
- bounding_box: allPointsBbox
381062
+ spatialdata_attrs: spatialDataAttrs
381008
381063
  } = zattrs;
381009
381064
  const { feature_key: featureKey } = spatialDataAttrs;
381010
381065
  const featureIndexColumnName = featureIndexColumnNameFromOptions ?? `${featureKey}_codes`;
381011
- return this.loadParquetTableInRect(parquetPath, tileBbox, allPointsBbox, signal, featureIndexColumnName, mortonCodeColumn);
381066
+ return this.loadParquetTableInRect(parquetPath, tileBbox, signal, featureIndexColumnName, mortonCodeColumn);
381012
381067
  }
381013
381068
  async supportsLoadPointsInRect(elementPath, featureIndexColumnName, mortonCodeColumn) {
381014
381069
  const parquetPath = getParquetPath(elementPath);
@@ -386566,7 +386621,8 @@ const baseFileTypes = [
386566
386621
  makeFileType(FileType$1.OBS_LOCATIONS_MOLECULES_JSON, DataType$3.OBS_LOCATIONS, MoleculesJsonAsObsLocationsLoader, JsonSource, z.null()),
386567
386622
  makeFileType(FileType$1.OBS_LABELS_MOLECULES_JSON, DataType$3.OBS_LABELS, MoleculesJsonAsObsLabelsLoader, JsonSource, z.null()),
386568
386623
  makeFileType(FileType$1.NEIGHBORHOODS_JSON, DataType$3.NEIGHBORHOODS, JsonLoader, JsonSource, z.null()),
386569
- makeFileType(FileType$1.GENOMIC_PROFILES_ZARR, DataType$3.GENOMIC_PROFILES, GenomicProfilesZarrLoader, ZarrDataSource, z.null())
386624
+ makeFileType(FileType$1.GENOMIC_PROFILES_ZARR, DataType$3.GENOMIC_PROFILES, GenomicProfilesZarrLoader, ZarrDataSource, z.null()),
386625
+ makeFileType(FileType$1.GENOMIC_PROFILES_ZARR_ZIP, DataType$3.GENOMIC_PROFILES, GenomicProfilesZarrLoader, ZarrDataSource, z.null())
386570
386626
  ];
386571
386627
  const baseJointFileTypes = [
386572
386628
  new PluginJointFileType(FileType$1.ANNDATA_ZARR, expandAnndataZarr, anndataZarrSchema),
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { bN, bM } from "./index-DBTEa182.js";
1
+ import { bN, bM } from "./index-dq5Rjqj6.js";
2
2
  export {
3
3
  bN as ControlledLauncher,
4
4
  bM as UncontrolledLauncher
@@ -1,4 +1,4 @@
1
- import { aX as BaseDecoder } from "./index-DBTEa182.js";
1
+ import { aX as BaseDecoder } from "./index-dq5Rjqj6.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 { aG as getDefaultExportFromCjs, aX as BaseDecoder, aY as LercParameters, aZ as LercAddCompression } from "./index-DBTEa182.js";
2
+ import { aG as getDefaultExportFromCjs, aX as BaseDecoder, aY as LercParameters, aZ as LercAddCompression } from "./index-dq5Rjqj6.js";
3
3
  var LercDecode = { exports: {} };
4
4
  var hasRequiredLercDecode;
5
5
  function requireLercDecode() {
@@ -1,4 +1,4 @@
1
- import { aX as BaseDecoder } from "./index-DBTEa182.js";
1
+ import { aX as BaseDecoder } from "./index-dq5Rjqj6.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 { aX as BaseDecoder } from "./index-DBTEa182.js";
1
+ import { aX as BaseDecoder } from "./index-dq5Rjqj6.js";
2
2
  class PackbitsDecoder extends BaseDecoder {
3
3
  decodeBlock(buffer) {
4
4
  const dataView = new DataView(buffer);
@@ -1,4 +1,4 @@
1
- import { aX as BaseDecoder } from "./index-DBTEa182.js";
1
+ import { aX as BaseDecoder } from "./index-dq5Rjqj6.js";
2
2
  class RawDecoder extends BaseDecoder {
3
3
  decodeBlock(buffer) {
4
4
  return buffer;
@@ -1,4 +1,4 @@
1
- import { bH as MeshDistanceMaterial, bI as MeshDepthMaterial, bJ as RGBADepthPacking, ae as UniformsUtils, bK 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, bL as InstancedBufferAttribute } from "./index-DBTEa182.js";
1
+ import { bH as MeshDistanceMaterial, bI as MeshDepthMaterial, bJ as RGBADepthPacking, ae as UniformsUtils, bK 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, bL as InstancedBufferAttribute } from "./index-dq5Rjqj6.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 { aX as BaseDecoder } from "./index-DBTEa182.js";
1
+ import { aX as BaseDecoder } from "./index-dq5Rjqj6.js";
2
2
  class WebImageDecoder extends BaseDecoder {
3
3
  constructor() {
4
4
  super();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vitessce/launcher",
3
- "version": "3.9.8",
3
+ "version": "3.9.10",
4
4
  "author": "HIDIVE Lab at HMS",
5
5
  "homepage": "http://vitessce.io",
6
6
  "repository": {
@@ -20,14 +20,14 @@
20
20
  "use-query-params": "^1.1.9",
21
21
  "react-dropzone": "^14.3.8",
22
22
  "@tanstack/react-query": "^5.80.2",
23
- "@vitessce/all": "3.9.8",
24
- "@vitessce/example-configs": "3.9.8",
25
- "@vitessce/styles": "3.9.8",
26
- "@vitessce/globals": "3.9.8",
27
- "@vitessce/example-plugins": "3.9.8",
28
- "@vitessce/constants-internal": "3.9.8",
29
- "@vitessce/vit-s": "3.9.8",
30
- "@vitessce/config": "3.9.8"
23
+ "@vitessce/all": "3.9.10",
24
+ "@vitessce/constants-internal": "3.9.10",
25
+ "@vitessce/example-plugins": "3.9.10",
26
+ "@vitessce/globals": "3.9.10",
27
+ "@vitessce/example-configs": "3.9.10",
28
+ "@vitessce/vit-s": "3.9.10",
29
+ "@vitessce/styles": "3.9.10",
30
+ "@vitessce/config": "3.9.10"
31
31
  },
32
32
  "devDependencies": {
33
33
  "react": "18.3.1",