@jax-data-science/sci-image-visualizer 0.8.2 → 0.9.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 (525) hide show
  1. package/README.md +201 -460
  2. package/esm2022/index.mjs +28 -15
  3. package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
  4. package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
  5. package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
  7. package/esm2022/lib/contracts/color.mjs +60 -0
  8. package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
  9. package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
  10. package/esm2022/lib/contracts/display-types.mjs +11 -1
  11. package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
  12. package/esm2022/lib/contracts/intensity.mjs +48 -5
  13. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  14. package/esm2022/lib/contracts/plot-type.mjs +134 -17
  15. package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
  16. package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
  17. package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
  18. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
  19. package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
  20. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  21. package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
  22. package/esm2022/lib/contracts/sam.contract.mjs +1 -1
  23. package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
  24. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  25. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
  26. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  27. package/esm2022/lib/contracts/viz-config.mjs +2 -1
  28. package/esm2022/lib/geometry/contour.mjs +63 -0
  29. package/esm2022/lib/geometry/raster.mjs +98 -0
  30. package/esm2022/lib/geometry/ring.mjs +201 -0
  31. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
  32. package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
  33. package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
  34. package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
  35. package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
  36. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
  37. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +3 -4
  38. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
  39. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -591
  40. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
  41. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
  42. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
  43. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
  44. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +263 -0
  45. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
  46. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
  47. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
  48. package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
  49. package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
  50. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +344 -0
  51. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +361 -4184
  52. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -0
  53. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
  54. package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
  55. package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
  56. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +182 -0
  57. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
  58. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
  59. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
  60. package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
  61. package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
  62. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
  63. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
  64. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
  65. package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
  66. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
  67. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
  68. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
  69. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
  70. package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
  71. package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
  72. package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
  73. package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
  74. package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
  75. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +153 -0
  76. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
  77. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
  78. package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
  79. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
  80. package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
  81. package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
  82. package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
  83. package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
  84. package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
  85. package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
  86. package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
  87. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
  88. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
  89. package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
  90. package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
  91. package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
  92. package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
  93. package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
  94. package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
  95. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
  96. package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
  97. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
  98. package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
  99. package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
  100. package/esm2022/lib/implementations/region-centroids.mjs +47 -0
  101. package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
  102. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
  103. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
  104. package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
  105. package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
  106. package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
  107. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
  108. package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
  109. package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
  110. package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
  111. package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
  112. package/esm2022/lib/models/bezier.mjs +1 -11
  113. package/esm2022/lib/models/class-preset.mjs +41 -3
  114. package/esm2022/lib/models/geometry.mjs +27 -164
  115. package/esm2022/lib/models/polygon-edit.mjs +254 -0
  116. package/esm2022/lib/models/polygon-factory.mjs +118 -0
  117. package/esm2022/lib/models/region-clone.mjs +68 -0
  118. package/esm2022/lib/models/region-geojson.mjs +373 -0
  119. package/esm2022/lib/models/region.mjs +34 -33
  120. package/esm2022/lib/models/shape.mjs +18 -16
  121. package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
  122. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
  123. package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
  124. package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
  125. package/esm2022/lib/plot.utilities.mjs +296 -473
  126. package/esm2022/lib/processing/image-crop.mjs +1 -1
  127. package/esm2022/lib/processing/processing-image.mjs +28 -15
  128. package/esm2022/lib/provide-visualization.mjs +40 -14
  129. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +99 -0
  130. package/esm2022/lib/region-editor/file-stem.mjs +13 -0
  131. package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
  132. package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
  133. package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
  134. package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
  135. package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
  136. package/esm2022/lib/region-editor/region-editor.component.mjs +402 -651
  137. package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
  138. package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
  139. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -0
  140. package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
  141. package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
  142. package/esm2022/lib/region-ops.service.mjs +28 -70
  143. package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
  144. package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
  145. package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
  146. package/esm2022/lib/render-orchestrator.mjs +14 -11
  147. package/esm2022/lib/render-session.mjs +207 -0
  148. package/esm2022/lib/routing-visualizer.service.mjs +459 -411
  149. package/esm2022/lib/spatial/density-raster.mjs +14 -0
  150. package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
  151. package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
  152. package/esm2022/lib/spatial/gene-search.mjs +1 -1
  153. package/esm2022/lib/spatial/glyphs.mjs +97 -0
  154. package/esm2022/lib/spatial/lod.mjs +187 -0
  155. package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
  156. package/esm2022/lib/spatial/spatial-density.mjs +25 -16
  157. package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
  158. package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
  159. package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
  160. package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
  161. package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
  162. package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
  163. package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
  164. package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
  165. package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
  166. package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
  167. package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
  168. package/esm2022/lib/spatial/stats.mjs +71 -0
  169. package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
  170. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
  171. package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
  172. package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
  173. package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
  174. package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
  175. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
  176. package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
  177. package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
  178. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
  179. package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
  180. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
  181. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
  182. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
  183. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
  184. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
  185. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
  186. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
  187. package/esm2022/lib/store/class-color.util.mjs +46 -3
  188. package/esm2022/lib/store/region-history.mjs +146 -0
  189. package/esm2022/lib/store/region-scope-cache.mjs +140 -0
  190. package/esm2022/lib/store/region-selection.mjs +82 -0
  191. package/esm2022/lib/store/region-store.service.mjs +279 -675
  192. package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
  193. package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
  194. package/esm2022/lib/toast-outlets.mjs +5 -4
  195. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
  196. package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
  197. package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
  198. package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
  199. package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
  200. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +114 -0
  201. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
  202. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
  203. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
  204. package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
  205. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
  206. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
  207. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
  208. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
  209. package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
  210. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
  211. package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
  212. package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
  213. package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
  214. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +81 -0
  215. package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
  216. package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
  217. package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
  218. package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
  219. package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
  220. package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
  221. package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
  222. package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
  223. package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
  224. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
  225. package/esm2022/lib/toolbar/toolbar.component.mjs +68 -117
  226. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
  227. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
  228. package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
  229. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
  230. package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
  231. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
  232. package/esm2022/lib/util/mark-for-check.mjs +17 -0
  233. package/esm2022/lib/util/supersede.mjs +56 -0
  234. package/esm2022/lib/visualization.module.mjs +39 -141
  235. package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
  236. package/esm2022/lib/visualizer/region-actions.mjs +149 -0
  237. package/esm2022/lib/visualizer/region-load.mjs +60 -0
  238. package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
  239. package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
  240. package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
  241. package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
  242. package/esm2022/lib/visualizer.component.mjs +480 -1902
  243. package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
  244. package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
  245. package/esm2022/lib/workers/spatial-math.mjs +190 -0
  246. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs +41083 -0
  247. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
  248. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
  249. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map +1 -0
  250. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
  251. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
  252. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34430
  253. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  254. package/fesm2022/mask.worker.js +36 -917
  255. package/fesm2022/onnx-sam.worker.js +52 -16
  256. package/fesm2022/spatial-math.worker.js +471 -0
  257. package/fesm2022/tsne.worker.js +32 -15
  258. package/index.d.ts +13 -10
  259. package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
  260. package/lib/contracts/capabilities.contract.d.ts +4 -2
  261. package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
  262. package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
  263. package/lib/contracts/color.d.ts +27 -0
  264. package/lib/contracts/colormap-lut.d.ts +19 -4
  265. package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
  266. package/lib/contracts/display-types.d.ts +21 -0
  267. package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
  268. package/lib/contracts/intensity.d.ts +13 -2
  269. package/lib/contracts/plot-type.d.ts +3 -1
  270. package/lib/contracts/ports/image-state.port.d.ts +6 -2
  271. package/lib/contracts/ports/preferences.port.d.ts +4 -0
  272. package/lib/contracts/ports/region-io.port.d.ts +1 -0
  273. package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
  274. package/lib/contracts/ports/tile-access.port.d.ts +1 -0
  275. package/lib/contracts/region-editor-api.contract.d.ts +1 -1
  276. package/lib/contracts/region-overlay.contract.d.ts +5 -0
  277. package/lib/contracts/sam.contract.d.ts +7 -0
  278. package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
  279. package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
  280. package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
  281. package/lib/contracts/visualizer.contract.d.ts +221 -54
  282. package/lib/contracts/viz-config.d.ts +1 -0
  283. package/lib/geometry/contour.d.ts +24 -0
  284. package/lib/geometry/raster.d.ts +42 -0
  285. package/lib/geometry/ring.d.ts +67 -0
  286. package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
  287. package/lib/implementations/base-store-visualizer.d.ts +61 -15
  288. package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
  289. package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
  290. package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
  291. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
  292. package/lib/implementations/napari-js/napari-loading-badge.d.ts +0 -1
  293. package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
  294. package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
  295. package/lib/implementations/napari-js/napari-scene.d.ts +93 -0
  296. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
  297. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
  298. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
  299. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +89 -0
  300. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
  301. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
  302. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
  303. package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
  304. package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
  305. package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
  306. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +121 -878
  307. package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -0
  308. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
  309. package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
  310. package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
  311. package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
  312. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
  313. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
  314. package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
  315. package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
  316. package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
  317. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
  318. package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
  319. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
  320. package/lib/implementations/osd/display-pipeline.d.ts +38 -9
  321. package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
  322. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
  323. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
  324. package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
  325. package/lib/implementations/osd/osd-coords.d.ts +6 -4
  326. package/lib/implementations/osd/osd-export.d.ts +36 -0
  327. package/lib/implementations/osd/osd-lib.d.ts +7 -0
  328. package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
  329. package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
  330. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +37 -0
  331. package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
  332. package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
  333. package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
  334. package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
  335. package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
  336. package/lib/implementations/osd/osd-viewport.d.ts +77 -0
  337. package/lib/implementations/osd/osd-zoom.d.ts +6 -0
  338. package/lib/implementations/osd/simple-source.d.ts +161 -0
  339. package/lib/implementations/osd/slice-cache.d.ts +12 -3
  340. package/lib/implementations/osd/tile-client.d.ts +11 -14
  341. package/lib/implementations/osd/tile-recolor.d.ts +141 -0
  342. package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
  343. package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
  344. package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
  345. package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
  346. package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
  347. package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
  348. package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
  349. package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
  350. package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
  351. package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
  352. package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
  353. package/lib/implementations/plotly/plotly.service.d.ts +136 -401
  354. package/lib/implementations/region-centroids.d.ts +14 -0
  355. package/lib/implementations/simple-slice-access.service.d.ts +7 -4
  356. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
  357. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
  358. package/lib/implementations/tile-server/index.d.ts +5 -0
  359. package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
  360. package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
  361. package/lib/implementations/tile-server/tile-protocol.d.ts +80 -0
  362. package/lib/implementations/tile-server/transport.d.ts +62 -0
  363. package/lib/intensity/intensity-profile.d.ts +66 -0
  364. package/lib/intensity/intensity-profile.service.d.ts +108 -0
  365. package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
  366. package/lib/models/bezier.d.ts +0 -5
  367. package/lib/models/class-preset.d.ts +18 -0
  368. package/lib/models/geometry.d.ts +14 -48
  369. package/lib/models/polygon-edit.d.ts +72 -0
  370. package/lib/models/polygon-factory.d.ts +40 -0
  371. package/lib/models/region-clone.d.ts +20 -0
  372. package/lib/models/region-geojson.d.ts +17 -0
  373. package/lib/models/region.d.ts +40 -4
  374. package/lib/models/shape.d.ts +8 -0
  375. package/lib/plot-mode/contribution-host.d.ts +125 -0
  376. package/lib/plot-mode/plot-type-menu.d.ts +60 -0
  377. package/lib/plot-mode/tool-params-model.d.ts +49 -0
  378. package/lib/plot.utilities.d.ts +19 -30
  379. package/lib/processing/processing-image.d.ts +5 -2
  380. package/lib/provide-visualization.d.ts +19 -2
  381. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +56 -0
  382. package/lib/region-editor/file-stem.d.ts +7 -0
  383. package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
  384. package/lib/region-editor/mask-export.service.d.ts +54 -0
  385. package/lib/region-editor/mask-raster.d.ts +2 -8
  386. package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
  387. package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
  388. package/lib/region-editor/region-editor.component.d.ts +166 -199
  389. package/lib/region-editor/region-metrics.d.ts +26 -0
  390. package/lib/region-editor/region-persistence.service.d.ts +69 -0
  391. package/lib/region-editor/region-table/region-table.component.d.ts +83 -0
  392. package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
  393. package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
  394. package/lib/region-ops.service.d.ts +1 -7
  395. package/lib/region-overlay/region-geometry.d.ts +157 -0
  396. package/lib/region-overlay/region-hit-test.d.ts +38 -0
  397. package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
  398. package/lib/render-orchestrator.d.ts +6 -2
  399. package/lib/render-session.d.ts +75 -0
  400. package/lib/routing-visualizer.service.d.ts +110 -58
  401. package/lib/spatial/density-raster.d.ts +6 -0
  402. package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
  403. package/lib/spatial/embedding-compute.d.ts +21 -2
  404. package/lib/spatial/glyphs.d.ts +16 -0
  405. package/lib/spatial/lod.d.ts +94 -0
  406. package/lib/spatial/spatial-controls.facade.d.ts +64 -0
  407. package/lib/spatial/spatial-density.d.ts +15 -5
  408. package/lib/spatial/spatial-encoding.d.ts +11 -44
  409. package/lib/spatial/spatial-expression.d.ts +40 -22
  410. package/lib/spatial/spatial-framing.d.ts +1 -0
  411. package/lib/spatial/spatial-heatmap.d.ts +2 -0
  412. package/lib/spatial/spatial-hover.d.ts +4 -16
  413. package/lib/spatial/spatial-panel-model.d.ts +135 -0
  414. package/lib/spatial/spatial-selection.d.ts +21 -26
  415. package/lib/spatial/spatial-tile-merge.d.ts +41 -0
  416. package/lib/spatial/spatial-tiles.d.ts +9 -256
  417. package/lib/spatial/stats.d.ts +38 -0
  418. package/lib/spatial/transcript-grouping.d.ts +119 -0
  419. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
  420. package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
  421. package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
  422. package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
  423. package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
  424. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
  425. package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
  426. package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
  427. package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
  428. package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
  429. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
  430. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
  431. package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
  432. package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
  433. package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
  434. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
  435. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
  436. package/lib/store/class-color.util.d.ts +35 -1
  437. package/lib/store/region-history.d.ts +66 -0
  438. package/lib/store/region-scope-cache.d.ts +63 -0
  439. package/lib/store/region-selection.d.ts +36 -0
  440. package/lib/store/region-store.service.d.ts +104 -112
  441. package/lib/store/visualizer-store.service.d.ts +22 -33
  442. package/lib/toast-outlets.d.ts +4 -3
  443. package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
  444. package/lib/toolbar/canvas-tools.d.ts +20 -0
  445. package/lib/toolbar/crop/slide-crop.d.ts +10 -4
  446. package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
  447. package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
  448. package/lib/toolbar/region-tools/region-tools.component.d.ts +60 -0
  449. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
  450. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
  451. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
  452. package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
  453. package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
  454. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
  455. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
  456. package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
  457. package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
  458. package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
  459. package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
  460. package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
  461. package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
  462. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +40 -0
  463. package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
  464. package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
  465. package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
  466. package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
  467. package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
  468. package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
  469. package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
  470. package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
  471. package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
  472. package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
  473. package/lib/toolbar/toolbar.component.d.ts +47 -83
  474. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
  475. package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
  476. package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
  477. package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
  478. package/lib/toolbar/wand/wand.service.d.ts +22 -116
  479. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
  480. package/lib/util/mark-for-check.d.ts +11 -0
  481. package/lib/util/supersede.d.ts +53 -0
  482. package/lib/visualization.module.d.ts +18 -39
  483. package/lib/visualizer/floating-drag.directive.d.ts +30 -0
  484. package/lib/visualizer/region-actions.d.ts +54 -0
  485. package/lib/visualizer/region-load.d.ts +27 -0
  486. package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
  487. package/lib/visualizer/tool-modes.d.ts +49 -0
  488. package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
  489. package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
  490. package/lib/visualizer.component.d.ts +201 -447
  491. package/lib/workers/spatial-math-ops.d.ts +65 -0
  492. package/lib/workers/spatial-math-worker.d.ts +7 -0
  493. package/lib/workers/spatial-math.d.ts +74 -0
  494. package/package.json +12 -3
  495. package/src/lib/styles/_viz-icons-rules.scss +73 -0
  496. package/src/lib/styles/viz-icons.scss +14 -0
  497. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
  498. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
  499. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
  500. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
  501. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
  502. package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
  503. package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
  504. package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
  505. package/src/lib/assets/cell-detection.svg +0 -37
  506. package/src/lib/assets/click.svg +0 -1
  507. package/src/lib/assets/colormap-luts.json +0 -1
  508. package/src/lib/assets/edit-selection-white.svg +0 -47
  509. package/src/lib/assets/icons/colormap-earth.png +0 -0
  510. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  511. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  512. package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
  513. package/src/lib/assets/picture-segmentation.svg +0 -43
  514. package/src/lib/assets/test/download-379.svg +0 -1
  515. package/src/lib/assets/test/download-98.svg +0 -1
  516. package/src/lib/assets/test/json-1.svg +0 -1
  517. package/src/lib/assets/test/load-53.svg +0 -1
  518. package/src/lib/assets/test/mask-44.svg +0 -1
  519. package/src/lib/assets/test/mask-download-44.svg +0 -15
  520. package/src/lib/assets/test/mask-save-44.svg +0 -11
  521. package/src/lib/assets/test/overlay-1.svg +0 -1
  522. package/src/lib/assets/test/overlay-4.svg +0 -1
  523. package/src/lib/assets/test/region-26.svg +0 -1
  524. package/src/lib/assets/test/save-56.svg +0 -1
  525. package/src/lib/assets/test/upload-43.svg +0 -1
@@ -0,0 +1,212 @@
1
+ import { IHistogram } from '../../contracts/channel-histogram-api.contract';
2
+ import { SpatialDataset, SpatialObservations } from '../../contracts/spatial-dataset.contract';
3
+ import { SpatialViewState } from '../../contracts/display-types';
4
+ import { SpatialSelectionMask } from '../../spatial/spatial-selection';
5
+ import { Spatial3dScalars } from './napari-spatial-encoding';
6
+ import { SpatialSceneBase, SpatialSession } from './napari-spatial-scene';
7
+ import type { NapariScene, SceneContext } from './napari-scene';
8
+ /**
9
+ * SPATIAL_OMICS_3D (review Appendix B, cluster K): observations as a 3D point cloud under the
10
+ * orbit camera, with the dataset's reference volume around it, per-cluster density volumes and the
11
+ * 3D gene map.
12
+ *
13
+ * Thinner than the 2D scene: there is no tissue image to render (a registered volume like the
14
+ * Allen CCF has no single reference plane), so no readback and no navigator; the 3D scale bar
15
+ * follows the dataset (see {@link installScaleBar}). The region tools work in SCREEN space through
16
+ * the tool bridge's 3D interaction — a lasso selects the cells under it, and an orbit clears the
17
+ * shape while keeping the selection. The first 3D layer added frames the camera (`fit3d: 'once'`).
18
+ */
19
+ export declare class Spatial3dScene extends SpatialSceneBase implements NapariScene {
20
+ /** The 3D point cloud. One layer: selection is a per-point alpha on it, not a second. */
21
+ private points;
22
+ private layerKey;
23
+ /** Interleaved x,y,z, cached so a colour change does not re-walk 3.7M observations. */
24
+ private positions;
25
+ /** Identity of the scalars currently uploaded — see {@link rebuild}. */
26
+ private scalarKey;
27
+ /** Observation indices the cached positions belong to, in the same order; null when every
28
+ * observation is drawn. Without it a projection built from the positions is indexed by DRAWN
29
+ * order and silently attributes each point to the wrong observation as soon as a section is
30
+ * isolated. */
31
+ private drawn;
32
+ /** The anatomical volume the cloud sits inside, when the dataset has one. */
33
+ private volume;
34
+ private volumeKey;
35
+ /** Per-cluster density volumes drawn alongside the cloud, and what they were
36
+ * built from — rasterising is seconds of work, so it must not repeat for a
37
+ * change that cannot affect the field. */
38
+ private densityLayers;
39
+ private densityKey;
40
+ /** The 3D gene map's volume layer and the inputs it was coloured for (its field is cached in
41
+ * the session, on a clock of its own). */
42
+ private geneMapLayer;
43
+ private geneMapKey;
44
+ /** Offset applied to observation coordinates to sit them in the volume's box. */
45
+ private origin;
46
+ /**
47
+ * napari-js's depth-aware pick over the cloud, and the projection the ROI selection reads. It
48
+ * owns the caching policy: re-project lazily, on the first pick after the camera, the canvas or
49
+ * the cloud's data moved (never on the camera event, so an orbit drag pays nothing), into
50
+ * reused buffers, with a screen index once the cloud is large enough.
51
+ */
52
+ private picker;
53
+ private scaleBar;
54
+ /** Dataset the scale bar was built for. */
55
+ private scaleBarKey;
56
+ /** The density rasterisation and the 3D gene-map estimate in flight (off the main thread
57
+ * past the worker threshold, SPATIAL-19): a new key supersedes — and aborts — the previous
58
+ * one; a rebuild that leaves the key alone lets it finish. */
59
+ private readonly densityLoads;
60
+ private readonly geneMapLoads;
61
+ /** The store's invert setting, which the density volumes follow (no other subscription of
62
+ * this scene carries it). */
63
+ private invertSub;
64
+ constructor(ctx: SceneContext, session: SpatialSession);
65
+ mount(): Promise<void>;
66
+ /** The observations' own z is on screen: there is no plane to step. */
67
+ setZ(): void;
68
+ /** A cloud has no intensity distribution for the histogram pane. */
69
+ histogram(): IHistogram | null;
70
+ /**
71
+ * Every observation's position on the canvas under the current 3D camera (for the ROI
72
+ * selection), indexed by observation with NaN for anything not drawn. Null before the cloud
73
+ * is built.
74
+ *
75
+ * The projection is the picker's (see {@link picker}); what is left is the part that is
76
+ * genuinely this adapter's: SCATTERING the drawn subset back into observation order. The cloud
77
+ * holds only the points of the displayed section, in its own packing; every consumer indexes by
78
+ * observation. NaN stands for "not on screen", which is also the right answer for an
79
+ * observation whose section is hidden.
80
+ */
81
+ screenProjection(obs: SpatialObservations): Float32Array | null;
82
+ dispose(): void;
83
+ /**
84
+ * The observation under a client position: the FRONT-most marker within `slackPx` of the
85
+ * pointer (ties by distance), as napari-js's {@link PointPicker} picks it. That matters more
86
+ * than it sounds: the renderer depth-tests the billboards, and in a 3.7M-point cloud the cursor
87
+ * covers many of them — picking the one nearest the cursor's centre regularly names a cell that
88
+ * something else is drawn over. The picker also takes each point's radius from the layer's
89
+ * per-point `sizes`, so a selected marker, drawn larger, is as large to the pointer.
90
+ */
91
+ protected pickObservation(clientX: number, clientY: number, slackPx: number): number;
92
+ /** Replace the cloud's picker (null: no cloud), releasing the old one's camera listener. */
93
+ private setPicker;
94
+ /**
95
+ * Scale bar for the cloud, measured at the ORBIT PIVOT.
96
+ *
97
+ * A perspective camera has no single scale — things farther away are smaller — so a bar can
98
+ * only be true at one depth. The pivot is the honest choice: it is what the camera is framing,
99
+ * what a zoom moves towards, and where the eye is anyway. napari's own 3D scale bar works the
100
+ * same way.
101
+ *
102
+ * napari-js's `ScaleBarOverlay` in `'3d'` mode measures there: CSS px per world unit is the
103
+ * reciprocal of `Camera3D.worldPerPixel` — the scale `Camera3D.pan` uses to track the cursor.
104
+ * The bar then converts through `micronsPerUnit`, and draws nothing at all when the dataset does
105
+ * not declare one, because a bar labelled in microns over unknown units would read as a
106
+ * measurement.
107
+ */
108
+ private installScaleBar;
109
+ /** (Re)build the 3D point cloud for the current dataset + view state. */
110
+ protected rebuild(dataset: SpatialDataset | null, view: SpatialViewState, selection?: SpatialSelectionMask): Promise<void>;
111
+ /**
112
+ * Draw the point cloud: a new layer for new geometry (a dataset or a section), the colour
113
+ * source swapped in place otherwise; then the selection and the visibility.
114
+ */
115
+ private drawCloud;
116
+ /** Interleaved x,y,z of the `shown` observations (null: all of them), offset by {@link origin}. */
117
+ private cloudPositions;
118
+ /**
119
+ * Selection is a PER-POINT alpha, in the one layer.
120
+ *
121
+ * It used to be a second layer: with a single opacity for the whole cloud, the only way
122
+ * to highlight a subset was to draw it again on top at full opacity while the parent
123
+ * dropped to the muted level. That second layer had to be kept in step through every
124
+ * colormap, window and size change, and the two then depth-sorted against each other as
125
+ * separate draws. Per-point alphas and sizes give the same reading — muted cloud, bright
126
+ * selection, slightly larger so a small one is findable inside 3.7M points — in one.
127
+ *
128
+ * `shown` is the drawn subset (null: every one of the `total` observations), so the alphas
129
+ * follow the drawn order.
130
+ */
131
+ private applySelection;
132
+ /**
133
+ * The **3D gene map**: the active gene's expression over the whole sectioned
134
+ * specimen, as one raymarched volume.
135
+ *
136
+ * Two things it can be, and the panel's `Volume rendering` toggle picks which:
137
+ *
138
+ * - **sheets** — exactly the planes that were imaged, each carrying that
139
+ * slide's own 2D gene map, with the gaps between sections empty. A stack of
140
+ * measured fields, at their true z.
141
+ * - **volume** — the same fields smoothed along z, so the planes between the
142
+ * sections carry an interpolated value. An estimate, and drawn as a
143
+ * translucent cloud for the same reason the density volumes are.
144
+ *
145
+ * One `VolumeLayer` rather than a textured quad per section: an `ImageLayer`
146
+ * renders only at `ndisplay === 2`, so 53 sheets in the orbit view would need a
147
+ * new layer type upstream — while a scalar volume whose z sampling already IS
148
+ * the section spacing expresses the sheets exactly, and the same lattice then
149
+ * gives the interpolated version for free.
150
+ *
151
+ * Estimated on the reference volume's own lattice (`densityGrid` at stride 1),
152
+ * so the field lands voxel-for-voxel on the anatomy and needs no offset — a
153
+ * `VolumeLayer` has no translate, and napari centres both boxes on the world
154
+ * origin.
155
+ */
156
+ private ensureGeneMap;
157
+ /**
158
+ * Cluster density volumes: each cluster rasterised into a smooth scalar field and
159
+ * raymarched alongside the cloud, tinted with the cluster's own legend colour.
160
+ *
161
+ * This is what makes a serially sectioned dataset readable as an anatomical
162
+ * distribution. The cloud shows measured cells and nothing else — but at 200 µm
163
+ * section spacing the eye cannot integrate a stack of discs into a shape, and
164
+ * every gap reads as absence. A density field is a different object from a cell:
165
+ * an estimate, defined between the imaged planes, drawn as a translucent cloud so
166
+ * it cannot be mistaken for measurement. Individual cells are never interpolated —
167
+ * consecutive sections sample different cells, so there is nothing to interpolate
168
+ * along.
169
+ *
170
+ * One volume per cluster rather than one for everything: additive blending is what
171
+ * makes two clusters' territories comparable, and a single blended field would
172
+ * answer no question anyone asks of a taxonomy. Capped at `DENSITY_MAX_CLUSTERS` by cell
173
+ * count.
174
+ *
175
+ * Keyed so it rebuilds only when the field would actually differ — the dataset,
176
+ * the colour column, the bandwidth, or the selection.
177
+ */
178
+ private ensureDensityVolumes;
179
+ /**
180
+ * The clusters to rasterise: the categories of the active categorical colouring,
181
+ * biggest first and capped, each with its legend colour, restricted to the current selection
182
+ * when there is one. With no categorical colouring there is one group — total cell density,
183
+ * which is a real question on its own ("where is the tissue dense?") and the honest thing to
184
+ * show when the view is not encoding a taxonomy.
185
+ */
186
+ private densityGroups;
187
+ /**
188
+ * Add (or keep) the dataset's reference volume, and derive the offset that sits the
189
+ * observations inside it.
190
+ *
191
+ * `VolumeLayer` has no translate: napari-js maps the volume's unit cube to a world box
192
+ * **centred on the origin**, sized `dims x voxelSize`. The observations, by contract, are in
193
+ * the volume's own frame with its near corner at the coordinate origin. So the two only line
194
+ * up if the POINTS move — by half the box — which is what {@link origin} is.
195
+ *
196
+ * A failed or absent volume is not fatal: the cloud renders on its own, at its own
197
+ * coordinates, and the camera frames the points instead.
198
+ */
199
+ private ensureVolume;
200
+ /** Drop every layer of the cloud (the dataset went away, or has no z). */
201
+ private removeLayers;
202
+ /**
203
+ * What colours the cloud.
204
+ *
205
+ * Continuous data goes through the active colormap with the same percentile window the 2D path
206
+ * uses. Categorical data is one RGBA per point from the column's palette, so any number of
207
+ * categories keeps its own colour — see `encodeSpatial3dCategorical`.
208
+ */
209
+ private scalarEncoding;
210
+ /** Continuous values → the active colormap over a percentile-clipped window. */
211
+ encodeContinuous(source: Float32Array, view: SpatialViewState): Spatial3dScalars;
212
+ }
@@ -0,0 +1,114 @@
1
+ import type { Colormap } from 'napari-js';
2
+ import { Rgb } from '../../contracts/colormap-lut';
3
+ import { CategoricalColumn } from '../../contracts/spatial-dataset.contract';
4
+ import { SpatialViewState } from '../../contracts/display-types';
5
+ import { type RGBA } from '../../spatial/spatial-encoding';
6
+ import { SpatialSelectionMask } from '../../spatial/spatial-selection';
7
+ /**
8
+ * The spatial scenes' pure colour and grouping math: what the 2D markers, the 3D cloud and the
9
+ * density volumes are coloured with, as functions of the data, the view and a LUT. No viewer, no
10
+ * port, no store (review Appendix B, step 1).
11
+ */
12
+ /** Marker radius (image px) for a dataset that declares none — segmented cells often don't. */
13
+ export declare const SPATIAL_FALLBACK_RADIUS = 4;
14
+ /** Smallest marker DIAMETER, in slice pixels, over a volume-backed dataset. A cell's real
15
+ * size is honoured wherever it survives the grid: the ABC atlas serves 5 µm radii on a
16
+ * 40 µm/px template, so drawing them to scale would put every cell a fifth of a pixel wide
17
+ * and the section would come up empty. The point-size control scales up from this floor. */
18
+ export declare const SPATIAL_SLICE_MIN_DIAMETER_PX = 1.5;
19
+ /** Longest side of the gene-map raster, in field pixels. A gene map is a smooth
20
+ * field read as territory, so it gains nothing from matching a 2 Gpx slide's
21
+ * resolution — and the estimate costs one pass over this many pixels. */
22
+ export declare const GENE_MAP_MAX_SIDE = 512;
23
+ /** Kernel σ in field pixels at smoothing 1: wide enough to read between cells,
24
+ * tight enough to keep a nucleus-scale structure distinct. */
25
+ export declare const GENE_MAP_SIGMA = 2.5;
26
+ /**
27
+ * In-plane coarsening of the 3D gene map's lattice, relative to the reference
28
+ * volume. The field is smooth, so its detail is set by the kernel rather than the
29
+ * raster — and the estimate is a pair of separable blurs, which at the template's
30
+ * full resolution means seconds of work per toggle.
31
+ */
32
+ export declare const GENE_MAP_VOLUME_STRIDE = 2;
33
+ /** Clusters drawn as density volumes at once. Past a handful, additive translucent
34
+ * clouds stop being separable by eye — and each one is a full rasterisation. */
35
+ export declare const DENSITY_MAX_CLUSTERS = 6;
36
+ /** How much larger a selected marker is drawn, so a small selection is findable inside a
37
+ * 3.7M-point cloud rather than merely brighter. */
38
+ export declare const SPATIAL_SELECTED_SIZE_SCALE = 1.6;
39
+ /** Base marker diameter for the 3D cloud, in SCREEN pixels (the layer's unit). */
40
+ export declare const SPATIAL_3D_BASE_SIZE = 3;
41
+ /** Colour for observations when nothing is selected to colour by: visible, neutral, and
42
+ * obviously not encoding anything. */
43
+ export declare const SPATIAL_NEUTRAL_COLOR: [number, number, number, number];
44
+ /** {@link SPATIAL_NEUTRAL_COLOR} as a hex colour (alpha dropped), for the encoders and the
45
+ * density-volume tint. */
46
+ export declare const SPATIAL_NEUTRAL_HEX: string;
47
+ /**
48
+ * Contrast windows memoised per (values array, lo, hi, log). `contrastWindow` sorts every value,
49
+ * and the spatial colouring re-runs it on each opacity, selection or colormap change while the
50
+ * coloured vector itself is unchanged (review SPATIAL-12). Keyed by the vector's identity, so a
51
+ * new column or gene vector is a miss and an old one is collected with its windows.
52
+ */
53
+ export declare class ContrastWindowCache {
54
+ private readonly byVector;
55
+ get(values: Float32Array, lo: number, hi: number, log: boolean, compute: () => [number, number]): [number, number];
56
+ }
57
+ /**
58
+ * What the 3D points layer needs to colour a cloud: for continuous data, one scalar per point, a
59
+ * colormap and the window that maps scalars onto it; for categorical data, one packed RGBA per
60
+ * point (`Points3DLayer.colors`, which wins over the scalars).
61
+ */
62
+ export type Spatial3dEncoding = Spatial3dScalars | Spatial3dColors;
63
+ /** A cloud coloured through the colormap: scalars, colormap and window. */
64
+ export interface Spatial3dScalars {
65
+ kind: 'scalars';
66
+ values: Float32Array;
67
+ colormap: Colormap;
68
+ contrastLimits: [number, number];
69
+ }
70
+ /** A cloud coloured point by point: packed RGBA, 4 floats per point. */
71
+ export interface Spatial3dColors {
72
+ kind: 'colors';
73
+ colors: Float32Array;
74
+ }
75
+ /** A one-colour colormap, for the "nothing to colour by" state. */
76
+ export declare function spatialFlatColormap(): Colormap;
77
+ /**
78
+ * Category codes → one RGBA per point, for any number of categories.
79
+ *
80
+ * The 2D markers' encoding, with one difference: a point with no category stays opaque (grey),
81
+ * as it always has in the cloud, where the selection dims through the layer's per-point alphas
82
+ * instead. It used to be smuggled through the scalar channel as a stepped 256-entry LUT, which
83
+ * kept at most 95 categories apart (review SPATIAL-11, NAPARI-SVC-18).
84
+ */
85
+ export declare function encodeSpatial3dCategorical(codes: Uint16Array, colors: string[]): Spatial3dColors;
86
+ /** Continuous values → `lut` over a percentile-clipped window (log1p first when the view's log
87
+ * scale is on), for the 3D cloud's scalar channel. */
88
+ export declare function encodeSpatial3dContinuous(source: Float32Array, view: SpatialViewState, lut: Rgb[], windows: ContrastWindowCache): Spatial3dScalars;
89
+ /** Continuous values → per-point RGBA through `lut` and a clipped window (log scale per the
90
+ * view), for the 2D markers. */
91
+ export declare function encodeSpatialContinuous(values: Float32Array, view: SpatialViewState, lut: Rgb[], windows: ContrastWindowCache, muted?: Uint8Array | null): Float32Array;
92
+ /** Marker colours: packed per-point RGBA (4 floats per point, the shape napari-js copies straight
93
+ * into its instance buffer), or one RGBA broadcast to every point. */
94
+ export type PointColors = Float32Array | RGBA;
95
+ /** Whether a colour input is one RGBA per point rather than one broadcast RGBA. */
96
+ export declare function isPerPoint(colors: PointColors): colors is Float32Array;
97
+ /** Per-point colours for the drawn subset. A broadcast tuple stays broadcast —
98
+ * it is one colour for every point either way. */
99
+ export declare function gatherColors(colors: PointColors, indices?: Uint32Array): PointColors;
100
+ /** One density volume's observations: a cluster (or all cells), with its legend colour. */
101
+ export interface DensityGroup {
102
+ name: string;
103
+ color: string;
104
+ indices?: Uint32Array;
105
+ }
106
+ /** The single group drawn when the colouring is not categorical: total cell density, within the
107
+ * selection when there is one. */
108
+ export declare function totalDensityGroup(selection: SpatialSelectionMask): DensityGroup;
109
+ /**
110
+ * The clusters of a categorical column to rasterise, biggest first and capped at
111
+ * {@link DENSITY_MAX_CLUSTERS}, each with its legend colour — restricted to the selection when
112
+ * there is one, so "select a region, check the box" answers which clusters live there.
113
+ */
114
+ export declare function rankDensityGroups(columnName: string, column: CategoricalColumn, count: number, selection: SpatialSelectionMask): DensityGroup[];
@@ -0,0 +1,89 @@
1
+ import type { Viewer } from 'napari-js';
2
+ import { SpatialDataPort } from '../../contracts/ports/spatial-data.port';
3
+ import { SpatialDataset } from '../../contracts/spatial-dataset.contract';
4
+ import { SpatialViewState } from '../../contracts/display-types';
5
+ import { SpatialSelectionStore } from '../../store/spatial-selection.service';
6
+ import { NapariSpatialTileLayers } from './napari-spatial-tiles';
7
+ /** Pointer distance, in screen pixels, that still counts as "on" a marker.
8
+ * Generous relative to a 1.5px disc: the cursor is a blunt instrument, and a
9
+ * tooltip you have to hunt for is worse than none. */
10
+ export declare const HOVER_RADIUS_PX = 10;
11
+ /** What the hover reads from the spatial scene it serves. */
12
+ export interface SpatialHoverHost {
13
+ /** The orbit view rather than the 2D view (no transcript markers to ask first). */
14
+ readonly is3d: boolean;
15
+ readonly viewer: Viewer;
16
+ readonly port: SpatialDataPort | null;
17
+ readonly selection: SpatialSelectionStore | null;
18
+ /** The dataset on screen, as the spatial subscription last saw it. */
19
+ dataset(): SpatialDataset | null;
20
+ /**
21
+ * The OBSERVATION drawn under a client position, or -1 — `slackPx` screen pixels of slack
22
+ * around the pointer. The scene owns the pick (napari-js's, on the layer it drew) and maps the
23
+ * drawn index back to the observation.
24
+ */
25
+ pick(clientX: number, clientY: number, slackPx: number): number;
26
+ /** The 2D transcript markers, which sit on top of everything and are asked first. */
27
+ tiles(): NapariSpatialTileLayers | null;
28
+ /** A region tool owns the pointer (placing a polygon vertex is also a still click). */
29
+ toolActive(): boolean;
30
+ outsideZone<T>(fn: () => T): T;
31
+ inZone<T>(fn: () => T): T;
32
+ }
33
+ /**
34
+ * Cursor tooltip and click-to-select for the spatial views (review Appendix B, cluster L): hover a
35
+ * marker, read its class; click it, select the class — the canvas equivalent of the panel's
36
+ * legend. The tooltip and the click share ONE hit-test, so a click selects the class the tooltip
37
+ * names (NAPARI-SVC-5).
38
+ *
39
+ * A 34-entry legend cannot be read back from a dot — several classes get similar colours, and
40
+ * matching one to a swatch by eye is exactly the task this removes. It reports whatever the cloud
41
+ * is CURRENTLY coloured by ({@link resolveSource}), so it and the legend can never say different
42
+ * things.
43
+ */
44
+ export declare class SpatialHover {
45
+ private readonly host;
46
+ private tooltip;
47
+ /** What the markers are coloured by, resolved once per colour source rather than per hover. */
48
+ private hoverSource;
49
+ private hoverSourceKey;
50
+ /** Latest wins within the scene: the KEY is only committed once a resolution lands, so a
51
+ * superseded fetch cannot leave the cache claiming to hold a source it never stored. */
52
+ private readonly resolutions;
53
+ private pointer;
54
+ private frame;
55
+ private off;
56
+ constructor(host: SpatialHoverHost);
57
+ /**
58
+ * Listen on `el` (the plot host) rather than the canvas, so it keeps working over the region
59
+ * overlay (an SVG covering the canvas, which would otherwise swallow every move), and throttle
60
+ * to one hit-test per animation frame: a pointermove can fire far more often than that, and
61
+ * the first test after an orbit re-projects the cloud.
62
+ */
63
+ install(el: HTMLElement): void;
64
+ /** Hide the tooltip (the navigator is being dragged, say). */
65
+ hide(): void;
66
+ /** Remove the listeners and the tooltip, and drop the colour source. */
67
+ dispose(): void;
68
+ /**
69
+ * What the tooltip says, resolved once per colour source rather than per hover.
70
+ *
71
+ * Fetched separately from the colouring on purpose: the reference port caches
72
+ * columns, but a host's need not, and re-fetching a 3.7M-element vector because
73
+ * the pointer moved would be indefensible either way.
74
+ */
75
+ resolveSource(dataset: SpatialDataset | null, view: SpatialViewState): Promise<void>;
76
+ /** Hit-test the last pointer position and show or hide the tooltip. */
77
+ private update;
78
+ /**
79
+ * Select the class of the marker at a client position — the canvas equivalent of
80
+ * clicking that class in the panel's legend, and the same selection object, so
81
+ * the two controls cannot produce different results.
82
+ *
83
+ * Clicking a class that is already the whole selection CLEARS it, which is what
84
+ * the legend does. Compared against the selection itself rather than against a
85
+ * remembered click, so selecting from the legend and then clicking the same
86
+ * class on the canvas still toggles.
87
+ */
88
+ private selectClassAt;
89
+ }
@@ -0,0 +1,118 @@
1
+ import { Observable } from 'rxjs';
2
+ import { SpatialDataPort } from '../../contracts/ports/spatial-data.port';
3
+ import { SpatialDataset } from '../../contracts/spatial-dataset.contract';
4
+ import { SpatialViewState } from '../../contracts/display-types';
5
+ import { ExpressionField, ExpressionVolumeField } from '../../spatial/spatial-expression';
6
+ import { SpatialSelectionMask } from '../../spatial/spatial-selection';
7
+ import { SpatialSelectionStore } from '../../store/spatial-selection.service';
8
+ import { VisualizerStore } from '../../store/visualizer-store.service';
9
+ import { Supersede } from '../../util/supersede';
10
+ import { ContrastWindowCache } from './napari-spatial-encoding';
11
+ import { SpatialHover } from './napari-spatial-hover';
12
+ import { NapariSpatialTileLayers, TranscriptEstimate } from './napari-spatial-tiles';
13
+ import { Rgb } from '../../contracts/colormap-lut';
14
+ import type { SceneContext } from './napari-scene';
15
+ /** What the spatial subscription last saw: the dataset, the view state and the selection. */
16
+ export type SpatialLatest = [SpatialDataset | null, SpatialViewState, SpatialSelectionMask];
17
+ /** Where the spatial tile layers' panel outputs go (the service's subjects and badge). */
18
+ export interface SpatialTileSinks {
19
+ /** The continuous LUT the view is using (so cells coloured by a gene match the markers). */
20
+ continuousLut(view: SpatialViewState): Rgb[];
21
+ estimateChanged(estimate: TranscriptEstimate | null): void;
22
+ geneCountsChanged(counts: Record<string, number> | null): void;
23
+ densityChanged(stats: {
24
+ lo: number;
25
+ hi: number;
26
+ max: number;
27
+ }): void;
28
+ loadingChanged(layers: string[]): void;
29
+ }
30
+ /** The 2D scene the tile layers currently draw into. */
31
+ export interface SpatialTileOwner {
32
+ canvasSize(): [number, number];
33
+ /** Outlines appeared or disappeared: the markers' visibility follows. */
34
+ polygonsShownChanged(): void;
35
+ }
36
+ /** An estimated field and the inputs it was estimated for. */
37
+ export interface FieldCache<T> {
38
+ key: string | null;
39
+ field: T | null;
40
+ }
41
+ /**
42
+ * The spatial state that outlives a scene (review Appendix B): what the subscription last saw, the
43
+ * memoised percentile windows, the selection revision counter and the estimated gene-map FIELDS —
44
+ * viewer-independent and expensive, so a re-plot recolours the cached field instead of estimating
45
+ * it again. Everything that names a layer of a viewer belongs to the scene instead.
46
+ */
47
+ export declare class SpatialSession {
48
+ readonly port: SpatialDataPort | null;
49
+ readonly selection: SpatialSelectionStore | null;
50
+ private readonly sinks;
51
+ /** Latest (dataset, view, selection) the spatial subscription saw — so a slice change can
52
+ * rebuild the markers for the new plane, and the tile layers and the hover can read it. */
53
+ latest: SpatialLatest | null;
54
+ /** Spatial colouring's percentile windows, memoised per coloured vector (SPATIAL-12). */
55
+ readonly contrastWindows: ContrastWindowCache;
56
+ /** The 2D gene map's field (the expensive half: it survives a recolour and a re-plot). */
57
+ readonly geneMap: FieldCache<ExpressionField>;
58
+ /** The 3D gene map's field. */
59
+ readonly geneMapVolume: FieldCache<ExpressionVolumeField>;
60
+ private lastSelectionSeen;
61
+ private selectionRevision;
62
+ /** Level-of-detail cell outlines, transcripts and density over the 2D view — created on first
63
+ * use, only when a spatial port is bound, and kept across scenes (its tile caches with it). */
64
+ private tileLayers;
65
+ private tileOwner;
66
+ constructor(port: SpatialDataPort | null, selection: SpatialSelectionStore | null, sinks: SpatialTileSinks);
67
+ /** The tile layers, if they were ever built. */
68
+ get tiles(): NapariSpatialTileLayers | null;
69
+ /**
70
+ * The tile layers, built on first use (null without a spatial port), now drawing for `owner`.
71
+ * Their host callbacks read the session's live state and the owner's canvas, so they never hold
72
+ * a stale dataset or colormap.
73
+ */
74
+ claimTiles(owner: SpatialTileOwner): NapariSpatialTileLayers | null;
75
+ /** `owner`'s scene is going away: take the tile layers off its viewer. */
76
+ releaseTiles(owner: SpatialTileOwner): void;
77
+ /**
78
+ * A revision number for a selection object.
79
+ *
80
+ * The store hands out a NEW mask object per change, so object identity is the
81
+ * cheap and exact way to tell two selections apart — a fingerprint over 3.7M
82
+ * mask bytes would be neither. Counting revisions keeps the cache key a short
83
+ * string.
84
+ */
85
+ selectionRev(selection: SpatialSelectionMask): number;
86
+ /**
87
+ * Everything a spatial scene redraws on: the dataset, the view state, the selection — and the
88
+ * display colormap and reverse flag, which are inputs here, not just something read at build
89
+ * time: `continuousColormap: null` means "follow the image's colormap", and a setting that only
90
+ * takes effect at the next unrelated rebuild is not one. Null without a spatial port.
91
+ */
92
+ changes$(store: VisualizerStore): Observable<[SpatialDataset | null, SpatialViewState, SpatialSelectionMask, unknown, boolean]> | null;
93
+ }
94
+ /**
95
+ * What the 2D and 3D spatial scenes share: the subscription that redraws them, the hover over
96
+ * them, and the latest-wins sequencing of their (async) rebuilds.
97
+ */
98
+ export declare abstract class SpatialSceneBase {
99
+ protected readonly ctx: SceneContext;
100
+ protected readonly session: SpatialSession;
101
+ protected readonly hover: SpatialHover;
102
+ /** Latest wins within the scene: a colour fetch is a round-trip, so a fast sequence of
103
+ * colour-by changes can resolve out of order, and only the newest may touch the layers. */
104
+ protected readonly rebuilds: Supersede;
105
+ private sub;
106
+ protected constructor(ctx: SceneContext, session: SpatialSession, is3d: boolean);
107
+ /** Rebuild on every dataset, view, selection or colormap change. */
108
+ protected subscribeSpatial(): void;
109
+ /** (Re)build the scene's layers for the current dataset + view state. */
110
+ protected abstract rebuild(dataset: SpatialDataset | null, view: SpatialViewState, selection?: SpatialSelectionMask): Promise<void>;
111
+ /** Run after each rebuild is started (the 2D tile layers refresh here). */
112
+ protected afterChange(): void;
113
+ /** The observation drawn under a client position, or -1 (see `SpatialHoverHost.pick`). */
114
+ protected abstract pickObservation(clientX: number, clientY: number, slackPx: number): number;
115
+ protected hoverTiles(): NapariSpatialTileLayers | null;
116
+ /** Stop following the data, drop the hover, and make every rebuild in flight stale. */
117
+ protected disposeSpatial(): void;
118
+ }