@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,30 @@
1
+ /** What the service itself counts on the badge; the spatial tile layers report their own names. */
2
+ export type LoadingSource = 'Image' | 'Observations';
3
+ /**
4
+ * "x reloading…" at the bottom of the canvas, aggregated over everything that loads into one
5
+ * scene: image tiles (the tile client), observation colourings (the spatial scenes) and the
6
+ * spatial tile layers' own loads (which report a list of layer names).
7
+ *
8
+ * Each load is a {@link begin} that hands back its own `end`. {@link reset} starts a new scene:
9
+ * the counts are dropped, and an `end` from a load that began before it is a no-op, so a load
10
+ * that settles after a re-plot can neither un-count the new scene's work nor drive a count below
11
+ * zero (which hid the next scene's "Observations reloading…" until a second load overlapped it).
12
+ */
13
+ export declare class LoadingBadgeState {
14
+ private host;
15
+ private badge;
16
+ private readonly counts;
17
+ private tileLayers;
18
+ private generation;
19
+ /** The element the badge is drawn into (the plot host); set per plot. */
20
+ attach(host: HTMLElement): void;
21
+ /** One load of `source` started; call the returned function once it settles. */
22
+ begin(source: LoadingSource): () => void;
23
+ /** The spatial tile layers still loading (their own names, in their order). */
24
+ setTileLayers(layers: readonly string[]): void;
25
+ /** The text the badge has set (shown, or about to be once the show delay passes). */
26
+ get text(): string;
27
+ /** A new scene: forget every count and remove the badge. */
28
+ reset(): void;
29
+ private show;
30
+ }
@@ -1,16 +1,29 @@
1
1
  import { IRegionOverlay, RegionToolMode } from '../../contracts/region-overlay.contract';
2
2
  import { RegionStore } from '../../store/region-store.service';
3
+ import type { Affine } from '../../region-overlay/svg-region-renderer';
3
4
  /**
4
5
  * The slice of the napari Viewer the overlay needs (coord transforms + control gating).
5
6
  *
7
+ * COORDINATE SPACES: `canvasToWorld` takes CLIENT pixels (viewport coordinates, as a pointer
8
+ * event's `clientX/Y`), exactly as napari-js `Viewer.canvasToWorld` does. `canvasTransform` is
9
+ * the camera's world → CANVAS-LOCAL CSS-pixel affine, napari-js `Viewer.canvasTransform`, which
10
+ * reads no layout: drawing and following the camera use it, so a camera frame costs one
11
+ * `matrix(...)` and no `getBoundingClientRect()` (review NAPARI-BOUNDARY-10). The svg covers the
12
+ * plot host and the canvas is the host's in-flow child at its top-left, so canvas-local and
13
+ * svg-local pixels are the same; a pointer's client pixels are mapped into the svg by the
14
+ * overlay itself.
15
+ *
6
16
  * Exported because the 3D spatial mode supplies a SCREEN-SPACE implementation of it: there the
7
17
  * drawn shape is a lasso in canvas pixels, not a rectangle in image space, so "world" is the
8
- * canvas itself and both transforms collapse to identity. That lets the 3D view reuse this whole
9
- * overlay — every tool, the handles, the store round-trip — with no 3D-specific drawing code.
18
+ * canvas itself — `canvasToWorld` is the client → canvas offset and `canvasTransform` the
19
+ * identity. That lets the 3D view reuse this whole overlay — every tool, the handles, the store
20
+ * round-trip — with no 3D-specific drawing code.
10
21
  */
11
22
  export interface OverlayViewer {
23
+ /** Client px → world. */
12
24
  canvasToWorld(clientX: number, clientY: number): [number, number];
13
- worldToCanvas(worldX: number, worldY: number): [number, number];
25
+ /** World → canvas-local (= svg-local) CSS px, as an SVG affine `[a, b, c, d, e, f]`. */
26
+ canvasTransform(): Affine;
14
27
  setControlsEnabled(enabled: boolean): void;
15
28
  readonly camera: {
16
29
  readonly changed: {
@@ -20,22 +33,31 @@ export interface OverlayViewer {
20
33
  }
21
34
  /**
22
35
  * SVG region overlay for the napari-js WebGPU image view (jit-ui#102), mirroring the OSD backend's
23
- * {@link OsdRegionOverlay} but driven by napari's `canvasToWorld`/`worldToCanvas` transforms.
36
+ * {@link OsdRegionOverlay} but driven by napari's `canvasToWorld`/`canvasTransform` transforms
37
+ * (see {@link OverlayViewer} for their coordinate spaces).
24
38
  * Vector shapes are drawn in an absolutely-positioned `<svg>` over the canvas (no need to push
25
- * them through WebGPU). It writes completed shapes to the shared {@link RegionStore} (so save /
26
- * undo / export work identically to OSD) and re-renders from the store on every camera move,
27
- * region change, and selection change.
39
+ * them through WebGPU) by {@link NapariRegionSvgRenderer} over the shared `SvgRegionRenderer`:
40
+ * in world coordinates inside one transformed group, rebuilt on a region or selection change,
41
+ * while a camera move only rewrites the transform (napari-js's `canvasTransform`, the camera
42
+ * centre/zoom) and the few screen-space handles and labels. This class is
43
+ * the gesture controller: pointer handlers, the tool mode, and the edit/draft/marquee state.
44
+ * It writes completed shapes to the shared {@link RegionStore} (so save / undo / export work
45
+ * identically to OSD).
28
46
  *
29
47
  * Supports (jit-ui#102): rectangle / polygon / freehand path drawing, click-select and rubber-band
30
48
  * marquee select, pan/zoom gating via `setControlsEnabled`, body move, vertex move/add/delete,
31
- * bezier handle editing, and donut holes (including hole vertex + hole-bezier-handle editing) —
32
- * full parity with {@link OsdRegionOverlay}.
49
+ * bezier handle editing, and donut holes (including hole vertex + hole-bezier-handle editing).
50
+ * Hit-testing shares `region-overlay/region-geometry` with the OSD overlay, so both follow
51
+ * the same rules (multi-part regions, holes, open polylines, handle-less bezier curves).
33
52
  */
34
53
  export declare class NapariRegionOverlay implements IRegionOverlay {
35
54
  private readonly host;
36
55
  private readonly viewer;
37
56
  private readonly store;
38
57
  private readonly svg;
58
+ private readonly renderer;
59
+ /** Client ↔ svg-local ↔ world conversions, with the svg origin read once per gesture/redraw. */
60
+ private readonly projection;
39
61
  private readonly subs;
40
62
  private readonly disconnectCamera;
41
63
  private mode;
@@ -44,8 +66,6 @@ export declare class NapariRegionOverlay implements IRegionOverlay {
44
66
  private draftRect;
45
67
  /** In-progress rubber-band selection marquee (select mode), image-space. */
46
68
  private marquee;
47
- /** Dedicated marquee rect element, updated directly during the drag (no full region redraw). */
48
- private marqueeEl;
49
69
  private draftPath;
50
70
  private drawing;
51
71
  private regionsVisible;
@@ -65,88 +85,60 @@ export declare class NapariRegionOverlay implements IRegionOverlay {
65
85
  setMode(mode: RegionToolMode): void;
66
86
  setSelectedBezier(bezier: boolean): void;
67
87
  /**
68
- * How finely a drawn vertex may be placed, in world units.
69
- *
70
- * One by default, because for an image the world IS pixels and a region should align to
71
- * them. A dataset whose coordinates are not pixels sets it finer — seqFISH's whole
72
- * sample spans about 5 x 7 units, where whole-unit vertices leave roughly six by eight
73
- * placeable positions and no ROI can be drawn at all.
88
+ * How finely a drawn vertex may be placed, in world units: one (an image's pixels) by
89
+ * default, finer for a dataset whose coordinates are not pixels (see OverlayProjection).
74
90
  */
75
- private worldQuantum;
76
91
  setWorldQuantum(quantum: number): void;
77
92
  destroy(): void;
78
- /** Pointer client coords → world coords, snapped to {@link worldQuantum}. */
79
- private toImage;
80
- /**
81
- * World units spanned by one screen pixel, measured through the viewer's own transform.
82
- *
83
- * Read from the transform rather than from the camera, so it holds for both the 2D and
84
- * the 3D screen-space adapters without either having to expose a zoom. Falls back to 1
85
- * if the transform gives nothing usable, which keeps the established pixel behaviour
86
- * rather than collapsing the threshold to zero and recording a point per event.
87
- */
88
- private worldPerCanvasPixel;
89
- /** Image coords → SVG-local px (the svg overlays the canvas at the same client rect). */
90
- private toLocal;
91
93
  private readonly onPointerDown;
94
+ private pointerDown;
92
95
  private readonly onPointerMove;
93
96
  private readonly onPointerUp;
97
+ /**
98
+ * The pointer gesture ended without a pointerup (the browser cancelled it, or capture was
99
+ * lost): end it without committing. Also fires after every normal release, when nothing
100
+ * is live any more.
101
+ */
102
+ private readonly onPointerCancel;
103
+ /**
104
+ * End whatever pointer gesture is live without committing it: close the store batch a drag
105
+ * opened (so later edits are emitted again) and forget the drag (so a bare hover no longer
106
+ * moves the region), and drop the marquee and a rectangle/freehand draft. A click-placed
107
+ * polygon is not a pointer gesture and survives.
108
+ */
109
+ private endGesture;
94
110
  /** Click-to-place polygon: add a vertex, or close when clicking near the first one. */
95
111
  private handlePolygonClick;
96
112
  private readonly onDblClick;
97
113
  /** The currently-selected region (single selection), or null. */
98
114
  private selectedRegion;
99
- /** Screen distance (px) between a client point and an image coord. */
100
- private screenDist;
101
115
  /**
102
116
  * Start a select/move interaction: grab a handle (rectangle corner) or vertex of the already-
103
117
  * selected region first; otherwise select the topmost region under the cursor and drag its body.
104
118
  */
105
119
  private beginManipulation;
106
- /** Create/update the marquee rect element directly (avoids a full region redraw per move). */
120
+ /** Show the marquee where it is now (only the marquee element: no full region redraw). */
107
121
  private updateMarqueeEl;
108
- /** Remove the marquee element from the SVG. */
109
- private clearMarqueeEl;
110
- /** Test whether a client point grabs a rectangle corner or a polygon vertex of `region`. */
111
- private hitHandle;
112
- /** Apply the live drag for the active manipulation (image coords `ix,iy`). */
113
- private applyManipulation;
114
- /** addpoint mode: insert a vertex on the selected polygon's nearest edge at the click. */
122
+ /** addpoint mode: insert a vertex at the click on the selected polygon's nearest edge
123
+ * (exterior or a hole ring). */
115
124
  private handleAddPoint;
116
- /** deletepoint mode: remove the selected polygon's vertex nearest the click. */
125
+ /** deletepoint mode: remove the selected polygon's vertex nearest the click (exterior or a
126
+ * hole ring). */
117
127
  private handleDeletePoint;
118
- /** Distance from point (px,py) to segment (ax,ay)-(bx,by), in image units. */
119
- private pointSegDist;
120
- /** Finalize a rubber-band marquee: select every region whose bounding box it overlaps (a tiny
121
- * marquee is treated as a click on empty space → clear the selection). */
128
+ /** Finalize a rubber-band marquee: select every region whose bounding box it overlaps (a
129
+ * marquee under {@link MIN_MARQUEE_PX} is a click on empty space → clear the selection). */
122
130
  private finishMarquee;
123
- /** A region's bounding box in image coords (rectangle, polygon, or multipolygon), or null. */
124
- private regionBBox;
125
131
  private commitRectangle;
126
132
  private commitPolygon;
127
- private hitTest;
128
133
  /** Show or hide the drawn regions. A region being drawn stays visible either way. */
129
134
  setRegionsVisible(visible: boolean): void;
135
+ /** Follow a camera move: one transform attribute plus the screen-space elements. */
136
+ private updateCamera;
137
+ /**
138
+ * Rebuild every element from the store: the regions in world coordinates (one transformed
139
+ * group), their labels, and the overlay. Reads no layout: the camera affine is the viewer's.
140
+ */
130
141
  redraw(): void;
131
- /** Draw a region's classification label at its top-left, when labels are enabled (matches OSD). */
132
- private drawLabel;
133
- /** Draw grab handles for the selected region: rectangle corners or polygon vertices. */
134
- private drawHandles;
135
- /** Draw one bezier control point (anchor + handle offset) as a small circle connected to its
136
- * anchor by a tangent line. `handle` is the [dx,dy] offset from the anchor in image space. */
137
- private drawBezierHandle;
138
- private buildRegionEl;
139
- /** Path data for a polygon: the exterior ring (bezier or straight) plus any holes (bezier when
140
- * the donut carries hole handles, else straight) as sub-paths — even-odd fill cuts them out. */
141
- private polygonPathData;
142
- /** SVG path data for a straight ring/polyline in image coords (closed appends `Z`). */
143
- private straightPath;
144
- /** SVG cubic-bezier path data for any ring (exterior or hole): anchors joined by cubic segments
145
- * whose control points are `anchor + handleOut` (leaving) and `nextAnchor + handleIn` (arriving),
146
- * in image space. Used for both the exterior and (donut) hole rings. */
147
- private ringBezierPath;
148
- private style;
149
- /** Draw the in-progress rectangle / path preview. */
150
- private drawDraft;
151
- private styleDraft;
142
+ /** Rebuild the screen-space overlay only: the selected regions' handles and the draft. */
143
+ private renderOverlay;
152
144
  }
@@ -0,0 +1,93 @@
1
+ import type { Viewer } from 'napari-js';
2
+ import { IImageInfo } from '../../contracts/image.contract';
3
+ import { IHistogram } from '../../contracts/channel-histogram-api.contract';
4
+ import { IIsosurfaceControls, ISurface3dControls } from '../../contracts/visualizer.contract';
5
+ import { SpatialObservations } from '../../contracts/spatial-dataset.contract';
6
+ import { VisualizerStore } from '../../store/visualizer-store.service';
7
+ import { RegionStore } from '../../store/region-store.service';
8
+ import { NapariTileClient } from './napari-tile-client';
9
+ import { NapariDisplayState } from './napari-display-state';
10
+ import { LoadingBadgeState } from './napari-loading-state';
11
+ import { NapariToolBridge } from './napari-tool-bridge';
12
+ /**
13
+ * What one `plot()` mounts into the viewer (review Appendix B): the 2D image (alone, under the
14
+ * region-centroid scatter, or under the spatial markers), a volume, a surface, a 3D scatter or the
15
+ * spatial 3D cloud. The service picks one per plot type and talks to it through this interface
16
+ * instead of asking which layer handle happens to be non-null; a scene owns every layer, key,
17
+ * subscription and listener it creates, and {@link dispose} drops them all — so a re-plot can no
18
+ * longer inherit a stale "already built" key from the previous one (NAPARI-SVC-1, -8).
19
+ */
20
+ export interface NapariScene {
21
+ /** Build the scene into the viewer. Resolves once the first frame's data is in. */
22
+ mount(): Promise<void>;
23
+ /** The stack slider moved to `z` (already recorded as the image's slice). */
24
+ setZ(z: number): void;
25
+ /** The histogram pane's distribution for `channel`, or null when there is none (yet). */
26
+ histogram(channel: number, bins: number): IHistogram | null;
27
+ /** The isosurface threshold controls (volume scenes only). */
28
+ isoControls?(): IIsosurfaceControls | null;
29
+ /** The 3D camera/axes/wireframe controls (3D scenes only). */
30
+ surface3dControls?(): ISurface3dControls | null;
31
+ /** Bilinear vs nearest-neighbour image sampling changed (2D image scenes). */
32
+ setImageSmoothing?(enabled: boolean): void;
33
+ /** The overview navigator was shown or hidden (2D image scenes). */
34
+ setNavigatorVisible?(visible: boolean): void;
35
+ /** Observations projected to canvas pixels (the spatial 3D cloud), or null. */
36
+ screenProjection?(obs: SpatialObservations): Float32Array | null;
37
+ /** Remove everything the scene added; called before the viewer is disposed. */
38
+ dispose(): void;
39
+ }
40
+ /** Viewer settings that outlive a scene: a re-plot keeps them. */
41
+ export interface NapariSettings {
42
+ /** Decimate factor for the 3D types (1 = Full, 2 = ½, 4 = ¼ default, 8 = ⅛). */
43
+ resolutionScale: number;
44
+ /** Whether the 2D overview navigator is shown (the same host setting OSD's navigator honours). */
45
+ navigatorVisible: boolean;
46
+ /** Image smoothing (bilinear) vs nearest-neighbour (crisp pixels, the default). */
47
+ imageSmoothing: boolean;
48
+ /** The 3D axes gizmo's on/off choice. */
49
+ axesVisible: boolean;
50
+ /** The surface's wireframe choice. */
51
+ surfaceWireframe: boolean;
52
+ /** The volume's user Z-height factor (1 = the volume's natural proportions). */
53
+ volumeZScale: number;
54
+ }
55
+ /** The stack-loading flag and progress the host shows while frames load. */
56
+ export interface StackProgress {
57
+ loading(on: boolean): void;
58
+ progress(percent: number): void;
59
+ }
60
+ /** Everything a scene is built from: the viewer and its DOM, the service's collaborators, and the
61
+ * service state a scene reads live. */
62
+ export interface SceneContext {
63
+ readonly viewer: Viewer;
64
+ readonly host: HTMLElement;
65
+ readonly canvas: HTMLCanvasElement;
66
+ /** The scene's lifetime: aborted when the service resets into the next scene. */
67
+ readonly signal: AbortSignal;
68
+ /** Frame loading (volume assembly, surface preload): aborted by a reset AND by
69
+ * `cancelLoading()`, which renews it — so read it when a load starts. */
70
+ loading(): AbortSignal;
71
+ /** The image on screen and its current slice, as `load()`/`setZIndex()` recorded them. */
72
+ info(): IImageInfo | undefined;
73
+ z(): number;
74
+ readonly tiles: NapariTileClient;
75
+ readonly display: NapariDisplayState;
76
+ readonly badge: LoadingBadgeState;
77
+ readonly tools: NapariToolBridge;
78
+ readonly store: VisualizerStore;
79
+ readonly regionStore: RegionStore;
80
+ readonly settings: NapariSettings;
81
+ readonly stack: StackProgress;
82
+ /** The image's full-resolution size as the scene drew it — read by the readback, the camera
83
+ * fit and `getTrueImageSize()`; it outlives the scene. */
84
+ imageSize(): {
85
+ width: number;
86
+ height: number;
87
+ };
88
+ setImageSize(width: number, height: number): void;
89
+ /** Fit the 2D camera to the image on the next frame. */
90
+ fitCameraSoon(): void;
91
+ outsideZone<T>(fn: () => T): T;
92
+ inZone<T>(fn: () => T): T;
93
+ }
@@ -0,0 +1,163 @@
1
+ import type { ImageLayer, Viewer } from 'napari-js';
2
+ import { IHistogram } from '../../contracts/channel-histogram-api.contract';
3
+ import { SpatialDataset } from '../../contracts/spatial-dataset.contract';
4
+ import { SpatialViewState } from '../../contracts/display-types';
5
+ import { SpatialSelectionMask } from '../../spatial/spatial-selection';
6
+ import { NapariSpatialTileLayers } from './napari-spatial-tiles';
7
+ import { Image2dScene } from './napari-image-2d-scene';
8
+ import { SpatialSceneBase, SpatialSession, SpatialTileOwner } from './napari-spatial-scene';
9
+ import type { NapariScene, SceneContext } from './napari-scene';
10
+ /**
11
+ * SPATIAL_OMICS (review Appendix B, cluster J): the tissue image (an {@link Image2dScene}) with one
12
+ * marker per observation, coloured by an annotation column or a gene, the gene map under the
13
+ * cells, and the level-of-detail tile layers (outlines, transcripts, density) over them. The
14
+ * markers rebuild whenever the dataset or the view state changes, so switching the colour-by
15
+ * column does not remount the scene.
16
+ *
17
+ * Sets up the full 2D interaction stack — region overlay, pixel tools, readback currency — exactly
18
+ * as the plain image view does. That is NOT optional here: this mode's selection is driven by
19
+ * drawn ROIs, so without the overlay there is no way to make a selection at all.
20
+ */
21
+ export declare class Spatial2dScene extends SpatialSceneBase implements NapariScene, SpatialTileOwner {
22
+ readonly image: Image2dScene;
23
+ /** The observation markers, and which dataset/plane they were built for — so a display-only
24
+ * change (size, colour, opacity, selection) can update them in place. */
25
+ private points;
26
+ private layerKey;
27
+ /** The observation each marker is, in draw order; null when every observation is drawn. */
28
+ private drawn;
29
+ /** The gene map's layer and the inputs it was coloured for (its field is cached in the session,
30
+ * on a clock of its own). */
31
+ geneMapLayer: ImageLayer | null;
32
+ private geneMapKey;
33
+ /** The dataset the camera has been framed on — see {@link frameOnce}. */
34
+ private framed;
35
+ /** The gene-map estimate in flight (off the main thread past the worker threshold,
36
+ * SPATIAL-19): a new field key supersedes — and aborts — it; a rebuild that leaves the key
37
+ * alone lets it finish. */
38
+ private readonly geneMapLoads;
39
+ /** `noImage`: an image-less dataset opened before any image — the observations alone. */
40
+ constructor(ctx: SceneContext, session: SpatialSession, noImage?: boolean);
41
+ mount(): Promise<void>;
42
+ setZ(z: number): void;
43
+ histogram(channel: number, bins: number): IHistogram | null;
44
+ setImageSmoothing(enabled: boolean): void;
45
+ setNavigatorVisible(visible: boolean): void;
46
+ dispose(): void;
47
+ canvasSize(): [number, number];
48
+ polygonsShownChanged(): void;
49
+ protected afterChange(): void;
50
+ protected hoverTiles(): NapariSpatialTileLayers | null;
51
+ /**
52
+ * The observation under a client position: napari-js's pick on the marker layer itself (a grid
53
+ * over its positions, rebuilt only when they change), so the tooltip cannot name a cell that is
54
+ * not drawn, then the drawn index mapped back to the observation.
55
+ *
56
+ * A marker is hit anywhere on its drawn disc, or within `slackPx` screen pixels of its centre
57
+ * when it is smaller than that (a 1.5 px dot still has to be hoverable), and of several hits the
58
+ * NEAREST centre wins (an exact tie goes to the one drawn on top). Not napari's `'topmost'`: the
59
+ * slack is wider than most markers, and over a dense field of small ones "the last drawn within
60
+ * 10 px" names a neighbour rather than the cell under the cursor.
61
+ */
62
+ protected pickObservation(clientX: number, clientY: number, slackPx: number): number;
63
+ /**
64
+ * Whether the markers are drawn: when the user wants them, and not while cell outlines are on
65
+ * screen — then a cell IS its outline, and a circle on top of it is noise. Zoomed out past the
66
+ * outline threshold, the circles stand in for the cells.
67
+ */
68
+ private pointsVisible;
69
+ /**
70
+ * Redraw the markers over a freshly rendered image. Two reasons, both invisible from the
71
+ * spatial store — which is why a scrub or a re-render never reached the markers on its own:
72
+ * - the image render CLEARS the layer list, taking the markers with it;
73
+ * - over a volume-backed dataset the displayed plane decides which observations belong on
74
+ * screen at all, so the cells have to move with the section rather than hang over another.
75
+ */
76
+ private redrawMarkers;
77
+ /** (Re)build the observation marker layer for the current dataset + view state. */
78
+ protected rebuild(dataset: SpatialDataset | null, view: SpatialViewState, selection?: SpatialSelectionMask): Promise<void>;
79
+ /** Nothing to draw: drop the markers and the gene map. */
80
+ private removeLayers;
81
+ /**
82
+ * Draw the observation markers over the image (and the gene map): restyled in place for a
83
+ * display-only change, else a new layer.
84
+ */
85
+ private drawMarkers;
86
+ /**
87
+ * Tell the region overlay how finely a drawn vertex may be placed.
88
+ *
89
+ * Region geometry is stored in whole world units, which is right when the world IS
90
+ * pixels — a region should align to them. It is wrong for a dataset that registers onto
91
+ * no image: seqFISH's observations span about 5 x 7 units in total, so whole-unit
92
+ * vertices leave roughly six by eight placeable positions across the entire sample and
93
+ * an ROI cannot be drawn at any zoom. Nothing errors; the tool just cannot express the
94
+ * shape.
95
+ *
96
+ * Keyed on whether the dataset brings PIXELS rather than on the extent, because the
97
+ * extent cannot tell the two apart — 2,000 units is a small slide or a large section
98
+ * depending only on what the units are, and only the dataset knows.
99
+ */
100
+ private setRegionGridFor;
101
+ /**
102
+ * Hide the image layer for a dataset that brings no image of its own.
103
+ *
104
+ * The host's viewer keeps whatever image was last loaded, and for a dataset that
105
+ * registers onto none that picture belongs to something else entirely — the example's
106
+ * default slide, say. It is not merely irrelevant: the two live in different coordinate
107
+ * spaces (image pixels against the embedding's own units), so the leftover is magnified
108
+ * roughly a hundredfold. At the fitted zoom the camera sits inside its corner, where it
109
+ * reads as blank background, and it appears only once you zoom out far enough to find
110
+ * it — which is exactly how it gets noticed.
111
+ *
112
+ * Hidden rather than removed, and hidden HERE rather than by clearing the host's image
113
+ * state: that state drives the whole render pipeline, including a Plotly backend whose
114
+ * fields are declared with definite-assignment assertions, so emptying it throws from
115
+ * whichever field the next path happens to read. This touches one layer's visibility
116
+ * and nothing else.
117
+ */
118
+ hideForeignImage(viewer: Pick<Viewer, 'layers' | 'requestRender'>, datasetHasPixels: boolean): void;
119
+ /**
120
+ * Frame the camera on the observations, for a dataset that brings no image.
121
+ *
122
+ * The 2D camera is normally fitted to the IMAGE, because the observations are in that
123
+ * image's pixel space and framing the image frames them too. A dataset with no
124
+ * reference image has coordinates in its own units instead — seqFISH's span about
125
+ * 5x7 — so the image framing left over from whatever was on screen before puts the
126
+ * whole cloud offscreen: measured at 9.7 x 13.4 PIXELS, centred 256px from where the
127
+ * camera was looking. The points are all there and drawn; they are a speck. Which
128
+ * looks exactly like the dataset having failed to load.
129
+ *
130
+ * Once per dataset, as napari-js's `fit3d: 'once'` does for the cloud: re-colouring,
131
+ * slicing or picking a gene re-adds this layer, and re-framing on those would move
132
+ * the camera under the user — the camera tools and the canvas drag are meant to be
133
+ * the only things that do.
134
+ */
135
+ private frameOnce;
136
+ /**
137
+ * The **gene map**: the active gene's expression as a continuous field drawn under
138
+ * the cells.
139
+ *
140
+ * A scatter coloured by a gene says which cells express it; it cannot say where,
141
+ * because the eye will not integrate thousands of dots into a territory. The field
142
+ * is a kernel-weighted MEAN per cell (see `spatial-expression.ts`), so a dense
143
+ * region does not glow merely for being dense, and it is transparent wherever no
144
+ * cell was measured — an unsampled gap must not read as "not expressed".
145
+ *
146
+ * It shares the points' LUT, percentile window and log flag, so the layer under
147
+ * the cells and the cells themselves cannot disagree about what a colour means.
148
+ *
149
+ * Estimated on the DISPLAYED image's pixel grid, coarsened so the long side is at
150
+ * most `GENE_MAP_MAX_SIDE`: a smooth field gains nothing from a slide's full
151
+ * resolution. For a volume-backed dataset that grid is the current slice, and only
152
+ * that plane's observations are included — the same rule the markers follow.
153
+ */
154
+ private ensureGeneMap;
155
+ /**
156
+ * Per-observation colours for the current view state, or a single flat colour when nothing is
157
+ * selected to colour by. Categorical columns use the column's own palette; continuous columns
158
+ * and gene vectors go through the active colormap with a percentile-clipped window.
159
+ */
160
+ private faceColors;
161
+ /** Continuous values → RGBA through the active colormap and a clipped window. */
162
+ encodeContinuous(values: Float32Array, view: SpatialViewState, muted?: Uint8Array | null): Float32Array;
163
+ }