@vitessce/launcher 4.0.0-test.3 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/{GeometryAndMeshXR-arbhswbx.js → GeometryAndMeshXR-CeAaq3ae.js} +1 -1
  2. package/dist/{ReactNeuroglancer-BsqPWpQJ.js → ReactNeuroglancer-BLfUOvtO.js} +1 -1
  3. package/dist/{deflate-0ecBfpbE.js → deflate-nYfk3Mbe.js} +1 -1
  4. package/dist/{higlass-DjFeS4wB.js → higlass-DPgS6S1h.js} +1 -1
  5. package/dist/{index-6Oxzw9ho.js → index-C2U2CO2P.js} +2 -2
  6. package/dist/{index-DAhtQMo7.js → index-DDD3apxS.js} +395 -194
  7. package/dist/{index-BsUxdbVL.js → index-DuFOjj6d.js} +7 -6
  8. package/dist/index.js +1 -1
  9. package/dist/{jpeg-BegTw2ZG.js → jpeg-4XvdCEqV.js} +1 -1
  10. package/dist/{lerc-BKy3Cqfz.js → lerc-J5N91MJw.js} +1 -1
  11. package/dist/{lzw-CyLNGLTP.js → lzw-BlNLuocx.js} +1 -1
  12. package/dist/{packbits-CMdMha0h.js → packbits-D7jhgu7h.js} +1 -1
  13. package/dist/{raw-DbDdV1tN.js → raw-Dcz65jWu.js} +1 -1
  14. package/dist/{webimage-DYe9qPKJ.js → webimage-CMXekglL.js} +1 -1
  15. package/dist-tsc/ControlledLauncher.js +1 -0
  16. package/dist-tsc/ControlledLauncher.js.map +1 -0
  17. package/dist-tsc/LauncherStart.js +1 -0
  18. package/dist-tsc/LauncherStart.js.map +1 -0
  19. package/dist-tsc/UncontrolledLauncher.js +1 -0
  20. package/dist-tsc/UncontrolledLauncher.js.map +1 -0
  21. package/dist-tsc/index.js +1 -0
  22. package/dist-tsc/index.js.map +1 -0
  23. package/dist-tsc/launcher-styles.js +1 -0
  24. package/dist-tsc/launcher-styles.js.map +1 -0
  25. package/dist-tsc/use-hash-param.js +1 -0
  26. package/dist-tsc/use-hash-param.js.map +1 -0
  27. package/dist-tsc/use-query-or-hash-param.js +1 -0
  28. package/dist-tsc/use-query-or-hash-param.js.map +1 -0
  29. package/package.json +9 -9
@@ -4,9 +4,6 @@ import { jsx as jsx$1, jsxs, Fragment } from "react/jsx-runtime";
4
4
  import { useLoaders, useCoordinationScopes, useCoordination, useDescription, useImageData, useReady, TitleInfo, useVitessceContainer, useSetWarning, useObsSetsData, useUrls, usePlotOptionsStyles, OptionsContainer, CellColorEncodingOption, OptionSelect, useComponentHover, useComponentViewInfo, useSetComponentHover, useSetComponentViewInfo, useInitialCoordination, useDeckCanvasSize, useMultiObsLabels, useObsEmbeddingData, useFeatureSelection, useObsFeatureMatrixIndices, useFeatureLabelsData, useExpandedFeatureLabelsMap, useSampleSetsData, useSampleEdgesData, useGetObsInfo, useUint8FeatureSelection, useExpressionValueGetter, useAuxiliaryCoordination, useHasLoader, useObsLocationsData, useObsLabelsData, useObsSegmentationsData, useNeighborhoodsData, useMergeCoordination, useCoordinationScopesBy, useMultiCoordinationScopesSecondaryNonNull, useMultiCoordinationScopesNonNull, useComplexCoordination, useComplexCoordinationSecondary, useGridItemSize, useMultiObsPoints, usePointMultiObsLabels, usePointMultiObsFeatureMatrixIndices, useMultiObsSpots, useSpotMultiObsSets, useSpotMultiFeatureLabels, useSpotMultiFeatureSelection, useSpotMultiObsFeatureMatrixIndices, useSegmentationMultiObsLocations, useMultiObsSegmentations, useSegmentationMultiObsSets, useSegmentationMultiFeatureSelection, useSegmentationMultiObsFeatureMatrixIndices, useMultiImages, useObsFeatureMatrixData, useUint8ObsFeatureMatrix, useGetObsMembership, PopperMenu, useComponentLayout, useClosestVitessceContainerSize, useWindowDimensions, useRemoveImageChannelInMetaCoordinationScopes, useAddImageChannelInMetaCoordinationScopes, useViewConfigStoreApi, useViewConfig, useSetViewConfig, createLoaders, useWarning, useGenomicProfilesData, useMatchingLoader, useColumnNameMapping, useFeatureStatsData, useObsSetStatsData, useAsyncFunction, useFeatureSetStatsData, useComparisonMetadata, logConfig, VitSContainer, createOnDrop } from "@vitessce/vit-s";
5
5
  import * as ReactDOM from "react-dom";
6
6
  import ReactDOM__default, { createPortal } from "react-dom";
7
- import { Quaternion as Quaternion$1, Euler as Euler$1 } from "three";
8
- import { GLTFLoader as GLTFLoader$1 } from "three/addons/loaders/GLTFLoader.js";
9
- import { DRACOLoader } from "three/addons/loaders/DRACOLoader.js";
10
7
  function _mergeNamespaces(n3, m2) {
11
8
  for (var i2 = 0; i2 < m2.length; i2++) {
12
9
  const e3 = m2[i2];
@@ -5881,7 +5878,7 @@ function baseClamp(number2, lower2, upper) {
5881
5878
  }
5882
5879
  return number2;
5883
5880
  }
5884
- function clamp$7(number2, lower2, upper) {
5881
+ function clamp$8(number2, lower2, upper) {
5885
5882
  if (upper === void 0) {
5886
5883
  upper = lower2;
5887
5884
  lower2 = void 0;
@@ -10213,6 +10210,7 @@ const FileType$1 = {
10213
10210
  OBS_LABELS_MUDATA_ZARR: "obsLabels.mudata.zarr",
10214
10211
  FEATURE_LABELS_MUDATA_ZARR: "featureLabels.mudata.zarr",
10215
10212
  GENOMIC_PROFILES_ZARR: "genomic-profiles.zarr",
10213
+ GENOMIC_PROFILES_ZARR_ZIP: "genomic-profiles.zarr.zip",
10216
10214
  NEIGHBORHOODS_JSON: "neighborhoods.json",
10217
10215
  // OME-TIFF
10218
10216
  IMAGE_OME_TIFF: "image.ome-tiff",
@@ -10507,6 +10505,7 @@ const ViewHelpMapping = {
10507
10505
  [FileType$1.OBS_LABELS_MOLECULES_JSON]: DataType$3.OBS_LABELS,
10508
10506
  // For old file types
10509
10507
  [FileType$1.GENOMIC_PROFILES_ZARR]: DataType$3.GENOMIC_PROFILES,
10508
+ [FileType$1.GENOMIC_PROFILES_ZARR_ZIP]: DataType$3.GENOMIC_PROFILES,
10510
10509
  [FileType$1.NEIGHBORHOODS_JSON]: DataType$3.NEIGHBORHOODS
10511
10510
  });
10512
10511
  ({
@@ -10671,6 +10670,10 @@ const ALT_ZARR_STORE_TYPES = {
10671
10670
  },
10672
10671
  [FileType$1.OBS_EMBEDDING_SPATIALDATA_ZARR]: {
10673
10672
  zip: FileType$1.OBS_EMBEDDING_SPATIALDATA_ZARR_ZIP
10673
+ },
10674
+ // For genomic profiles:
10675
+ [FileType$1.GENOMIC_PROFILES_ZARR]: {
10676
+ zip: FileType$1.GENOMIC_PROFILES_ZARR_ZIP
10674
10677
  }
10675
10678
  };
10676
10679
  [
@@ -17047,7 +17050,7 @@ function useThemeProps$1({
17047
17050
  });
17048
17051
  }
17049
17052
  const useEnhancedEffect$1 = typeof window !== "undefined" ? React.useLayoutEffect : React.useEffect;
17050
- function clamp$6(val, min2 = Number.MIN_SAFE_INTEGER, max2 = Number.MAX_SAFE_INTEGER) {
17053
+ function clamp$7(val, min2 = Number.MIN_SAFE_INTEGER, max2 = Number.MAX_SAFE_INTEGER) {
17051
17054
  return Math.max(min2, Math.min(val, max2));
17052
17055
  }
17053
17056
  function clampWrapper(value2, min2 = 0, max2 = 1) {
@@ -17056,7 +17059,7 @@ function clampWrapper(value2, min2 = 0, max2 = 1) {
17056
17059
  console.error(`MUI: The value provided ${value2} is out of range [${min2}, ${max2}].`);
17057
17060
  }
17058
17061
  }
17059
- return clamp$6(value2, min2, max2);
17062
+ return clamp$7(value2, min2, max2);
17060
17063
  }
17061
17064
  function hexToRgb$1(color2) {
17062
17065
  color2 = color2.slice(1);
@@ -40923,7 +40926,7 @@ function useSlider(parameters2) {
40923
40926
  });
40924
40927
  const range2 = Array.isArray(valueDerived);
40925
40928
  let values3 = range2 ? valueDerived.slice().sort(asc) : [valueDerived];
40926
- values3 = values3.map((value2) => value2 == null ? min2 : clamp$6(value2, min2, max2));
40929
+ values3 = values3.map((value2) => value2 == null ? min2 : clamp$7(value2, min2, max2));
40927
40930
  const marks = marksProp === true && step !== null ? [...Array(Math.floor((max2 - min2) / step) + 1)].map((_, index2) => ({
40928
40931
  value: min2 + step * index2
40929
40932
  })) : marksProp || [];
@@ -40961,10 +40964,10 @@ function useSlider(parameters2) {
40961
40964
  newValue = newValue < value2 ? marksValues[marksIndex - 1] : marksValues[marksIndex + 1];
40962
40965
  }
40963
40966
  }
40964
- newValue = clamp$6(newValue, min2, max2);
40967
+ newValue = clamp$7(newValue, min2, max2);
40965
40968
  if (range2) {
40966
40969
  if (disableSwap) {
40967
- newValue = clamp$6(newValue, values3[index2 - 1] || -Infinity, values3[index2 + 1] || Infinity);
40970
+ newValue = clamp$7(newValue, values3[index2 - 1] || -Infinity, values3[index2 + 1] || Infinity);
40968
40971
  }
40969
40972
  const previousValue = newValue;
40970
40973
  newValue = setValueIndex({
@@ -41099,7 +41102,7 @@ function useSlider(parameters2) {
41099
41102
  const closestIndex = findClosest(marksValues, newValue);
41100
41103
  newValue = marksValues[closestIndex];
41101
41104
  }
41102
- newValue = clamp$6(newValue, min2, max2);
41105
+ newValue = clamp$7(newValue, min2, max2);
41103
41106
  let activeIndex = 0;
41104
41107
  if (range2) {
41105
41108
  if (!move2) {
@@ -41108,7 +41111,7 @@ function useSlider(parameters2) {
41108
41111
  activeIndex = previousIndex.current;
41109
41112
  }
41110
41113
  if (disableSwap) {
41111
- newValue = clamp$6(newValue, values3[activeIndex - 1] || -Infinity, values3[activeIndex + 1] || Infinity);
41114
+ newValue = clamp$7(newValue, values3[activeIndex - 1] || -Infinity, values3[activeIndex + 1] || Infinity);
41112
41115
  }
41113
41116
  const previousValue = newValue;
41114
41117
  newValue = setValueIndex({
@@ -49015,7 +49018,7 @@ function localStorageAvailable() {
49015
49018
  function escapeRegExp(value2) {
49016
49019
  return value2.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
49017
49020
  }
49018
- const clamp$5 = (value2, min2, max2) => Math.max(min2, Math.min(max2, value2));
49021
+ const clamp$6 = (value2, min2, max2) => Math.max(min2, Math.min(max2, value2));
49019
49022
  function range$c(from2, to) {
49020
49023
  return Array.from({
49021
49024
  length: to - from2
@@ -52721,7 +52724,7 @@ const hydrateColumnsWidth = (rawState, dimensions) => {
52721
52724
  totalFlexUnits += column2.flex;
52722
52725
  isFlex = true;
52723
52726
  } else {
52724
- computedWidth = clamp$5(column2.width || GRID_STRING_COL_DEF.width, column2.minWidth || GRID_STRING_COL_DEF.minWidth, column2.maxWidth || GRID_STRING_COL_DEF.maxWidth);
52727
+ computedWidth = clamp$6(column2.width || GRID_STRING_COL_DEF.width, column2.minWidth || GRID_STRING_COL_DEF.minWidth, column2.maxWidth || GRID_STRING_COL_DEF.maxWidth);
52725
52728
  }
52726
52729
  widthAllocatedBeforeFlex += computedWidth;
52727
52730
  }
@@ -53321,8 +53324,8 @@ const useGridVirtualScroller = () => {
53321
53324
  const maxScrollTop = Math.ceil(dimensions.minimumSize.height - dimensions.viewportOuterSize.height);
53322
53325
  const maxScrollLeft = Math.ceil(dimensions.minimumSize.width - dimensions.viewportInnerSize.width);
53323
53326
  const newScroll = {
53324
- top: clamp$5(scroller.scrollTop, 0, maxScrollTop),
53325
- left: isRtl ? clamp$5(scroller.scrollLeft, -maxScrollLeft, 0) : clamp$5(scroller.scrollLeft, 0, maxScrollLeft)
53327
+ top: clamp$6(scroller.scrollTop, 0, maxScrollTop),
53328
+ left: isRtl ? clamp$6(scroller.scrollLeft, -maxScrollLeft, 0) : clamp$6(scroller.scrollLeft, 0, maxScrollLeft)
53326
53329
  };
53327
53330
  const dx = newScroll.left - scrollPosition.current.left;
53328
53331
  const dy = newScroll.top - scrollPosition.current.top;
@@ -53760,7 +53763,7 @@ function getNearestIndexToRender(inputs, offset2, options) {
53760
53763
  if (inputs.range?.lastRowIndex && !allRowsMeasured) {
53761
53764
  allRowsMeasured = lastMeasuredIndexRelativeToAllRows >= inputs.range.lastRowIndex;
53762
53765
  }
53763
- const lastMeasuredIndexRelativeToCurrentPage = clamp$5(lastMeasuredIndexRelativeToAllRows - (inputs.range?.firstRowIndex || 0), 0, inputs.rowsMeta.positions.length);
53766
+ const lastMeasuredIndexRelativeToCurrentPage = clamp$6(lastMeasuredIndexRelativeToAllRows - (inputs.range?.firstRowIndex || 0), 0, inputs.rowsMeta.positions.length);
53764
53767
  if (allRowsMeasured || inputs.rowsMeta.positions[lastMeasuredIndexRelativeToCurrentPage] >= offset2) {
53765
53768
  return binarySearch$2(offset2, inputs.rowsMeta.positions, options);
53766
53769
  }
@@ -53844,7 +53847,7 @@ function getIndexesToRender({
53844
53847
  lastPosition: positions[positions.length - 1] + lastSize
53845
53848
  });
53846
53849
  const lastIndexPadded = binarySearch$2(lastPosition, positions);
53847
- return [clamp$5(firstIndexPadded, minFirstIndex, maxLastIndex), clamp$5(lastIndexPadded, minFirstIndex, maxLastIndex)];
53850
+ return [clamp$6(firstIndexPadded, minFirstIndex, maxLastIndex), clamp$6(lastIndexPadded, minFirstIndex, maxLastIndex)];
53848
53851
  }
53849
53852
  function areRenderContextsEqual(context1, context2) {
53850
53853
  if (context1 === context2) {
@@ -63423,7 +63426,7 @@ const useGridFocus = (apiRef, props) => {
63423
63426
  columnIndexToFocus = visibleColumns.length - 1;
63424
63427
  }
63425
63428
  }
63426
- rowIndexToFocus = clamp$5(rowIndexToFocus, 0, currentPageRows.length - 1);
63429
+ rowIndexToFocus = clamp$6(rowIndexToFocus, 0, currentPageRows.length - 1);
63427
63430
  const rowToFocus = currentPageRows[rowIndexToFocus];
63428
63431
  if (!rowToFocus) {
63429
63432
  return;
@@ -63436,7 +63439,7 @@ const useGridFocus = (apiRef, props) => {
63436
63439
  columnIndexToFocus = colSpanInfo.rightVisibleCellIndex;
63437
63440
  }
63438
63441
  }
63439
- columnIndexToFocus = clamp$5(columnIndexToFocus, 0, visibleColumns.length - 1);
63442
+ columnIndexToFocus = clamp$6(columnIndexToFocus, 0, visibleColumns.length - 1);
63440
63443
  const columnToFocus = visibleColumns[columnIndexToFocus];
63441
63444
  apiRef.current.setCellFocus(rowToFocus.id, columnToFocus.field);
63442
63445
  }, [apiRef, props.pagination, props.paginationMode]);
@@ -63549,7 +63552,7 @@ const useGridFocus = (apiRef, props) => {
63549
63552
  pagination: props.pagination,
63550
63553
  paginationMode: props.paginationMode
63551
63554
  });
63552
- const nextRow = currentPage.rows[clamp$5(lastFocusedRowIndex, 0, currentPage.rows.length - 1)];
63555
+ const nextRow = currentPage.rows[clamp$6(lastFocusedRowIndex, 0, currentPage.rows.length - 1)];
63553
63556
  nextRowId = nextRow?.id ?? null;
63554
63557
  }
63555
63558
  apiRef.current.setState((state) => _extends$c({}, state, {
@@ -67902,7 +67905,7 @@ function extractColumnWidths(apiRef, options, columns2) {
67902
67905
  const min2 = hasColumnMin ? column2.minWidth : 0;
67903
67906
  const max2 = hasColumnMax ? column2.maxWidth : Infinity;
67904
67907
  const maxContent = filteredWidths.length === 0 ? 0 : Math.max(...filteredWidths);
67905
- widthByField[column2.field] = clamp$5(maxContent, min2, max2);
67908
+ widthByField[column2.field] = clamp$6(maxContent, min2, max2);
67906
67909
  });
67907
67910
  root2.classList.remove(gridClasses.autosizing);
67908
67911
  return widthByField;
@@ -68058,7 +68061,7 @@ const useGridColumnResize = (apiRef, props) => {
68058
68061
  return;
68059
68062
  }
68060
68063
  let newWidth = computeNewWidth(initialOffsetToSeparator.current, nativeEvent.clientX, refs.columnHeaderElement.getBoundingClientRect(), resizeDirection.current);
68061
- newWidth = clamp$5(newWidth, refs.colDef.minWidth, refs.colDef.maxWidth);
68064
+ newWidth = clamp$6(newWidth, refs.colDef.minWidth, refs.colDef.maxWidth);
68062
68065
  updateWidth(newWidth);
68063
68066
  const params2 = {
68064
68067
  element: refs.columnHeaderElement,
@@ -68084,7 +68087,7 @@ const useGridColumnResize = (apiRef, props) => {
68084
68087
  return;
68085
68088
  }
68086
68089
  let newWidth = computeNewWidth(initialOffsetToSeparator.current, finger.x, refs.columnHeaderElement.getBoundingClientRect(), resizeDirection.current);
68087
- newWidth = clamp$5(newWidth, refs.colDef.minWidth, refs.colDef.maxWidth);
68090
+ newWidth = clamp$6(newWidth, refs.colDef.minWidth, refs.colDef.maxWidth);
68088
68091
  updateWidth(newWidth);
68089
68092
  const params2 = {
68090
68093
  element: refs.columnHeaderElement,
@@ -116653,7 +116656,7 @@ function acos$4(radians2, result) {
116653
116656
  function atan$3(radians2, result) {
116654
116657
  return map$3(radians2, (angle2) => Math.atan(angle2), result);
116655
116658
  }
116656
- function clamp$4(value2, min2, max2) {
116659
+ function clamp$5(value2, min2, max2) {
116657
116660
  return map$3(value2, (value3) => Math.max(min2, Math.min(max2, value3)));
116658
116661
  }
116659
116662
  function lerp$8(a2, b2, t4) {
@@ -119623,7 +119626,7 @@ class SphericalCoordinates {
119623
119626
  this.radius = length$5(v);
119624
119627
  if (this.radius > 0) {
119625
119628
  this.theta = Math.atan2(v[0], v[1]);
119626
- this.phi = Math.acos(clamp$4(v[2] / this.radius, -1, 1));
119629
+ this.phi = Math.acos(clamp$5(v[2] / this.radius, -1, 1));
119627
119630
  }
119628
119631
  return this.check();
119629
119632
  }
@@ -119878,7 +119881,7 @@ class Euler extends MathArray {
119878
119881
  order2 = order2 || this[3];
119879
119882
  switch (order2) {
119880
119883
  case Euler.XYZ:
119881
- this[1] = Math.asin(clamp$4(m13, -1, 1));
119884
+ this[1] = Math.asin(clamp$5(m13, -1, 1));
119882
119885
  if (Math.abs(m13) < ALMOST_ONE) {
119883
119886
  this[0] = Math.atan2(-m23, m33);
119884
119887
  this[2] = Math.atan2(-m12, m11);
@@ -119888,7 +119891,7 @@ class Euler extends MathArray {
119888
119891
  }
119889
119892
  break;
119890
119893
  case Euler.YXZ:
119891
- this[0] = Math.asin(-clamp$4(m23, -1, 1));
119894
+ this[0] = Math.asin(-clamp$5(m23, -1, 1));
119892
119895
  if (Math.abs(m23) < ALMOST_ONE) {
119893
119896
  this[1] = Math.atan2(m13, m33);
119894
119897
  this[2] = Math.atan2(m21, m22);
@@ -119898,7 +119901,7 @@ class Euler extends MathArray {
119898
119901
  }
119899
119902
  break;
119900
119903
  case Euler.ZXY:
119901
- this[0] = Math.asin(clamp$4(m32, -1, 1));
119904
+ this[0] = Math.asin(clamp$5(m32, -1, 1));
119902
119905
  if (Math.abs(m32) < ALMOST_ONE) {
119903
119906
  this[1] = Math.atan2(-m31, m33);
119904
119907
  this[2] = Math.atan2(-m12, m22);
@@ -119908,7 +119911,7 @@ class Euler extends MathArray {
119908
119911
  }
119909
119912
  break;
119910
119913
  case Euler.ZYX:
119911
- this[1] = Math.asin(-clamp$4(m31, -1, 1));
119914
+ this[1] = Math.asin(-clamp$5(m31, -1, 1));
119912
119915
  if (Math.abs(m31) < ALMOST_ONE) {
119913
119916
  this[0] = Math.atan2(m32, m33);
119914
119917
  this[2] = Math.atan2(m21, m11);
@@ -119918,7 +119921,7 @@ class Euler extends MathArray {
119918
119921
  }
119919
119922
  break;
119920
119923
  case Euler.YZX:
119921
- this[2] = Math.asin(clamp$4(m21, -1, 1));
119924
+ this[2] = Math.asin(clamp$5(m21, -1, 1));
119922
119925
  if (Math.abs(m21) < ALMOST_ONE) {
119923
119926
  this[0] = Math.atan2(-m23, m22);
119924
119927
  this[1] = Math.atan2(-m31, m11);
@@ -119928,7 +119931,7 @@ class Euler extends MathArray {
119928
119931
  }
119929
119932
  break;
119930
119933
  case Euler.XZY:
119931
- this[2] = Math.asin(-clamp$4(m12, -1, 1));
119934
+ this[2] = Math.asin(-clamp$5(m12, -1, 1));
119932
119935
  if (Math.abs(m12) < ALMOST_ONE) {
119933
119936
  this[0] = Math.atan2(m32, m22);
119934
119937
  this[1] = Math.atan2(m13, m11);
@@ -123072,7 +123075,7 @@ function mod$2(value2, divisor) {
123072
123075
  function lerp$3(start2, end2, step) {
123073
123076
  return step * end2 + (1 - step) * start2;
123074
123077
  }
123075
- function clamp$3(x2, min2, max2) {
123078
+ function clamp$4(x2, min2, max2) {
123076
123079
  return x2 < min2 ? min2 : x2 > max2 ? max2 : x2;
123077
123080
  }
123078
123081
  function ieLog2(x2) {
@@ -123218,7 +123221,7 @@ function getProjectionParameters(options) {
123218
123221
  cameraToSeaLevelDistance += center2[2] * scale2 / Math.cos(pitchRadians) / height2;
123219
123222
  }
123220
123223
  const fovAboveCenter = fovRadians * (0.5 + (offset2 ? offset2[1] : 0) / height2);
123221
- const topHalfSurfaceDistance = Math.sin(fovAboveCenter) * cameraToSeaLevelDistance / Math.sin(clamp$3(Math.PI / 2 - pitchRadians - fovAboveCenter, 0.01, Math.PI - 0.01));
123224
+ const topHalfSurfaceDistance = Math.sin(fovAboveCenter) * cameraToSeaLevelDistance / Math.sin(clamp$4(Math.PI / 2 - pitchRadians - fovAboveCenter, 0.01, Math.PI - 0.01));
123222
123225
  const furthestDistance = Math.sin(pitchRadians) * topHalfSurfaceDistance + cameraToSeaLevelDistance;
123223
123226
  const horizonDistance = cameraToSeaLevelDistance * 10;
123224
123227
  const farZ = Math.min(furthestDistance * farZMultiplier, horizonDistance);
@@ -123276,8 +123279,8 @@ function fitBounds(options) {
123276
123279
  } = options;
123277
123280
  const [[west, south], [east, north]] = bounds2;
123278
123281
  const padding2 = getPaddingObject(options.padding);
123279
- const nw = lngLatToWorld([west, clamp$3(north, -MAX_LATITUDE, MAX_LATITUDE)]);
123280
- const se = lngLatToWorld([east, clamp$3(south, -MAX_LATITUDE, MAX_LATITUDE)]);
123282
+ const nw = lngLatToWorld([west, clamp$4(north, -MAX_LATITUDE, MAX_LATITUDE)]);
123283
+ const se = lngLatToWorld([east, clamp$4(south, -MAX_LATITUDE, MAX_LATITUDE)]);
123281
123284
  const size2 = [Math.max(Math.abs(se[0] - nw[0]), minExtent), Math.max(Math.abs(se[1] - nw[1]), minExtent)];
123282
123285
  const targetSize = [width2 - padding2.left - padding2.right - Math.abs(offset2[0]) * 2, height2 - padding2.top - padding2.bottom - Math.abs(offset2[1]) * 2];
123283
123286
  assert$b(targetSize[0] > 0 && targetSize[1] > 0);
@@ -124567,8 +124570,8 @@ function createProjectionMatrix({
124567
124570
  top: top2 = 0,
124568
124571
  bottom: bottom2 = 0
124569
124572
  } = padding2;
124570
- const offsetX = clamp$4((left2 + width2 - right2) / 2, 0, width2) - width2 / 2;
124571
- const offsetY = clamp$4((top2 + height2 - bottom2) / 2, 0, height2) - height2 / 2;
124573
+ const offsetX = clamp$5((left2 + width2 - right2) / 2, 0, width2) - width2 / 2;
124574
+ const offsetY = clamp$5((top2 + height2 - bottom2) / 2, 0, height2) - height2 / 2;
124572
124575
  matrix2[8] -= offsetX * 2 / width2;
124573
124576
  matrix2[9] += offsetY * 2 / height2;
124574
124577
  }
@@ -124683,7 +124686,7 @@ class Viewport {
124683
124686
  projectFlat(xyz) {
124684
124687
  if (this.isGeospatial) {
124685
124688
  const result = lngLatToWorld(xyz);
124686
- result[1] = clamp$4(result[1], -318, 830);
124689
+ result[1] = clamp$5(result[1], -318, 830);
124687
124690
  return result;
124688
124691
  }
124689
124692
  return xyz;
@@ -127400,7 +127403,7 @@ class MapState extends ViewState {
127400
127403
  minZoom
127401
127404
  } = this.getViewportProps();
127402
127405
  let zoom2 = startZoom + Math.log2(scale2);
127403
- zoom2 = clamp$4(zoom2, minZoom, maxZoom);
127406
+ zoom2 = clamp$5(zoom2, minZoom, maxZoom);
127404
127407
  const zoomedViewport = this.makeViewport({
127405
127408
  ...this.getViewportProps(),
127406
127409
  zoom: zoom2
@@ -127477,13 +127480,13 @@ class MapState extends ViewState {
127477
127480
  minZoom,
127478
127481
  zoom: zoom2
127479
127482
  } = props;
127480
- props.zoom = clamp$4(zoom2, minZoom, maxZoom);
127483
+ props.zoom = clamp$5(zoom2, minZoom, maxZoom);
127481
127484
  const {
127482
127485
  maxPitch,
127483
127486
  minPitch,
127484
127487
  pitch
127485
127488
  } = props;
127486
- props.pitch = clamp$4(pitch, minPitch, maxPitch);
127489
+ props.pitch = clamp$5(pitch, minPitch, maxPitch);
127487
127490
  const {
127488
127491
  normalize: normalize2 = true
127489
127492
  } = props;
@@ -127544,7 +127547,7 @@ class MapState extends ViewState {
127544
127547
  deltaScaleY = 1 - centerY / startY;
127545
127548
  }
127546
127549
  }
127547
- deltaScaleY = clamp$4(deltaScaleY, -1, 1);
127550
+ deltaScaleY = clamp$5(deltaScaleY, -1, 1);
127548
127551
  const {
127549
127552
  minPitch,
127550
127553
  maxPitch
@@ -127673,8 +127676,8 @@ function getProjectionMatrix({
127673
127676
  top: t4 = 0,
127674
127677
  bottom: b2 = 0
127675
127678
  } = padding2;
127676
- const offsetX = clamp$4((l2 + width2 - r3) / 2, 0, width2) - width2 / 2;
127677
- const offsetY = clamp$4((t4 + height2 - b2) / 2, 0, height2) - height2 / 2;
127679
+ const offsetX = clamp$5((l2 + width2 - r3) / 2, 0, width2) - width2 / 2;
127680
+ const offsetY = clamp$5((t4 + height2 - b2) / 2, 0, height2) - height2 / 2;
127678
127681
  left2 -= offsetX;
127679
127682
  right2 -= offsetX;
127680
127683
  bottom2 += offsetY;
@@ -127987,7 +127990,7 @@ class OrbitState extends ViewState {
127987
127990
  startZoom = this.getViewportProps().zoom;
127988
127991
  }
127989
127992
  const zoom2 = startZoom + Math.log2(scale2);
127990
- return clamp$4(zoom2, minZoom, maxZoom);
127993
+ return clamp$5(zoom2, minZoom, maxZoom);
127991
127994
  }
127992
127995
  _panFromCenter(offset2) {
127993
127996
  const {
@@ -128017,8 +128020,8 @@ class OrbitState extends ViewState {
128017
128020
  minRotationX,
128018
128021
  rotationOrbit
128019
128022
  } = props;
128020
- props.zoom = Array.isArray(zoom2) ? [clamp$4(zoom2[0], minZoom, maxZoom), clamp$4(zoom2[1], minZoom, maxZoom)] : clamp$4(zoom2, minZoom, maxZoom);
128021
- props.rotationX = clamp$4(props.rotationX, minRotationX, maxRotationX);
128023
+ props.zoom = Array.isArray(zoom2) ? [clamp$5(zoom2[0], minZoom, maxZoom), clamp$5(zoom2[1], minZoom, maxZoom)] : clamp$5(zoom2, minZoom, maxZoom);
128024
+ props.rotationX = clamp$5(props.rotationX, minRotationX, maxRotationX);
128022
128025
  if (rotationOrbit < -180 || rotationOrbit > 180) {
128023
128026
  props.rotationOrbit = mod$1(rotationOrbit + 180, 360) - 180;
128024
128027
  }
@@ -128062,10 +128065,10 @@ class OrthographicState extends OrbitState {
128062
128065
  let [newZoomX, newZoomY] = startZoom;
128063
128066
  switch (this.zoomAxis) {
128064
128067
  case "X":
128065
- newZoomX = clamp$4(newZoomX + deltaZoom, minZoom, maxZoom);
128068
+ newZoomX = clamp$5(newZoomX + deltaZoom, minZoom, maxZoom);
128066
128069
  break;
128067
128070
  case "Y":
128068
- newZoomY = clamp$4(newZoomY + deltaZoom, minZoom, maxZoom);
128071
+ newZoomY = clamp$5(newZoomY + deltaZoom, minZoom, maxZoom);
128069
128072
  break;
128070
128073
  default:
128071
128074
  let z2 = Math.min(newZoomX + deltaZoom, newZoomY + deltaZoom);
@@ -128081,7 +128084,7 @@ class OrthographicState extends OrbitState {
128081
128084
  }
128082
128085
  return [newZoomX, newZoomY];
128083
128086
  }
128084
- return clamp$4(startZoom + deltaZoom, minZoom, maxZoom);
128087
+ return clamp$5(startZoom + deltaZoom, minZoom, maxZoom);
128085
128088
  }
128086
128089
  }
128087
128090
  class OrthographicController extends Controller {
@@ -136820,7 +136823,7 @@ class FirstPersonState extends ViewState {
136820
136823
  longitude: longitude2,
136821
136824
  bearing
136822
136825
  } = props;
136823
- props.pitch = clamp$4(pitch, minPitch, maxPitch);
136826
+ props.pitch = clamp$5(pitch, minPitch, maxPitch);
136824
136827
  if (longitude2 !== null && (longitude2 < -180 || longitude2 > 180)) {
136825
136828
  props.longitude = mod$1(longitude2 + 180, 360) - 180;
136826
136829
  }
@@ -136869,7 +136872,7 @@ class GlobeState extends MapState {
136869
136872
  minZoom,
136870
136873
  zoom: zoom2
136871
136874
  } = props;
136872
- props.zoom = clamp$4(zoom2, minZoom, maxZoom);
136875
+ props.zoom = clamp$5(zoom2, minZoom, maxZoom);
136873
136876
  const {
136874
136877
  longitude: longitude2,
136875
136878
  latitude
@@ -136877,7 +136880,7 @@ class GlobeState extends MapState {
136877
136880
  if (longitude2 < -180 || longitude2 > 180) {
136878
136881
  props.longitude = mod$1(longitude2 + 180, 360) - 180;
136879
136882
  }
136880
- props.latitude = clamp$4(latitude, -89, 89);
136883
+ props.latitude = clamp$5(latitude, -89, 89);
136881
136884
  return props;
136882
136885
  }
136883
136886
  }
@@ -144524,7 +144527,7 @@ function getQuantileDomain(data2, valueAccessor) {
144524
144527
  function getOrdinalDomain(data2, valueAccessor) {
144525
144528
  return unique$1(getTruthyValues(data2, valueAccessor));
144526
144529
  }
144527
- function clamp$2(value2, min2, max2) {
144530
+ function clamp$3(value2, min2, max2) {
144528
144531
  return Math.max(min2, Math.min(max2, value2));
144529
144532
  }
144530
144533
  const defaultGetValue = (points2) => points2.length;
@@ -144585,7 +144588,7 @@ class BinSorter {
144585
144588
  if (len2 < 2) {
144586
144589
  return [0, 0];
144587
144590
  }
144588
- const [lower2, upper] = percentileRange.map((n3) => clamp$2(n3, 0, 100));
144591
+ const [lower2, upper] = percentileRange.map((n3) => clamp$3(n3, 0, 100));
144589
144592
  const lowerIdx = Math.ceil(lower2 / 100 * (len2 - 1));
144590
144593
  const upperIdx = Math.floor(upper / 100 * (len2 - 1));
144591
144594
  return [lowerIdx, upperIdx];
@@ -167379,7 +167382,7 @@ new Vector3();
167379
167382
  new Vector2();
167380
167383
  new Vector2();
167381
167384
  function fromSNorm(value2, rangeMaximum = 255) {
167382
- return clamp$4(value2, 0, rangeMaximum) / rangeMaximum * 2 - 1;
167385
+ return clamp$5(value2, 0, rangeMaximum) / rangeMaximum * 2 - 1;
167383
167386
  }
167384
167387
  function signNotZero(value2) {
167385
167388
  return value2 < 0 ? -1 : 1;
@@ -206496,7 +206499,7 @@ const esm = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty(
206496
206499
  asin: asin$5,
206497
206500
  assert: assert$c,
206498
206501
  atan: atan$3,
206499
- clamp: clamp$4,
206502
+ clamp: clamp$5,
206500
206503
  clone: clone$5,
206501
206504
  config: config$3,
206502
206505
  configure,
@@ -210925,22 +210928,22 @@ async function getDecoder(fileDirectory) {
210925
210928
  const Decoder = await importFn();
210926
210929
  return new Decoder(fileDirectory);
210927
210930
  }
210928
- addDecoder([void 0, 1], () => import("./raw-DbDdV1tN.js").then((m2) => m2.default));
210929
- addDecoder(5, () => import("./lzw-CyLNGLTP.js").then((m2) => m2.default));
210931
+ addDecoder([void 0, 1], () => import("./raw-Dcz65jWu.js").then((m2) => m2.default));
210932
+ addDecoder(5, () => import("./lzw-BlNLuocx.js").then((m2) => m2.default));
210930
210933
  addDecoder(6, () => {
210931
210934
  throw new Error("old style JPEG compression is not supported.");
210932
210935
  });
210933
- addDecoder(7, () => import("./jpeg-BegTw2ZG.js").then((m2) => m2.default));
210934
- addDecoder([8, 32946], () => import("./deflate-0ecBfpbE.js").then((m2) => m2.default));
210935
- addDecoder(32773, () => import("./packbits-CMdMha0h.js").then((m2) => m2.default));
210936
+ addDecoder(7, () => import("./jpeg-4XvdCEqV.js").then((m2) => m2.default));
210937
+ addDecoder([8, 32946], () => import("./deflate-nYfk3Mbe.js").then((m2) => m2.default));
210938
+ addDecoder(32773, () => import("./packbits-D7jhgu7h.js").then((m2) => m2.default));
210936
210939
  addDecoder(
210937
210940
  34887,
210938
- () => import("./lerc-BKy3Cqfz.js").then(async (m2) => {
210941
+ () => import("./lerc-J5N91MJw.js").then(async (m2) => {
210939
210942
  await m2.zstd.init();
210940
210943
  return m2;
210941
210944
  }).then((m2) => m2.default)
210942
210945
  );
210943
- addDecoder(50001, () => import("./webimage-DYe9qPKJ.js").then((m2) => m2.default));
210946
+ addDecoder(50001, () => import("./webimage-CMXekglL.js").then((m2) => m2.default));
210944
210947
  function copyNewSize(array2, width2, height2, samplesPerPixel = 1) {
210945
210948
  return new (Object.getPrototypeOf(array2)).constructor(width2 * height2 * samplesPerPixel);
210946
210949
  }
@@ -228161,7 +228164,7 @@ const BASE_POINT_SIZE = 5;
228161
228164
  const LARGE_DATASET_CELL_COUNT = 1e4;
228162
228165
  const SMALL_DATASET_CELL_COUNT = 100;
228163
228166
  function getInitialPointSize(numCells = LARGE_DATASET_CELL_COUNT) {
228164
- return BASE_POINT_SIZE / clamp$7(numCells, SMALL_DATASET_CELL_COUNT, LARGE_DATASET_CELL_COUNT);
228167
+ return BASE_POINT_SIZE / clamp$8(numCells, SMALL_DATASET_CELL_COUNT, LARGE_DATASET_CELL_COUNT);
228165
228168
  }
228166
228169
  function getPointSizeDevicePixels(devicePixelRatio2, zoom2, xRange, yRange, width2, height2, numCells) {
228167
228170
  const pointSize = getInitialPointSize(numCells);
@@ -228174,7 +228177,7 @@ function getPointSizeDevicePixels(devicePixelRatio2, zoom2, xRange, yRange, widt
228174
228177
  const diagonalAxisRange = Math.sqrt(xAxisRange ** 2 + yAxisRange ** 2);
228175
228178
  const diagonalFraction = pointSize / diagonalAxisRange;
228176
228179
  const deviceSize = diagonalFraction * diagonalScreenSize;
228177
- const pointSizeDevicePixels = clamp$7(deviceSize, pointScreenSizeMin, pointScreenSizeMax);
228180
+ const pointSizeDevicePixels = clamp$8(deviceSize, pointScreenSizeMin, pointScreenSizeMax);
228178
228181
  return pointSizeDevicePixels;
228179
228182
  }
228180
228183
  function getPointOpacity(zoom2, xRange, yRange, width2, height2, numCells, avgFillDensity) {
@@ -228203,7 +228206,7 @@ function getPointOpacity(zoom2, xRange, yRange, width2, height2, numCells, avgFi
228203
228206
  rho = Math.min(1, 1 / 10 ** (Math.log10(N2) - 3));
228204
228207
  }
228205
228208
  const alpha2 = rho * W * H / N2 * (Y02 / Y3) * (X02 / X3);
228206
- const pointOpacity = clamp$7(alpha2, 1.01 / 255, 1);
228209
+ const pointOpacity = clamp$8(alpha2, 1.01 / 255, 1);
228207
228210
  return pointOpacity;
228208
228211
  }
228209
228212
  const CELLS_LAYER_ID$1 = "scatterplot";
@@ -228819,7 +228822,7 @@ typeof SuppressedError === "function" ? SuppressedError : function(error2, suppr
228819
228822
  var e3 = new Error(message);
228820
228823
  return e3.name = "SuppressedError", e3.error = error2, e3.suppressed = suppressed, e3;
228821
228824
  };
228822
- const FEATURE_AGGREGATION_STRATEGIES$1 = ["first", "last", "sum", "mean"];
228825
+ const FEATURE_AGGREGATION_STRATEGIES$2 = ["first", "last", "sum", "mean"];
228823
228826
  function ScatterplotOptions(props) {
228824
228827
  const { children: children3, observationsLabel, cellRadius, setCellRadius, cellRadiusMode, setCellRadiusMode, cellOpacity, setCellOpacity, cellOpacityMode, setCellOpacityMode, cellSetLabelsVisible, setCellSetLabelsVisible, tooltipsVisible, setTooltipsVisible, cellSetLabelSize, setCellSetLabelSize, cellSetPolygonsVisible, setCellSetPolygonsVisible, cellColorEncoding, setCellColorEncoding, geneExpressionColormap, setGeneExpressionColormap, geneExpressionColormapRange, setGeneExpressionColormapRange, embeddingPointsVisible, setEmbeddingPointsVisible, embeddingContoursVisible, setEmbeddingContoursVisible, embeddingContoursFilled, setEmbeddingContoursFilled, contourPercentiles, setContourPercentiles, defaultContourPercentiles, contourColorEncoding, setContourColorEncoding, featureAggregationStrategy, setFeatureAggregationStrategy } = props;
228825
228828
  const scatterplotOptionsId = $bdb11010cef70236$export$f680877a34711e37();
@@ -228944,7 +228947,7 @@ function ScatterplotOptions(props) {
228944
228947
  return "Scatterplot sliders for contour percentile thresholds";
228945
228948
  }, id: `scatterplot-contour-percentiles-${scatterplotOptionsId}`, valueLabelDisplay: "auto", step: 5e-3, min: 9e-3, max: 0.999 }) })] }), setFeatureAggregationStrategy ? jsxs(TableRow, { children: [jsx$1(TableCell, { className: classes2.labelCell, variant: "head", scope: "row", children: jsx$1("label", { htmlFor: `feature-aggregation-strategy-${scatterplotOptionsId}`, children: "Feature Aggregation Strategy" }) }), jsx$1(TableCell, { className: classes2.inputCell, variant: "body", children: jsx$1(OptionSelect, { className: classes2.select, value: featureAggregationStrategy ?? "first", onChange: handleFeatureAggregationStrategyChange, inputProps: {
228946
228949
  id: `feature-aggregation-strategy-${scatterplotOptionsId}`
228947
- }, children: FEATURE_AGGREGATION_STRATEGIES$1.map((opt) => jsx$1("option", { value: opt, children: capitalize$3(opt) }, opt)) }) })] }) : null] });
228950
+ }, children: FEATURE_AGGREGATION_STRATEGIES$2.map((opt) => jsx$1("option", { value: opt, children: capitalize$3(opt) }, opt)) }) })] }) : null] });
228948
228951
  }
228949
228952
  const useStyles$t = makeStyles()((theme) => ({
228950
228953
  tooltipAnchor: {
@@ -233616,7 +233619,7 @@ function ChannelNamesLegend(props) {
233616
233619
  }) : null });
233617
233620
  }
233618
233621
  const DEFAULT_CONTOUR_PERCENTILES = [0.09, 0.9, 0.99];
233619
- const DEFAULT_FEATURE_AGGREGATION_STRATEGY$2 = "first";
233622
+ const DEFAULT_FEATURE_AGGREGATION_STRATEGY$3 = "first";
233620
233623
  function EmbeddingScatterplotSubscriber(props) {
233621
233624
  const {
233622
233625
  uuid: uuid2,
@@ -233643,7 +233646,7 @@ function EmbeddingScatterplotSubscriber(props) {
233643
233646
  const { embeddingZoom: initialZoom, embeddingTargetX: initialTargetX, embeddingTargetY: initialTargetY } = useInitialCoordination(COMPONENT_COORDINATION_TYPES[ViewType$1.SCATTERPLOT], coordinationScopes);
233644
233647
  const observationsLabel = observationsLabelOverride || obsType;
233645
233648
  const sampleSetSelection = sampleSetSelectionFromProps || sampleSetSelectionFromCoordination;
233646
- const featureAggregationStrategyToUse = featureAggregationStrategy ?? DEFAULT_FEATURE_AGGREGATION_STRATEGY$2;
233649
+ const featureAggregationStrategyToUse = featureAggregationStrategy ?? DEFAULT_FEATURE_AGGREGATION_STRATEGY$3;
233647
233650
  const [width2, height2, deckRef] = useDeckCanvasSize();
233648
233651
  const title2 = titleOverride || `Scatterplot (${mapping})`;
233649
233652
  const [
@@ -238315,7 +238318,7 @@ function cbrt(x2) {
238315
238318
  function ceil$2(x2) {
238316
238319
  return finalise(x2 = new this(x2), x2.e + 1, 2);
238317
238320
  }
238318
- function clamp$1(x2, min2, max2) {
238321
+ function clamp$2(x2, min2, max2) {
238319
238322
  return new this(x2).clamp(min2, max2);
238320
238323
  }
238321
238324
  function config$1(obj) {
@@ -238486,7 +238489,7 @@ function clone$1(obj) {
238486
238489
  Decimal3.atan2 = atan2$2;
238487
238490
  Decimal3.cbrt = cbrt;
238488
238491
  Decimal3.ceil = ceil$2;
238489
- Decimal3.clamp = clamp$1;
238492
+ Decimal3.clamp = clamp$2;
238490
238493
  Decimal3.cos = cos$3;
238491
238494
  Decimal3.cosh = cosh;
238492
238495
  Decimal3.div = div;
@@ -252470,6 +252473,16 @@ class RelaxedFetchStore extends FetchStore {
252470
252473
  throw e3;
252471
252474
  }
252472
252475
  }
252476
+ async getRange(key2, range2, options = {}) {
252477
+ try {
252478
+ return await super.getRange(key2, range2, options);
252479
+ } catch (e3) {
252480
+ if (e3?.message?.startsWith("Unexpected response status 403") && true) {
252481
+ return void 0;
252482
+ }
252483
+ throw e3;
252484
+ }
252485
+ }
252473
252486
  }
252474
252487
  function transformEntriesForZipFileStore(entries2) {
252475
252488
  const topLevelZarrDirectories = new Set(Object.keys(entries2).map((k) => k.split("/")[0]).filter((firstPathItem) => firstPathItem?.endsWith(".zarr")));
@@ -253379,7 +253392,8 @@ let Spatial$1 = class Spatial extends AbstractSpatialOrScatterplot {
253379
253392
  "expressionData",
253380
253393
  "cellColorEncoding",
253381
253394
  "geneExpressionColormap",
253382
- "segmentationLayerCallbacks"
253395
+ "segmentationLayerCallbacks",
253396
+ "getExpressionValue"
253383
253397
  ].some(shallowDiff2)) {
253384
253398
  this.onUpdateCellsLayer();
253385
253399
  forceUpdate = true;
@@ -253439,6 +253453,7 @@ const useToggleStyles = makeStyles()(() => ({
253439
253453
  padding: "0px"
253440
253454
  }
253441
253455
  }));
253456
+ const FEATURE_AGGREGATION_STRATEGIES$1 = ["first", "last", "sum", "mean"];
253442
253457
  const ToggleFixedAxisButton = ({ setSpatialAxisFixed, spatialAxisFixed, use3d }) => {
253443
253458
  const toggleAxisId = $bdb11010cef70236$export$f680877a34711e37();
253444
253459
  const { classes: classes2 } = useToggleStyles();
@@ -253448,7 +253463,7 @@ const ToggleFixedAxisButton = ({ setSpatialAxisFixed, spatialAxisFixed, use3d })
253448
253463
  } } }) })] });
253449
253464
  };
253450
253465
  function SpatialOptions(props) {
253451
- const { observationsLabel, cellColorEncoding, setCellColorEncoding, setSpatialAxisFixed, spatialAxisFixed, use3d, tooltipsVisible, setTooltipsVisible, geneExpressionColormap, setGeneExpressionColormap, geneExpressionColormapRange, setGeneExpressionColormapRange, canShowExpressionOptions, canShowColorEncodingOption, canShow3DOptions } = props;
253466
+ const { observationsLabel, cellColorEncoding, setCellColorEncoding, setSpatialAxisFixed, spatialAxisFixed, use3d, tooltipsVisible, setTooltipsVisible, geneExpressionColormap, setGeneExpressionColormap, geneExpressionColormapRange, setGeneExpressionColormapRange, canShowExpressionOptions, canShowColorEncodingOption, canShow3DOptions, featureAggregationStrategy, setFeatureAggregationStrategy } = props;
253452
253467
  const spatialOptionsId = $bdb11010cef70236$export$f680877a34711e37();
253453
253468
  function handleGeneExpressionColormapChange(event2) {
253454
253469
  setGeneExpressionColormap(event2.target.value);
@@ -253484,7 +253499,7 @@ function SpatialOptions(props) {
253484
253499
  }, value: geneExpressionColormapRange, onChange: handleColormapRangeChangeDebounced, getAriaLabel: (index2) => {
253485
253500
  const labelPrefix = index2 === 0 ? "Low value slider" : "High value slider";
253486
253501
  return `${labelPrefix} for spatial gene expression colormap range`;
253487
- }, id: `gene-expression-colormap-range-${spatialOptionsId}`, valueLabelDisplay: "auto", step: 5e-3, min: 0, max: 1 }) })] })] }) : null] });
253502
+ }, id: `gene-expression-colormap-range-${spatialOptionsId}`, valueLabelDisplay: "auto", step: 5e-3, min: 0, max: 1 }) })] }), setFeatureAggregationStrategy ? jsxs(TableRow, { children: [jsx$1(TableCell, { className: classes2.labelCell, variant: "head", scope: "row", children: jsx$1("label", { htmlFor: `feature-aggregation-strategy-${spatialOptionsId}`, children: "Feature Aggregation Strategy" }) }), jsx$1(TableCell, { className: classes2.inputCell, variant: "body", children: jsx$1(OptionSelect, { className: classes2.select, value: featureAggregationStrategy ?? "first", onChange: (e3) => setFeatureAggregationStrategy(e3.target.value), inputProps: { id: `feature-aggregation-strategy-${spatialOptionsId}` }, children: FEATURE_AGGREGATION_STRATEGIES$1.map((opt) => jsx$1("option", { value: opt, children: capitalize$3(opt) }, opt)) }) })] }) : null] }) : null] });
253488
253503
  }
253489
253504
  function SpatialTooltipSubscriber$1(props) {
253490
253505
  const { parentUuid, obsHighlight, width: width2, height: height2, getObsInfo: getObsInfo2, hoverData, hoverCoord, hoverMode, useHoverInfoForTooltip, getObsIdFromHoverData, featureType, featureLabelsMap } = props;
@@ -253516,12 +253531,13 @@ function SpatialTooltipSubscriber$1(props) {
253516
253531
  }
253517
253532
  return cellInfo ? jsx$1(Tooltip2D, { x: x2, y: y2, parentUuid, sourceUuid, parentWidth: width2, parentHeight: height2, children: jsx$1(TooltipContent, { info: cellInfo, featureType, featureLabelsMap }) }) : null;
253518
253533
  }
253534
+ const DEFAULT_FEATURE_AGGREGATION_STRATEGY$2 = "first";
253519
253535
  function SpatialSubscriber$1(props) {
253520
253536
  const { uuid: uuid2, coordinationScopes, closeButtonVisible, downloadButtonVisible, removeGridComponent, observationsLabelOverride, subobservationsLabelOverride: subobservationsLabel = "molecule", theme, title: title2 = "Spatial", disable3d, globalDisable3d, useFullResolutionImage = {}, channelNamesVisible = false, helpText = ViewHelpMapping.SPATIAL } = props;
253521
253537
  const loaders = useLoaders();
253522
253538
  const setComponentHover = useSetComponentHover();
253523
253539
  const setComponentViewInfo = useSetComponentViewInfo(uuid2);
253524
- const [{ dataset, obsType, featureType, featureValueType, spatialZoom: zoom2, spatialTargetX: targetX2, spatialTargetY: targetY2, spatialTargetZ: targetZ, spatialRotationX: rotationX, spatialRotationY: rotationY, spatialRotationZ: rotationZ, spatialRotationOrbit: rotationOrbit, spatialOrbitAxis: orbitAxis, spatialImageLayer: imageLayers, spatialSegmentationLayer: cellsLayer, spatialPointLayer: moleculesLayer, spatialNeighborhoodLayer: neighborhoodsLayer, obsFilter: cellFilter, obsHighlight: cellHighlight, moleculeHighlight, featureSelection: geneSelection, obsSetSelection: cellSetSelection, obsSetColor: cellSetColor, obsColorEncoding: cellColorEncoding, additionalObsSets: additionalCellSets, spatialAxisFixed, featureValueColormap: geneExpressionColormap, featureValueColormapRange: geneExpressionColormapRange, tooltipsVisible, photometricInterpretation: photometricInterpretationFromCoordination }, { setSpatialZoom: setZoom, setSpatialTargetX: setTargetX, setSpatialTargetY: setTargetY, setSpatialTargetZ: setTargetZ, setSpatialRotationX: setRotationX, setSpatialRotationOrbit: setRotationOrbit, setSpatialOrbitAxis: setOrbitAxis, setSpatialImageLayer: setRasterLayers, setSpatialSegmentationLayer: setCellsLayer, setSpatialPointLayer: setMoleculesLayer, setSpatialNeighborhoodLayer: setNeighborhoodsLayer, setObsFilter: setCellFilter, setObsSetSelection: setCellSetSelection, setObsHighlight: setCellHighlight, setObsSetColor: setCellSetColor, setObsColorEncoding: setCellColorEncoding, setAdditionalObsSets: setAdditionalCellSets, setMoleculeHighlight, setSpatialAxisFixed, setFeatureValueColormap: setGeneExpressionColormap, setFeatureValueColormapRange: setGeneExpressionColormapRange, setTooltipsVisible }] = useCoordination(COMPONENT_COORDINATION_TYPES[ViewType$1.SPATIAL], coordinationScopes);
253540
+ const [{ dataset, obsType, featureType, featureValueType, spatialZoom: zoom2, spatialTargetX: targetX2, spatialTargetY: targetY2, spatialTargetZ: targetZ, spatialRotationX: rotationX, spatialRotationY: rotationY, spatialRotationZ: rotationZ, spatialRotationOrbit: rotationOrbit, spatialOrbitAxis: orbitAxis, spatialImageLayer: imageLayers, spatialSegmentationLayer: cellsLayer, spatialPointLayer: moleculesLayer, spatialNeighborhoodLayer: neighborhoodsLayer, obsFilter: cellFilter, obsHighlight: cellHighlight, moleculeHighlight, featureSelection: geneSelection, obsSetSelection: cellSetSelection, obsSetColor: cellSetColor, obsColorEncoding: cellColorEncoding, additionalObsSets: additionalCellSets, spatialAxisFixed, featureValueColormap: geneExpressionColormap, featureValueColormapRange: geneExpressionColormapRange, tooltipsVisible, photometricInterpretation: photometricInterpretationFromCoordination, featureAggregationStrategy }, { setSpatialZoom: setZoom, setSpatialTargetX: setTargetX, setSpatialTargetY: setTargetY, setSpatialTargetZ: setTargetZ, setSpatialRotationX: setRotationX, setSpatialRotationOrbit: setRotationOrbit, setSpatialOrbitAxis: setOrbitAxis, setSpatialImageLayer: setRasterLayers, setSpatialSegmentationLayer: setCellsLayer, setSpatialPointLayer: setMoleculesLayer, setSpatialNeighborhoodLayer: setNeighborhoodsLayer, setObsFilter: setCellFilter, setObsSetSelection: setCellSetSelection, setObsHighlight: setCellHighlight, setObsSetColor: setCellSetColor, setObsColorEncoding: setCellColorEncoding, setAdditionalObsSets: setAdditionalCellSets, setMoleculeHighlight, setSpatialAxisFixed, setFeatureValueColormap: setGeneExpressionColormap, setFeatureValueColormapRange: setGeneExpressionColormapRange, setTooltipsVisible, setFeatureAggregationStrategy }] = useCoordination(COMPONENT_COORDINATION_TYPES[ViewType$1.SPATIAL], coordinationScopes);
253525
253541
  const { spatialZoom: initialZoom, spatialTargetX: initialTargetX, spatialTargetY: initialTargetY, spatialTargetZ: initialTargetZ } = useInitialCoordination(COMPONENT_COORDINATION_TYPES[ViewType$1.SPATIAL], coordinationScopes);
253526
253542
  const observationsLabel = observationsLabelOverride || obsType;
253527
253543
  const [{ imageLayerCallbacks, segmentationLayerCallbacks }] = useAuxiliaryCoordination(COMPONENT_COORDINATION_TYPES.layerController, coordinationScopes);
@@ -253727,7 +253743,15 @@ function SpatialSubscriber$1(props) {
253727
253743
  subobservationsLabel,
253728
253744
  locationsCount
253729
253745
  });
253730
- const { normData: uint8ExpressionData, extents: expressionExtents } = useUint8FeatureSelection(expressionData);
253746
+ const featureAggregationStrategyToUse = featureAggregationStrategy ?? DEFAULT_FEATURE_AGGREGATION_STRATEGY$2;
253747
+ const aggregatedExpressionData = useMemo$1(() => {
253748
+ if (featureAggregationStrategyToUse != null && expressionData && expressionData.length > 1) {
253749
+ const aggregated = aggregateFeatureArrays(expressionData, featureAggregationStrategyToUse);
253750
+ return [aggregated];
253751
+ }
253752
+ return expressionData;
253753
+ }, [expressionData, featureAggregationStrategyToUse]);
253754
+ const { normData: uint8ExpressionData, extents: expressionExtents } = useUint8FeatureSelection(aggregatedExpressionData);
253731
253755
  const shiftedExpressionDataForBitmask = useMemo$1(() => {
253732
253756
  if (matrixObsIndex && uint8ExpressionData && obsSegmentationsType === "bitmask") {
253733
253757
  const maxId = matrixObsIndex.reduce((max2, curr) => Math.max(max2, Number(curr)));
@@ -253752,7 +253776,7 @@ function SpatialSubscriber$1(props) {
253752
253776
  const canShow3DOptions = canLoad3DLayers && !(disable3d?.length === imageLayerLoaders.length) && !globalDisable3d;
253753
253777
  const options = useMemo$1(() => {
253754
253778
  if (canShow3DOptions || hasExpressionData) {
253755
- return jsx$1(SpatialOptions, { observationsLabel, cellColorEncoding, setCellColorEncoding, setSpatialAxisFixed, spatialAxisFixed, use3d, tooltipsVisible, setTooltipsVisible, geneExpressionColormap, setGeneExpressionColormap, geneExpressionColormapRange, setGeneExpressionColormapRange, canShowExpressionOptions: hasExpressionData, canShowColorEncodingOption: (hasLocationsData || hasSegmentationsData) && hasExpressionData, canShow3DOptions });
253779
+ return jsx$1(SpatialOptions, { observationsLabel, cellColorEncoding, setCellColorEncoding, setSpatialAxisFixed, spatialAxisFixed, use3d, tooltipsVisible, setTooltipsVisible, geneExpressionColormap, setGeneExpressionColormap, geneExpressionColormapRange, setGeneExpressionColormapRange, canShowExpressionOptions: hasExpressionData, canShowColorEncodingOption: (hasLocationsData || hasSegmentationsData) && hasExpressionData, canShow3DOptions, featureSelection: geneSelection, featureAggregationStrategy, setFeatureAggregationStrategy });
253756
253780
  }
253757
253781
  return null;
253758
253782
  }, [
@@ -253771,7 +253795,10 @@ function SpatialSubscriber$1(props) {
253771
253795
  spatialAxisFixed,
253772
253796
  use3d,
253773
253797
  tooltipsVisible,
253774
- setTooltipsVisible
253798
+ setTooltipsVisible,
253799
+ geneSelection,
253800
+ featureAggregationStrategy,
253801
+ setFeatureAggregationStrategy
253775
253802
  ]);
253776
253803
  useEffect(() => {
253777
253804
  if (!hasSegmentationsData && cellsLayer && !obsSegmentations && !obsSegmentationsIndex && obsCentroids && obsCentroidsIndex) {
@@ -253834,7 +253861,8 @@ function SpatialSubscriber$1(props) {
253834
253861
  featureValueColormap: geneExpressionColormap,
253835
253862
  featureValueColormapRange: geneExpressionColormapRange,
253836
253863
  setFeatureValueColormapRange: setGeneExpressionColormapRange,
253837
- extent: expressionExtents?.[0]
253864
+ extent: expressionExtents?.[0],
253865
+ featureAggregationStrategy: featureAggregationStrategyToUse
253838
253866
  })] });
253839
253867
  }
253840
253868
  function getInitialSpatialTargets({ width: width2, height: height2, obsPoints, obsSpots, obsSegmentations, obsSegmentationsLocations, segmentationChannelScopesByLayer, images, is3dMode: use3d, isReady }) {
@@ -255486,12 +255514,12 @@ class ErrorBoundary extends React__default.Component {
255486
255514
  }
255487
255515
  }
255488
255516
  const LazySpatialThree = React__default.lazy(async () => {
255489
- const { SpatialWrapper: SpatialWrapper2 } = await import("./index-6Oxzw9ho.js").then((n3) => n3.a);
255517
+ const { SpatialWrapper: SpatialWrapper2 } = await import("./index-C2U2CO2P.js").then((n3) => n3.a);
255490
255518
  return { default: SpatialWrapper2 };
255491
255519
  });
255492
255520
  const SpatialThreeAdapter = React__default.forwardRef((props, ref2) => jsx$1("div", { ref: ref2, style: { width: "100%", height: "100%" }, children: jsx$1(ErrorBoundary, { fallback: jsx$1("div", { children: "3D spatial view is not available in this environment." }), children: jsx$1(Suspense, { fallback: jsx$1("div", { children: "Loading..." }), children: jsx$1(LazySpatialThree, { ...props }) }) }) }));
255493
255521
  const LazySpatialAccelerated = React__default.lazy(async () => {
255494
- const { SpatialWrapper: SpatialWrapper2 } = await import("./index-BsUxdbVL.js");
255522
+ const { SpatialWrapper: SpatialWrapper2 } = await import("./index-DuFOjj6d.js");
255495
255523
  return { default: SpatialWrapper2 };
255496
255524
  });
255497
255525
  const SpatialAcceleratedAdapter = React__default.forwardRef((props, ref2) => jsx$1("div", { ref: ref2, style: { width: "100%", height: "100%" }, children: jsx$1(ErrorBoundary, { fallback: jsx$1("div", { children: "3D spatial view is not available in this environment." }), children: jsx$1(Suspense, { fallback: jsx$1("div", { children: "Loading..." }), children: jsx$1(LazySpatialAccelerated, { ...props }) }) }) }));
@@ -256219,8 +256247,8 @@ function getAxisSizes(transpose2, longestGeneLabel, longestCellLabel, hideObserv
256219
256247
  const font2 = `${AXIS_LABEL_TEXT_SIZE}pt ${AXIS_FONT_FAMILY}`;
256220
256248
  const geneLabelMaxWidth = hideVariableLabels ? 0 : getTextWidth(longestGeneLabel, font2) + AXIS_PADDING;
256221
256249
  const cellLabelMaxWidth = hideObservationLabels ? 0 : getTextWidth(longestCellLabel, font2) + AXIS_PADDING;
256222
- const axisOffsetLeft = clamp$7(transpose2 ? geneLabelMaxWidth : cellLabelMaxWidth, AXIS_MIN_SIZE, AXIS_MAX_SIZE);
256223
- const axisOffsetTop = clamp$7(transpose2 ? cellLabelMaxWidth : geneLabelMaxWidth, AXIS_MIN_SIZE, AXIS_MAX_SIZE);
256250
+ const axisOffsetLeft = clamp$8(transpose2 ? geneLabelMaxWidth : cellLabelMaxWidth, AXIS_MIN_SIZE, AXIS_MAX_SIZE);
256251
+ const axisOffsetTop = clamp$8(transpose2 ? cellLabelMaxWidth : geneLabelMaxWidth, AXIS_MIN_SIZE, AXIS_MAX_SIZE);
256224
256252
  return [axisOffsetLeft, axisOffsetTop];
256225
256253
  }
256226
256254
  function mouseToHeatmapPosition(mouseX, mouseY, { offsetLeft, offsetTop, targetX: targetX2, targetY: targetY2, scaleFactor, matrixWidth, matrixHeight, numRows, numCols }) {
@@ -256450,8 +256478,8 @@ const Heatmap$1 = forwardRef$1((props, deckRef) => {
256450
256478
  const scaleFactor = 2 ** viewState.zoom;
256451
256479
  const cellHeight = matrixHeight * scaleFactor / height2;
256452
256480
  const cellWidth = matrixWidth * scaleFactor / width2;
256453
- const aggSizeX = clamp$7(2 ** Math.ceil(Math.log2(1 / cellWidth)), MIN_ROW_AGG, MAX_ROW_AGG);
256454
- const aggSizeY = clamp$7(2 ** Math.ceil(Math.log2(1 / cellHeight)), MIN_ROW_AGG, MAX_ROW_AGG);
256481
+ const aggSizeX = clamp$8(2 ** Math.ceil(Math.log2(1 / cellWidth)), MIN_ROW_AGG, MAX_ROW_AGG);
256482
+ const aggSizeY = clamp$8(2 ** Math.ceil(Math.log2(1 / cellHeight)), MIN_ROW_AGG, MAX_ROW_AGG);
256455
256483
  const [targetX2, targetY2] = viewState.target;
256456
256484
  useEffect(() => {
256457
256485
  updateViewInfo({
@@ -256495,8 +256523,8 @@ const Heatmap$1 = forwardRef$1((props, deckRef) => {
256495
256523
  const minTargetY = nextZoom === 0 ? 0 : -(matrixBottom - matrixBottom / nextScaleFactor);
256496
256524
  const maxTargetY = -1 * minTargetY;
256497
256525
  const nextTarget = [
256498
- clamp$7(nextViewState.target[0], minTargetX, maxTargetX),
256499
- clamp$7(nextViewState.target[1], minTargetY, maxTargetY)
256526
+ clamp$8(nextViewState.target[0], minTargetX, maxTargetX),
256527
+ clamp$8(nextViewState.target[1], minTargetY, maxTargetY)
256500
256528
  ];
256501
256529
  setViewState({
256502
256530
  zoom: nextZoom,
@@ -263641,7 +263669,7 @@ const useStyles$o = makeStyles()((theme) => ({
263641
263669
  }));
263642
263670
  const SHIFT_KEYCODE = 16;
263643
263671
  function SelectableTable(props) {
263644
- const { hasColorEncoding, columns: columns2, columnLabels, data: data2, onChange, idKey = "id", valueKey = "value", allowMultiple = false, allowUncheck = false, showTableHead = true, showTableInputs = false, testHeight = void 0, testWidth = void 0, width: width2, height: height2 } = props;
263672
+ const { hasColorEncoding, columns: columns2, columnLabels, data: data2, onChange, idKey = "id", selectedIds, allowMultiple = false, allowUncheck = false, showTableHead = true, showTableInputs = false, testHeight = void 0, testWidth = void 0, width: width2, height: height2 } = props;
263645
263673
  const [selectedRows, setSelectedRows] = useState(null);
263646
263674
  const [isCheckingMultiple, setIsCheckingMultiple] = useState(false);
263647
263675
  useEffect(() => {
@@ -263685,20 +263713,20 @@ function SelectableTable(props) {
263685
263713
  })), [data2, idKey]);
263686
263714
  const isSelected = useCallback((id2) => Array.isArray(selectedRows) && selectedRows.includes(id2), [selectedRows]);
263687
263715
  useEffect(() => {
263688
- const initialSelectedRows = data2.map((d) => {
263689
- if (d[valueKey]) {
263690
- return d[idKey];
263691
- }
263692
- return null;
263693
- }).filter(Boolean);
263694
- if (!isEqual$3(initialSelectedRows, selectedRows)) {
263695
- if (initialSelectedRows.length > 0) {
263696
- setSelectedRows(initialSelectedRows);
263697
- } else {
263698
- setSelectedRows(null);
263716
+ if (selectedIds === void 0)
263717
+ return;
263718
+ setSelectedRows((prev2) => {
263719
+ const prevList = prev2 || [];
263720
+ const nextList = selectedIds || [];
263721
+ const sharedList = prevList.filter((id2) => nextList.includes(id2));
263722
+ const nextUnique = nextList.filter((id2) => !prevList.includes(id2));
263723
+ const merged = [...sharedList, ...nextUnique];
263724
+ if (isEqual$3(merged, prevList)) {
263725
+ return prev2;
263699
263726
  }
263700
- }
263701
- }, [data2, idKey, valueKey]);
263727
+ return merged.length > 0 ? merged : null;
263728
+ });
263729
+ }, [selectedIds]);
263702
263730
  useEffect(() => {
263703
263731
  if (!onChange || !selectedRows) {
263704
263732
  return;
@@ -263770,8 +263798,7 @@ function FeatureList(props) {
263770
263798
  const data2 = useMemo$1(() => {
263771
263799
  const preSortedData = searchResults.filter((gene) => geneFilter ? geneFilter.includes(gene) : true).map((gene) => ({
263772
263800
  key: gene,
263773
- name: featureLabelsMap?.get(gene) || featureLabelsMap?.get(cleanFeatureId(gene)) || gene,
263774
- value: geneSelection ? geneSelection.includes(gene) : false
263801
+ name: featureLabelsMap?.get(gene) || featureLabelsMap?.get(cleanFeatureId(gene)) || gene
263775
263802
  }));
263776
263803
  if (preSortedData && featureListSort === "alphabetical" && preSortedData.length > 0) {
263777
263804
  return preSortedData.sort((a2, b2) => a2[selectableTableSortKey].localeCompare(b2[selectableTableSortKey]));
@@ -263782,8 +263809,7 @@ function FeatureList(props) {
263782
263809
  selectableTableSortKey,
263783
263810
  searchResults,
263784
263811
  geneFilter,
263785
- featureLabelsMap,
263786
- geneSelection
263812
+ featureLabelsMap
263787
263813
  ]);
263788
263814
  const handleChange = (event2) => {
263789
263815
  setSearchTerm(event2.target.value);
@@ -263800,7 +263826,7 @@ function FeatureList(props) {
263800
263826
  [primaryColumnName]
263801
263827
  ];
263802
263828
  }, [showFeatureTable, primaryColumnName, hasFeatureLabels]);
263803
- return width2 > 0 && height2 > 0 ? jsxs(Fragment, { children: [jsx$1("input", { className: classes2.searchBar, type: "text", placeholder: "Search", value: searchTerm, onChange: handleChange }), jsx$1(SelectableTable, { columns: columns2, columnLabels, data: data2, hasColorEncoding, idKey: "key", valueKey: "value", onChange, allowMultiple: enableMultiSelect, allowUncheck: enableMultiSelect, showTableHead: columnLabels.length > 1, width: width2, height: height2 - 34 })] }) : null;
263829
+ return width2 > 0 && height2 > 0 ? jsxs(Fragment, { children: [jsx$1("input", { className: classes2.searchBar, type: "text", placeholder: "Search", value: searchTerm, onChange: handleChange }), jsx$1(SelectableTable, { columns: columns2, columnLabels, data: data2, hasColorEncoding, idKey: "key", selectedIds: geneSelection, onChange, allowMultiple: enableMultiSelect, allowUncheck: enableMultiSelect, showTableHead: columnLabels.length > 1, width: width2, height: height2 - 34 })] }) : null;
263804
263830
  }
263805
263831
  function FeatureListOptions(props) {
263806
263832
  const { children: children3, featureListSort, setFeatureListSort, featureListSortKey, setFeatureListSortKey, showFeatureTable, setShowFeatureTable, hasFeatureLabels, primaryColumnName } = props;
@@ -265316,7 +265342,7 @@ function PointLayerController(props) {
265316
265342
  const [coloringTabIndex, setColoringTabIndex] = useState(0);
265317
265343
  const { featureIndex } = pointMatrixIndicesData || {};
265318
265344
  const hasSelectedFeatures = Array.isArray(featureSelection) && featureSelection.length > 0;
265319
- return jsxs(Grid$1, { className: lcClasses.layerControllerGrid, children: [jsxs(Paper, { elevation: 4, className: lcClasses.layerControllerRoot, children: [jsxs(Grid$1, { container: true, direction: "row", justifyContent: "space-between", children: [jsx$1(Grid$1, { size: 1, children: jsx$1(Button, { onClick: handleVisibleChange, className: menuClasses.imageLayerVisibleButton, "aria-label": "Toggle layer visibility", children: jsx$1(Visibility, {}) }) }), jsx$1(Grid$1, { size: 1, children: jsx$1(ChannelColorPickerMenu, { theme, color: color2, setColor: setColor2, palette, isStaticColor, isColormap, featureValueColormap, visible }) }), jsx$1(Grid$1, { size: 6, children: jsx$1(Typography, { className: menuClasses.imageLayerName, children: label2 }) }), jsx$1(Grid$1, { size: 2, children: jsx$1(Slider, { value: opacity2, min: 0, max: 1, step: 1e-3, onChange: handleOpacityChange, className: menuClasses.imageLayerOpacitySlider, orientation: "horizontal", "aria-label": `Adjust opacity for layer ${label2}` }) }), jsx$1(Grid$1, { size: 1, children: jsx$1(PointLayerEllipsisMenu, { featureSelection, obsColorEncoding, setObsColorEncoding, featureValueColormapRange, setFeatureValueColormapRange, tooltipsVisible, setTooltipsVisible, tooltipCrosshairsVisible, setTooltipCrosshairsVisible, legendVisible, setLegendVisible, featureFilterMode, setFeatureFilterMode }) }), jsxs(Grid$1, { size: 1, container: true, direction: "row", children: [jsx$1(SvgPoints, { className: classes2.layerTypePointIcon }), null] })] }), loadingDoneFraction < 1 ? jsx$1(Grid$1, { size: 12, container: true, direction: "column", justifyContent: "space-between", className: classes2.pointFeatureControllerGrid, children: jsx$1(LinearProgress, { variant: loadingDoneFraction === 0 ? "indeterminate" : "determinate", value: loadingDoneFraction * 100 }) }) : null, null] }), hasSelectedFeatures ? jsxs(Fragment, { children: [featureSelection.map((featureName) => jsx$1(LayerPerFeatureController, { theme, featureName, featureColor, setFeatureColor, spatialLayerColor, featureIndex, featureValueColormap, featureSelection, setFeatureSelection, obsColorEncoding, loadingDoneFraction, opacity: opacity2, handleOpacityChange }, featureName)), jsx$1(Grid$1, { className: lcClasses.layerControllerGrid, children: jsx$1(Paper, { elevation: 2, className: lcClasses.layerControllerSubRow, children: jsxs(Grid$1, { container: true, direction: "row", justifyContent: "space-between", children: [jsx$1(Grid$1, { size: 1, children: jsx$1(Button, { onClick: () => setFeatureFilterMode(featureFilterMode === "featureSelection" ? null : "featureSelection"), className: menuClasses.imageLayerVisibleButton, "aria-label": "Toggle visibility of unselected points", children: featureFilterMode === "featureSelection" ? jsx$1(VisibilityOffIcon, {}) : jsx$1(VisibilityIcon, {}) }) }), jsx$1(Grid$1, { size: 1, children: jsx$1(ChannelColorPickerMenu, { theme, color: getDefaultColor("dark"), setColor: null, isStaticColor: true, isColormap: false, visible: true }) }), jsx$1(Grid$1, { size: 6, children: jsx$1(Typography, { className: menuClasses.imageLayerName, children: "Unselected" }) }), jsx$1(Grid$1, { size: 2, sx: { paddingRight: "12px", overflow: "visible" }, children: jsx$1(Slider, { value: opacity2, min: 0, max: 1, step: 1e-3, onChange: handleOpacityChange, className: menuClasses.imageLayerOpacitySlider, orientation: "horizontal", "aria-label": "Adjust opacity for unselected layer" }) }), jsx$1(Grid$1, { size: 1, children: jsx$1(SvgPoints, { className: classes2.layerTypePointIcon }) })] }) }) })] }) : null] });
265345
+ return jsxs(Grid$1, { className: lcClasses.layerControllerGrid, children: [jsxs(Paper, { elevation: 4, className: lcClasses.layerControllerRoot, children: [jsxs(Grid$1, { container: true, direction: "row", justifyContent: "space-between", children: [jsx$1(Grid$1, { size: 1, children: jsx$1(Button, { onClick: handleVisibleChange, className: menuClasses.imageLayerVisibleButton, "aria-label": "Toggle layer visibility", children: jsx$1(Visibility, {}) }) }), jsx$1(Grid$1, { size: 1, children: jsx$1(ChannelColorPickerMenu, { theme, color: color2, setColor: setColor2, palette, isStaticColor, isColormap, featureValueColormap, visible }) }), jsx$1(Grid$1, { size: 6, children: jsx$1(Typography, { className: menuClasses.imageLayerName, children: label2 }) }), jsx$1(Grid$1, { size: 2, children: jsx$1(Slider, { value: opacity2, min: 0, max: 1, step: 1e-3, onChange: handleOpacityChange, className: menuClasses.imageLayerOpacitySlider, orientation: "horizontal", "aria-label": `Adjust opacity for layer ${label2}` }) }), jsx$1(Grid$1, { size: 1, children: jsx$1(PointLayerEllipsisMenu, { featureSelection, obsColorEncoding, setObsColorEncoding, featureValueColormapRange, setFeatureValueColormapRange, tooltipsVisible, setTooltipsVisible, tooltipCrosshairsVisible, setTooltipCrosshairsVisible, legendVisible, setLegendVisible, featureFilterMode, setFeatureFilterMode }) }), jsxs(Grid$1, { size: 1, container: true, direction: "row", children: [jsx$1(SvgPoints, { className: classes2.layerTypePointIcon }), null] })] }), loadingDoneFraction < 1 ? jsx$1(Grid$1, { size: 12, container: true, direction: "column", justifyContent: "space-between", className: classes2.pointFeatureControllerGrid, children: jsx$1(LinearProgress, { variant: loadingDoneFraction === 0 ? "indeterminate" : "determinate", value: loadingDoneFraction * 100 }) }) : null, null] }), layerPerFeatureForPoints && hasSelectedFeatures ? jsxs(Fragment, { children: [featureSelection.map((featureName) => jsx$1(LayerPerFeatureController, { theme, featureName, featureColor, setFeatureColor, spatialLayerColor, featureIndex, featureValueColormap, featureSelection, setFeatureSelection, obsColorEncoding, loadingDoneFraction, opacity: opacity2, handleOpacityChange }, featureName)), jsx$1(Grid$1, { className: lcClasses.layerControllerGrid, children: jsx$1(Paper, { elevation: 2, className: lcClasses.layerControllerSubRow, children: jsxs(Grid$1, { container: true, direction: "row", justifyContent: "space-between", children: [jsx$1(Grid$1, { size: 1, children: jsx$1(Button, { onClick: () => setFeatureFilterMode(featureFilterMode === "featureSelection" ? null : "featureSelection"), className: menuClasses.imageLayerVisibleButton, "aria-label": "Toggle visibility of unselected points", children: featureFilterMode === "featureSelection" ? jsx$1(VisibilityOffIcon, {}) : jsx$1(VisibilityIcon, {}) }) }), jsx$1(Grid$1, { size: 1, children: jsx$1(ChannelColorPickerMenu, { theme, color: getDefaultColor("dark"), setColor: null, isStaticColor: true, isColormap: false, visible: true }) }), jsx$1(Grid$1, { size: 6, children: jsx$1(Typography, { className: menuClasses.imageLayerName, children: "Unselected" }) }), jsx$1(Grid$1, { size: 2, sx: { paddingRight: "12px", overflow: "visible" }, children: jsx$1(Slider, { value: opacity2, min: 0, max: 1, step: 1e-3, onChange: handleOpacityChange, className: menuClasses.imageLayerOpacitySlider, orientation: "horizontal", "aria-label": "Adjust opacity for unselected layer" }) }), jsx$1(Grid$1, { size: 1, children: jsx$1(SvgPoints, { className: classes2.layerTypePointIcon }) })] }) }) })] }) : null] });
265320
265346
  }
265321
265347
  const useStyles$e = makeStyles()(() => ({
265322
265348
  layerTypeSegmentationIcon: {
@@ -270544,7 +270570,7 @@ function HiglassGlobalStyles(props) {
270544
270570
  }
270545
270571
  register({ dataFetcher: ZarrMultivecDataFetcher_default, config: ZarrMultivecDataFetcher_default.config }, { pluginType: "dataFetcher" });
270546
270572
  const LazyHiGlassComponent = React__default.lazy(async () => {
270547
- const { HiGlassComponent } = await import("./higlass-DjFeS4wB.js");
270573
+ const { HiGlassComponent } = await import("./higlass-DPgS6S1h.js");
270548
270574
  return { default: HiGlassComponent };
270549
270575
  });
270550
270576
  const HG_SIZE = 800;
@@ -273492,7 +273518,7 @@ function NeuroglancerGlobalStyles(props) {
273492
273518
  const { classes: classes2 } = props;
273493
273519
  return jsxs(Fragment, { children: [jsx$1(GlobalStyles$3, { styles: globalNeuroglancerCss }), jsx$1(ScopedGlobalStyles, { styles: globalNeuroglancerStyles, parentClassName: classes2.neuroglancerWrapper })] });
273494
273520
  }
273495
- const LazyReactNeuroglancer = React__default.lazy(() => import("./ReactNeuroglancer-BsqPWpQJ.js"));
273521
+ const LazyReactNeuroglancer = React__default.lazy(() => import("./ReactNeuroglancer-BLfUOvtO.js"));
273496
273522
  function createWorker() {
273497
273523
  const worker = new WorkerFactory$1();
273498
273524
  worker.AsyncComputationWorker = WorkerFactory;
@@ -274182,17 +274208,40 @@ function diffCameraState(prev2, next4) {
274182
274208
  const pos = posHard || posSoft;
274183
274209
  return { changed: scale2 || pos || rot2, scale: scale2, pos, rot: rot2 };
274184
274210
  }
274211
+ const clamp$1 = (value2, min2, max2) => Math.max(min2, Math.min(max2, value2));
274185
274212
  function quaternionToEuler([x2, y2, z2, w2]) {
274186
- const quaternion2 = new Quaternion$1(x2, y2, z2, w2);
274187
- const euler = new Euler$1().setFromQuaternion(quaternion2, "YXZ");
274188
- const pitch = euler.x;
274189
- const yaw = euler.y;
274213
+ const x22 = x2 + x2;
274214
+ const y22 = y2 + y2;
274215
+ const z22 = z2 + z2;
274216
+ const xx = x2 * x22;
274217
+ const yy = y2 * y22;
274218
+ const zz = z2 * z22;
274219
+ const xz = x2 * z22;
274220
+ const yz = y2 * z22;
274221
+ const wx = w2 * x22;
274222
+ const wy = w2 * y22;
274223
+ const m11 = 1 - (yy + zz);
274224
+ const m13 = xz + wy;
274225
+ const m23 = yz - wx;
274226
+ const m31 = xz - wy;
274227
+ const m33 = 1 - (xx + yy);
274228
+ const pitch = Math.asin(-clamp$1(m23, -1, 1));
274229
+ const yaw = Math.abs(m23) < 0.9999999 ? Math.atan2(m13, m33) : Math.atan2(-m31, m11);
274190
274230
  return [pitch, yaw];
274191
274231
  }
274192
274232
  function eulerToQuaternion(pitch, yaw, roll = 0) {
274193
- const euler = new Euler$1(pitch, yaw, roll, "YXZ");
274194
- const quaternion2 = new Quaternion$1().setFromEuler(euler);
274195
- return [quaternion2.x, quaternion2.y, quaternion2.z, quaternion2.w];
274233
+ const c1 = Math.cos(pitch / 2);
274234
+ const c2 = Math.cos(yaw / 2);
274235
+ const c3 = Math.cos(roll / 2);
274236
+ const s1 = Math.sin(pitch / 2);
274237
+ const s2 = Math.sin(yaw / 2);
274238
+ const s3 = Math.sin(roll / 2);
274239
+ return [
274240
+ s1 * c2 * c3 + c1 * s2 * s3,
274241
+ c1 * s2 * c3 - s1 * c2 * s3,
274242
+ c1 * c2 * s3 - s1 * s2 * c3,
274243
+ c1 * c2 * c3 + s1 * s2 * s3
274244
+ ];
274196
274245
  }
274197
274246
  function makeVitNgZoomCalibrator(initialNgProjectionScale, initialDeckZoom = 0) {
274198
274247
  const base2 = initialNgProjectionScale / 2 ** -initialDeckZoom;
@@ -327333,8 +327382,8 @@ function CellSetSizesPlot(props) {
327333
327382
  value: 0
327334
327383
  }
327335
327384
  },
327336
- width: clamp$7(width2 - marginRight, 10, Infinity),
327337
- height: clamp$7(height2 - marginBottom, 10, Infinity),
327385
+ width: clamp$8(width2 - marginRight, 10, Infinity),
327386
+ height: clamp$8(height2 - marginBottom, 10, Infinity),
327338
327387
  config: VEGA_THEMES[theme]
327339
327388
  };
327340
327389
  const handleSignal = (name2, value2) => {
@@ -327447,8 +327496,8 @@ function ExpressionHistogram(props) {
327447
327496
  select: { type: "interval", encodings: ["x"] }
327448
327497
  }
327449
327498
  ],
327450
- width: clamp$7(width2 - marginRight, 10, Infinity),
327451
- height: clamp$7(height2 - marginBottom, 10, Infinity),
327499
+ width: clamp$8(width2 - marginRight, 10, Infinity),
327500
+ height: clamp$8(height2 - marginBottom, 10, Infinity),
327452
327501
  config: VEGA_THEMES[theme]
327453
327502
  };
327454
327503
  const handleSignal = (name2, value2) => {
@@ -327583,8 +327632,8 @@ function DotPlot(props) {
327583
327632
  const autoMarginForFeature = marginBottom || 30 + Math.sqrt(maxCharactersForFeature / 2) * 30;
327584
327633
  const autoMarginForGroup = marginRight || 30 + Math.sqrt(maxCharactersForGroup / 2) * 30;
327585
327634
  const autoMarginForSampleSet = marginRight || 30 + Math.sqrt(maxCharactersForSampleSet / 2) * 30;
327586
- const plotWidth = transpose2 ? clamp$7(width2 - autoMarginForFeature - 180, 10, Infinity) / (obsSetSelection?.length || 1) : clamp$7(width2 - autoMarginForGroup - autoMarginForSampleSet - 200, 10, Infinity);
327587
- const plotHeight = transpose2 ? clamp$7(height2 - autoMarginForGroup - autoMarginForSampleSet - 50, 10, Infinity) : clamp$7(height2 - autoMarginForFeature - 80, 10, Infinity) / (obsSetSelection?.length || 1);
327635
+ const plotWidth = transpose2 ? clamp$8(width2 - autoMarginForFeature - 180, 10, Infinity) / (obsSetSelection?.length || 1) : clamp$8(width2 - autoMarginForGroup - autoMarginForSampleSet - 200, 10, Infinity);
327636
+ const plotHeight = transpose2 ? clamp$8(height2 - autoMarginForGroup - autoMarginForSampleSet - 50, 10, Infinity) : clamp$8(height2 - autoMarginForFeature - 80, 10, Infinity) / (obsSetSelection?.length || 1);
327588
327637
  const groupKeys = data2.map((d) => d.keyGroup);
327589
327638
  const featureKeys = data2.map((d) => d.keyFeature);
327590
327639
  const groupSecondaryKeys = data2.map((d) => d.keyGroupSecondary);
@@ -328580,8 +328629,8 @@ function CellSetCompositionBarPlot(props) {
328580
328629
  }
328581
328630
  },
328582
328631
  // TODO: for width, also subtract length of longest y-axis set name label.
328583
- width: clamp$7(width2 - marginRight, 10, Infinity),
328584
- height: clamp$7(height2 - marginBottom, 10, Infinity),
328632
+ width: clamp$8(width2 - marginRight, 10, Infinity),
328633
+ height: clamp$8(height2 - marginBottom, 10, Infinity),
328585
328634
  config: VEGA_THEMES[theme]
328586
328635
  };
328587
328636
  const handleSignal = (name2, value2) => {
@@ -328762,8 +328811,8 @@ function FeatureSetEnrichmentBarPlot(props) {
328762
328811
  }
328763
328812
  },
328764
328813
  // TODO: for width, also subtract length of longest y-axis set name label.
328765
- width: clamp$7(width2 - marginRight, 10, Infinity),
328766
- height: clamp$7(height2 - marginBottom, 10, Infinity),
328814
+ width: clamp$8(width2 - marginRight, 10, Infinity),
328815
+ height: clamp$8(height2 - marginBottom, 10, Infinity),
328767
328816
  config: VEGA_THEMES[theme]
328768
328817
  };
328769
328818
  const handleSignal = (name2, value2) => {
@@ -329982,7 +330031,9 @@ const fileTypeToExtensions = {
329982
330031
  // TODO: how to handle h5ad-based AnnData (since needs reference JSON file).
329983
330032
  // Perhaps just assume one H5AD+one JSON (or .ref.json) file correspond to each other?
329984
330033
  [FileType$1.SPATIALDATA_ZARR]: [".sd.zarr", ".sdata.zarr", ".spatialdata.zarr"],
329985
- [FileType$1.SPATIALDATA_ZARR_ZIP]: [".sd.zarr.zip", ".sdata.zarr.zip", ".spatialdata.zarr.zip"]
330034
+ [FileType$1.SPATIALDATA_ZARR_ZIP]: [".sd.zarr.zip", ".sdata.zarr.zip", ".spatialdata.zarr.zip"],
330035
+ [FileType$1.GENOMIC_PROFILES_ZARR]: [".multivec.zarr"],
330036
+ [FileType$1.GENOMIC_PROFILES_ZARR_ZIP]: [".multivec.zarr.zip"]
329986
330037
  };
329987
330038
  const fileTypeToClass = {
329988
330039
  // OME-TIFF
@@ -330008,7 +330059,9 @@ const ZARR_FILETYPES = [
330008
330059
  FileType$1.IMAGE_OME_ZARR,
330009
330060
  FileType$1.IMAGE_OME_ZARR_ZIP,
330010
330061
  FileType$1.OBS_SEGMENTATIONS_OME_ZARR,
330011
- FileType$1.OBS_SEGMENTATIONS_OME_ZARR_ZIP
330062
+ FileType$1.OBS_SEGMENTATIONS_OME_ZARR_ZIP,
330063
+ FileType$1.GENOMIC_PROFILES_ZARR,
330064
+ FileType$1.GENOMIC_PROFILES_ZARR_ZIP
330012
330065
  ];
330013
330066
  function urlToFileType(url) {
330014
330067
  const match2 = Object.entries(fileTypeToExtensions).find(
@@ -330164,6 +330217,102 @@ async function generateConfig(parsedUrls, layoutOption = null) {
330164
330217
  stores
330165
330218
  };
330166
330219
  }
330220
+ var fetchJsonp$1 = { exports: {} };
330221
+ var fetchJsonp = fetchJsonp$1.exports;
330222
+ var hasRequiredFetchJsonp;
330223
+ function requireFetchJsonp() {
330224
+ if (hasRequiredFetchJsonp) return fetchJsonp$1.exports;
330225
+ hasRequiredFetchJsonp = 1;
330226
+ (function(module2, exports2) {
330227
+ (function(global2, factory2) {
330228
+ {
330229
+ factory2(exports2, module2);
330230
+ }
330231
+ })(fetchJsonp, function(exports3, module3) {
330232
+ var defaultOptions = {
330233
+ timeout: 5e3,
330234
+ jsonpCallback: "callback"
330235
+ };
330236
+ function generateCallbackFunction() {
330237
+ return "jsonp_" + Date.now() + "_" + Math.ceil(Math.random() * 1e5);
330238
+ }
330239
+ function clearFunction(functionName) {
330240
+ try {
330241
+ delete window[functionName];
330242
+ } catch (e3) {
330243
+ window[functionName] = void 0;
330244
+ }
330245
+ }
330246
+ function removeScript(scriptId) {
330247
+ var script = document.getElementById(scriptId);
330248
+ if (script) {
330249
+ document.getElementsByTagName("head")[0].removeChild(script);
330250
+ }
330251
+ }
330252
+ function fetchJsonp2(_url) {
330253
+ var options = arguments.length <= 1 || arguments[1] === void 0 ? {} : arguments[1];
330254
+ var url = _url;
330255
+ var timeout3 = options.timeout || defaultOptions.timeout;
330256
+ var jsonpCallback = options.jsonpCallback || defaultOptions.jsonpCallback;
330257
+ var timeoutId = void 0;
330258
+ return new Promise(function(resolve2, reject) {
330259
+ var callbackFunction = options.jsonpCallbackFunction || generateCallbackFunction();
330260
+ var scriptId = jsonpCallback + "_" + callbackFunction;
330261
+ window[callbackFunction] = function(response) {
330262
+ resolve2({
330263
+ ok: true,
330264
+ // keep consistent with fetch API
330265
+ json: function json2() {
330266
+ return Promise.resolve(response);
330267
+ }
330268
+ });
330269
+ if (timeoutId) clearTimeout(timeoutId);
330270
+ removeScript(scriptId);
330271
+ clearFunction(callbackFunction);
330272
+ };
330273
+ url += url.indexOf("?") === -1 ? "?" : "&";
330274
+ var jsonpScript = document.createElement("script");
330275
+ jsonpScript.setAttribute("src", "" + url + jsonpCallback + "=" + callbackFunction);
330276
+ if (options.charset) {
330277
+ jsonpScript.setAttribute("charset", options.charset);
330278
+ }
330279
+ if (options.nonce) {
330280
+ jsonpScript.setAttribute("nonce", options.nonce);
330281
+ }
330282
+ if (options.referrerPolicy) {
330283
+ jsonpScript.setAttribute("referrerPolicy", options.referrerPolicy);
330284
+ }
330285
+ if (options.crossorigin) {
330286
+ jsonpScript.setAttribute("crossorigin", typeof options.crossorigin === "string" ? options.crossorigin : "anonymous");
330287
+ }
330288
+ var fp = options.fetchPriority;
330289
+ if (fp === "high" || fp === "low" || fp === "auto") {
330290
+ jsonpScript.setAttribute("fetchPriority", fp);
330291
+ }
330292
+ jsonpScript.id = scriptId;
330293
+ document.getElementsByTagName("head")[0].appendChild(jsonpScript);
330294
+ timeoutId = setTimeout(function() {
330295
+ reject(new Error("JSONP request to " + _url + " timed out"));
330296
+ clearFunction(callbackFunction);
330297
+ removeScript(scriptId);
330298
+ window[callbackFunction] = function() {
330299
+ clearFunction(callbackFunction);
330300
+ };
330301
+ }, timeout3);
330302
+ jsonpScript.onerror = function() {
330303
+ reject(new Error("JSONP request to " + _url + " failed"));
330304
+ clearFunction(callbackFunction);
330305
+ removeScript(scriptId);
330306
+ if (timeoutId) clearTimeout(timeoutId);
330307
+ };
330308
+ });
330309
+ }
330310
+ module3.exports = fetchJsonp2;
330311
+ });
330312
+ })(fetchJsonp$1, fetchJsonp$1.exports);
330313
+ return fetchJsonp$1.exports;
330314
+ }
330315
+ requireFetchJsonp();
330167
330316
  class ObsSpotsCsvLoader extends CsvLoader {
330168
330317
  loadFromCache(data2) {
330169
330318
  if (this.cachedResult) {
@@ -331078,11 +331227,21 @@ class AnnDataSource extends ZarrDataSource {
331078
331227
  categoriesValues = await this.getFlatArrDecompressed(`${prefix2}/${categories}`);
331079
331228
  }
331080
331229
  } else if (encodingType === "categorical") {
331081
- const { dtype } = await open$1(storeRoot.resolve(`${path2}/categories`), { kind: "array" });
331082
- if (dtype === "v2:object" || dtype === "|O") {
331230
+ const categoriesZattrs = await this.getJson(`${path2}/categories/.zattrs`);
331231
+ const categoriesEncodingType = categoriesZattrs?.["encoding-type"];
331232
+ if (categoriesEncodingType === "nullable-string-array") {
331233
+ categoriesValues = await this.getFlatArrDecompressed(`${path2}/categories/values`);
331234
+ } else if (categoriesEncodingType === "string-array") {
331083
331235
  categoriesValues = await this.getFlatArrDecompressed(`${path2}/categories`);
331236
+ } else {
331237
+ const { dtype } = await open$1(storeRoot.resolve(`${path2}/categories`), { kind: "array" });
331238
+ if (dtype === "v2:object" || dtype === "|O") {
331239
+ categoriesValues = await this.getFlatArrDecompressed(`${path2}/categories`);
331240
+ }
331084
331241
  }
331085
331242
  codesPath = `${path2}/codes`;
331243
+ } else if (encodingType === "nullable-string-array") {
331244
+ return this.getFlatArrDecompressed(`${path2}/values`);
331086
331245
  } else if (encodingType === "string-array") {
331087
331246
  return this.getFlatArrDecompressed(path2);
331088
331247
  } else {
@@ -332246,16 +332405,25 @@ let FeatureStatsAnndataLoader$1 = class FeatureStatsAnndataLoader extends Abstra
332246
332405
  return this.dataSource.loadDataFrameIndex(dfPath);
332247
332406
  }
332248
332407
  async loadDataFrame(dfPath) {
332249
- const [featureId2, featureFoldChange, featureSignificance] = await Promise.all([
332250
- this.loadFeatureNames(dfPath),
332251
- this.loadFoldChanges(dfPath),
332252
- this.loadSignificances(dfPath)
332253
- ]);
332254
- return {
332255
- featureId: featureId2,
332256
- featureFoldChange,
332257
- featureSignificance
332258
- };
332408
+ try {
332409
+ const [featureId2, featureFoldChange, featureSignificance] = await Promise.all([
332410
+ this.loadFeatureNames(dfPath),
332411
+ this.loadFoldChanges(dfPath),
332412
+ this.loadSignificances(dfPath)
332413
+ ]);
332414
+ return {
332415
+ featureId: featureId2,
332416
+ featureFoldChange,
332417
+ featureSignificance
332418
+ };
332419
+ } catch (e3) {
332420
+ log$b.warn("Dataframe not found at", dfPath);
332421
+ return {
332422
+ featureId: [],
332423
+ featureFoldChange: [],
332424
+ featureSignificance: []
332425
+ };
332426
+ }
332259
332427
  }
332260
332428
  /**
332261
332429
  *
@@ -332282,7 +332450,7 @@ let FeatureStatsAnndataLoader$1 = class FeatureStatsAnndataLoader extends Abstra
332282
332450
  * @returns {Promise<LoaderResult<FeatureStatsData>>}
332283
332451
  */
332284
332452
  async loadMulti(volcanoOptions) {
332285
- const { analysisType: targetAnalysisType = "rank_genes_groups" } = this.options;
332453
+ const { analysisType: targetAnalysisType = "pydeseq2" } = this.options;
332286
332454
  const { sampleSetSelection, obsSetSelection } = volcanoOptions || {};
332287
332455
  const rawObsSetSelection = obsSetSelection;
332288
332456
  const rawSampleSetSelection = sampleSetSelection;
@@ -333260,7 +333428,7 @@ class SpatialDataObsSpotsLoader extends AbstractTwoStepLoader {
333260
333428
  const formatVersion = await this.dataSource.getShapesFormatVersion(path2);
333261
333429
  if (formatVersion === "0.1") {
333262
333430
  locations = await this.dataSource.loadNumericForDims(getCoordsPath(path2), [0, 1]);
333263
- } else if (formatVersion === "0.2") {
333431
+ } else if (formatVersion === "0.2" || formatVersion === "0.3") {
333264
333432
  locations = await this.dataSource.loadCircleShapes(getGeometryPath$1(path2));
333265
333433
  }
333266
333434
  this.locations = locations;
@@ -333459,7 +333627,7 @@ class SpatialDataObsPointsLoader extends AbstractTwoStepLoader {
333459
333627
  }
333460
333628
  let locations;
333461
333629
  const formatVersion = await this.dataSource.getPointsFormatVersion(path2);
333462
- if (formatVersion === "0.1") {
333630
+ if (formatVersion === "0.1" || formatVersion === "0.2") {
333463
333631
  locations = await this.dataSource.loadPoints(path2);
333464
333632
  } else {
333465
333633
  throw new UnknownSpatialDataFormatError("Only points format version 0.1 is supported.");
@@ -333478,7 +333646,7 @@ class SpatialDataObsPointsLoader extends AbstractTwoStepLoader {
333478
333646
  }
333479
333647
  let locationsFeatureIndex;
333480
333648
  const formatVersion = await this.dataSource.getPointsFormatVersion(path2);
333481
- if (formatVersion === "0.1") {
333649
+ if (formatVersion === "0.1" || formatVersion === "0.2") {
333482
333650
  locationsFeatureIndex = await this.dataSource.loadPointsFeatureIds(path2);
333483
333651
  } else {
333484
333652
  throw new UnknownSpatialDataFormatError("Only points format version 0.1 is supported.");
@@ -333490,7 +333658,7 @@ class SpatialDataObsPointsLoader extends AbstractTwoStepLoader {
333490
333658
  const { path: path2, featureIndexColumn, mortonCodeColumn } = this.options;
333491
333659
  let locations;
333492
333660
  const formatVersion = await this.dataSource.getPointsFormatVersion(path2);
333493
- if (formatVersion === "0.1") {
333661
+ if (formatVersion === "0.1" || formatVersion === "0.2") {
333494
333662
  locations = await this.dataSource.loadPointsInRect(path2, bounds2, signal, featureIndexColumn, mortonCodeColumn);
333495
333663
  } else {
333496
333664
  throw new UnknownSpatialDataFormatError("Only points format version 0.1 is supported.");
@@ -333522,10 +333690,8 @@ class SpatialDataObsPointsLoader extends AbstractTwoStepLoader {
333522
333690
  // and for the presence of morton_code_2d and feature_index columns.
333523
333691
  this.dataSource.supportsLoadPointsInRect(path2, featureIndexColumnName, mortonCodeColumn)
333524
333692
  ]);
333525
- const isSupportedVersion = formatVersion === "0.1";
333526
- const boundingBox = zattrs?.bounding_box;
333527
- const hasBoundingBox2D = typeof boundingBox?.x_max === "number" && typeof boundingBox?.x_min === "number" && typeof boundingBox?.y_max === "number" && typeof boundingBox?.y_min === "number";
333528
- return isSupportedVersion && hasBoundingBox2D && hasRequiredColumnsAndRowGroupSize;
333693
+ const isSupportedVersion = formatVersion === "0.1" || formatVersion === "0.2";
333694
+ return isSupportedVersion && hasRequiredColumnsAndRowGroupSize;
333529
333695
  }
333530
333696
  async load() {
333531
333697
  const [modelMatrix2, supportsTiling] = await Promise.all([
@@ -333563,7 +333729,7 @@ class SpatialDataObsPointsLoader extends AbstractTwoStepLoader {
333563
333729
  featureIds,
333564
333730
  obsPointsModelMatrix: modelMatrix2,
333565
333731
  // Return 'tiled' if the morton_code_2d column
333566
- // and bounding_box metadata are present,
333732
+ // is present,
333567
333733
  // and the row group size is small enough.
333568
333734
  // Otherwise, return 'full'.
333569
333735
  obsPointsTilingType: supportsTiling ? "tiled" : "full",
@@ -343072,6 +343238,7 @@ function sdataMortonQueryRectAux(boundingBox, origRect) {
343072
343238
  const mortonIntervals = zcoverRectangle(normRect[0][0], normRect[0][1], normRect[1][0], normRect[1][1], 16, null, true);
343073
343239
  return mortonIntervals;
343074
343240
  }
343241
+ const MORTON_CODE_EXTREME_VALUE_INDICATOR = 0;
343075
343242
  async function getParquetModule() {
343076
343243
  const module2 = await import(
343077
343244
  /* webpackIgnore: true */
@@ -343150,7 +343317,7 @@ async function _loadParquetSchemaBytes({ queryClient, store }, parquetPath, part
343150
343317
  if (!tailBytes || tailBytes.length < TAIL_LENGTH) {
343151
343318
  throw new Error(`Failed to load parquet footerLength for ${partZeroPath}`);
343152
343319
  }
343153
- const footerLength = new DataView(tailBytes.buffer).getInt32(0, true);
343320
+ const footerLength = new DataView(tailBytes.buffer, tailBytes.byteOffset, tailBytes.byteLength).getInt32(0, true);
343154
343321
  const magic = new TextDecoder().decode(tailBytes.slice(4, 8));
343155
343322
  if (magic !== "PAR1") {
343156
343323
  throw new Error("Invalid Parquet file: missing PAR1 magic number");
@@ -343197,22 +343364,22 @@ async function _loadParquetMetadataByPart({ queryClient, store }, parquetPath) {
343197
343364
  } catch (error2) {
343198
343365
  if (error2.message.includes("Failed to load parquet footerLength")) {
343199
343366
  numParts = partIndex;
343367
+ log$b.info(`Found ${numParts} parts for parquet path ${parquetPath}; An above "Failed to load parquet footerLength" error is expected for the subsequent part.`);
343200
343368
  }
343201
343369
  }
343202
343370
  } while (numParts === void 0);
343371
+ const numRows = allMetadata.map((part) => part.metadata.fileMetadata().numRows());
343372
+ const numRowGroups = allMetadata.map((part) => part.metadata.numRowGroups());
343373
+ const numRowsPerGroup = allMetadata.map((part) => part.metadata.rowGroup(0).numRows());
343203
343374
  const metadata2 = {
343204
- numRows: 0,
343205
- numRowGroups: 0,
343206
- numRowsPerGroup: 0,
343207
- schema: null
343208
- };
343209
- if (allMetadata.length > 0) {
343210
- const firstPart = allMetadata[0];
343211
- metadata2.numRows = allMetadata.reduce((sum2, part) => sum2 + part.metadata.fileMetadata().numRows(), 0);
343212
- metadata2.numRowGroups = allMetadata.reduce((sum2, part) => sum2 + part.metadata.numRowGroups(), 0);
343213
- metadata2.numRowsPerGroup = firstPart.metadata.rowGroup(0).numRows();
343214
- metadata2.schema = firstPart.schema.schema;
343215
- }
343375
+ totalNumRows: numRows.reduce((a2, b2) => a2 + b2, 0),
343376
+ totalNumRowGroups: numRowGroups.reduce((a2, b2) => a2 + b2, 0),
343377
+ // Array of count per part (length equal to numParts).
343378
+ numRowsByPart: numRows,
343379
+ numRowGroupsByPart: numRowGroups,
343380
+ numRowsPerGroupByPart: numRowsPerGroup,
343381
+ schema: allMetadata?.[0]?.schema?.schema
343382
+ };
343216
343383
  const result = {
343217
343384
  ...metadata2,
343218
343385
  // TODO: extract metadata per part and rowGroup into plain objects that match the hyparquet parquetMetadata() return value?
@@ -343236,8 +343403,8 @@ async function _loadParquetRowGroupByGroupIndex({ queryClient, store }, parquetP
343236
343403
  const store2 = ctx.meta?.store;
343237
343404
  const { readParquetRowGroup } = await _getParquetModule({ queryClient: queryClient2 });
343238
343405
  const allMetadata = await _loadParquetMetadataByPart({ queryClient: queryClient2, store: store2 }, parquetPath);
343239
- if (rowGroupIndex < 0 || rowGroupIndex >= allMetadata.numRowGroups) {
343240
- throw new Error(`Row group index ${rowGroupIndex} is out of bounds for parquet table with ${allMetadata.numRowGroups} row groups.`);
343406
+ if (rowGroupIndex < 0 || rowGroupIndex >= allMetadata.totalNumRowGroups) {
343407
+ throw new Error(`Row group index ${rowGroupIndex} is out of bounds for parquet table with ${allMetadata.totalNumRowGroups} row groups.`);
343241
343408
  }
343242
343409
  let partIndex;
343243
343410
  let cumulativeRowGroups = 0;
@@ -343347,9 +343514,9 @@ async function _bisectRowGroupsRight({ queryClient, store }, parquetPath, column
343347
343514
  );
343348
343515
  const store2 = ctx.meta?.store;
343349
343516
  const allMetadata = await _loadParquetMetadataByPart({ queryClient: queryClient2, store: store2 }, parquetPath);
343350
- const { numRowGroups } = allMetadata;
343517
+ const { totalNumRowGroups } = allMetadata;
343351
343518
  let lo = 0;
343352
- let hi = numRowGroups;
343519
+ let hi = totalNumRowGroups;
343353
343520
  while (lo < hi) {
343354
343521
  const cachedInRange = await getCachedInRange(queryClient2, parquetPath, columnName, lo, hi);
343355
343522
  const betterLo = cachedInRange.slice().reverse().find((c2) => c2.index > lo && targetValue >= c2.max);
@@ -343752,11 +343919,12 @@ class SpatialDataTableSource extends AnnDataSource {
343752
343919
  const { queryClient } = this;
343753
343920
  const { store } = this.storeRoot;
343754
343921
  const allMetadata = await _loadParquetMetadataByPart({ queryClient, store }, parquetPath);
343755
- const { numRowsPerGroup } = allMetadata;
343756
- const numRowsTotal = allMetadata.numRows;
343757
- if (numRowsPerGroup >= 1e5) {
343922
+ const { numRowsPerGroupByPart } = allMetadata;
343923
+ const numRowsTotal = allMetadata.totalNumRows;
343924
+ const maxNumRowsPerGroup = Math.max(...numRowsPerGroupByPart);
343925
+ if (maxNumRowsPerGroup >= 1e5) {
343758
343926
  if (numRowsTotal > 5e6) {
343759
- 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.`);
343927
+ 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.`);
343760
343928
  }
343761
343929
  return false;
343762
343930
  }
@@ -343780,7 +343948,7 @@ class SpatialDataTableSource extends AnnDataSource {
343780
343948
  * @param {string[]|undefined} columns An optional list of column names to load.
343781
343949
  * @returns
343782
343950
  */
343783
- async loadParquetTableInRect(parquetPath, tileBbox, allPointsBbox, signal, featureIndexColumnName, mortonCodeColumn) {
343951
+ async loadParquetTableInRect(parquetPath, tileBbox, signal, featureIndexColumnName, mortonCodeColumn) {
343784
343952
  const { queryClient } = this;
343785
343953
  const { store } = this.storeRoot;
343786
343954
  const mortonCodeColumnName = mortonCodeColumn ?? "morton_code_2d";
@@ -343805,15 +343973,46 @@ class SpatialDataTableSource extends AnnDataSource {
343805
343973
  } else {
343806
343974
  tileBboxes = [tileBbox];
343807
343975
  }
343976
+ const firstRowGroupTable = await _loadParquetRowGroupByGroupIndex({ queryClient, store }, parquetPath, 0);
343977
+ const xColumnForBoundingBox = firstRowGroupTable.getChild("x");
343978
+ const yColumnForBoundingBox = firstRowGroupTable.getChild("y");
343979
+ const mortonCodeColumnForBoundingBox = firstRowGroupTable.getChild(mortonCodeColumnName);
343980
+ const boundingBoxMaxNumRows = Math.min(4, firstRowGroupTable.numRows);
343981
+ const firstMortonCodes = range$e(boundingBoxMaxNumRows).map((i2) => mortonCodeColumnForBoundingBox.get(i2));
343982
+ const boundingBoxNumRows = firstMortonCodes.filter((code2) => code2 === MORTON_CODE_EXTREME_VALUE_INDICATOR).length;
343983
+ const boundingBoxXValues = range$e(boundingBoxNumRows).map((i2) => xColumnForBoundingBox.get(i2));
343984
+ const boundingBoxYValues = range$e(boundingBoxNumRows).map((i2) => yColumnForBoundingBox.get(i2));
343985
+ const xMin = Math.min(...boundingBoxXValues);
343986
+ const xMax = Math.max(...boundingBoxXValues);
343987
+ const yMin = Math.min(...boundingBoxYValues);
343988
+ const yMax = Math.max(...boundingBoxYValues);
343989
+ const allPointsBbox = {
343990
+ x_min: xMin,
343991
+ x_max: xMax,
343992
+ y_min: yMin,
343993
+ y_max: yMax
343994
+ };
343808
343995
  const rowGroupIndicesPerTile = await Promise.all(tileBboxes.map(async (subTileBbox) => _rectToRowGroupIndices({ queryClient, store }, parquetPath, subTileBbox, allPointsBbox, mortonCodeColumnName)));
343809
343996
  const uniqueCoveredRowGroupIndices = Array.from(new Set(rowGroupIndicesPerTile.flat())).toSorted((a2, b2) => a2 - b2);
343810
343997
  const allMetadata = await _loadParquetMetadataByPart({ queryClient, store }, parquetPath);
343811
- const { numRowsPerGroup } = allMetadata;
343812
- const numRowGroups = uniqueCoveredRowGroupIndices.length;
343813
- const totalNumRows = numRowsPerGroup * numRowGroups;
343814
- const xArr = new Float32Array(totalNumRows);
343815
- const yArr = new Float32Array(totalNumRows);
343816
- const featureIndexArr = new Uint32Array(totalNumRows);
343998
+ const { numRowsPerGroupByPart, numRowGroupsByPart } = allMetadata;
343999
+ const rowGroupIToNumRows = (rowGroupI) => {
344000
+ let currPartIndex = 0;
344001
+ let prevTotalRowGroupCount = 0;
344002
+ for (let partIndex = 0; partIndex < numRowGroupsByPart.length; partIndex++) {
344003
+ const numRowGroupsInPart = numRowGroupsByPart[partIndex];
344004
+ if (prevTotalRowGroupCount <= rowGroupI && rowGroupI < prevTotalRowGroupCount + numRowGroupsInPart) {
344005
+ currPartIndex = partIndex;
344006
+ break;
344007
+ }
344008
+ prevTotalRowGroupCount += numRowGroupsInPart;
344009
+ }
344010
+ return numRowsPerGroupByPart[currPartIndex];
344011
+ };
344012
+ const totalNumRowsToLoad = uniqueCoveredRowGroupIndices.reduce((acc, rowGroupI) => acc + rowGroupIToNumRows(rowGroupI), 0);
344013
+ const xArr = new Float32Array(totalNumRowsToLoad);
344014
+ const yArr = new Float32Array(totalNumRowsToLoad);
344015
+ const featureIndexArr = new Uint32Array(totalNumRowsToLoad);
343817
344016
  const rowGroupTables = await Promise.all(uniqueCoveredRowGroupIndices.map(async (rowGroupIndex) => _loadParquetRowGroupByGroupIndex({ queryClient, store }, parquetPath, rowGroupIndex)));
343818
344017
  let rowOffset = 0;
343819
344018
  rowGroupTables.forEach((table2) => {
@@ -343826,7 +344025,7 @@ class SpatialDataTableSource extends AnnDataSource {
343826
344025
  xArr.set(xColumn.toArray(), rowOffset);
343827
344026
  yArr.set(yColumn.toArray(), rowOffset);
343828
344027
  featureIndexArr.set(featureIndexColumn.toArray(), rowOffset);
343829
- rowOffset += numRowsPerGroup;
344028
+ rowOffset += table2.numRows;
343830
344029
  });
343831
344030
  return {
343832
344031
  data: {
@@ -343834,7 +344033,7 @@ class SpatialDataTableSource extends AnnDataSource {
343834
344033
  y: yArr,
343835
344034
  featureIndices: featureIndexArr
343836
344035
  },
343837
- shape: [3, totalNumRows]
344036
+ shape: [3, totalNumRowsToLoad]
343838
344037
  };
343839
344038
  }
343840
344039
  }
@@ -349710,14 +349909,14 @@ class SpatialDataShapesSource extends SpatialDataTableSource {
349710
349909
  /**
349711
349910
  *
349712
349911
  * @param {string} path A path to within shapes.
349713
- * @returns {Promise<"0.1"|"0.2">} The format version.
349912
+ * @returns {Promise<"0.1"|"0.2"|"0.3">} The format version.
349714
349913
  */
349715
349914
  async getShapesFormatVersion(path2) {
349716
349915
  const zattrs = await this.loadSpatialDataElementAttrs(path2);
349717
349916
  const formatVersion = zattrs.spatialdata_attrs.version;
349718
349917
  const geos = zattrs.spatialdata_attrs.geos || {};
349719
349918
  const encodingType = zattrs["encoding-type"];
349720
- if (encodingType !== "ngff:shapes" || !(formatVersion === "0.1" && (geos.name === "POINT" && geos.type === 0) || formatVersion === "0.2")) {
349919
+ if (encodingType !== "ngff:shapes" || !(formatVersion === "0.1" && (geos.name === "POINT" && geos.type === 0) || formatVersion === "0.2" || formatVersion === "0.3")) {
349721
349920
  throw new Error(`Unexpected encoding type or version for shapes spatialdata_attrs: ${encodingType} ${formatVersion}`);
349722
349921
  }
349723
349922
  return formatVersion;
@@ -349926,7 +350125,7 @@ class SpatialDataPointsSource extends SpatialDataTableSource {
349926
350125
  const zattrs = await this.loadSpatialDataElementAttrs(path2);
349927
350126
  const formatVersion = zattrs.spatialdata_attrs.version;
349928
350127
  const encodingType = zattrs["encoding-type"];
349929
- if (encodingType === "ngff:points" && !(formatVersion === "0.1")) {
350128
+ if (encodingType === "ngff:points" && !(formatVersion === "0.1" || formatVersion === "0.2")) {
349930
350129
  throw new Error(`Unexpected version for points spatialdata_attrs: ${formatVersion}`);
349931
350130
  }
349932
350131
  return formatVersion;
@@ -350029,16 +350228,11 @@ class SpatialDataPointsSource extends SpatialDataTableSource {
350029
350228
  const zattrs = await this.loadSpatialDataElementAttrs(elementPath);
350030
350229
  const {
350031
350230
  // axes,
350032
- spatialdata_attrs: spatialDataAttrs,
350033
- // The bounding box (extent) of all points.
350034
- // Required for un-normalization from uints back to floats.
350035
- // TODO: decide whether these will be stored here or somewhere else.
350036
- // Reference: https://github.com/vitessce/vitessce-python/pull/476#issuecomment-3362656956
350037
- bounding_box: allPointsBbox
350231
+ spatialdata_attrs: spatialDataAttrs
350038
350232
  } = zattrs;
350039
350233
  const { feature_key: featureKey } = spatialDataAttrs;
350040
350234
  const featureIndexColumnName = featureIndexColumnNameFromOptions ?? `${featureKey}_codes`;
350041
- return this.loadParquetTableInRect(parquetPath, tileBbox, allPointsBbox, signal, featureIndexColumnName, mortonCodeColumn);
350235
+ return this.loadParquetTableInRect(parquetPath, tileBbox, signal, featureIndexColumnName, mortonCodeColumn);
350042
350236
  }
350043
350237
  async supportsLoadPointsInRect(elementPath, featureIndexColumnName, mortonCodeColumn) {
350044
350238
  const parquetPath = getParquetPath(elementPath);
@@ -350246,7 +350440,13 @@ class GlbSource {
350246
350440
  class GlbDataLoader extends AbstractTwoStepLoader {
350247
350441
  async load() {
350248
350442
  const { url, options } = this;
350249
- const loader2 = new GLTFLoader$1();
350443
+ const [{ GLTFLoader: GLTFLoader2 }, { DRACOLoader }] = await Promise.all([
350444
+ // eslint-disable-next-line import/no-unresolved
350445
+ import("three/addons/loaders/GLTFLoader.js"),
350446
+ // eslint-disable-next-line import/no-unresolved
350447
+ import("three/addons/loaders/DRACOLoader.js")
350448
+ ]);
350449
+ const loader2 = new GLTFLoader2();
350250
350450
  const dracoLoader = new DRACOLoader();
350251
350451
  dracoLoader.setDecoderPath("https://www.gstatic.com/draco/versioned/decoders/1.5.6/");
350252
350452
  loader2.setDRACOLoader(dracoLoader);
@@ -352812,7 +353012,8 @@ const baseFileTypes = [
352812
353012
  makeFileType(FileType$1.OBS_LOCATIONS_MOLECULES_JSON, DataType$3.OBS_LOCATIONS, MoleculesJsonAsObsLocationsLoader, JsonSource, z.null()),
352813
353013
  makeFileType(FileType$1.OBS_LABELS_MOLECULES_JSON, DataType$3.OBS_LABELS, MoleculesJsonAsObsLabelsLoader, JsonSource, z.null()),
352814
353014
  makeFileType(FileType$1.NEIGHBORHOODS_JSON, DataType$3.NEIGHBORHOODS, JsonLoader, JsonSource, z.null()),
352815
- makeFileType(FileType$1.GENOMIC_PROFILES_ZARR, DataType$3.GENOMIC_PROFILES, GenomicProfilesZarrLoader, ZarrDataSource, z.null())
353015
+ makeFileType(FileType$1.GENOMIC_PROFILES_ZARR, DataType$3.GENOMIC_PROFILES, GenomicProfilesZarrLoader, ZarrDataSource, z.null()),
353016
+ makeFileType(FileType$1.GENOMIC_PROFILES_ZARR_ZIP, DataType$3.GENOMIC_PROFILES, GenomicProfilesZarrLoader, ZarrDataSource, z.null())
352816
353017
  ];
352817
353018
  const baseJointFileTypes = [
352818
353019
  new PluginJointFileType(FileType$1.ANNDATA_ZARR, expandAnndataZarr, anndataZarrSchema),