@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,58 @@
1
+ import { ChangeDetectorRef, DestroyRef, NgZone, OnDestroy, OnInit } from '@angular/core';
2
+ import { IImageInfo } from '../contracts/image.contract';
3
+ import { IVisualizer } from '../contracts/visualizer.contract';
4
+ import { Region } from '../models/region';
5
+ import { FloatingPos } from '../visualizer/floating-drag.directive';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * The floating, draggable intensity-profile inset: shown while any intensity line
9
+ * exists, charting one trace per line as lines are added, moved or removed.
10
+ *
11
+ * Owns the profile and viewport-change subscriptions, the window-resize reflow, the
12
+ * drag and the per-instance chart div id it is given. The chart itself is drawn by the
13
+ * backend (`IVisualizer.renderIntensityInset`) so this never reaches a charting
14
+ * library. Fixed to the viewport, outside the plot div, so it is not clipped to the
15
+ * canvas.
16
+ *
17
+ * OnPush, with its view state in signals: the profile stream may fire outside the zone.
18
+ */
19
+ export declare class IntensityInsetComponent implements OnInit, OnDestroy {
20
+ private readonly visualizer;
21
+ private readonly cdr;
22
+ private readonly zone;
23
+ private readonly destroyRef;
24
+ /** Id of the chart div — unique per viewer: the backend resolves it by id. */
25
+ divId: string;
26
+ /** Id of the viewer's plot div: the inset parks near its top-right corner. */
27
+ plotDivName: string;
28
+ /** The displayed slice, re-sampled at when the view settles. */
29
+ zIndex: number;
30
+ /** The Image view (OSD), whose line sampling is fed from preview frames. */
31
+ imageView: boolean;
32
+ /** The image shown (the Image view samples its lines from it). */
33
+ imageInfo: IImageInfo | undefined;
34
+ /** True whenever any intensity-profile line exists (whatever the plot type). */
35
+ protected readonly hasProfiles: import("@angular/core").WritableSignal<boolean>;
36
+ protected readonly pos: import("@angular/core").WritableSignal<FloatingPos>;
37
+ /** Where a header drag starts from. */
38
+ protected readonly dragOrigin: () => FloatingPos;
39
+ private profiles;
40
+ private readonly onResize;
41
+ constructor(visualizer: IVisualizer, cdr: ChangeDetectorRef, zone: NgZone, destroyRef: DestroyRef);
42
+ ngOnInit(): void;
43
+ /** Removes the window resize listener; the streams end through `takeUntilDestroyed`. */
44
+ ngOnDestroy(): void;
45
+ /** The canvas was resized: reflow the chart a tick later, once the panel has settled. */
46
+ reflow(): void;
47
+ /** A slice was committed: keep the lines sampled from it (Image view). */
48
+ sliceCommitted(z: number): void;
49
+ /**
50
+ * Add another line ROI (next bright colour) and select it on the active backend so
51
+ * it is ready to move or delete. The first line parks the inset near the plot's
52
+ * top-right. Resolves the new line, or null when no image extent is known yet.
53
+ */
54
+ addProfileLine(): Promise<Region | null>;
55
+ private render;
56
+ static ɵfac: i0.ɵɵFactoryDeclaration<IntensityInsetComponent, never>;
57
+ static ɵcmp: i0.ɵɵComponentDeclaration<IntensityInsetComponent, "viz-intensity-inset", never, { "divId": { "alias": "divId"; "required": false; }; "plotDivName": { "alias": "plotDivName"; "required": false; }; "zIndex": { "alias": "zIndex"; "required": false; }; "imageView": { "alias": "imageView"; "required": false; }; "imageInfo": { "alias": "imageInfo"; "required": false; }; }, {}, never, never, true, never>;
58
+ }
@@ -52,8 +52,3 @@ export declare function resolveHandles(xs: number[], ys: number[], closed: boole
52
52
  * closed ring returns to its first point.
53
53
  */
54
54
  export declare function bezierCurveFromHandles(xs: number[], ys: number[], handles: AnchorHandle[], closed: boolean): CurvePoints;
55
- /**
56
- * Flatten the smooth Catmull-Rom bezier through the anchors (no custom handles).
57
- * Falls back to the anchors when there are too few to form a curve.
58
- */
59
- export declare function bezierCurve(xs: number[], ys: number[], closed: boolean): CurvePoints;
@@ -5,7 +5,12 @@
5
5
  * The `PresetSet` is the per-user, server-persisted source of truth for region colours;
6
6
  * see `class-color.util.ts` for the deterministic colour-resolution engine.
7
7
  */
8
+ /** Where a preset class came from: added by the user, one of the built-in
9
+ * defaults, or auto-promoted from an unknown region label. */
8
10
  export type PresetSource = 'user' | 'default' | 'auto';
11
+ /** One annotation class and its colour: regions whose `label` matches
12
+ * `name` (per the set's {@link MatchMode}) draw in `color` unless their colour
13
+ * was overridden by hand. */
9
14
  export interface ClassPreset {
10
15
  /** The class name — matched against `Region.label`. */
11
16
  name: string;
@@ -16,7 +21,14 @@ export interface ClassPreset {
16
21
  /** Provenance; `'auto'` = added by opt-in fallback promotion. */
17
22
  source?: PresetSource;
18
23
  }
24
+ /** How a region label is matched to a preset name: `'exact'` compares the
25
+ * strings as is; `'normalized'` trims and lower-cases both first. */
19
26
  export type MatchMode = 'exact' | 'normalized';
27
+ /**
28
+ * The per-user class-colour configuration (server-persisted through the
29
+ * preferences port): the preset classes, the palette for labels outside them,
30
+ * and the matching rules. Resolved into region colours by `class-color.util.ts`.
31
+ */
20
32
  export interface PresetSet {
21
33
  /** Ordered list of preset classes. */
22
34
  classes: ClassPreset[];
@@ -37,3 +49,9 @@ export declare const DEFAULT_FALLBACK_PALETTE: string[];
37
49
  export declare function defaultPresetSet(): PresetSet;
38
50
  /** True when the set has no usable classes (e.g. the server returned an empty/blank record). */
39
51
  export declare function isEmptyPresetSet(set: PresetSet | null | undefined): boolean;
52
+ /**
53
+ * Validate an untrusted value (e.g. an imported JSON file) as a preset set.
54
+ * Returns a clean copy — only well-formed `{ name, color }` classes, defaults
55
+ * for missing optional fields — or null when it has no usable classes.
56
+ */
57
+ export declare function parsePresetSet(value: unknown): PresetSet | null;
@@ -1,66 +1,32 @@
1
1
  /**
2
- * Pure geometry helpers extracted from PlotlyService.
2
+ * Pure SVG-path helpers (build and parse a vertex ring as a Plotly path).
3
3
  *
4
- * No DOM access, no service state, no `this` — every function is testable
5
- * in isolation. Keep it that way: this module is the dumping ground for
6
- * shape/mask/SVG-path utilities the wand, vertex eraser, and region editor
7
- * share. If a helper grows a `this.shapes` reference, it doesn't belong here.
4
+ * No DOM access, no service state, no `this`. Mask and ring geometry (the
5
+ * rasterizer, mask set operations, point-in-ring, simplification, contour
6
+ * tracing) lives in `src/lib/geometry/`.
8
7
  */
9
- /** A bbox-relative binary mask (1 = filled, 0 = empty). */
10
- export interface BBoxMask {
11
- bx: number;
12
- by: number;
13
- bw: number;
14
- bh: number;
15
- mask: Uint8Array;
16
- }
17
8
  /** Parsed single-subpath polygon vertices. */
18
9
  export interface PolygonVertices {
19
10
  xpoints: number[];
20
11
  ypoints: number[];
21
12
  }
22
13
  /**
23
- * Parse a single-subpath `M x,y L x,y ... Z` path into vertex arrays.
14
+ * Split a single-subpath `M x,y L x,y ... [Z]` path into vertex arrays, plus
15
+ * whether it is closed (ends in `Z`). No validation: a coordinate that doesn't
16
+ * parse comes back as NaN. See {@link parseSvgPathPolygon} for the checked form.
17
+ */
18
+ export declare function parseSvgPath(path: string): PolygonVertices & {
19
+ closed: boolean;
20
+ };
21
+ /**
22
+ * Parse a single-subpath `M x,y L x,y ... [Z]` path into vertex arrays.
24
23
  *
25
24
  * Returns null for paths we can't safely round-trip (multi-subpath, curves,
26
- * fewer than three vertices). The wand only adopts shapes it produced or
27
- * that Plotly's drawclosedpath produces, both of which are single-subpath
28
- * polygons.
25
+ * non-numeric coordinates, fewer than three vertices).
29
26
  */
30
27
  export declare function parseSvgPathPolygon(path: string): PolygonVertices | null;
31
- /**
32
- * Build a closed SVG path string `M x,y L x,y L ... Z` from vertex arrays.
33
- * Returns '' for fewer than three vertices (degenerate).
34
- */
35
- export declare function polygonToSvgPath(xpoints: number[], ypoints: number[]): string;
36
28
  /**
37
29
  * Build an SVG path string from vertex arrays. Closed polygons end with `Z`,
38
30
  * open polylines do not. Returns '' for fewer than two vertices (degenerate).
39
31
  */
40
32
  export declare function verticesToSvgPath(xs: number[], ys: number[], closed: boolean): string;
41
- /**
42
- * Compare two Plotly shape objects for "same region" — used by the wand to
43
- * avoid appending duplicates when the user pushes the same find result more
44
- * than once. Polygons compare by SVG path string, rectangles compare by
45
- * (x0, y0, x1, y1).
46
- */
47
- export declare function shapesEqual(a: any, b: any): boolean;
48
- /** Returns true if the two bbox-relative masks share at least one set pixel. */
49
- export declare function masksOverlap(a: BBoxMask, b: BBoxMask): boolean;
50
- /**
51
- * Allocate a fresh accumulator covering both masks and OR them in. The
52
- * resulting mask's bbox is the smallest rectangle containing both inputs.
53
- */
54
- export declare function unionMasks(a: BBoxMask, b: BBoxMask): BBoxMask;
55
- /**
56
- * Simplify a closed ring with the Douglas–Peucker algorithm (jit-ui#85):
57
- * drop every vertex that lies within `epsilon` pixels (the "altitude
58
- * threshold") of the line between its kept neighbours. Anchored at vertex 0
59
- * (the ring is closed by appending it). Rings of ≤ 3 vertices, or a
60
- * non-positive epsilon, are returned unchanged. Output keeps the closed-ring
61
- * convention (no repeated closing point).
62
- */
63
- export declare function simplifyRing(xs: number[], ys: number[], epsilon: number): {
64
- xs: number[];
65
- ys: number[];
66
- };
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Copy-on-write polygon edits (review RT-13, RegionStore split "polygon-edit").
3
+ *
4
+ * Every function takes a polygon and returns a NEW {@link Polygon} with the
5
+ * edit applied — or null when the edit does not apply (an index out of range,
6
+ * a vertex delete that would degenerate the ring, …), so a caller can skip its
7
+ * undo step. The input is never mutated: arrays the edit does not touch are
8
+ * shared with it (structural sharing), arrays it does touch are copied. That
9
+ * is what lets `RegionStore` keep shallow undo snapshots instead of deep
10
+ * clones: an instance in a snapshot is never changed after the fact.
11
+ *
12
+ * Pure: no DOM, no store. Coordinates are image pixels; bézier handle offsets
13
+ * are relative to their anchor, as on {@link Polygon}.
14
+ */
15
+ import { MultiPolygon, Polygon, Rectangle } from './region';
16
+ /** Move exterior vertex `index` to (x, y). Null when `index` is out of range. */
17
+ export declare function moveVertex(p: Polygon, index: number, x: number, y: number): Polygon | null;
18
+ /**
19
+ * Insert a vertex at (x, y) after `segIndex` (the start vertex of the edge),
20
+ * clamped to the ring. A bézier polygon with stored handles gives the new
21
+ * vertex smooth handles from its neighbours and keeps the others' (possibly
22
+ * hand-edited) handles.
23
+ */
24
+ export declare function addVertex(p: Polygon, segIndex: number, x: number, y: number): Polygon;
25
+ /**
26
+ * Delete exterior vertex `index`. Null when out of range, or when it would
27
+ * leave fewer than 3 vertices (2 for an open polyline).
28
+ */
29
+ export declare function deleteVertex(p: Polygon, index: number): Polygon | null;
30
+ /** Move vertex `index` of hole `holeIndex` to (x, y). Null when either is out of range. */
31
+ export declare function moveHoleVertex(p: Polygon, holeIndex: number, index: number, x: number, y: number): Polygon | null;
32
+ /**
33
+ * Insert a vertex at (x, y) on hole `holeIndex`, after `segIndex`. A bézier
34
+ * polygon re-seeds its hole handles so they stay parallel to the rings. Null
35
+ * for an out-of-range hole.
36
+ */
37
+ export declare function addHoleVertex(p: Polygon, holeIndex: number, segIndex: number, x: number, y: number): Polygon | null;
38
+ /**
39
+ * Delete vertex `index` of hole `holeIndex`. Taking a ring below 3 vertices
40
+ * drops the whole hole (it would bound no area). Null when out of range.
41
+ */
42
+ export declare function deleteHoleVertex(p: Polygon, holeIndex: number, index: number): Polygon | null;
43
+ /**
44
+ * Per-hole bézier handles seeded from the Catmull-Rom default, parallel to
45
+ * `holes` (both undefined without holes).
46
+ */
47
+ export declare function seededHoleHandles(holes: number[][][] | undefined): Pick<Polygon, 'holeHandlesIn' | 'holeHandlesOut'>;
48
+ /**
49
+ * Turn bézier on — seeding editable handles (holes included) from the smooth
50
+ * default — or off, dropping every handle. The anchors never move. Null when
51
+ * the polygon is already in that state.
52
+ */
53
+ export declare function setBezier(p: Polygon, bezier: boolean): Polygon | null;
54
+ /**
55
+ * Move the `side` control point of exterior vertex `index` to the absolute
56
+ * point (x, y). Handles missing from a bézier polygon are seeded from the
57
+ * default first. Null for a non-bézier polygon or an out-of-range index.
58
+ */
59
+ export declare function moveBezierHandle(p: Polygon, index: number, side: 'in' | 'out', x: number, y: number): Polygon | null;
60
+ /**
61
+ * Move the `side` control point of vertex `index` on hole `holeIndex` to the
62
+ * absolute point (x, y), seeding the hole handles first when missing. Null for
63
+ * a non-bézier polygon or an out-of-range hole/index.
64
+ */
65
+ export declare function moveHoleBezierHandle(p: Polygon, holeIndex: number, index: number, side: 'in' | 'out', x: number, y: number): Polygon | null;
66
+ /**
67
+ * A polygon moved by (dx, dy): its vertices and holes (bézier offsets are
68
+ * relative, so they carry over). `round` snaps the moved coordinates.
69
+ */
70
+ export declare function translatePolygon(p: Polygon, dx: number, dy: number, round?: (v: number) => number): Polygon;
71
+ /** Any region geometry moved by (dx, dy) (see {@link translatePolygon}). */
72
+ export declare function translateBounds(b: Rectangle | Polygon | MultiPolygon, dx: number, dy: number, round?: (v: number) => number): Rectangle | Polygon | MultiPolygon;
@@ -0,0 +1,40 @@
1
+ import { MultiPolygon, Polygon, Rectangle, Region } from './region';
2
+ /**
3
+ * Polygon / Region construction and cloning in one place, so callers stop
4
+ * hand-filling `npoints`, `xpoints`, `ypoints`, `coordinates` and `closed`
5
+ * (three redundant views of one ring that every mutator must keep in sync).
6
+ */
7
+ /** Options for {@link makePolygon}. */
8
+ export interface MakePolygonOptions {
9
+ /** false for an open polyline; default true. */
10
+ closed?: boolean;
11
+ /** Interior rings; omitted when absent or empty. */
12
+ holes?: number[][][];
13
+ bezier?: boolean;
14
+ }
15
+ /** A Polygon over the given vertex arrays (taken by reference). */
16
+ export declare function makePolygon(xs: number[], ys: number[], opts?: MakePolygonOptions): Polygon;
17
+ /** The four corners of a rectangle as a closed ring (clockwise from top-left). */
18
+ export declare function rectToRing(r: Pick<Rectangle, 'x' | 'y' | 'width' | 'height'>): {
19
+ xs: number[];
20
+ ys: number[];
21
+ };
22
+ /** A deep copy of a polygon: vertices, holes and every bézier handle. */
23
+ export declare function clonePolygon(p: Polygon): Polygon;
24
+ /** A deep copy of any region geometry. */
25
+ export declare function cloneBounds(bounds: Rectangle | Polygon | MultiPolygon): Rectangle | Polygon | MultiPolygon;
26
+ /**
27
+ * A copy of `existing` (id, name, label, colour, colour override, source,
28
+ * file name, kind, z, …) with new geometry and optional extra fields. Use it
29
+ * whenever a tool edits a region's shape, so the edit never drops metadata and
30
+ * never mutates the store's instance.
31
+ */
32
+ export declare function replaceBounds(existing: Region, bounds: Region['bounds'], patch?: Partial<Region>): Region;
33
+ /**
34
+ * The closed polygons a region covers, for image-processing consumers (crop,
35
+ * segmentation requests): a rectangle's four corners, a closed polygon with its
36
+ * holes (a bézier region as its flattened curve), one polygon per part of a
37
+ * multi-polygon. Open polylines cover no area and yield nothing. Coordinates
38
+ * are rounded to whole pixels.
39
+ */
40
+ export declare function regionPolygons(region: Region): Polygon[];
@@ -0,0 +1,20 @@
1
+ import { Polygon, Region } from './region';
2
+ /**
3
+ * Copy-on-write region copies and geometry equality (RT-13). Stored regions
4
+ * are shared with the undo history, so a change is always a copy; these
5
+ * helpers return the input unchanged when the patch would not change it.
6
+ * (Deep geometry copies are `cloneBounds` / `clonePolygon` in `polygon-factory`.)
7
+ */
8
+ /** A shallow copy of `r` with `patch` applied; `r` itself is never changed. */
9
+ export declare function withRegionPatch(r: Region, patch: Partial<Region>): Region;
10
+ /** `r` tagged with slice `z`: itself when it already is, else a copy. */
11
+ export declare function withRegionZ(r: Region, z: number): Region;
12
+ /**
13
+ * True when two regions have the same geometry: equal rectangles, or polygons
14
+ * (each part of a multi-polygon, in order) with the same vertices, open/closed
15
+ * state and holes. Bézier handles, labels and colours are not compared. Mixed
16
+ * kinds are never equal.
17
+ */
18
+ export declare function regionsEqual(a: Region, b: Region): boolean;
19
+ /** Same vertices, open/closed state and holes (see {@link regionsEqual}). */
20
+ export declare function polygonsEqual(pa: Polygon, pb: Polygon): boolean;
@@ -0,0 +1,17 @@
1
+ import { Region } from './region';
2
+ /**
3
+ * Parse a GeoJSON FeatureCollection string (QuPath-compatible) into regions.
4
+ * Throws on invalid JSON, a missing `features` key, or a feature without
5
+ * coordinates.
6
+ */
7
+ export declare function regionsFromGeoJson(geoJsonStr: string): Region[];
8
+ /**
9
+ * Serialise regions as a GeoJSON FeatureCollection string (QuPath-compatible),
10
+ * leaving out intensity-profile lines.
11
+ */
12
+ export declare function regionsToGeoJson(rois: readonly Region[]): string;
13
+ /**
14
+ * Download a GeoJSON string as `<baseName without extension>.geojson`
15
+ * (`rois.geojson` without a base name).
16
+ */
17
+ export declare function downloadGeoJson(jsonString: string, baseName?: string): void;
@@ -1,9 +1,20 @@
1
1
  import { ShapeSelection } from './shape';
2
+ /**
3
+ * One annotation region — the backend-neutral model every renderer (Plotly,
4
+ * OpenSeadragon, napari-js), the RegionStore, the Region Editor and the
5
+ * GeoJSON/QuPath import/export share.
6
+ *
7
+ * Geometry lives in {@link bounds}, in full-resolution image-pixel
8
+ * coordinates (x right, y down) of slice {@link z}. A region with no bounds
9
+ * (`null`/absent) is kept but draws nowhere. Regions that arrive as JSON are
10
+ * rebuilt into class instances by {@link hydrateBounds} on their way into the
11
+ * store, so `bounds instanceof Rectangle` etc. can be relied on downstream.
12
+ */
2
13
  export declare class Region {
3
- /** Stable, unique identity for selection and equality. Minted by
4
- * PlotlyService when a region first enters the system. Never derived
5
- * from array index — name collisions across delete/add cycles must
6
- * not break PrimeNG row selection. */
14
+ /** Stable, unique identity for selection and equality. Minted by the
15
+ * RegionStore when a region first enters it. Never derived from array
16
+ * index — name collisions across delete/add cycles must not break PrimeNG
17
+ * row selection. */
7
18
  id: number;
8
19
  name: string;
9
20
  bounds?: Rectangle | Polygon | MultiPolygon | null;
@@ -37,6 +48,7 @@ export declare class Region {
37
48
  * or a region drawn without a slice context (jit-ui#93). */
38
49
  z: number;
39
50
  shapeColor?: string | undefined;
51
+ /** @deprecated Unused by the library; will be removed in the next minor release. */
40
52
  bytesPerPixel: number;
41
53
  /**
42
54
  * resolution is the resolution at which the region
@@ -49,13 +61,19 @@ export declare class Region {
49
61
  * at resolution = 0
50
62
  */
51
63
  resolution: number;
64
+ /** @deprecated Unused by the library; will be removed in the next minor release. */
52
65
  cropped: boolean;
66
+ /** @deprecated Unused by the library; will be removed in the next minor release. */
53
67
  tileNumber: number;
54
68
  tileCoordinates: number[] | null;
55
69
  /** True for intensity-profile line ROIs (the intensity tool's lines). These are
56
70
  * NOT annotation regions: they never appear in the Region Editor and editor
57
71
  * operations (select/save/delete) must never touch them. */
58
72
  isProfile(): boolean;
73
+ /**
74
+ * A debug string: the rectangle's box, or the polygon's SVG path.
75
+ * @deprecated Unused by the library; will be removed in the next minor release.
76
+ */
59
77
  toString(): string;
60
78
  /**
61
79
  * Returns a ShapeSelection object that can be used to
@@ -67,12 +85,23 @@ export declare class Region {
67
85
  isRectangle(bnds: any): bnds is Rectangle;
68
86
  isPolygon(bnds: any): bnds is Polygon;
69
87
  }
88
+ /** An axis-aligned box in image-pixel coordinates: (`x`, `y`) is the top-left
89
+ * (minimum) corner, `width`/`height` extend right/down. */
70
90
  export declare class Rectangle {
71
91
  x: number;
72
92
  y: number;
73
93
  width: number;
74
94
  height: number;
75
95
  }
96
+ /**
97
+ * A polygon or open polyline in image-pixel coordinates, optionally with holes
98
+ * and smoothed into a bézier curve.
99
+ *
100
+ * The vertices are stored twice and must agree: as the parallel `xpoints` /
101
+ * `ypoints` arrays (length `npoints`; the Java/JIT wire shape) and as
102
+ * `coordinates` `[x, y]` pairs (what GeoJSON export reads). The ring is
103
+ * implicitly closed — the first vertex is not repeated at the end.
104
+ */
76
105
  export declare class Polygon {
77
106
  npoints: number;
78
107
  xpoints: number[];
@@ -132,6 +161,13 @@ export declare class MultiPolygon {
132
161
  /** One or more disjoint closed polygons (each may have holes). */
133
162
  polygons: Polygon[];
134
163
  }
164
+ /**
165
+ * A region's geometry as a host may supply it: a {@link Rectangle} or
166
+ * {@link Polygon} instance, or a plain object with the same fields (e.g. parsed
167
+ * JSON, possibly with only some of them). Image-pixel coordinates. Plain objects
168
+ * become class instances via {@link hydrateBounds} when they enter the store;
169
+ * {@link Region.bounds} itself is always an instance (or a {@link MultiPolygon}).
170
+ */
135
171
  export type Bounds = Rectangle | Polygon | {
136
172
  x?: number;
137
173
  y?: number;
@@ -1,5 +1,13 @@
1
1
  import { Region } from './region';
2
2
  import { Datum, Font, Shape, ShapeLabel, ShapeLine, XAxisName, YAxisName } from 'plotly.js-dist-min';
3
+ /**
4
+ * A {@link Region} projected to a Plotly layout shape (`rect` or SVG `path`),
5
+ * carrying the region's identity, class label and file name along so it
6
+ * round-trips through Plotly's relayout. Coordinates are the plot's data
7
+ * coordinates, which are the region's image pixels. Built by
8
+ * {@link Region.getShape}; {@link getRegion} converts back (only `rect` and
9
+ * `path` shapes — anything else throws).
10
+ */
3
11
  export declare class ShapeSelection implements Shape {
4
12
  /** Stable, unique identity carried alongside the shape so it round-trips
5
13
  * through Plotly's relayout untouched. Plotly preserves unknown
@@ -0,0 +1,125 @@
1
+ import { Injector, NgZone, Type } from '@angular/core';
2
+ import { Observable } from 'rxjs';
3
+ import { Message } from 'primeng/api';
4
+ import { IImageInfo } from '../contracts/image.contract';
5
+ import { PlotType, PlotTypeId } from '../contracts/plot-type';
6
+ import { PlotModeTools, PlotTypeContribution } from '../contracts/plot-type-contribution.contract';
7
+ import { ToolbarContribution, ToolbarDialogToolContribution } from '../contracts/toolbar-tool.contract';
8
+ import { IVisualizer } from '../contracts/visualizer.contract';
9
+ import { PlotModeController } from './plot-mode-controller';
10
+ /** The live contributed mode's side panel, as the template renders it. */
11
+ export interface PlotModePanelView {
12
+ title: string;
13
+ /** An Angular component panel, with its own injector… */
14
+ component: Type<unknown> | null;
15
+ injector: Injector | null;
16
+ /** …or a plain host element a `mount` panel rendered into. */
17
+ host: HTMLElement | null;
18
+ }
19
+ /** The open dialog tool's dialog, as the template renders it. */
20
+ export interface ToolDialogView {
21
+ title: string;
22
+ width: string;
23
+ host: HTMLElement;
24
+ }
25
+ /** What the contributions need from the viewer that hosts them. */
26
+ export interface ContributionViewer {
27
+ readonly visualizer: IVisualizer;
28
+ readonly zone: NgZone;
29
+ /** The toolbar tools a contribution may arm (`PlotModeContext.tools`). */
30
+ readonly tools: PlotModeTools;
31
+ /** Parent of a component panel's injector. */
32
+ readonly injector?: Injector;
33
+ imageInfo$(): Observable<IImageInfo | null>;
34
+ /** The selector's id (a built-in type or a contributed mode). */
35
+ selectedId(): PlotTypeId;
36
+ /** The built-in type being rendered. */
37
+ renderedType(): PlotType;
38
+ /** A contributed mode could not start: select its base type, already on screen. */
39
+ selectBase(type: PlotType): void;
40
+ notify(message: Message): void;
41
+ detectChanges(): void;
42
+ }
43
+ /**
44
+ * Hosts the library's two kinds of contributed sessions over the viewer:
45
+ * - **plot modes** (`PLOT_TYPE_CONTRIBUTIONS`): a selector entry riding on a built-in
46
+ * base type, with an optional side panel;
47
+ * - **dialog tools** (`TOOLBAR_TOOLS`, `kind: 'dialog'`): a floating dialog over the
48
+ * Image view, whose body the tool mounts once the dialog is in the document.
49
+ *
50
+ * Both run through a {@link PlotModeController} (one live session each, isolated from
51
+ * a failing contribution). A session is bound to the base view it drew over, so it
52
+ * ends before anything else draws ({@link endSessions}) and restarts once the next
53
+ * render has landed ({@link activate}).
54
+ */
55
+ export declare class ContributionHost {
56
+ private readonly viewer;
57
+ readonly plotModes: PlotModeController;
58
+ readonly toolDialogs: PlotModeController;
59
+ /** Dialog tools, sorted; their buttons show in the Image view only. */
60
+ readonly dialogTools: ToolbarDialogToolContribution[];
61
+ /** The live mode's panel; null while no contributed session is live. */
62
+ plotModePanel: PlotModePanelView | null;
63
+ /** The open dialog tool's live dialog. */
64
+ toolDialog: ToolDialogView | null;
65
+ /** The dialog tool the user has open (its session may be between renders). */
66
+ openDialogToolId: string | null;
67
+ private destroying;
68
+ /** The live dialog body's teardown, and a pending wait for its host to connect. */
69
+ private toolDialogTeardown;
70
+ private toolDialogFrame;
71
+ constructor(plotTypeContributions: readonly PlotTypeContribution[] | null | undefined, toolContributions: readonly ToolbarContribution[] | null | undefined, viewer: ContributionViewer);
72
+ /** End both sessions: the view they drew over is about to go. An open dialog tool
73
+ * stays open and restarts on the next {@link activate}. */
74
+ endSessions(): void;
75
+ /** A render landed: start the selected mode's session and the open dialog tool's. */
76
+ activate(): void;
77
+ /** The viewer is being destroyed: end both sessions without touching its view. */
78
+ destroy(): void;
79
+ /** The toolbar button: open the tool's dialog, or close it if it is open. */
80
+ toggleDialogTool(id: string): void;
81
+ /** Close the open dialog tool: its body is torn down, then its session ends. */
82
+ closeDialogTool(): void;
83
+ /** Attach a `mount` panel's host element once the panel dialog renders its slot. */
84
+ attachPanelSlot(slot: HTMLElement | undefined): void;
85
+ /** Attach the open dialog tool's host element once its dialog renders its slot. */
86
+ attachToolDialogSlot(slot: HTMLElement | undefined): void;
87
+ /**
88
+ * Start the selected contributed mode's session, once its base view has plotted.
89
+ * No-op for a built-in type, or when the base on screen is not the one the mode
90
+ * rides on. A backend that cannot provide a viewport for it (e.g. OSD fell back to
91
+ * Plotly) counts as a failed activation.
92
+ */
93
+ private activateSelectedPlotMode;
94
+ /** Start (or restart, after a re-render) the open dialog tool's session. */
95
+ private activateOpenDialogTool;
96
+ /** A session's context over the backend on screen, or null when it has no viewport. */
97
+ private context;
98
+ /** Render the live mode's panel. Activation can resolve outside Angular (an OSD
99
+ * callback, a contribution's own promise), hence the zone re-entry. */
100
+ private showPlotModePanel;
101
+ /** Drop the panel (destroying a component panel) before the session ends. */
102
+ private hidePlotModePanel;
103
+ /** A contributed mode could not start. Its base type is already on screen — the base
104
+ * plotted first — so just select it: nothing needs to re-plot. */
105
+ private fallBackFromPlotMode;
106
+ /**
107
+ * The dialog-tool session is live: render the dialog, then mount the tool's body
108
+ * once the host element is in the document, so `mount()` can measure it and start
109
+ * widgets that need a connected element.
110
+ */
111
+ private showToolDialog;
112
+ /**
113
+ * Mount `tool`'s body into `host` once it is connected (the dialog may attach it a
114
+ * frame later, when it moves itself to `<body>`). If it never connects within
115
+ * {@link TOOL_DIALOG_ATTACH_FRAMES} it is mounted anyway, with a warning, rather than
116
+ * leaving an empty dialog. A throwing `mount()` fails the session like a failed start.
117
+ */
118
+ private mountToolDialogBody;
119
+ /** The dialog-tool session is about to end: tear the body down first, then drop the dialog. */
120
+ private hideToolDialog;
121
+ /** A dialog tool could not start: close it and say so. */
122
+ private dialogToolFailed;
123
+ /** Run change detection; returns what it threw (logged), or null. */
124
+ private detectChangesSafely;
125
+ }
@@ -0,0 +1,60 @@
1
+ import { ViewerCapabilities } from '../contracts/capabilities.contract';
2
+ import { IImageInfo } from '../contracts/image.contract';
3
+ import { PlotTypeDescriptor, PlotTypeId } from '../contracts/plot-type';
4
+ import { ContributedPlotTypeDescriptor, PlotTypeOption } from '../contracts/plot-type-contribution.contract';
5
+ /** What a spatial-omics dataset on offer contributes to the plot-type gates. */
6
+ export interface SpatialGates {
7
+ /** A dataset is published on `SPATIAL_DATA_PORT`. */
8
+ hasDataset: boolean;
9
+ /** Its observations carry a z, so it can be drawn as a 3D cloud. */
10
+ has3d: boolean;
11
+ /** It brings pixels of its own: a tissue image it registers onto, or a volume
12
+ * published as a z-stack image. */
13
+ hasPixels: boolean;
14
+ }
15
+ /** Everything {@link computePlotTypeMenu} gates on. */
16
+ export interface PlotTypeMenuInput {
17
+ /** The built-in types the backend advertises. */
18
+ descriptors: PlotTypeDescriptor[];
19
+ /** Contributed plot modes (`PLOT_TYPE_CONTRIBUTIONS`). */
20
+ contributions: ContributedPlotTypeDescriptor[];
21
+ caps: ViewerCapabilities;
22
+ imageInfo: IImageInfo | undefined;
23
+ spatial: SpatialGates;
24
+ /** Offer every backend's type under its full label, not just the curated set. */
25
+ testMode: boolean;
26
+ }
27
+ /** The selector's entries: {@link builtIn} then the contributed modes. */
28
+ export interface PlotTypeMenu {
29
+ builtIn: PlotTypeDescriptor[];
30
+ menu: PlotTypeOption[];
31
+ }
32
+ /**
33
+ * Plot types offered in the selector for the current image:
34
+ * - Outside **test mode**, only the curated default set (descriptors with a
35
+ * `productionLabel`) is offered, shown under suffix-free names — Image,
36
+ * Heatmap, Contour and the napari Surface / Volume / Isosurface. Test mode
37
+ * exposes every backend's type under its full (backend-suffixed) label.
38
+ * - 3D types hidden when the backend can't render a 3D scene.
39
+ * - stack-only types (volume, isosurface) hidden unless the file is a stack —
40
+ * a volume needs multiple z-slices.
41
+ * - scalar-intensity types (contour, surface, isosurface) hidden for RGB
42
+ * images — they map a single intensity per pixel. Image and Heatmap render
43
+ * any image. A multichannel image's bands are each scalar, so it passes.
44
+ * - spatial-omics types hidden until a `SpatialDataset` is published on
45
+ * `SPATIAL_DATA_PORT` — the mode has nothing to draw without observations,
46
+ * exactly as a volume has nothing to draw without a stack.
47
+ * - image-sourced types hidden while a dataset that brings no pixels is up.
48
+ *
49
+ * Contributed modes come after every built-in one, under the same label rule and
50
+ * their own stack/grayscale/spatial gates; a mode also needs whatever its base view
51
+ * needs, so the base type's gates apply too.
52
+ */
53
+ export declare function computePlotTypeMenu(input: PlotTypeMenuInput): PlotTypeMenu;
54
+ /**
55
+ * The type to fall back to when `selected` is no longer offered — Image when it is
56
+ * on offer, else the first type still offered — or null when `selected` is still
57
+ * offered (or nothing is). With no image loaded the pixel modes are gone, and falling
58
+ * back to Image would select a mode the selector does not list and nothing can draw.
59
+ */
60
+ export declare function reconcilePlotType(menu: PlotTypeOption[], selected: PlotTypeId): PlotTypeId | null;