@jax-data-science/sci-image-visualizer 0.8.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (525) hide show
  1. package/README.md +201 -460
  2. package/esm2022/index.mjs +28 -15
  3. package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
  4. package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
  5. package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
  7. package/esm2022/lib/contracts/color.mjs +60 -0
  8. package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
  9. package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
  10. package/esm2022/lib/contracts/display-types.mjs +11 -1
  11. package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
  12. package/esm2022/lib/contracts/intensity.mjs +48 -5
  13. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  14. package/esm2022/lib/contracts/plot-type.mjs +134 -17
  15. package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
  16. package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
  17. package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
  18. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
  19. package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
  20. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  21. package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
  22. package/esm2022/lib/contracts/sam.contract.mjs +1 -1
  23. package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
  24. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  25. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
  26. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  27. package/esm2022/lib/contracts/viz-config.mjs +2 -1
  28. package/esm2022/lib/geometry/contour.mjs +63 -0
  29. package/esm2022/lib/geometry/raster.mjs +98 -0
  30. package/esm2022/lib/geometry/ring.mjs +201 -0
  31. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
  32. package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
  33. package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
  34. package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
  35. package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
  36. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
  37. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +3 -4
  38. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
  39. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -591
  40. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
  41. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
  42. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
  43. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
  44. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +263 -0
  45. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
  46. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
  47. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
  48. package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
  49. package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
  50. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +344 -0
  51. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +361 -4184
  52. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -0
  53. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
  54. package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
  55. package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
  56. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +182 -0
  57. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
  58. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
  59. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
  60. package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
  61. package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
  62. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
  63. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
  64. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
  65. package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
  66. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
  67. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
  68. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
  69. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
  70. package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
  71. package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
  72. package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
  73. package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
  74. package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
  75. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +153 -0
  76. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
  77. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
  78. package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
  79. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
  80. package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
  81. package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
  82. package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
  83. package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
  84. package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
  85. package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
  86. package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
  87. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
  88. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
  89. package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
  90. package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
  91. package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
  92. package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
  93. package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
  94. package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
  95. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
  96. package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
  97. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
  98. package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
  99. package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
  100. package/esm2022/lib/implementations/region-centroids.mjs +47 -0
  101. package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
  102. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
  103. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
  104. package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
  105. package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
  106. package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
  107. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
  108. package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
  109. package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
  110. package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
  111. package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
  112. package/esm2022/lib/models/bezier.mjs +1 -11
  113. package/esm2022/lib/models/class-preset.mjs +41 -3
  114. package/esm2022/lib/models/geometry.mjs +27 -164
  115. package/esm2022/lib/models/polygon-edit.mjs +254 -0
  116. package/esm2022/lib/models/polygon-factory.mjs +118 -0
  117. package/esm2022/lib/models/region-clone.mjs +68 -0
  118. package/esm2022/lib/models/region-geojson.mjs +373 -0
  119. package/esm2022/lib/models/region.mjs +34 -33
  120. package/esm2022/lib/models/shape.mjs +18 -16
  121. package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
  122. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
  123. package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
  124. package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
  125. package/esm2022/lib/plot.utilities.mjs +296 -473
  126. package/esm2022/lib/processing/image-crop.mjs +1 -1
  127. package/esm2022/lib/processing/processing-image.mjs +28 -15
  128. package/esm2022/lib/provide-visualization.mjs +40 -14
  129. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +99 -0
  130. package/esm2022/lib/region-editor/file-stem.mjs +13 -0
  131. package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
  132. package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
  133. package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
  134. package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
  135. package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
  136. package/esm2022/lib/region-editor/region-editor.component.mjs +402 -651
  137. package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
  138. package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
  139. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -0
  140. package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
  141. package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
  142. package/esm2022/lib/region-ops.service.mjs +28 -70
  143. package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
  144. package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
  145. package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
  146. package/esm2022/lib/render-orchestrator.mjs +14 -11
  147. package/esm2022/lib/render-session.mjs +207 -0
  148. package/esm2022/lib/routing-visualizer.service.mjs +459 -411
  149. package/esm2022/lib/spatial/density-raster.mjs +14 -0
  150. package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
  151. package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
  152. package/esm2022/lib/spatial/gene-search.mjs +1 -1
  153. package/esm2022/lib/spatial/glyphs.mjs +97 -0
  154. package/esm2022/lib/spatial/lod.mjs +187 -0
  155. package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
  156. package/esm2022/lib/spatial/spatial-density.mjs +25 -16
  157. package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
  158. package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
  159. package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
  160. package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
  161. package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
  162. package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
  163. package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
  164. package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
  165. package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
  166. package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
  167. package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
  168. package/esm2022/lib/spatial/stats.mjs +71 -0
  169. package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
  170. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
  171. package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
  172. package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
  173. package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
  174. package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
  175. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
  176. package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
  177. package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
  178. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
  179. package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
  180. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
  181. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
  182. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
  183. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
  184. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
  185. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
  186. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
  187. package/esm2022/lib/store/class-color.util.mjs +46 -3
  188. package/esm2022/lib/store/region-history.mjs +146 -0
  189. package/esm2022/lib/store/region-scope-cache.mjs +140 -0
  190. package/esm2022/lib/store/region-selection.mjs +82 -0
  191. package/esm2022/lib/store/region-store.service.mjs +279 -675
  192. package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
  193. package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
  194. package/esm2022/lib/toast-outlets.mjs +5 -4
  195. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
  196. package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
  197. package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
  198. package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
  199. package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
  200. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +114 -0
  201. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
  202. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
  203. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
  204. package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
  205. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
  206. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
  207. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
  208. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
  209. package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
  210. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
  211. package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
  212. package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
  213. package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
  214. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +81 -0
  215. package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
  216. package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
  217. package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
  218. package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
  219. package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
  220. package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
  221. package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
  222. package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
  223. package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
  224. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
  225. package/esm2022/lib/toolbar/toolbar.component.mjs +68 -117
  226. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
  227. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
  228. package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
  229. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
  230. package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
  231. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
  232. package/esm2022/lib/util/mark-for-check.mjs +17 -0
  233. package/esm2022/lib/util/supersede.mjs +56 -0
  234. package/esm2022/lib/visualization.module.mjs +39 -141
  235. package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
  236. package/esm2022/lib/visualizer/region-actions.mjs +149 -0
  237. package/esm2022/lib/visualizer/region-load.mjs +60 -0
  238. package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
  239. package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
  240. package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
  241. package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
  242. package/esm2022/lib/visualizer.component.mjs +480 -1902
  243. package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
  244. package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
  245. package/esm2022/lib/workers/spatial-math.mjs +190 -0
  246. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs +41083 -0
  247. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
  248. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
  249. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map +1 -0
  250. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
  251. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
  252. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34430
  253. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  254. package/fesm2022/mask.worker.js +36 -917
  255. package/fesm2022/onnx-sam.worker.js +52 -16
  256. package/fesm2022/spatial-math.worker.js +471 -0
  257. package/fesm2022/tsne.worker.js +32 -15
  258. package/index.d.ts +13 -10
  259. package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
  260. package/lib/contracts/capabilities.contract.d.ts +4 -2
  261. package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
  262. package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
  263. package/lib/contracts/color.d.ts +27 -0
  264. package/lib/contracts/colormap-lut.d.ts +19 -4
  265. package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
  266. package/lib/contracts/display-types.d.ts +21 -0
  267. package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
  268. package/lib/contracts/intensity.d.ts +13 -2
  269. package/lib/contracts/plot-type.d.ts +3 -1
  270. package/lib/contracts/ports/image-state.port.d.ts +6 -2
  271. package/lib/contracts/ports/preferences.port.d.ts +4 -0
  272. package/lib/contracts/ports/region-io.port.d.ts +1 -0
  273. package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
  274. package/lib/contracts/ports/tile-access.port.d.ts +1 -0
  275. package/lib/contracts/region-editor-api.contract.d.ts +1 -1
  276. package/lib/contracts/region-overlay.contract.d.ts +5 -0
  277. package/lib/contracts/sam.contract.d.ts +7 -0
  278. package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
  279. package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
  280. package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
  281. package/lib/contracts/visualizer.contract.d.ts +221 -54
  282. package/lib/contracts/viz-config.d.ts +1 -0
  283. package/lib/geometry/contour.d.ts +24 -0
  284. package/lib/geometry/raster.d.ts +42 -0
  285. package/lib/geometry/ring.d.ts +67 -0
  286. package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
  287. package/lib/implementations/base-store-visualizer.d.ts +61 -15
  288. package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
  289. package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
  290. package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
  291. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
  292. package/lib/implementations/napari-js/napari-loading-badge.d.ts +0 -1
  293. package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
  294. package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
  295. package/lib/implementations/napari-js/napari-scene.d.ts +93 -0
  296. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
  297. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
  298. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
  299. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +89 -0
  300. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
  301. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
  302. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
  303. package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
  304. package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
  305. package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
  306. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +121 -878
  307. package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -0
  308. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
  309. package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
  310. package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
  311. package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
  312. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
  313. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
  314. package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
  315. package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
  316. package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
  317. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
  318. package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
  319. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
  320. package/lib/implementations/osd/display-pipeline.d.ts +38 -9
  321. package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
  322. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
  323. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
  324. package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
  325. package/lib/implementations/osd/osd-coords.d.ts +6 -4
  326. package/lib/implementations/osd/osd-export.d.ts +36 -0
  327. package/lib/implementations/osd/osd-lib.d.ts +7 -0
  328. package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
  329. package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
  330. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +37 -0
  331. package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
  332. package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
  333. package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
  334. package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
  335. package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
  336. package/lib/implementations/osd/osd-viewport.d.ts +77 -0
  337. package/lib/implementations/osd/osd-zoom.d.ts +6 -0
  338. package/lib/implementations/osd/simple-source.d.ts +161 -0
  339. package/lib/implementations/osd/slice-cache.d.ts +12 -3
  340. package/lib/implementations/osd/tile-client.d.ts +11 -14
  341. package/lib/implementations/osd/tile-recolor.d.ts +141 -0
  342. package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
  343. package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
  344. package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
  345. package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
  346. package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
  347. package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
  348. package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
  349. package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
  350. package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
  351. package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
  352. package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
  353. package/lib/implementations/plotly/plotly.service.d.ts +136 -401
  354. package/lib/implementations/region-centroids.d.ts +14 -0
  355. package/lib/implementations/simple-slice-access.service.d.ts +7 -4
  356. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
  357. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
  358. package/lib/implementations/tile-server/index.d.ts +5 -0
  359. package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
  360. package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
  361. package/lib/implementations/tile-server/tile-protocol.d.ts +80 -0
  362. package/lib/implementations/tile-server/transport.d.ts +62 -0
  363. package/lib/intensity/intensity-profile.d.ts +66 -0
  364. package/lib/intensity/intensity-profile.service.d.ts +108 -0
  365. package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
  366. package/lib/models/bezier.d.ts +0 -5
  367. package/lib/models/class-preset.d.ts +18 -0
  368. package/lib/models/geometry.d.ts +14 -48
  369. package/lib/models/polygon-edit.d.ts +72 -0
  370. package/lib/models/polygon-factory.d.ts +40 -0
  371. package/lib/models/region-clone.d.ts +20 -0
  372. package/lib/models/region-geojson.d.ts +17 -0
  373. package/lib/models/region.d.ts +40 -4
  374. package/lib/models/shape.d.ts +8 -0
  375. package/lib/plot-mode/contribution-host.d.ts +125 -0
  376. package/lib/plot-mode/plot-type-menu.d.ts +60 -0
  377. package/lib/plot-mode/tool-params-model.d.ts +49 -0
  378. package/lib/plot.utilities.d.ts +19 -30
  379. package/lib/processing/processing-image.d.ts +5 -2
  380. package/lib/provide-visualization.d.ts +19 -2
  381. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +56 -0
  382. package/lib/region-editor/file-stem.d.ts +7 -0
  383. package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
  384. package/lib/region-editor/mask-export.service.d.ts +54 -0
  385. package/lib/region-editor/mask-raster.d.ts +2 -8
  386. package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
  387. package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
  388. package/lib/region-editor/region-editor.component.d.ts +166 -199
  389. package/lib/region-editor/region-metrics.d.ts +26 -0
  390. package/lib/region-editor/region-persistence.service.d.ts +69 -0
  391. package/lib/region-editor/region-table/region-table.component.d.ts +83 -0
  392. package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
  393. package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
  394. package/lib/region-ops.service.d.ts +1 -7
  395. package/lib/region-overlay/region-geometry.d.ts +157 -0
  396. package/lib/region-overlay/region-hit-test.d.ts +38 -0
  397. package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
  398. package/lib/render-orchestrator.d.ts +6 -2
  399. package/lib/render-session.d.ts +75 -0
  400. package/lib/routing-visualizer.service.d.ts +110 -58
  401. package/lib/spatial/density-raster.d.ts +6 -0
  402. package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
  403. package/lib/spatial/embedding-compute.d.ts +21 -2
  404. package/lib/spatial/glyphs.d.ts +16 -0
  405. package/lib/spatial/lod.d.ts +94 -0
  406. package/lib/spatial/spatial-controls.facade.d.ts +64 -0
  407. package/lib/spatial/spatial-density.d.ts +15 -5
  408. package/lib/spatial/spatial-encoding.d.ts +11 -44
  409. package/lib/spatial/spatial-expression.d.ts +40 -22
  410. package/lib/spatial/spatial-framing.d.ts +1 -0
  411. package/lib/spatial/spatial-heatmap.d.ts +2 -0
  412. package/lib/spatial/spatial-hover.d.ts +4 -16
  413. package/lib/spatial/spatial-panel-model.d.ts +135 -0
  414. package/lib/spatial/spatial-selection.d.ts +21 -26
  415. package/lib/spatial/spatial-tile-merge.d.ts +41 -0
  416. package/lib/spatial/spatial-tiles.d.ts +9 -256
  417. package/lib/spatial/stats.d.ts +38 -0
  418. package/lib/spatial/transcript-grouping.d.ts +119 -0
  419. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
  420. package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
  421. package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
  422. package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
  423. package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
  424. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
  425. package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
  426. package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
  427. package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
  428. package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
  429. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
  430. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
  431. package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
  432. package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
  433. package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
  434. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
  435. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
  436. package/lib/store/class-color.util.d.ts +35 -1
  437. package/lib/store/region-history.d.ts +66 -0
  438. package/lib/store/region-scope-cache.d.ts +63 -0
  439. package/lib/store/region-selection.d.ts +36 -0
  440. package/lib/store/region-store.service.d.ts +104 -112
  441. package/lib/store/visualizer-store.service.d.ts +22 -33
  442. package/lib/toast-outlets.d.ts +4 -3
  443. package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
  444. package/lib/toolbar/canvas-tools.d.ts +20 -0
  445. package/lib/toolbar/crop/slide-crop.d.ts +10 -4
  446. package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
  447. package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
  448. package/lib/toolbar/region-tools/region-tools.component.d.ts +60 -0
  449. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
  450. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
  451. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
  452. package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
  453. package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
  454. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
  455. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
  456. package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
  457. package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
  458. package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
  459. package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
  460. package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
  461. package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
  462. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +40 -0
  463. package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
  464. package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
  465. package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
  466. package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
  467. package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
  468. package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
  469. package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
  470. package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
  471. package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
  472. package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
  473. package/lib/toolbar/toolbar.component.d.ts +47 -83
  474. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
  475. package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
  476. package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
  477. package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
  478. package/lib/toolbar/wand/wand.service.d.ts +22 -116
  479. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
  480. package/lib/util/mark-for-check.d.ts +11 -0
  481. package/lib/util/supersede.d.ts +53 -0
  482. package/lib/visualization.module.d.ts +18 -39
  483. package/lib/visualizer/floating-drag.directive.d.ts +30 -0
  484. package/lib/visualizer/region-actions.d.ts +54 -0
  485. package/lib/visualizer/region-load.d.ts +27 -0
  486. package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
  487. package/lib/visualizer/tool-modes.d.ts +49 -0
  488. package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
  489. package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
  490. package/lib/visualizer.component.d.ts +201 -447
  491. package/lib/workers/spatial-math-ops.d.ts +65 -0
  492. package/lib/workers/spatial-math-worker.d.ts +7 -0
  493. package/lib/workers/spatial-math.d.ts +74 -0
  494. package/package.json +12 -3
  495. package/src/lib/styles/_viz-icons-rules.scss +73 -0
  496. package/src/lib/styles/viz-icons.scss +14 -0
  497. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
  498. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
  499. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
  500. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
  501. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
  502. package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
  503. package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
  504. package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
  505. package/src/lib/assets/cell-detection.svg +0 -37
  506. package/src/lib/assets/click.svg +0 -1
  507. package/src/lib/assets/colormap-luts.json +0 -1
  508. package/src/lib/assets/edit-selection-white.svg +0 -47
  509. package/src/lib/assets/icons/colormap-earth.png +0 -0
  510. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  511. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  512. package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
  513. package/src/lib/assets/picture-segmentation.svg +0 -43
  514. package/src/lib/assets/test/download-379.svg +0 -1
  515. package/src/lib/assets/test/download-98.svg +0 -1
  516. package/src/lib/assets/test/json-1.svg +0 -1
  517. package/src/lib/assets/test/load-53.svg +0 -1
  518. package/src/lib/assets/test/mask-44.svg +0 -1
  519. package/src/lib/assets/test/mask-download-44.svg +0 -15
  520. package/src/lib/assets/test/mask-save-44.svg +0 -11
  521. package/src/lib/assets/test/overlay-1.svg +0 -1
  522. package/src/lib/assets/test/overlay-4.svg +0 -1
  523. package/src/lib/assets/test/region-26.svg +0 -1
  524. package/src/lib/assets/test/save-56.svg +0 -1
  525. package/src/lib/assets/test/upload-43.svg +0 -1
@@ -4,6 +4,7 @@ import { Region, Rectangle, Polygon, MultiPolygon } from '../models/region';
4
4
  import { VisualizerStore } from './visualizer-store.service';
5
5
  import { IRegionStore } from '../contracts/visualizer.contract';
6
6
  import { IRegionEditApi } from '../contracts/region-store.contract';
7
+ import { StackSaveLayout } from './region-scope-cache';
7
8
  import * as i0 from "@angular/core";
8
9
  /**
9
10
  * Backend-neutral region store — the single source of truth for region state.
@@ -21,45 +22,33 @@ import * as i0 from "@angular/core";
21
22
  * - {@link IRegionEditApi} — Region-native geometry edits (move/resize, and
22
23
  * add/delete/move vertex) the OSD overlay drives.
23
24
  *
25
+ * Copy-on-write (review RT-13): no operation changes a stored {@link Region}
26
+ * (or the regions array) in place. An edit builds a replacement — the geometry
27
+ * through the pure `models/polygon-edit` functions — and swaps it in, so the
28
+ * undo history ({@link RegionHistory}) can keep shallow snapshots that share
29
+ * every untouched region instead of deep-cloning the whole set per step.
30
+ * Callers must follow the same rule with the instances {@link getRegions}
31
+ * returns: treat them as read-only, and commit a changed copy.
32
+ *
24
33
  * Classification colours live in {@link VisualizerStore} (shared by both
25
- * backends); GeoJSON import/export and the closed-polygon projection reuse the
26
- * neutral {@link PlotUtilities} helpers. All coordinates are image pixels.
34
+ * backends); GeoJSON import/export is `models/region-geojson`. All coordinates
35
+ * are image pixels.
27
36
  */
28
37
  export declare class RegionStore implements IRegionStore, IRegionEditApi {
29
38
  private store;
30
39
  private static readonly UNDO_LIMIT;
31
40
  private static readonly UNDO_COALESCE_MS;
32
- /** Per-image region cache. `regions` is always a snapshot of the entry for
33
- * `currentImageKey`. */
34
- private regionsByImageKey;
35
- private currentImageKey;
36
41
  /** The current image's regions — the live, edited array. */
37
42
  private regions;
38
- /** Last saved snapshot, restorable via plotPreviousShapes(). */
39
- private previousRegions;
40
43
  /**
41
44
  * Undo/redo history (jit-ui#85): up to {@link UNDO_LIMIT} snapshots of the
42
- * region set, each a deep clone captured immediately *before* a
43
- * region-editing action. {@link undo} pops the newest off `undoStack`, pushes
44
- * the current state onto `redoStack`, and restores it — so it can be invoked
45
- * up to {@link UNDO_LIMIT} times in a row. {@link redo} is the mirror. Any new
46
- * region action clears `redoStack` (the redo future is no longer reachable).
47
- *
48
- * A continuous gesture (a wand/brush/vertex drag commits to the store many
49
- * times) is coalesced into a single entry: the first commit of a burst
50
- * captures the pre-burst state and every commit within
51
- * {@link UNDO_COALESCE_MS} of the previous one is folded into it. History
52
- * never crosses an image load/switch — {@link resetUndoHistory} clears it.
45
+ * region set, each taken just *before* a region-editing action; continuous
46
+ * gestures and rapid commits coalesce (see {@link RegionHistory}). Snapshots
47
+ * are shallow — the regions array as it was — which is safe because nothing
48
+ * here mutates a region or an array in place (RT-13). History never crosses an
49
+ * image load/switch — {@link resetUndoHistory} clears it.
53
50
  */
54
- private undoStack;
55
- private redoStack;
56
- /** True while a coalescing burst is open (further commits fold into it). */
57
- private undoBurstOpen;
58
- private undoBurstTimer;
59
- /** True while restoring a snapshot, so the restore records no new history. */
60
- private restoringUndo;
61
- private readonly canUndo$;
62
- private readonly canRedo$;
51
+ private readonly history;
63
52
  /** Monotonic id source — ids never repeat within the service lifetime, so
64
53
  * selection stays correct across delete/add cycles even when names collide. */
65
54
  private nextId;
@@ -68,39 +57,27 @@ export declare class RegionStore implements IRegionStore, IRegionEditApi {
68
57
  private fillColor;
69
58
  private isRegionSavedOn;
70
59
  /**
71
- * Per-slice region support for z-stacks (jit-ui#93). While {@link stackMode}
72
- * is on (a z-stack is loaded), the live `regions` array always holds ONE
73
- * slice — the {@link currentSliceZ} slice — so the on-canvas overlays, the
74
- * selection projection, and the Regions table keep working unchanged
75
- * (they all read {@link getRegions}). The other slices live in
76
- * {@link regionsBySlice}; {@link setDisplaySlice} swaps the live set on scrub
77
- * and {@link getSliceRegions} flattens every slice (each tagged with its
78
- * zero-based {@link Region.z}) for save/export. Off by default (stackMode
79
- * false, z 0), so single-plane images are completely unaffected.
60
+ * Per-image cache and, for z-stacks, per-slice regions (jit-ui#93). In stack
61
+ * mode the live `regions` array holds ONE slice — the display slice — so the
62
+ * overlays, the selection projection and the Regions table work unchanged
63
+ * (they all read {@link getRegions}); {@link setDisplaySlice} swaps the live
64
+ * set on scrub and {@link getSliceRegions} flattens every slice (each tagged
65
+ * with its zero-based {@link Region.z}) for save/export. Off by default, so
66
+ * single-plane images are unaffected.
80
67
  */
81
- private regionsBySlice;
82
- private stackMode;
83
- private currentSliceZ;
84
- /** How a stack's regions round-trip to disk (jit-ui#93): `combined` writes one
85
- * z-indexed geojson (single-file z-stack, QuPath schema); `per-slice-file`
86
- * writes one geojson per slice-file (a folder of numbered images). */
87
- private stackSaveLayout;
88
- /** Slices that were loaded with regions (jit-ui#93). A per-slice-file save
89
- * re-writes these even when now empty, so clearing a slice's regions and
90
- * saving removes its previously-saved geojson (writes an empty one). */
91
- private stackInitialNonEmpty;
92
- /** Selection is tracked by region *id* internally (stable across edits) and
93
- * projected to array indices on the IRegionStore boundary. */
94
- private selectedIds;
95
- private readonly selectedIndices$;
68
+ private readonly scope;
69
+ /** Selection by region *id* (stable across edits), projected to array
70
+ * indices on the IRegionStore boundary. */
71
+ private readonly selection;
96
72
  private readonly regionUpdate$;
97
73
  /** Non-coalesced sibling of regionUpdate$: fires on every change even during a
98
74
  * batched drag, so live consumers (intensity inset) update per frame. */
99
75
  private readonly regionLiveEdit$;
76
+ /** See {@link getRegionSetReplaced$}. */
77
+ private readonly regionSetReplaced$;
100
78
  /** Emit coalescing for live drags (see IRegionEditApi.beginBatch). */
101
79
  private batchDepth;
102
80
  private pendingEmit;
103
- private readonly plotUtilities;
104
81
  constructor(store: VisualizerStore);
105
82
  /**
106
83
  * Replace (or, with `append`, add to) the current image's regions. Mints ids
@@ -109,7 +86,14 @@ export declare class RegionStore implements IRegionStore, IRegionEditApi {
109
86
  * not stored — mirrors the previous Plotly behaviour.
110
87
  */
111
88
  setRegions(regions: Region[], showRegionLabel?: boolean, isRegionSaveOn?: boolean, fillColor?: string, append?: boolean): void;
112
- /** The canonical accessor: current image's regions (live instances). */
89
+ /**
90
+ * The canonical accessor: the current image's regions. A fresh array, but the
91
+ * instances are the stored ones, shared with the undo history: treat them as
92
+ * read-only and change a region through the store's operations (or by
93
+ * committing a copy). Typed `Region[]` rather than
94
+ * `ReadonlyArray<Readonly<Region>>` because the IRegionStore contract and the
95
+ * backends still take a mutable array.
96
+ */
113
97
  getRegions(): Region[];
114
98
  /** True while a z-stack is loaded and the store holds regions per slice. */
115
99
  isStackMode(): boolean;
@@ -118,7 +102,7 @@ export declare class RegionStore implements IRegionStore, IRegionEditApi {
118
102
  /** How the current stack persists to disk (jit-ui#93): `combined` = one
119
103
  * z-indexed geojson (single-file z-stack); `per-slice-file` = one geojson per
120
104
  * slice-file (folder stack). Meaningless outside stack mode. */
121
- getStackSaveLayout(): 'combined' | 'per-slice-file';
105
+ getStackSaveLayout(): StackSaveLayout;
122
106
  /**
123
107
  * Enter per-slice stack mode. `slices` maps each zero-based slice index to
124
108
  * the regions imported for that slice; the store makes `initialZ`'s slice the
@@ -128,9 +112,11 @@ export declare class RegionStore implements IRegionStore, IRegionEditApi {
128
112
  * every slice for save/export. Ids/names/classification colours are minted
129
113
  * exactly as {@link setRegions} does.
130
114
  */
131
- enterStackMode(slices: Map<number, Region[]>, initialZ?: number, saveLayout?: 'combined' | 'per-slice-file'): void;
115
+ enterStackMode(slices: Map<number, Region[]>, initialZ?: number, saveLayout?: StackSaveLayout): void;
132
116
  /** Leave stack mode (single-plane image, or the stack was closed). */
133
117
  exitStackMode(): void;
118
+ /** The live-set swap of {@link setDisplaySlice}. */
119
+ private showSlice;
134
120
  /**
135
121
  * Show a different slice: capture the current slice's (possibly edited)
136
122
  * regions back into the per-slice store, then load the target slice's regions
@@ -138,6 +124,8 @@ export declare class RegionStore implements IRegionStore, IRegionEditApi {
138
124
  * this only records the requested slice index (a no-op otherwise: single-plane
139
125
  * regions stay on the default plane — addRegion tags Region.z only in stack
140
126
  * mode, so the recorded index is unused until a stack is entered). (jit-ui#93)
127
+ * Either way {@link getRegionSetReplaced$} emits: the slice on screen changed
128
+ * under any in-progress tool work.
141
129
  */
142
130
  setDisplaySlice(z: number): void;
143
131
  /**
@@ -157,16 +145,36 @@ export declare class RegionStore implements IRegionStore, IRegionEditApi {
157
145
  /** Mint ids/names + apply classification colours + tag the slice index, as
158
146
  * {@link setRegions} does, for regions entering the per-slice store. */
159
147
  private normalizeSlice;
148
+ /**
149
+ * Regions entering the store: mint ids and default names, hydrate JSON bounds
150
+ * into class instances — everything downstream (rendering, geometry de-dup,
151
+ * moveRegion, GeoJSON export) discriminates them with `instanceof`
152
+ * (jit-ui#124) — and apply classification colours. A region that is new to
153
+ * the store (no id yet) is completed in place; one that already has an id may
154
+ * be a stored instance shared with the undo history, so it is copied if it
155
+ * changes.
156
+ */
157
+ private admit;
160
158
  /**
161
159
  * Closed polygons projected for image-processing consumers (segmentation,
162
- * trace builders). Open polylines are annotation-only and excluded. Reuses
163
- * the neutral PlotUtilities projection so output matches the previous path.
160
+ * crop requests, trace builders), straight from each region's bounds: a
161
+ * rectangle's corners, a polygon with its holes (a bézier as its curve), one
162
+ * polygon per part of a multi-polygon. Open polylines are annotation-only and
163
+ * excluded. Coordinates are rounded to whole pixels.
164
164
  */
165
- getRegionPolygons(): any[];
165
+ getRegionPolygons(): Polygon[];
166
166
  getRegionUpdateEvent(): Observable<any[]>;
167
167
  /** Live (non-coalesced) region-change stream — fires per frame during a drag.
168
168
  * Used by the intensity-profile inset so it tracks line ROIs live. */
169
169
  getRegionLiveEdit$(): Observable<Region[]>;
170
+ /**
171
+ * Emits after every {@link undo}, {@link redo} and {@link setDisplaySlice} call
172
+ * (even one that changed nothing): the region set was replaced under whatever
173
+ * a canvas tool was building on (a brush stroke, a SAM point prompt), so the
174
+ * backends reset their canvas tools on it. Not emitted for ordinary edits —
175
+ * a tool's own commit must not reset it.
176
+ */
177
+ getRegionSetReplaced$(): Observable<void>;
170
178
  /** Select regions by array index (or [] to clear). Stored internally by id
171
179
  * so the selection survives subsequent edits/reorders. */
172
180
  setSelectedShapeIndices(indices: number[]): void;
@@ -183,16 +191,11 @@ export declare class RegionStore implements IRegionStore, IRegionEditApi {
183
191
  getShowShapeLabel(): boolean;
184
192
  getShapeColor(): string;
185
193
  getFillColor(): string;
186
- /** Convenience setters (not on the contract) for toolbar wiring. */
194
+ /** Show or hide region labels (not on the contract; specs drive it directly).
195
+ * @deprecated Nothing in the library calls it; will be removed next minor. */
187
196
  setShowShapeLabel(show: boolean): void;
188
- setShapeColor(color: string): void;
189
- setFillColor(color: string): void;
190
197
  getClassificationColors(): Map<string, string>;
191
198
  setClassificationColor(label: string, color: string): void;
192
- /** Re-show the last saved snapshot (transient — does not alter stored state). */
193
- plotPreviousShapes(): void;
194
- setPreviousShapes(shapes: any[]): void;
195
- getPreviousShapes(): any[];
196
199
  /** Emits whether an undo step is currently available — drives the toolbar
197
200
  * Undo button's enabled state (greyed out when false). */
198
201
  getCanUndo$(): Observable<boolean>;
@@ -224,35 +227,32 @@ export declare class RegionStore implements IRegionStore, IRegionEditApi {
224
227
  * crosses images). */
225
228
  resetUndoHistory(): void;
226
229
  /** Make `snapshot` the live region set and notify both backends. Shared by
227
- * {@link undo} and {@link redo}; the snapshot is already a detached deep
228
- * clone, so it becomes the live array directly. */
230
+ * {@link undo} and {@link redo}; nothing records history while it runs. */
229
231
  private restoreSnapshot;
230
232
  /**
231
233
  * Capture the pre-action region set into the bounded undo history. Called at
232
- * the top of every mutating operation, *before* it changes `regions`, so the
233
- * snapshot is the state to return to. Rapid commits from one gesture coalesce
234
- * into a single entry (see {@link undoStack}). A fresh action also abandons
235
- * any redo future.
234
+ * the top of every mutating operation, *before* it changes `regions`. The
235
+ * snapshot is the array itself: every operation replaces `regions` (and any
236
+ * region it edits) rather than changing them, so it never changes after this.
236
237
  */
237
238
  private recordUndoSnapshot;
238
- /** Push the current can-undo / can-redo availability to subscribers. */
239
- private emitUndoState;
240
- /** (Re)arm the idle timer that closes the current coalescing burst. */
241
- private armUndoBurst;
242
- private closeUndoBurst;
243
- private cloneRegions;
244
- /** Deep clone a region so an in-place geometry edit can't mutate a stored
245
- * history snapshot (bounds are cloned via {@link cloneBounds}). */
246
- private cloneRegion;
247
239
  importRegions(geoJsonStr: string): Region[];
248
- exportRegions(regions: Region[]): void;
240
+ /** Download `regions` as GeoJSON, named after `fileName` (extension
241
+ * replaced by `.geojson`) or `rois.geojson` without one. */
242
+ exportRegions(regions: Region[], fileName?: string): void;
249
243
  getGeoJsonString(regions: Region[]): string;
250
244
  addRegion(region: Region): number;
251
245
  removeRegion(id: number): void;
246
+ /**
247
+ * Remove the regions with these ids, if present. With `{ recordUndo: false }`
248
+ * no undo step is taken — for clearing transient shapes that were never the
249
+ * user's work (the 3D view's screen-space lassos on an orbit, NAPARI-SVC-11).
250
+ */
251
+ removeRegions(ids: Iterable<number>, opts?: {
252
+ recordUndo?: boolean;
253
+ }): void;
252
254
  updateBounds(id: number, bounds: Rectangle | Polygon | MultiPolygon): void;
253
255
  moveRegion(id: number, dx: number, dy: number): void;
254
- /** Translate a polygon's vertices and any holes in place by (dx, dy). */
255
- private translatePolygon;
256
256
  moveVertex(id: number, index: number, x: number, y: number): void;
257
257
  /** Move a vertex on a polygon's interior ring (hole) — jit-ui#85. */
258
258
  moveHoleVertex(id: number, holeIndex: number, index: number, x: number, y: number): void;
@@ -266,50 +266,42 @@ export declare class RegionStore implements IRegionStore, IRegionEditApi {
266
266
  addVertex(id: number, segIndex: number, x: number, y: number): void;
267
267
  deleteVertex(id: number, index: number): void;
268
268
  setBezier(id: number, bezier: boolean): void;
269
- /** Turn bezier on (and seed editable handles from the smooth default) or off
270
- * (and drop the handles). */
271
- private applyBezier;
272
- /** (Re)seed per-hole bezier handles from the Catmull-Rom default, parallel to `poly.holes`. */
273
- private seedHoleHandles;
274
269
  /** Drag a bezier control point on a hole ring vertex (donut bezier editing). */
275
270
  moveHoleBezierHandle(id: number, holeIndex: number, index: number, side: 'in' | 'out', x: number, y: number): void;
276
271
  moveBezierHandle(id: number, index: number, side: 'in' | 'out', x: number, y: number): void;
272
+ /** Apply a copy-on-write polygon edit to region `id`: record, swap in, emit. */
273
+ private editPolygon;
274
+ /** Swap `next` in for the stored region with its id (a new array), then sync and emit. */
275
+ private replaceRegion;
276
+ /** Coalesce `regionUpdate$` until the matching {@link endBatch} (live drags);
277
+ * the batch is also one undo gesture ({@link beginGesture}). */
277
278
  beginBatch(): void;
278
279
  endBatch(): void;
280
+ /**
281
+ * Mark the start of one user gesture (e.g. a wand/brush mousedown): every
282
+ * commit until the matching {@link endGesture} becomes a single undo step,
283
+ * without delaying `regionUpdate$` (tools render through it while dragging).
284
+ * Calls nest. A gesture never folds into an earlier timed burst.
285
+ */
286
+ beginGesture(): void;
287
+ /** End the gesture opened by {@link beginGesture}; the next commit starts a new step. */
288
+ endGesture(): void;
279
289
  /**
280
290
  * Switch the active image: snapshot the outgoing regions, restore the
281
291
  * incoming image's (or [] if none), clear selection, and notify. Idempotent
282
292
  * for the same image (so repeated replots of one image keep its regions).
283
293
  */
284
294
  setActiveImage(imageInfo: IImageInfo): void;
285
- /** Drop the entire per-image cache (logout / project switch). */
286
- clearRegionsByImageKey(): void;
287
- private deriveImageKey;
288
- /**
289
- * Resolve each region's colour from the annotation-class preset set (jit-ui#70).
290
- * The presets are the source of truth for colour — this **overrides any colour
291
- * embedded in the GeoJSON** (which the YOLO worker writes today). A matching
292
- * preset gives the class colour; an unknown class gets a deterministic fallback
293
- * colour (and, only when `autoPromote` is on, is added to the editable list).
294
- * Regions the user explicitly recoloured (`colorOverridden`) are left untouched.
295
- */
296
- private applyClassificationColors;
295
+ /** Apply the preset set's class colours (see {@link applyPresetColors}),
296
+ * promoting unknown classes into the shared store when the set asks for it. */
297
+ private withClassificationColors;
297
298
  private syncCache;
298
299
  private emit;
299
- /** Project selected ids to current array indices, pruning ids that no longer
300
- * exist, and emit if the index set changed. */
300
+ /** Project the selected ids onto the current regions (pruning gone ones);
301
+ * emits only if the index set changed. */
301
302
  private emitSelection;
302
- private indicesEqual;
303
303
  private findById;
304
304
  private indexOfId;
305
- /** The region's bounds as a Polygon, or undefined if it isn't a polygon. */
306
- private polygonOf;
307
- private clonePolygon;
308
- private cloneBounds;
309
- private regionsEqual;
310
- private polygonsEqual;
311
- /** Compare two polygons' interior-ring (hole) sets for the dedupe path. */
312
- private holesEqual;
313
305
  static ɵfac: i0.ɵɵFactoryDeclaration<RegionStore, never>;
314
306
  static ɵprov: i0.ɵɵInjectableDeclaration<RegionStore>;
315
307
  }
@@ -1,4 +1,3 @@
1
- import { HttpClient } from '@angular/common/http';
2
1
  import { Observable } from 'rxjs';
3
2
  import { ClassPreset, PresetSet } from '../models/class-preset';
4
3
  import { PreferencesPort } from '../contracts/ports/preferences.port';
@@ -9,25 +8,20 @@ import * as i0 from "@angular/core";
9
8
  /**
10
9
  * Backend-neutral store for the **visualization session** — the state that
11
10
  * describes *how* the current image is being viewed, independent of which
12
- * rendering backend (Plotly or OpenSeadragon) is on screen:
11
+ * rendering backend (Plotly, OpenSeadragon or napari-js) is on screen:
13
12
  *
14
13
  * - the active colormap / LUT and its reverse-scale toggle,
15
- * - the current image's physical metadata (µm/pixel etc.),
16
- * - the classification label → colour map,
14
+ * - the current image's physical metadata (µm/pixel etc.) and its per-channel
15
+ * display state (window, gamma, tint, visibility; grayscale / invert),
16
+ * - the annotation-class presets (the classification label → colour map),
17
+ * - the spatial-omics view state,
17
18
  * - which on-canvas tool is currently active.
18
19
  *
19
- * Both backends read and write this single instance, so they stay in lock-step
20
- * regardless of which one is rendering. Previously this state lived inside
21
- * `PlotlyService`, which forced the OpenSeadragon backend to depend on the
22
- * Plotly service purely to read the shared colormap; this store removes that
23
- * coupling — neither backend owns the session state.
24
- *
25
- * NOTE: region *geometry* (the drawn shapes / per-image region cache) still
26
- * lives in `PlotlyService` for now; extracting it into a sibling region store
27
- * is a separate follow-up.
20
+ * Every backend reads and writes this single instance (one per visualizer chain),
21
+ * so they stay in lock-step regardless of which one is rendering; none of them
22
+ * owns the session state. Region geometry lives in the sibling `RegionStore`.
28
23
  */
29
24
  export declare class VisualizerStore {
30
- private readonly http;
31
25
  private readonly prefsPort;
32
26
  private readonly colormap$;
33
27
  private readonly reverseScale$;
@@ -37,6 +31,8 @@ export declare class VisualizerStore {
37
31
  * single-scalar 3D view (the napari Surface) follows for a multichannel image. */
38
32
  private readonly selectedChannel$;
39
33
  private defaultChannelStates;
34
+ /** The image the current channel states were derived for (see setImageMeta). */
35
+ private channelImageKey;
40
36
  private readonly grayscale$;
41
37
  private readonly invert$;
42
38
  private presetSet;
@@ -48,17 +44,7 @@ export declare class VisualizerStore {
48
44
  * Held here, next to the colormap/channel state, so the active backend reacts
49
45
  * to an edit exactly as it does for an image. */
50
46
  private readonly spatialView$;
51
- constructor(http?: HttpClient | null, prefsPort?: PreferencesPort | null);
52
- /**
53
- * Resolve the colormap tree's LUT keys (e.g. "GREYS_LUT") to their colour
54
- * arrays from a served JSON asset. The ~630 KB of LUT data lives outside the
55
- * bundle (as `/assets/plotting/colormap-luts.json`) so it never enters the TS
56
- * / webpack module graph — that data-in-source was the main driver of the
57
- * build's >2 GB heap. Named Plotly scales (e.g. "Viridis") aren't keys in the
58
- * JSON, so they're left untouched. The default LUT ("Greys Inv" → the Plotly
59
- * "Greys" scale) needs no JSON, so the first render works before this resolves.
60
- */
61
- private loadColormapLuts;
47
+ constructor(prefsPort?: PreferencesPort | null);
62
48
  private initPresetPersistence;
63
49
  private normalizePresetSet;
64
50
  /** Queue a debounced save. No-ops until the initial load resolves (and when no port is bound). */
@@ -86,7 +72,16 @@ export declare class VisualizerStore {
86
72
  * Editor) show µm²/mm² instead of px². No-op when neither axis is positive.
87
73
  */
88
74
  setPhysicalPixelSize(mppX?: number, mppY?: number): void;
89
- setImageMeta(imageMeta: IImageMetadata[]): void;
75
+ /**
76
+ * Publish the current image's metadata and derive its channels.
77
+ *
78
+ * `imageKey` identifies the image (its file name). A re-plot of the SAME image
79
+ * keeps the user's window/gamma/tint edits; a different image gets its own
80
+ * derived channels even at the same channel count — keying on the count alone
81
+ * left a DAPI/GFP/RFP stack's names, tints and windows on a following
82
+ * CD3/CD8/PanCK one. Without a key, only a change of channel count re-derives.
83
+ */
84
+ setImageMeta(imageMeta: IImageMetadata[], imageKey?: string): void;
90
85
  /** Channels for an image:
91
86
  * - RGB (rgbChannels ≥ 3) → Red/Green/Blue;
92
87
  * - multichannel fluorescence (channelCount > 1) → one channel per band,
@@ -125,19 +120,13 @@ export declare class VisualizerStore {
125
120
  upsertClass(preset: ClassPreset): void;
126
121
  removeClass(name: string): void;
127
122
  resetPresets(): void;
128
- /** Force a (debounced) write-back of the current preset set. */
129
- persistPresets(): void;
130
123
  getSpatialView$(): Observable<SpatialViewState>;
131
124
  /** Synchronous read, for a renderer building its first frame. */
132
125
  currentSpatialView(): SpatialViewState;
133
126
  /** Patch the spatial view state; emits once with the merged value. */
134
127
  setSpatialView(partial: Partial<SpatialViewState>): void;
135
- /** Reset to defaults — e.g. when a different dataset is selected, where the
136
- * previous colour column almost certainly does not exist. */
137
- resetSpatialView(): void;
138
128
  getActiveTool$(): Observable<string | null>;
139
- getActiveTool(): string | null;
140
129
  setActiveTool(tool: string | null): void;
141
- static ɵfac: i0.ɵɵFactoryDeclaration<VisualizerStore, [{ optional: true; }, { optional: true; }]>;
130
+ static ɵfac: i0.ɵɵFactoryDeclaration<VisualizerStore, [{ optional: true; }]>;
142
131
  static ɵprov: i0.ɵɵInjectableDeclaration<VisualizerStore>;
143
132
  }
@@ -10,9 +10,10 @@
10
10
  * failed or no-op action looked like a dead button.
11
11
  *
12
12
  * These keys are owned by the library and their outlets are rendered by
13
- * {@link VisualizerComponent}, so the feedback works in any host. A host that
14
- * wants these notices somewhere else should not render an outlet with the same
15
- * key — two matching outlets show the message twice.
13
+ * {@link VisualizerComponent}, so the feedback works in any host. Both keys are
14
+ * exported from the package so a host can tell them apart from its own; it should
15
+ * not render an outlet with the same key — two matching outlets show the message
16
+ * twice.
16
17
  */
17
18
  /** General notices: save results, validation, action outcomes. Default position. */
18
19
  export declare const VIZ_TOAST_KEY = "sci-viz-notice";