@jax-data-science/sci-image-visualizer 0.8.3 → 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 +358 -4218
  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 -34467
  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 -883
  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
@@ -1,13 +1,15 @@
1
+ import { OnDestroy } from '@angular/core';
1
2
  import { Observable } from 'rxjs';
2
3
  import { Image } from 'image-js';
3
4
  import { IImageInfo, IImageMetadata } from './contracts/image.contract';
4
- import { Region } from './models/region';
5
+ import { Polygon, Region } from './models/region';
5
6
  import { ClassPreset, PresetSet } from './models/class-preset';
6
7
  import { PlotlyService } from './implementations/plotly/plotly.service';
7
8
  import { OpenSeadragonVisualizerService } from './implementations/osd/openseadragon-visualizer.service';
8
9
  import { PlotType, PlotTypeDescriptor } from './contracts/plot-type';
9
- import { IVisualizer, PixelData, IntensityProfile, IIsosurfaceControls, IIntensityControls, ISurface3dControls, ISpatialControls } from './contracts/visualizer.contract';
10
+ import { IVisualizer, LoadedImage, PixelData, IntensityProfile, IIsosurfaceControls, IIntensityControls, ISurface3dControls, ISpatialControls, IIntensitySampling, IOsdViewOptions, IVolumeResolution } from './contracts/visualizer.contract';
10
11
  import { SpatialDataPort } from './contracts/ports/spatial-data.port';
12
+ import { CanvasToolOptions, ColormapNode, IBrushOptions, IWandOptions } from './contracts/display-types';
11
13
  import { RegionStore } from './store/region-store.service';
12
14
  import { SpatialSelectionStore } from './store/spatial-selection.service';
13
15
  import { ViewerCapabilities } from './contracts/capabilities.contract';
@@ -18,8 +20,30 @@ import { VisualizerStore } from './store/visualizer-store.service';
18
20
  import { NapariVisualizerService } from './implementations/napari-js/napari-visualizer.service';
19
21
  import { VizConfig } from './contracts/viz-config';
20
22
  import { PlotModeViewport } from './contracts/plot-type-contribution.contract';
23
+ import { IntensityProfileService } from './intensity/intensity-profile.service';
21
24
  import * as i0 from "@angular/core";
22
- export declare class RoutingVisualizerService implements IVisualizer, IRegionEditorApi, IChannelHistogramApi {
25
+ /**
26
+ * The visualizer chain's front door: implements `IVisualizer`, `IRegionEditorApi`
27
+ * and `IChannelHistogramApi` (bound to the `VISUALIZER` / `REGION_EDITOR_API` /
28
+ * `CHANNEL_HISTOGRAM_API` tokens) over three rendering backends, chosen per plot type:
29
+ * - **Image** renders through OpenSeadragon (natively tiled, region tools,
30
+ * client-side colormap), or through napari-js when `VizConfig.useNapariRenderer`
31
+ * opts in; the napari image types and the 2D spatial-omics mode render through
32
+ * napari-js. A failed load falls back napari-js → OSD → Plotly for that image only
33
+ * (see `napariFellBack` / `osdFellBack`, cleared by `reset()`).
34
+ * - the napari 3D types (volume, isosurface, surface, 3D scatter, the 3D spatial
35
+ * cloud) render through napari-js, falling back to Plotly.
36
+ * - every other plot type (heatmap, contour, surface, scatter, line, …) renders
37
+ * through Plotly.
38
+ *
39
+ * Only rendering and the viewport are routed to the backend on screen. Region state
40
+ * lives in the shared `RegionStore` and display state (colormap, channels, presets,
41
+ * spatial view) in the shared `VisualizerStore`, so every backend sees the same
42
+ * values; the backends subscribe to them to redraw.
43
+ *
44
+ * Package-internal: hosts depend on the tokens, not on this class.
45
+ */
46
+ export declare class RoutingVisualizerService implements IVisualizer, IRegionEditorApi, IChannelHistogramApi, OnDestroy {
23
47
  private plotly;
24
48
  private osd;
25
49
  private napari;
@@ -27,6 +51,7 @@ export declare class RoutingVisualizerService implements IVisualizer, IRegionEdi
27
51
  private config;
28
52
  private regionStore;
29
53
  private selectionStore;
54
+ private intensity;
30
55
  private spatialData;
31
56
  private currentPlotType;
32
57
  private lastRendered;
@@ -39,7 +64,11 @@ export declare class RoutingVisualizerService implements IVisualizer, IRegionEdi
39
64
  /** napari-js failed for the current render cycle → fall back to OSD (then Plotly).
40
65
  * Reset by reset() at the start of every cycle, like {@link osdFellBack}. */
41
66
  private napariFellBack;
42
- constructor(plotly: PlotlyService, osd: OpenSeadragonVisualizerService, napari: NapariVisualizerService, store: VisualizerStore, config: VizConfig, regionStore: RegionStore, selectionStore: SpatialSelectionStore, spatialData?: SpatialDataPort | null);
67
+ /** The file name of the image last plotted (names a GeoJSON export). */
68
+ private plottedFileName;
69
+ /** The div the backends render into (every backend shares it); '' before the first plot. */
70
+ private plotDiv;
71
+ constructor(plotly: PlotlyService, osd: OpenSeadragonVisualizerService, napari: NapariVisualizerService, store: VisualizerStore, config: VizConfig, regionStore: RegionStore, selectionStore: SpatialSelectionStore, intensity: IntensityProfileService, spatialData?: SpatialDataPort | null);
43
72
  private isImageType;
44
73
  /** The 2D napari types (image, region-centroid scatter, spatial omics) — a 2D fallback chain
45
74
  * (OSD, then Plotly).
@@ -64,19 +93,33 @@ export declare class RoutingVisualizerService implements IVisualizer, IRegionEdi
64
93
  /** Backend currently on screen — what ongoing zoom/tool/region ops act on. */
65
94
  private renderer;
66
95
  get capabilities(): ViewerCapabilities;
67
- load(imageInfo: IImageInfo, zIndex: number): Promise<any>;
96
+ load(imageInfo: IImageInfo, zIndex: number, signal?: AbortSignal): Promise<LoadedImage>;
68
97
  /** Try OSD; on failure fall back to Plotly for this image (not permanent — see reset()). */
69
98
  private loadViaOsdThenPlotly;
70
- plot(plotDiv: string, imageLoaded: any, imageInfo: IImageInfo, screenHeight: number, plotType: PlotType, inPlace?: boolean): Promise<boolean>;
99
+ plot(plotDiv: string, imageLoaded: unknown, imageInfo: IImageInfo, screenHeight: number, plotType: PlotType, inPlace?: boolean): Promise<boolean>;
71
100
  reloadAndPlot(): void;
72
101
  reset(): void;
73
102
  relayout(trueImageSize?: number[]): void;
74
103
  resetAxes(): void;
104
+ fitToView(): void;
105
+ /** @deprecated Use {@link fitToView}. */
75
106
  autoscale(): void;
76
107
  zoomIn(): void;
77
108
  zoomOut(): void;
78
109
  setDragMode(mode: string | false): void;
110
+ /** Every backend, on screen or not. */
111
+ private backends;
112
+ /**
113
+ * The navigator / smoothing options, applied to EVERY backend that has them (not
114
+ * just the active renderer): consumers set them before the first render, when
115
+ * `renderer()` is still the Plotly default, and OSD/napari-js must receive them
116
+ * to honour them at viewer creation.
117
+ */
118
+ getOsdViewOptions(): IOsdViewOptions;
119
+ private readonly viewOptions;
120
+ /** @deprecated Use `getOsdViewOptions().setNavigatorVisible()`. */
79
121
  setNavigatorVisible(visible: boolean): void;
122
+ /** @deprecated Use `getOsdViewOptions().setImageSmoothingEnabled()`. */
80
123
  setImageSmoothingEnabled(enabled: boolean): void;
81
124
  setShowStack(showstack: boolean): void;
82
125
  setZIndex(zIndex: number): void;
@@ -95,9 +138,15 @@ export declare class RoutingVisualizerService implements IVisualizer, IRegionEdi
95
138
  downloadImage(): void;
96
139
  exportComposite(): void;
97
140
  setPlotType(plotType: PlotType): void;
141
+ /** @deprecated Use `getSurface3dControls()`. */
98
142
  setSurfaceDragMode(mode: string): void;
143
+ /** @deprecated Use `getSurface3dControls()`. */
99
144
  resetSurfaceCamera(): void;
145
+ /** The 3D decimate factor of the backend on screen (napari-js), else null. */
146
+ getVolumeResolution(): IVolumeResolution | null;
147
+ /** @deprecated Use `getVolumeResolution()?.set()`. */
100
148
  setResolutionScale(scale: number): void;
149
+ /** @deprecated Use `getVolumeResolution()?.get()`. */
101
150
  getResolutionScale(): number;
102
151
  /** The viewport of the backend on screen, for a contributed plot mode. Null
103
152
  * when that backend cannot provide one (e.g. OSD fell back to Plotly). */
@@ -107,13 +156,14 @@ export declare class RoutingVisualizerService implements IVisualizer, IRegionEdi
107
156
  cancelLoading(): void;
108
157
  isStackLoading(): Observable<boolean>;
109
158
  getStackLoadingProgress(): Observable<number>;
110
- getAutoscaleEvent(): Observable<any>;
159
+ getAutoscaleEvent(): Observable<void>;
160
+ /** The line-ROI profiles: sampled by the backend-neutral IntensityProfileService. */
111
161
  getIntensityProfile$(): Observable<IntensityProfile[]>;
112
162
  renderIntensityInset(divId: string, profiles: IntensityProfile[]): void;
113
163
  setRegions(regions: Region[], showRegionLabel?: boolean, isRegionSaveOn?: boolean, fillColor?: string, append?: boolean): void;
114
164
  getRegions(): Region[];
115
- getRegionPolygons(): any[];
116
- getRegionUpdateEvent(): Observable<any[]>;
165
+ getRegionPolygons(): Polygon[];
166
+ getRegionUpdateEvent(): Observable<Region[]>;
117
167
  setSelectedShapeIndices(indices: number[]): void;
118
168
  selectRegion(region: Region): void;
119
169
  getSelectedShapeIndices$(): Observable<number[]>;
@@ -129,9 +179,6 @@ export declare class RoutingVisualizerService implements IVisualizer, IRegionEdi
129
179
  upsertClass(preset: ClassPreset): void;
130
180
  removeClass(name: string): void;
131
181
  resetPresets(): void;
132
- plotPreviousShapes(): void;
133
- setPreviousShapes(shapes: any[]): void;
134
- getPreviousShapes(): any[];
135
182
  undo(): void;
136
183
  redo(): void;
137
184
  canUndo(): boolean;
@@ -140,6 +187,7 @@ export declare class RoutingVisualizerService implements IVisualizer, IRegionEdi
140
187
  getCanRedo$(): Observable<boolean>;
141
188
  resetUndoHistory(): void;
142
189
  importRegions(geoJsonStr: string): Region[];
190
+ /** Download `regions` as GeoJSON, named after the image last plotted. */
143
191
  exportRegions(regions: Region[]): void;
144
192
  getGeoJsonString(regions: Region[]): string;
145
193
  enterStackMode(slices: Map<number, Region[]>, initialZ?: number, saveLayout?: 'combined' | 'per-slice-file'): void;
@@ -170,26 +218,32 @@ export declare class RoutingVisualizerService implements IVisualizer, IRegionEdi
170
218
  setAnnotationRegions(regions: Region[], showRegionLabel?: boolean, isRegionSaveOn?: boolean, fillColor?: string): void;
171
219
  getSelectedRegions$(): Observable<Region[]>;
172
220
  setSelectedRegions(regions: Region[]): void;
173
- setWandMode(active: boolean, options?: any): void;
174
- setWandOptions(options: any): void;
221
+ setActiveTool(id: string | null, options?: CanvasToolOptions): void;
222
+ /** @deprecated Use {@link setActiveTool}. */
223
+ setWandMode(active: boolean, options?: IWandOptions): void;
224
+ setWandOptions(options: IWandOptions): void;
175
225
  clearActiveWandRegion(): void;
176
- setBrushMode(active: boolean, options?: any): void;
177
- setBrushOptions(options: any): void;
226
+ /** @deprecated Use {@link setActiveTool}. */
227
+ setBrushMode(active: boolean, options?: IBrushOptions): void;
228
+ setBrushOptions(options: IBrushOptions): void;
229
+ /** @deprecated Use {@link setActiveTool}. */
178
230
  setVertexEraserMode(active: boolean): void;
179
231
  setVertexEraserRadius(radius: number): void;
232
+ /** @deprecated Use {@link setActiveTool}. */
180
233
  setZoomToBoxMode(active: boolean): void;
181
234
  segmentRectangles(): Promise<number>;
182
235
  segmentRectanglesCellpose(): Promise<number>;
183
236
  setSamModel(id: string): void;
237
+ /** @deprecated Use {@link setActiveTool}. */
184
238
  setSamPointMode(active: boolean): void;
185
239
  commitSamPoints(): void;
186
240
  clearSamPoints(): void;
187
- getColormap(): Observable<any>;
188
- setColormap(colormap: any): void;
189
- getColormapOptions(): any;
241
+ getColormap(): Observable<ColormapNode | null>;
242
+ setColormap(colormap: ColormapNode): void;
243
+ getColormapOptions(): ColormapNode[];
190
244
  getReverseScale(): Observable<boolean>;
191
- setReverseScale(reverscale: any): void;
192
- setImageMeta(imageMeta: IImageMetadata[]): void;
245
+ setReverseScale(reverse: boolean): void;
246
+ setImageMeta(imageMeta: IImageMetadata[], imageKey?: string): void;
193
247
  getImageMeta(): Observable<IImageMetadata[]>;
194
248
  getHistogram(channelIndex: number, bins: number): IHistogram | null;
195
249
  getHistogram$(channelIndex: number, bins: number): Observable<IHistogram | null>;
@@ -212,60 +266,58 @@ export declare class RoutingVisualizerService implements IVisualizer, IRegionEdi
212
266
  * usable overlay.
213
267
  */
214
268
  getRegionOverlay(): IRegionOverlay;
215
- /**
216
- * Isosurface controls when available — always Plotly's, since the isosurface
217
- * plot type renders on Plotly (OSD only handles the image type).
218
- */
269
+ /** Isosurface controls of the backend on screen, when it renders isosurfaces. */
219
270
  getIsosurfaceControls(): IIsosurfaceControls | null;
220
- /** 3D scene controls — always Plotly's, since the 3D plot types render on
221
- * Plotly (OSD only handles the image type). */
271
+ /** 3D scene controls of the backend on screen (Plotly or napari-js), or null on a
272
+ * 2D-only one. */
222
273
  getSurface3dControls(): ISurface3dControls | null;
223
- /** Intensity (line-ROI) controls — always Plotly's, since the line profiles
224
- * render their inset on Plotly regardless of which backend draws the image. */
274
+ /** Intensity (line-ROI) controls, whichever backend draws the image: the
275
+ * IntensityProfileService adds the line to the store, and every backend
276
+ * (Plotly included) draws it from the store's update event. */
225
277
  getIntensityControls(): IIntensityControls | null;
226
278
  /**
227
- * Spatial-omics controls, or null when no `SPATIAL_DATA_PORT` is bound.
228
- *
229
- * Implemented HERE rather than on a backend because the state is
230
- * backend-neutral: the view state lives in the shared `VisualizerStore` (like
231
- * the colormap), so the controls keep working across a plot-type switch and a
232
- * host can drive them before any backend has mounted.
279
+ * Spatial-omics controls, or null when no `SPATIAL_DATA_PORT` is bound. Served by a
280
+ * backend-neutral {@link SpatialControlsFacade} (state in the shared stores), so the
281
+ * controls work across a plot-type switch and before any backend has mounted.
233
282
  */
234
283
  getSpatialControls(): ISpatialControls | null;
235
- /**
236
- * Whether `dataset` can answer this colour source.
237
- *
238
- * A column is checkable against the declared list. A gene is checkable only when
239
- * the dataset inlines its feature names — a dataset too wide to inline them
240
- * (typeahead-only) keeps the source, and a name that turns out not to exist
241
- * surfaces as the chart's "could not be charted" rather than as a silent reset.
242
- */
243
- private canColorBy;
244
- /** Memoised so consumers can hold the object across calls. */
245
- private spatialControls;
246
- /** Latest dataset, mirrored so `selectFromRegions()` can answer synchronously
247
- * — it runs from a button click and must not await a round-trip. */
248
- private currentSpatialDataset;
284
+ /** Created on first use; owns the dataset subscription. */
285
+ private spatialFacade;
249
286
  /** Displayed slice. Only a volume-backed spatial dataset reads it, to keep a
250
287
  * region drawn over one section from selecting the whole depth behind it. */
251
288
  private currentZIndex;
252
- private spatialDatasetSub;
253
- /** Load pixel frames for intensity sampling when OpenSeadragon owns the image
254
- * (it doesn't feed Plotly's frame cache). No-op needed when Plotly renders. */
289
+ /** Angular calls this when the injector providing the router is destroyed — the host
290
+ * component for a `provideVisualization()` chain. The dataset subscription would
291
+ * otherwise keep the whole isolated chain reachable from the root data port. */
292
+ ngOnDestroy(): void;
293
+ /**
294
+ * Intensity-profile sampling, whichever backend is on screen: the sampling is the
295
+ * backend-neutral IntensityProfileService's; the viewport changes come from every
296
+ * backend that reports them (OpenSeadragon, napari-js), merged into one stable
297
+ * stream the inset subscribes to once.
298
+ */
299
+ getIntensitySampling(): IIntensitySampling;
300
+ private readonly intensitySampling;
301
+ /** @deprecated Use `getIntensitySampling().ensureIntensitySampling()`. */
255
302
  ensureIntensitySampling(imageInfo: IImageInfo, zIndex: number): Promise<void>;
256
- /** Visible-region changes from the OpenSeadragon viewer (image-pixel coords),
257
- * so the intensity inset can re-sample at the current zoom level. Plotly's own
258
- * high-def zoom updates the sampling cache inline, so only OSD feeds this. */
303
+ /** Crops for sampling are sized from the plot div (whichever backend renders into it). */
304
+ private pointSamplingAtPlot;
305
+ /** @deprecated Use `getIntensitySampling().getViewportChange$()`. */
259
306
  getViewportChange$(): Observable<{
260
307
  x: number;
261
308
  y: number;
262
309
  width: number;
263
310
  height: number;
264
311
  }>;
265
- /** Re-sample the intensity profiles from a fresh crop of the given image-pixel
266
- * ROI at display resolution (sampling always lives in Plotly). */
312
+ /** @deprecated Use `getIntensitySampling().refreshIntensitySamplingForRoi()`. */
267
313
  refreshIntensitySamplingForRoi(x: number, y: number, width: number, height: number, zIndex: number): void;
314
+ /** The visualizer view is going away: detach every backend — dropping their view-bound
315
+ * subscriptions and disposing the napari-js viewer, whose canvas, render loop and GPU
316
+ * buffers would otherwise outlive the view (for a component-scoped chain, forever).
317
+ * Nothing is on screen afterwards, so the next plot starts from the default backend. */
318
+ detach(): void;
319
+ /** @deprecated Use {@link detach}. */
268
320
  unsubscribe(): void;
269
- static ɵfac: i0.ɵɵFactoryDeclaration<RoutingVisualizerService, [null, null, null, null, null, null, null, { optional: true; }]>;
321
+ static ɵfac: i0.ɵɵFactoryDeclaration<RoutingVisualizerService, [null, null, null, null, null, null, null, null, { optional: true; }]>;
270
322
  static ɵprov: i0.ɵɵInjectableDeclaration<RoutingVisualizerService>;
271
323
  }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * The transcript-density raster's window. Its default colour scale is matplotlib's
3
+ * inferno (`INFERNO_LUT` from napari-js/colormaps), as in Xenium Explorer.
4
+ */
5
+ /** A density window from the non-empty bins: 1st to 99th percentile. */
6
+ export declare function densityAutoRange(values: ArrayLike<number>): [number, number];
@@ -0,0 +1,123 @@
1
+ import { BehaviorSubject } from 'rxjs';
2
+ import type { SpatialEmbedding, SpatialEmbeddingMeta } from '../contracts/spatial-dataset.contract';
3
+ /** Where a browser-side embedding computation stands, for the progress bar and messages. */
4
+ export interface EmbeddingComputeState {
5
+ /** True while a run is going. */
6
+ running: boolean;
7
+ /** 0..1 while running, or null before the first report. */
8
+ fraction: number | null;
9
+ /** Which backend the worker got — 'webgpu', 'wasm' or 'cpu'. */
10
+ backend: string | null;
11
+ message: string | null;
12
+ error: string | null;
13
+ }
14
+ /** Where the PCA scores come from: a port that serves embeddings by name. */
15
+ export type EmbeddingSource = (name: string) => Promise<SpatialEmbedding>;
16
+ /**
17
+ * Largest dataset a t-SNE is offered for in the browser.
18
+ *
19
+ * t-SNE is O(N²) per iteration — vectorised on the GPU, but not approximated — so the cost
20
+ * is quadratic in observations. Measured end to end in Firefox on WebGPU: 2,688 points took
21
+ * 95 s. That scales to roughly five and a half minutes at this threshold, and to about 76
22
+ * minutes at seqFISH's 19,416, which was also measured offline.
23
+ *
24
+ * Past this the option is WITHDRAWN rather than offered with a warning. An hour-long job
25
+ * started from a button is not a choice a reader can meaningfully consent to in a dialog,
26
+ * and a t-SNE that large belongs in the offline pipeline, where it can run once and be
27
+ * served to everyone.
28
+ */
29
+ export declare const BROWSER_TSNE_MAX_OBSERVATIONS = 5000;
30
+ /**
31
+ * A t-SNE the dataset does not publish, offered so it can be computed here.
32
+ *
33
+ * A dropped-in `.h5ad` typically carries one UMAP and a PCA, and no t-SNE — the two views
34
+ * answer different questions, so having only one is a real gap. Computing it needs no
35
+ * expression data: t-SNE runs on the PCA scores, which is why this can happen in the
36
+ * browser at all while PCA cannot.
37
+ */
38
+ export declare const COMPUTABLE_EMBEDDINGS: readonly SpatialEmbeddingMeta[];
39
+ /** Roughly how long a t-SNE of `n` observations takes, in seconds, from the measured anchor. */
40
+ export declare function tsneEstimateSeconds(n: number): number;
41
+ /** A duration as something to put on a button: `~42s`, `~6 min`. */
42
+ export declare function estimateLabel(seconds: number): string;
43
+ /**
44
+ * The browser-side embedding computation behind the charts' Embedding tab: which
45
+ * embeddings to offer for a dataset, the t-SNE run itself (PCA scores from the port, then a
46
+ * worker), its progress, and the results computed this session.
47
+ *
48
+ * A run is several awaits long — the PCA scores arrive over HTTP, then the worker takes a
49
+ * minute or more — and the dataset can change at any of them, including before the run
50
+ * exists to be terminated. Every await is checked against a {@link Supersede} that a
51
+ * dataset switch ({@link setDataset}) or teardown ({@link abandon}) cancels, so the scores
52
+ * fetched for one dataset are never embedded and drawn over another's observations.
53
+ *
54
+ * Plain class: the owner renders {@link state} (or {@link state$}).
55
+ */
56
+ export declare class EmbeddingComputeCoordinator {
57
+ readonly state$: BehaviorSubject<EmbeddingComputeState>;
58
+ /** True when a t-SNE is missing but the dataset is too big to embed here. */
59
+ tooLarge: boolean;
60
+ /** Observations in the live dataset, kept for the cost estimate. */
61
+ observationCount: number;
62
+ /** Coordinates computed in this browser, by name. Not persisted: a reload recomputes. */
63
+ private readonly computed;
64
+ /** The live run, when one is going. */
65
+ private run;
66
+ private readonly load;
67
+ get state(): EmbeddingComputeState;
68
+ get running(): boolean;
69
+ /**
70
+ * A new dataset: drop everything computed or computing for the previous one, and return
71
+ * the embeddings to offer — the published ones, plus a t-SNE to compute where the dataset
72
+ * has a PCA to embed, no t-SNE of its own, and is small enough. Otherwise the menu would
73
+ * advertise work that cannot start, or duplicate what is already served.
74
+ */
75
+ setDataset(published: readonly SpatialEmbeddingMeta[], observationCount: number): SpatialEmbeddingMeta[];
76
+ /** Whether `meta` is one this browser would have to compute. */
77
+ isComputable(meta: SpatialEmbeddingMeta | null): boolean;
78
+ /** Whether `meta` has already been computed this session. */
79
+ isComputed(meta: SpatialEmbeddingMeta | null): boolean;
80
+ /** The coordinates computed for `name`, if any. */
81
+ result(name: string): SpatialEmbedding | undefined;
82
+ /** Roughly how long a run would take here, in seconds. Shown before the click: a progress
83
+ * bar tells you a job is going; only an estimate tells you whether to start it. */
84
+ get estimateSeconds(): number;
85
+ /** {@link estimateSeconds} as something to put on a button. */
86
+ get estimateLabel(): string;
87
+ /** Why the option is absent, when a dataset is past the threshold. */
88
+ get tooLargeNote(): string;
89
+ /**
90
+ * Compute `meta` here, in a worker, from the dataset's PCA among `embeddings`.
91
+ *
92
+ * The PCA scores come from the port as an ordinary embedding — the server derives them,
93
+ * because PCA needs the whole expression matrix (185 MB for a Visium dataset) while
94
+ * t-SNE needs only the scores (0.51 MB). Sending the matrix to the browser to save a few
95
+ * seconds of arithmetic would be a far slower answer.
96
+ *
97
+ * @returns the coordinates, to draw — or null when there is nothing to draw: cancelled,
98
+ * abandoned, failed (see {@link state}), or already running.
99
+ */
100
+ start(meta: SpatialEmbeddingMeta, embeddings: readonly SpatialEmbeddingMeta[], getEmbedding: EmbeddingSource): Promise<SpatialEmbedding | null>;
101
+ /** The user's Cancel: ask the worker to stop. The run settles shortly after, with nothing. */
102
+ cancel(): void;
103
+ /**
104
+ * Drop any computation in progress, because what it is computing no longer applies.
105
+ *
106
+ * Distinct from {@link cancel}: this does not wait — the run is settled and the worker
107
+ * killed, so a dataset switch or a teardown cannot leave a t-SNE grinding on in the
108
+ * background over observations nothing is showing any more.
109
+ */
110
+ abandon(): void;
111
+ private patch;
112
+ }
113
+ /**
114
+ * The dataset's PCA, as row-major scores.
115
+ *
116
+ * Assembled from whichever PCA the source offers, widest first — a 3-D one gives t-SNE
117
+ * three components instead of two for the same request.
118
+ */
119
+ export declare function loadPcaScores(embeddings: readonly SpatialEmbeddingMeta[], getEmbedding: EmbeddingSource): Promise<{
120
+ scores: Float32Array;
121
+ nObs: number;
122
+ nDims: number;
123
+ } | null>;
@@ -18,6 +18,7 @@ export interface ComputeProgress {
18
18
  backend: string | null;
19
19
  message: string | null;
20
20
  }
21
+ /** One t-SNE to compute: the PCA scores to embed and the run's parameters. */
21
22
  export interface ComputeRequest {
22
23
  /** PCA scores, row-major `nObs x nDims`. */
23
24
  scores: Float32Array;
@@ -28,12 +29,30 @@ export interface ComputeRequest {
28
29
  iterations?: number;
29
30
  seed?: number;
30
31
  }
31
- /** Factory, so a test can supply a worker without a bundler. */
32
- export type WorkerFactory = () => Worker;
32
+ /**
33
+ * Factory, so a test can supply a worker without a bundler. May be asynchronous, as the
34
+ * default one is: it imports the worker module on demand.
35
+ */
36
+ export type WorkerFactory = () => Worker | Promise<Worker>;
37
+ /**
38
+ * One t-SNE run in its own worker: start it, follow its progress, cancel it. Single use —
39
+ * a new computation takes a new run.
40
+ */
33
41
  export declare class EmbeddingComputeRun {
34
42
  private readonly factory?;
35
43
  private worker;
36
44
  private settled;
45
+ /**
46
+ * Between `run()` being called and the worker existing.
47
+ *
48
+ * The default factory imports the worker module first, and a dataset switch or a
49
+ * teardown can call {@link terminate} in that window. With no worker yet there is
50
+ * nothing to kill, so terminating bumps {@link generation} instead and the run stops
51
+ * itself the moment the worker arrives, before posting it any work.
52
+ */
53
+ private starting;
54
+ /** Bumped by {@link terminate}; a run that finds it changed across its await gives up. */
55
+ private generation;
37
56
  /**
38
57
  * Settles a run that is still waiting, set for as long as one is.
39
58
  *
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Transcript "icon" mode: the marker shapes, and their outlines for the panel's previews.
3
+ * The napari view draws them as napari-js point symbols (`GLYPH_SYMBOLS` in
4
+ * `spatial-tiles/transcript-layers.ts`), with these outlines' proportions.
5
+ */
6
+ /** Marker shapes for the transcript "icon" mode. */
7
+ export declare const TRANSCRIPT_GLYPHS: readonly ["circle", "star", "triangle", "square", "diamond", "cross", "hexagon", "triangle-down", "pentagon", "x"];
8
+ /** One of the marker shapes in {@link TRANSCRIPT_GLYPHS}. */
9
+ export type TranscriptGlyph = (typeof TRANSCRIPT_GLYPHS)[number];
10
+ /**
11
+ * Unit outline of a glyph, radius ≈ 1, centred on the origin, as `[x0, y0, x1, y1, …]` — the
12
+ * panel's preview of the point symbol the canvas draws.
13
+ */
14
+ export declare function glyphOutline(glyph: TranscriptGlyph): Float32Array;
15
+ /** The glyph a gene gets by default: by its position in the selected list. */
16
+ export declare function defaultGlyphFor(slot: number): TranscriptGlyph;
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Level-of-detail planning for tiled spatial geometry — cell outlines and transcripts.
3
+ *
4
+ * The renderer knows its camera (a world-space centre, a zoom in canvas pixels per world
5
+ * unit, a canvas size); a tiled dataset knows its grids (one per level, in observation
6
+ * units). This module is the bridge: which level the zoom calls for and which tiles are on
7
+ * screen. Everything here is pure, so the policy — the part that decides whether the view
8
+ * is fast and legible — is testable without a GPU.
9
+ *
10
+ * Observation units map onto world units through the dataset's `imageRef` affine
11
+ * (`world = data · scale + translate`), so "pixels per observation unit" is
12
+ * `zoom · scale`. For a Xenium bundle the data unit is the micron and the world unit the
13
+ * morphology pixel.
14
+ */
15
+ import type { SpatialBounds, SpatialDataset, SpatialImageRef, SpatialTileLevel } from '../contracts/spatial-dataset.contract';
16
+ import type { SpatialViewState } from '../contracts/display-types';
17
+ /** A rectangle in observation coordinates. */
18
+ export interface DataRect {
19
+ x0: number;
20
+ y0: number;
21
+ x1: number;
22
+ y1: number;
23
+ }
24
+ /** Tile address. */
25
+ export interface TileKey {
26
+ level: number;
27
+ gx: number;
28
+ gy: number;
29
+ }
30
+ /** Whether cell outlines are drawn: the user's choice, else on when the dataset has any. */
31
+ export declare function cellsShown(dataset: Pick<SpatialDataset, 'polygonTiles' | 'polygons'> | null, view: Pick<SpatialViewState, 'showCells'>): boolean;
32
+ /** A column holding a hand-curated cell-type annotation, by naming convention. */
33
+ export declare function isCuratedColumn(name: string): boolean;
34
+ /**
35
+ * The categorical column that names each cell's type: the view's choice when it is a
36
+ * column of this dataset, else the first categorical column that is not a curated
37
+ * annotation (a pipeline's clustering is the default; curation is opted into), else
38
+ * any categorical column.
39
+ */
40
+ export declare function cellTypeColumnFor(dataset: SpatialDataset, view: Pick<SpatialViewState, 'cellTypeColumn'>): string | null;
41
+ /** A stable string id for a tile key, `level/gx/gy` — usable as a Map key. */
42
+ export declare function tileId(k: TileKey): string;
43
+ /** Canvas pixels per observation unit along x, for a camera zoom and a data→world affine. */
44
+ export declare function pixelsPerDataUnit(zoom: number, ref?: SpatialImageRef | null): number;
45
+ /**
46
+ * The part of observation space the camera shows, padded by `margin` (a fraction of the
47
+ * viewport) so tiles just off screen are already there when a pan brings them in: napari-js's
48
+ * `worldViewport`, mapped back through the inverse of the data→world affine.
49
+ */
50
+ export declare function visibleDataRect(center: readonly [number, number], zoom: number, canvasW: number, canvasH: number, ref?: SpatialImageRef | null, margin?: number): DataRect | null;
51
+ /**
52
+ * Tiles of one level intersecting `rect`, clipped to the dataset's `bounds` (so zooming
53
+ * out over empty canvas does not ask for tiles that cannot exist). Ordered from the
54
+ * rectangle's centre outward, so the middle of the screen fills in first.
55
+ *
56
+ * Tile `g` covers `[g·s, (g+1)·s)`. The view's far edge is open — a tile starting exactly
57
+ * at `rect.x1` shows nothing — but the bounds' far edge is closed: the bounds are the
58
+ * extreme observations' coordinates, so one sits exactly on `bounds[2]`, in the tile
59
+ * starting there.
60
+ */
61
+ export declare function tilesInRect(rect: DataRect, level: number, levels: readonly SpatialTileLevel[], bounds?: SpatialBounds | null, limit?: number): TileKey[];
62
+ /** {@link tilesInRect} for a grid whose tile (0, 0) starts at `origin`. */
63
+ export declare function tilesInRectFrom(origin: readonly [number, number], rect: DataRect, level: number, levels: readonly SpatialTileLevel[], bounds?: SpatialBounds | null, limit?: number): TileKey[];
64
+ /** Area of `rect` inside `bounds` (the whole rect when there are none). */
65
+ export declare function visibleArea(rect: DataRect, bounds?: SpatialBounds | null): number;
66
+ /**
67
+ * Typical cell diameter, in observation units, used to judge how large cells appear.
68
+ * Derived from the per-observation radius when there is one; 12 µm otherwise.
69
+ */
70
+ export declare function typicalCellDiameter(radius: Float32Array | number | undefined, fallback?: number): number;
71
+ /**
72
+ * On-screen cell diameter (px) at or above which each polygon level is used. A level
73
+ * halves the vertices of the one below, so each should take over when the cell is about
74
+ * half as large on screen. Below the last finite threshold outlines are not drawn at
75
+ * all — a cell a few pixels wide is a dot, and the observation markers already draw it
76
+ * as one.
77
+ *
78
+ * Xenium's fourth level (3 vertices per cell) is deliberately never used: seen on
79
+ * screen it is a field of triangles, which reads as an artefact rather than as cells.
80
+ * The dots below 8 px say the same thing more honestly.
81
+ */
82
+ export declare const POLYGON_LEVEL_MIN_CELL_PX: number[];
83
+ /**
84
+ * Which polygon level suits this zoom, or -1 for "too small to outline".
85
+ * `detail` > 1 prefers finer levels (sharper, slower); < 1 coarser.
86
+ */
87
+ export declare function polygonLevelFor(pxPerUnit: number, cellDiameter: number, levelCount: number, detail?: number): number;
88
+ /**
89
+ * Which transcript level suits this zoom: the one whose tiles come out closest to
90
+ * `targetTilePx` on screen. Coarser levels aggregate more, so this keeps the number of
91
+ * markers per screen roughly constant however far out the camera is — the property that
92
+ * keeps the view fast.
93
+ */
94
+ export declare function transcriptLevelFor(pxPerUnit: number, levels: readonly SpatialTileLevel[], targetTilePx?: number): number;
@@ -0,0 +1,64 @@
1
+ import { Observable } from 'rxjs';
2
+ import { PlotType } from '../contracts/plot-type';
3
+ import { SpatialDataPort } from '../contracts/ports/spatial-data.port';
4
+ import { SpatialObservations } from '../contracts/spatial-dataset.contract';
5
+ import { ISpatialControls } from '../contracts/visualizer.contract';
6
+ import { RegionStore } from '../store/region-store.service';
7
+ import { SpatialSelectionStore } from '../store/spatial-selection.service';
8
+ import { VisualizerStore } from '../store/visualizer-store.service';
9
+ /** The renderer-side spatial readouts the controls surface (the napari-js backend). */
10
+ export interface SpatialRendererFeeds {
11
+ readonly transcriptEstimate$: {
12
+ asObservable(): Observable<{
13
+ points: number;
14
+ max: number;
15
+ } | null>;
16
+ };
17
+ readonly geneCountsInView$: {
18
+ asObservable(): Observable<Record<string, number> | null>;
19
+ };
20
+ readonly densityStats$: {
21
+ asObservable(): Observable<{
22
+ lo: number;
23
+ hi: number;
24
+ max: number;
25
+ } | null>;
26
+ };
27
+ /** Observations projected to canvas pixels by the 3D camera, or null when the cloud is not mounted. */
28
+ getSpatialScreenProjection(obs: SpatialObservations): Float32Array | null;
29
+ }
30
+ /** What the facade works over: the shared stores, the renderer feeds and the router's view state. */
31
+ export interface SpatialControlsContext {
32
+ readonly store: VisualizerStore;
33
+ readonly regionStore: RegionStore;
34
+ readonly selectionStore: SpatialSelectionStore;
35
+ readonly napari: SpatialRendererFeeds;
36
+ /** The plot type on screen (the 3D cloud selects in screen space). */
37
+ plotType(): PlotType;
38
+ /** The displayed slice (a volume-backed dataset selects within one section). */
39
+ zIndex(): number;
40
+ }
41
+ /**
42
+ * The spatial-omics controls (`ISpatialControls`) over a host's `SPATIAL_DATA_PORT`.
43
+ *
44
+ * Backend-neutral: the view state lives in the shared `VisualizerStore` (like the
45
+ * colormap) and the selection in the `SpatialSelectionStore`, so the controls keep
46
+ * working across a plot-type switch and a host can drive them before any backend has
47
+ * mounted. Owns its mirror of the port's dataset — dropping a stale selection and an
48
+ * unsatisfiable colour source when the dataset changes — and the subscription behind
49
+ * it, released by {@link dispose} (review CORE-30).
50
+ */
51
+ export declare class SpatialControlsFacade {
52
+ private readonly port;
53
+ private readonly ctx;
54
+ /** The controls; one object for the facade's life, so consumers can hold it. */
55
+ readonly controls: ISpatialControls;
56
+ /** Latest dataset, mirrored so `selectFromRegions()` can answer synchronously — it
57
+ * runs from a button click and must not await a round-trip. */
58
+ private dataset;
59
+ private readonly sub;
60
+ constructor(port: SpatialDataPort, ctx: SpatialControlsContext);
61
+ /** Release the port subscription (the router's injector is being destroyed). */
62
+ dispose(): void;
63
+ private build;
64
+ }