@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
@@ -0,0 +1,104 @@
1
+ import { MultiChannelVolumeView } from 'napari-js';
2
+ import type { AxisLabelSpec } from 'napari-js/overlays';
3
+ import { IImageInfo } from '../../contracts/image.contract';
4
+ import { IHistogram } from '../../contracts/channel-histogram-api.contract';
5
+ import { IIsosurfaceControls, ISurface3dControls } from '../../contracts/visualizer.contract';
6
+ import { Axes3dGizmo, Box3 } from './napari-axes-gizmo';
7
+ import type { NapariScene, SceneContext } from './napari-scene';
8
+ /**
9
+ * NAPARI_VOLUME / NAPARI_ISOSURFACE (review Appendix B, cluster F): the stack assembled into a
10
+ * decimated volume — one additive, tinted `VolumeLayer` per channel for a multichannel image, a
11
+ * single grayscale volume otherwise — with the axes gizmo and the in-view Z-height handle.
12
+ */
13
+ export declare class VolumeScene implements NapariScene {
14
+ private readonly ctx;
15
+ private readonly info;
16
+ private readonly rendering;
17
+ /** napari-js high-level view owning the volume layers. */
18
+ view: MultiChannelVolumeView | null;
19
+ /** True when the volume is composited from per-channel layers (vs a single grayscale volume). */
20
+ private multichannel;
21
+ /** Volume world box at Z-scale 1 (base) + the sampled voxel depth — enough to recompute the
22
+ * Z-axis voxel scale, axes depth, and overlay anchors as the handle stretches Z. */
23
+ private worldBase;
24
+ private sampledDepth;
25
+ private dims;
26
+ /** Assembled uint8 volume data per channel (key = channel index), kept for the volume intensity
27
+ * histogram. Key 0 holds the grayscale/composite volume in the single-channel case. */
28
+ private readonly channelData;
29
+ gizmo: Axes3dGizmo | null;
30
+ private zHandle;
31
+ private displaySub;
32
+ constructor(ctx: SceneContext, info: IImageInfo | undefined, rendering: 'iso' | 'mip');
33
+ /**
34
+ * Assemble and render the volume, then add the axes gizmo + labels and the Z handle and follow
35
+ * the display state.
36
+ */
37
+ mount(): Promise<void>;
38
+ /**
39
+ * Assemble each channel's volume from the server tiles (or the single grayscale volume) under
40
+ * the stack progress bar, with the display settings it is drawn with. `dims` is null when
41
+ * nothing was assembled (a Cancel, a new plot, or no slices).
42
+ */
43
+ private assembleChannels;
44
+ /** The volume's world box for the assembled `dims`, independent of the decimate factor. */
45
+ private worldBox;
46
+ /**
47
+ * The whole stack is already on screen: no plane to step. (This used to write `viewer.dims.z`,
48
+ * which only a tiled 2D image reads — a volume raymarches every slice — and schedule a readback
49
+ * of a frame that had not changed. The toolbar shows no slice control in volume / isosurface
50
+ * mode, as Plotly's isosurface ignores the slice too.)
51
+ */
52
+ setZ(): void;
53
+ /** The intensity histogram of the assembled (downsampled) uint8 volume for the requested
54
+ * channel (multichannel) or the single grayscale volume. */
55
+ histogram(channel: number, bins: number): IHistogram | null;
56
+ isoControls(): IIsosurfaceControls | null;
57
+ surface3dControls(): ISurface3dControls | null;
58
+ dispose(): void;
59
+ /**
60
+ * Restretch the volume's Z height live (driven by the in-view {@link NapariVolumeZHandle}). Only
61
+ * the per-axis `voxelSize` / axes depth change — the voxel textures are untouched — so dragging is
62
+ * smooth. `factor` is relative to the volume's natural proportions (1). Persists across re-mounts
63
+ * (resolution changes) so the chosen height sticks.
64
+ */
65
+ setZScale(factor: number): void;
66
+ /** The X/Y/Z axis-end label specs for the gizmo. Anchors are in the volume's centred world box
67
+ * (matching the AxesLayer geometry); the scale text reflects the FULL image extent — physical µm
68
+ * when µm/pixel is known, else pixel (X/Y) / slice (Z) counts. */
69
+ axesLabels(vol: Box3): AxisLabelSpec[];
70
+ /**
71
+ * The image's declared extent in pixels/slices, and its physical spacing per
72
+ * axis in µm (0 = undeclared, and then that axis reads in pixels).
73
+ *
74
+ * One place, because the volume world box and the axis labels have to agree
75
+ * about what the image's real dimensions are — the sampled grid is decimated and
76
+ * says nothing about either.
77
+ */
78
+ private imageExtent;
79
+ /** The store's colormap, reverse, invert and channel windows → the volume's transfer function:
80
+ * colour (channel tint or selected colormap), the intensity window (min/max → contrastLimits)
81
+ * and gamma, mirroring the grayscale image's display controls so the histogram pane drives the
82
+ * 3D render. */
83
+ private followDisplayState;
84
+ }
85
+ /**
86
+ * NAPARI_SCATTER3D (review Appendix B, cluster H): the downsampled voxel grid as a 3D point cloud
87
+ * coloured by intensity (the napari-js analog of Plotly's voxel scatter3d). Assembles a coarse
88
+ * volume, then emits a flat-strided sample of voxels (capped at `SCATTER3D_MAX_POINTS`).
89
+ */
90
+ export declare class Scatter3dScene implements NapariScene {
91
+ private readonly ctx;
92
+ private readonly info;
93
+ private layer;
94
+ /** The assembled volume (key 0), for the intensity histogram. */
95
+ private readonly channelData;
96
+ private displaySub;
97
+ constructor(ctx: SceneContext, info: IImageInfo | undefined);
98
+ mount(): Promise<void>;
99
+ /** The whole stack is already on screen: no plane to step. */
100
+ setZ(): void;
101
+ histogram(channel: number, bins: number): IHistogram | null;
102
+ surface3dControls(): ISurface3dControls | null;
103
+ dispose(): void;
104
+ }
@@ -1,14 +1,10 @@
1
- /**
2
- * Draggable Z-height handle for the napari-js WebGPU volume (jit-ui#102). A small DOM grip is drawn
3
- * over the 3D canvas at the projected top-face centre of the volume box (reusing the axes-label
4
- * {@link projectPoint} projection, so it tracks the box as the volume orbits). Dragging it up makes
5
- * the volume taller, down makes it flatter — the host maps the drag to a Z-scale factor and
6
- * restretches the volume + axes live (only the model matrix changes; the voxel texture is untouched).
7
- *
8
- * Direct-manipulation counterpart of {@link NapariAxesLabels}: both are absolute-positioned overlays
9
- * updated on every `camera3d.changed`, but this one accepts pointer input.
10
- */
11
- import { AxesLabelCamera3D } from './napari-axes-labels';
1
+ /** The slice of napari's Camera3D the handle reads. `viewProjection` is column-major (gl-matrix). */
2
+ export interface ZHandleCamera3D {
3
+ viewProjection(vw: number, vh: number): ArrayLike<number>;
4
+ readonly changed: {
5
+ connect(listener: () => void): () => void;
6
+ };
7
+ }
12
8
  export interface VolumeZHandleOptions {
13
9
  /** Current top-face-centre world point (the box is centred at the origin, so `[0, 0, +halfZ]`). */
14
10
  topAnchor: () => [number, number, number];
@@ -33,7 +29,7 @@ export declare class NapariVolumeZHandle {
33
29
  private dragging;
34
30
  private startY;
35
31
  private startScale;
36
- constructor(host: HTMLElement, camera3d: AxesLabelCamera3D, opts: VolumeZHandleOptions);
32
+ constructor(host: HTMLElement, camera3d: ZHandleCamera3D, opts: VolumeZHandleOptions);
37
33
  setVisible(visible: boolean): void;
38
34
  /** Reproject the handle to the current top-face anchor. Called on camera move, resize, and after
39
35
  * the host applies a new scale (so the grip follows the growing/shrinking box). */
@@ -0,0 +1,59 @@
1
+ import type { ToScreen } from '../../../region-overlay/region-geometry';
2
+ import { Affine } from '../../../region-overlay/svg-region-renderer';
3
+ import type { OverlayViewer } from '../napari-region-overlay';
4
+ /**
5
+ * The region overlay's coordinate spaces: pointer CLIENT pixels, svg-LOCAL pixels and WORLD
6
+ * units, through the viewer's own transforms (see {@link OverlayViewer}).
7
+ *
8
+ * World → svg-local is the viewer's camera affine (`canvasTransform`), which reads no layout, so
9
+ * drawing and following the camera read none. Only a pointer, in client pixels, needs the svg's
10
+ * client origin: read once per {@link withOrigin} block (a gesture event), as an uncached read
11
+ * per vertex — interleaved with the elements a redraw appends — forced a synchronous layout per
12
+ * vertex (review NAPARI-BOUNDARY-10).
13
+ */
14
+ export declare class OverlayProjection {
15
+ private readonly svg;
16
+ private readonly viewer;
17
+ /**
18
+ * How finely a drawn vertex may be placed, in world units.
19
+ *
20
+ * One by default, because for an image the world IS pixels and a region should align to
21
+ * them. A dataset whose coordinates are not pixels sets it finer — seqFISH's whole
22
+ * sample spans about 5 x 7 units, where whole-unit vertices leave roughly six by eight
23
+ * placeable positions and no ROI can be drawn at all.
24
+ */
25
+ private worldQuantum;
26
+ /** The svg's client origin and the camera affine, cached while a {@link withOrigin} block runs. */
27
+ private origin;
28
+ private camera;
29
+ constructor(svg: SVGSVGElement, viewer: OverlayViewer);
30
+ setWorldQuantum(quantum: number): void;
31
+ /** Pointer client coords → world coords, snapped to the world quantum (for placing vertices). */
32
+ toImage(clientX: number, clientY: number): [number, number];
33
+ /** Pointer client coords → world coords, exact (for picking: snapping is for placing). */
34
+ toWorld(clientX: number, clientY: number): [number, number];
35
+ /**
36
+ * World units spanned by one screen pixel, measured through the viewer's own transform.
37
+ *
38
+ * Read from the transform rather than from the camera, so it holds for both the 2D and
39
+ * the 3D screen-space adapters without either having to expose a zoom. Falls back to 1
40
+ * if the transform gives nothing usable, which keeps the established pixel behaviour
41
+ * rather than collapsing the threshold to zero and recording a point per event.
42
+ */
43
+ worldPerCanvasPixel(): number;
44
+ /** Run `fn` with the svg's client origin and the camera affine read once (nested calls reuse them). */
45
+ withOrigin<T>(fn: () => T): T;
46
+ /** Client px → SVG-local px. */
47
+ clientToLocal(clientX: number, clientY: number): [number, number];
48
+ /** World coords → SVG-local px, through the camera affine: no layout read. */
49
+ toLocal(imgX: number, imgY: number): [number, number];
50
+ /** {@link toLocal} as the shared region geometry takes it. */
51
+ readonly toScreen: ToScreen;
52
+ /** Screen distance (px) between a client point and a world point. */
53
+ screenDist(clientX: number, clientY: number, imgX: number, imgY: number): number;
54
+ /**
55
+ * The world → svg-local affine for the current camera: the viewer's `canvasTransform`, which
56
+ * reads no layout. The svg and the canvas share an origin (see {@link OverlayViewer}).
57
+ */
58
+ affine(): Affine;
59
+ }
@@ -0,0 +1,15 @@
1
+ import type { HandleHit } from '../../../region-overlay/region-geometry';
2
+ import type { RegionStore } from '../../../store/region-store.service';
3
+ /**
4
+ * A live drag of the select/move tools: the region's body, or one of its handles as the
5
+ * shared `hitHandle` names it (a rectangle corner with its fixed opposite `anchor`, or a
6
+ * vertex / bézier control point on `ring` -1 for the exterior, else a hole).
7
+ */
8
+ export type RegionEdit = {
9
+ id: number;
10
+ last: [number, number];
11
+ } & ({
12
+ kind: 'body';
13
+ } | HandleHit);
14
+ /** Apply the drag of `edit` to the pointer at world point `(x, y)`, through the store's edit ops. */
15
+ export declare function applyRegionEdit(store: RegionStore, edit: RegionEdit, x: number, y: number): void;
@@ -0,0 +1,54 @@
1
+ import { Region } from '../../../models/region';
2
+ import type { RegionStore } from '../../../store/region-store.service';
3
+ import { Affine } from '../../../region-overlay/svg-region-renderer';
4
+ /** Rendered handle size (screen px). */
5
+ export declare const HANDLE_SIZE = 7;
6
+ /** An axis-aligned box from a drag's start to its current point (any order). */
7
+ export interface DragBox {
8
+ x0: number;
9
+ y0: number;
10
+ x1: number;
11
+ y1: number;
12
+ }
13
+ /** A region being drawn: a rectangle drag, or a freehand / click-placed path. */
14
+ export interface RegionDraft {
15
+ rect: DragBox | null;
16
+ path: Array<[number, number]> | null;
17
+ }
18
+ /**
19
+ * What the napari region overlay draws, over the shared {@link SvgRegionRenderer}: the regions
20
+ * in world coordinates (styled from the store's colours, labelled when labels are on), and in
21
+ * screen space the selected regions' grab handles (corners, vertices, bézier control points),
22
+ * the draft being drawn and the rubber-band marquee.
23
+ */
24
+ export declare class NapariRegionSvgRenderer {
25
+ private readonly svg;
26
+ private readonly store;
27
+ private readonly renderer;
28
+ /** Dedicated marquee rect element, updated directly during the drag (no full region redraw). */
29
+ private marqueeEl;
30
+ constructor(svg: SVGSVGElement, store: RegionStore);
31
+ /** Follow the camera: one transform attribute plus the screen-space elements. */
32
+ setCamera(affine: Affine): void;
33
+ /** Rebuild the regions (world space) and their labels. */
34
+ render(regions: readonly Region[], selected: readonly number[]): void;
35
+ /** Rebuild the screen-space overlay only: the selected regions' handles and the draft. */
36
+ renderOverlay(regions: readonly Region[], selected: readonly number[], draft: RegionDraft): void;
37
+ /** Show the marquee over svg-local corners `(lx, ly)`–`(rx, ry)`, creating it on first use. */
38
+ showMarquee(lx: number, ly: number, rx: number, ry: number): void;
39
+ /** Remove the marquee element from the SVG. */
40
+ clearMarquee(): void;
41
+ /** A region's outline colour. */
42
+ private strokeOf;
43
+ /** Draw a region's classification label at its top-left, when labels are enabled (matches OSD). */
44
+ private drawLabel;
45
+ /** Draw grab handles for a selected region: rectangle corners or polygon vertices. */
46
+ private drawHandles;
47
+ /** Draw one bezier control point as a small circle connected to its anchor by a tangent line.
48
+ * `handle` is the control point's absolute position in image space. */
49
+ private drawBezierHandle;
50
+ private style;
51
+ /** Draw the in-progress rectangle / path preview. */
52
+ private drawDraft;
53
+ private styleDraft;
54
+ }
@@ -0,0 +1,26 @@
1
+ import type { SpatialDataPort } from '../../../contracts/ports/spatial-data.port';
2
+ import type { SpatialViewState } from '../../../contracts/display-types';
3
+ import { SpatialColumn, SpatialDataset } from '../../../contracts/spatial-dataset.contract';
4
+ /** A categorical column's per-observation codes and its metadata (categories, colours). */
5
+ export interface CategoricalCodes {
6
+ codes: Uint16Array;
7
+ meta: SpatialColumn['meta'];
8
+ }
9
+ /** Per-observation group codes, and which codes are switched off (1) in the group list. */
10
+ export interface HiddenCodes {
11
+ codes: Uint16Array;
12
+ hidden: Uint8Array;
13
+ }
14
+ /**
15
+ * The categorical columns the cells, the transcripts and the hover all read: the cell-type
16
+ * column's codes, and which of its groups the user switched off. A failed request rejects;
17
+ * the caller decides whether that fails its group of the plan or degrades to "no types".
18
+ */
19
+ export declare class CategoricalLookup {
20
+ private readonly port;
21
+ constructor(port: SpatialDataPort);
22
+ /** Codes of the column `name`, or null when it is not categorical. */
23
+ codes(name: string): Promise<CategoricalCodes | null>;
24
+ /** Codes of the group column that are switched off, or null when none are. */
25
+ hiddenCodes(dataset: SpatialDataset, view: SpatialViewState): Promise<HiddenCodes | null>;
26
+ }
@@ -0,0 +1,70 @@
1
+ import type { Rgb } from '../../../contracts/colormap-lut';
2
+ import type { SpatialDataPort } from '../../../contracts/ports/spatial-data.port';
3
+ import type { SpatialViewState } from '../../../contracts/display-types';
4
+ import { SpatialDataset } from '../../../contracts/spatial-dataset.contract';
5
+ import { SpatialSelectionMask } from '../../../spatial/spatial-selection';
6
+ import { DataRect } from '../../../spatial/lod';
7
+ import type { CategoricalLookup } from './categorical-lookup';
8
+ import type { OrderedLayerGroups, TileGroup } from './layer-groups';
9
+ import type { PlanContext } from './plan-context';
10
+ /** What the cell layers need from the service. */
11
+ export interface CellLayersHost {
12
+ /** The continuous LUT the view is using (so cells coloured by a gene match the markers). */
13
+ continuousLut(view: SpatialViewState): Rgb[];
14
+ /** Outlines appeared or disappeared: the markers' visibility follows. */
15
+ polygonsShownChanged(shown: boolean): void;
16
+ }
17
+ /**
18
+ * The cell outlines of the 2D spatial view, at the polygon level the zoom calls for: a fill,
19
+ * an outline or both (plus nucleus outlines for the "both" cell set), coloured by the view's
20
+ * cell-colour mode, with switched-off groups left out of the geometry.
21
+ *
22
+ * Geometry and style are keyed apart, so a recolour (a new cell-type column, a selection)
23
+ * rewrites the per-shape values of the existing layers and never re-expands the rings.
24
+ */
25
+ export declare class CellLayers {
26
+ private readonly port;
27
+ private readonly groups;
28
+ private readonly lookup;
29
+ private readonly host;
30
+ private polygonsShown;
31
+ /** Rings currently drawn and the (dataset, set, tiles) they came from. */
32
+ private currentRings;
33
+ private cellGeometryKey;
34
+ private currentNuclei;
35
+ private cellStyleKey;
36
+ /** Selection identity → revision, so a change key can name a selection cheaply. */
37
+ private lastSelection;
38
+ private selectionRevision;
39
+ /** Continuous colourings' windows, per (vector, clip, log): `contrastWindow` sorts every
40
+ * value, and a selection or opacity change recolours with the vector unchanged (SPATIAL-12). */
41
+ private readonly contrastWindows;
42
+ constructor(port: SpatialDataPort, groups: OrderedLayerGroups<TileGroup>, lookup: CategoricalLookup, host: CellLayersHost);
43
+ /** True while outlines are on screen — the service hides its dots then. */
44
+ get outlinesShown(): boolean;
45
+ /** The viewer went away (its layers with it): the outlines are no longer shown. */
46
+ detached(): void;
47
+ /** Draw the cells covering `rect` at the level `pxPerUnit` calls for, or drop them. */
48
+ plan(dataset: SpatialDataset, view: SpatialViewState, selection: SpatialSelectionMask, rect: DataRect, pxPerUnit: number, ctx: PlanContext): Promise<void>;
49
+ /**
50
+ * The cell layers: the fill and the outline the view's draw mode asks for, and with "both" the
51
+ * nucleus outlines over them. A geometry change builds new layers; a style change restyles them.
52
+ */
53
+ private drawCells;
54
+ private selectionRev;
55
+ /**
56
+ * The rings' colours by their owners, by the view's cell-colour mode (Xenium Explorer's "Cell
57
+ * Color"): one RGBA per shape for a grouping, values + colormap for a measurement, one colour
58
+ * for "single". A selection mutes what it leaves out.
59
+ */
60
+ private cellColors;
61
+ /**
62
+ * The cell rings (and, for "both", the nucleus rings) covering `rect` at `level`, minus
63
+ * the hidden groups — reused when nothing that decides them changed. Null when the
64
+ * view went stale or the dataset has no set to draw.
65
+ */
66
+ private cellGeometry;
67
+ /** Remove the cell layers and forget what they showed. */
68
+ drop(): void;
69
+ private setPolygonsShown;
70
+ }
@@ -0,0 +1,61 @@
1
+ import type { Viewer } from 'napari-js';
2
+ import { type SpatialDataPort } from '../../../contracts/ports/spatial-data.port';
3
+ import type { SpatialViewState } from '../../../contracts/display-types';
4
+ import type { SpatialDataset } from '../../../contracts/spatial-dataset.contract';
5
+ import type { OrderedLayerGroups, TileGroup } from './layer-groups';
6
+ import type { PlanContext } from './plan-context';
7
+ /** The density window in use and the densest bin (transcripts per unit area). */
8
+ export interface DensityStats {
9
+ lo: number;
10
+ hi: number;
11
+ max: number;
12
+ }
13
+ /** Xenium Explorer's "Estimated Transcript Points". */
14
+ export interface TranscriptEstimate {
15
+ /** Transcripts of the visible genes estimated to be in view. */
16
+ points: number;
17
+ /** The marker budget. */
18
+ max: number;
19
+ }
20
+ /**
21
+ * The transcript density image of the 2D spatial view: the visible genes' summed density
22
+ * raster, one scalar layer in the `density` group, windowed and coloured on the GPU.
23
+ *
24
+ * Bins at or below the window's low end are transparent (`transparentBelow`), so a window,
25
+ * colormap or opacity change is a uniform or LUT update of the same layer: only new genes or a
26
+ * new bin size fetch and upload a raster.
27
+ */
28
+ export declare class DensityLayer {
29
+ private readonly port;
30
+ private readonly groups;
31
+ private readonly changed;
32
+ /** The density window in use and the densest bin, for the panel's threshold control. */
33
+ stats: DensityStats | null;
34
+ /** The drawn raster in transcripts per unit area, its densest bin and its auto window. */
35
+ private raster;
36
+ /** The colormap the layer was given, so an unchanged one does not rebuild its LUT. */
37
+ private colormapKey;
38
+ constructor(port: SpatialDataPort, groups: OrderedLayerGroups<TileGroup>, changed: (stats: DensityStats) => void);
39
+ /** Draw the view's density, or drop it; an unchanged (genes, bin, window, colormap) is a no-op. */
40
+ plan(dataset: SpatialDataset, view: SpatialViewState, ctx: PlanContext): Promise<void>;
41
+ /** Window, colour and opacity onto the drawn layer: uniforms and a LUT, no re-upload. */
42
+ private restyle;
43
+ }
44
+ /**
45
+ * Transcripts in view for the visible genes, against the marker budget — it tells the user
46
+ * whether the budget will force grouping. Caches the per-gene dataset totals for the latest
47
+ * gene set.
48
+ */
49
+ export declare class TranscriptEstimator {
50
+ private readonly port;
51
+ private readonly changed;
52
+ /** Per-gene dataset totals for the in-view estimate, for the latest gene set. */
53
+ private countsCache;
54
+ constructor(port: SpatialDataPort, changed: (estimate: TranscriptEstimate | null) => void);
55
+ /**
56
+ * Transcripts in view for the visible genes: each gene's dataset total times the share
57
+ * of the tissue on screen. An estimate — expression is not uniform — which is also what
58
+ * Xenium Explorer shows; it tells the user whether the budget will force grouping.
59
+ */
60
+ plan(dataset: SpatialDataset, view: SpatialViewState, viewer: Viewer, w: number, h: number, ctx: PlanContext): Promise<void>;
61
+ }
@@ -0,0 +1,67 @@
1
+ import type { Layer, Viewer } from 'napari-js';
2
+ import type { SpatialPolygons } from '../../../contracts/spatial-dataset.contract';
3
+ /** The layer groups of the 2D spatial tile view. */
4
+ export type TileGroup = 'density' | 'cellFill' | 'cellOutline' | 'nucleusOutline' | 'transcripts';
5
+ /**
6
+ * Bottom to top: cell fill, cell outline, nucleus outline, the transcript density, then the
7
+ * transcripts. The density goes OVER the service's observation markers on purpose: under 10^5
8
+ * dots it would only show in the gaps between cells.
9
+ */
10
+ export declare const TILE_LAYER_ORDER: readonly TileGroup[];
11
+ /**
12
+ * One napari-js layer per named group, kept in a fixed bottom-to-top order, plus what each
13
+ * group currently shows (its key), so an unchanged plan is a no-op.
14
+ *
15
+ * Order is kept with `LayerList.move`, which restacks a layer without disposing its GPU visual
16
+ * (a remove + re-add would re-upload its whole buffer, review NAPARI-BOUNDARY-11). A plan still
17
+ * restores the order once, after all its groups are in place, and moves only the layers that
18
+ * are out of place ({@link restoreOrder}).
19
+ */
20
+ export declare class OrderedLayerGroups<G extends string> {
21
+ private readonly order;
22
+ private current;
23
+ private readonly layers;
24
+ /** What each group currently shows, so an unchanged plan is a no-op. */
25
+ private readonly keys;
26
+ constructor(order: readonly G[]);
27
+ /** The viewer the groups are drawn into, while attached. */
28
+ get viewer(): Viewer | null;
29
+ attach(viewer: Viewer): void;
30
+ /** Remove every group's layer from the viewer and forget the layers, keys and viewer. */
31
+ detach(): void;
32
+ /** Whether `group` has a layer (on screen or not). */
33
+ has(group: G): boolean;
34
+ /** `group`'s layer (on screen or not), if it has one. */
35
+ layer(group: G): Layer | undefined;
36
+ /** Whether `group`'s layer is in the viewer now. */
37
+ shown(group: G): boolean;
38
+ /** What `group` currently shows, as its plan keyed it. */
39
+ key(group: G): string | undefined;
40
+ setKey(group: G, key: string): void;
41
+ /** Forget what `group` shows, so the next plan redraws it. */
42
+ forgetKey(group: G): void;
43
+ /** Whether `layer` is one of the groups' layers. */
44
+ owns(layer: Layer): boolean;
45
+ /**
46
+ * Put a shapes layer in place for `group`: a geometry change builds a new layer, a
47
+ * colour-only change mutates the per-shape colours or values/colormap of the existing one.
48
+ */
49
+ upsertShapes(group: G, wanted: boolean, geometryChanged: boolean, rings: SpatialPolygons, opts: Parameters<Viewer['addShapes']>[2] & object): void;
50
+ /**
51
+ * Install `layer` as `group`'s layer. The layer was just added by the caller, so it is on
52
+ * top: the plan puts the groups that belong above it back in place once it is done
53
+ * ({@link restoreOrder}), rather than after every replaced group.
54
+ */
55
+ replace(group: G, layer: Layer): void;
56
+ /**
57
+ * Put the groups' layers in order, moving to the top only from the first one out of place
58
+ * (and, with `aboveOthers`, the first one under a layer that is not ours — the service's
59
+ * markers). Everything before that is already where it belongs. A move keeps each layer
60
+ * mounted (no `removed`/`added`), so nothing is re-uploaded.
61
+ */
62
+ restoreOrder(aboveOthers: boolean): void;
63
+ /** Remove `group`'s layer and forget its key. */
64
+ drop(group: G): void;
65
+ /** Drop every group. */
66
+ dropAll(): void;
67
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Loads in flight, per layer label ("Transcripts", "Cells"…), for the canvas loading badge.
3
+ * Shared by every plan: a label stays reported while any plan still loads it.
4
+ */
5
+ export declare class LoadTracker {
6
+ private readonly changed;
7
+ private readonly loading;
8
+ constructor(changed: (labels: string[]) => void);
9
+ /** Report `label` loading while `work` is in flight. */
10
+ track<T>(label: string, work: Promise<T>): Promise<T>;
11
+ /** Forget every load (the viewer went away) and report none. */
12
+ clear(): void;
13
+ }
14
+ /**
15
+ * One run of `NapariSpatialTileLayers.plan()`. Completeness belongs to the run that did the
16
+ * fetching: on the instance, a superseded run's failed tile marked the CURRENT run incomplete,
17
+ * which then skipped caching its keys and retried for nothing (review NAPARI-BOUNDARY-9).
18
+ */
19
+ export declare class PlanContext {
20
+ private readonly isStale;
21
+ private readonly loads;
22
+ private failed;
23
+ /** `isStale` turns true once a newer plan started or the viewer changed. */
24
+ constructor(isStale: () => boolean, loads: LoadTracker);
25
+ /** True once a newer plan started or the viewer changed. */
26
+ stale(): boolean;
27
+ /** Set when a fetch of this run failed (see fetchAll): don't cache it as done; retry. */
28
+ get incomplete(): boolean;
29
+ /** A request of this run failed: what it drew must not be cached as done. */
30
+ markIncomplete(): void;
31
+ /** Report `label` loading while `work` is in flight. */
32
+ track<T>(label: string, work: Promise<T>): Promise<T>;
33
+ /**
34
+ * Fetch every tile, drawing what arrived. A failure does not fail the view, but it marks this
35
+ * run incomplete: the caller must not cache it as done, and `plan()` retries it.
36
+ */
37
+ fetchAll<K, T>(keys: K[], load: (k: K) => Promise<T>): Promise<T[]>;
38
+ }
@@ -0,0 +1,71 @@
1
+ import type { PointsLayer } from 'napari-js';
2
+ import type { SpatialDataPort } from '../../../contracts/ports/spatial-data.port';
3
+ import { SpatialTranscriptTile } from '../../../contracts/spatial-dataset.contract';
4
+ import type { CategoricalCodes } from './categorical-lookup';
5
+ /** What one transcript entry is — decides what hovering it says. */
6
+ export type TranscriptKind = 'genes' | 'individual' | 'bins';
7
+ /** A bin grid: its size and origin, so a hovered bin's square can be recovered. */
8
+ export interface TranscriptBin {
9
+ size: number;
10
+ origin: [number, number];
11
+ }
12
+ /**
13
+ * Tooltips for the transcript markers of the 2D spatial view.
14
+ *
15
+ * Reads only what the transcript layer last drew — handed over one way through
16
+ * {@link setDrawn} / {@link setTypes} — and asks the server for the slower details (distinct
17
+ * genes in a group, its top genes and cells, the cell's display id) once the pointer has
18
+ * rested on a marker, caching them until the next draw.
19
+ */
20
+ export declare class TranscriptHover {
21
+ private readonly port;
22
+ private readonly layerShown;
23
+ /** What the transcript layer currently shows (written by drawing, read by hover). */
24
+ private drawn;
25
+ /** The cell-type column, to name the cell a marker is in. */
26
+ private types;
27
+ /** µm per observation unit of the drawn dataset, for describing a grouped marker's area. */
28
+ private micronsPerUnit;
29
+ /** Details already fetched, by hovered entry. */
30
+ private readonly cache;
31
+ private key;
32
+ private timer;
33
+ /** `layerShown` says whether the transcript layer is on screen now (it may have been dropped). */
34
+ constructor(port: SpatialDataPort, layerShown: () => boolean);
35
+ /** The transcript layer was redrawn: hover names these entries now (cached details are dropped). */
36
+ setDrawn(drawn: DrawnTranscripts, micronsPerUnit: number | null): void;
37
+ /** The cell-type column the drawn entries' cells are named by, or null. */
38
+ setTypes(types: CategoricalCodes | null): void;
39
+ /** Nothing is drawn any more. */
40
+ clear(): void;
41
+ /** Stop a pending details request and forget what was drawn. */
42
+ dispose(): void;
43
+ /**
44
+ * Tooltip lines for the transcript marker under world point `(wx, wy)`, or null.
45
+ *
46
+ * The marker is napari-js's pick on the drawn layer: hit anywhere on it, or within
47
+ * `radiusWorld` of its centre when it is smaller than that, the NEAREST centre winning
48
+ * among several (an exact tie, such as two genes' groups on one bin centre, goes to the one
49
+ * drawn on top). Returns what is known at once (gene, count, cell type); anything that needs
50
+ * the server — distinct genes in a group, its top genes and cells, the cell's display id —
51
+ * arrives through `onDetails` once the pointer has rested on the marker briefly.
52
+ */
53
+ hoverAt(wx: number, wy: number, radiusWorld: number, onDetails: (lines: string[]) => void): string[] | null;
54
+ private fetchDetails;
55
+ /** The tooltip text for entry `i`, with the server's details when they have arrived. */
56
+ private describe;
57
+ }
58
+ /** What the transcript layer currently shows — what hovering needs to name a marker. */
59
+ export interface DrawnTranscripts {
60
+ kind: TranscriptKind;
61
+ bin?: TranscriptBin;
62
+ merged: SpatialTranscriptTile;
63
+ /** The layer the entries are drawn in, one marker per entry in the same order. */
64
+ layer: PointsLayer;
65
+ genes: string[];
66
+ /** For a grouped gene selection: each entry's group, and the groups' names. */
67
+ entryGroup?: Int32Array;
68
+ groupNames?: string[];
69
+ /** Each group's genes, when the markers came from the density grids (for the hover). */
70
+ groupGenes?: string[][];
71
+ }