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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (525) hide show
  1. package/README.md +201 -460
  2. package/esm2022/index.mjs +28 -15
  3. package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
  4. package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
  5. package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
  7. package/esm2022/lib/contracts/color.mjs +60 -0
  8. package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
  9. package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
  10. package/esm2022/lib/contracts/display-types.mjs +11 -1
  11. package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
  12. package/esm2022/lib/contracts/intensity.mjs +48 -5
  13. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  14. package/esm2022/lib/contracts/plot-type.mjs +134 -17
  15. package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
  16. package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
  17. package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
  18. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
  19. package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
  20. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  21. package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
  22. package/esm2022/lib/contracts/sam.contract.mjs +1 -1
  23. package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
  24. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  25. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
  26. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  27. package/esm2022/lib/contracts/viz-config.mjs +2 -1
  28. package/esm2022/lib/geometry/contour.mjs +63 -0
  29. package/esm2022/lib/geometry/raster.mjs +98 -0
  30. package/esm2022/lib/geometry/ring.mjs +201 -0
  31. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
  32. package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
  33. package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
  34. package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
  35. package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
  36. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
  37. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +3 -4
  38. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
  39. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -591
  40. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
  41. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
  42. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
  43. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
  44. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +263 -0
  45. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
  46. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
  47. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
  48. package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
  49. package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
  50. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +344 -0
  51. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +358 -4218
  52. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -0
  53. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
  54. package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
  55. package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
  56. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +182 -0
  57. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
  58. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
  59. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
  60. package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
  61. package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
  62. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
  63. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
  64. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
  65. package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
  66. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
  67. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
  68. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
  69. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
  70. package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
  71. package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
  72. package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
  73. package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
  74. package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
  75. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +153 -0
  76. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
  77. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
  78. package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
  79. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
  80. package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
  81. package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
  82. package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
  83. package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
  84. package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
  85. package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
  86. package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
  87. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
  88. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
  89. package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
  90. package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
  91. package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
  92. package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
  93. package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
  94. package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
  95. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
  96. package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
  97. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
  98. package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
  99. package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
  100. package/esm2022/lib/implementations/region-centroids.mjs +47 -0
  101. package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
  102. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
  103. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
  104. package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
  105. package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
  106. package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
  107. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
  108. package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
  109. package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
  110. package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
  111. package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
  112. package/esm2022/lib/models/bezier.mjs +1 -11
  113. package/esm2022/lib/models/class-preset.mjs +41 -3
  114. package/esm2022/lib/models/geometry.mjs +27 -164
  115. package/esm2022/lib/models/polygon-edit.mjs +254 -0
  116. package/esm2022/lib/models/polygon-factory.mjs +118 -0
  117. package/esm2022/lib/models/region-clone.mjs +68 -0
  118. package/esm2022/lib/models/region-geojson.mjs +373 -0
  119. package/esm2022/lib/models/region.mjs +34 -33
  120. package/esm2022/lib/models/shape.mjs +18 -16
  121. package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
  122. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
  123. package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
  124. package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
  125. package/esm2022/lib/plot.utilities.mjs +296 -473
  126. package/esm2022/lib/processing/image-crop.mjs +1 -1
  127. package/esm2022/lib/processing/processing-image.mjs +28 -15
  128. package/esm2022/lib/provide-visualization.mjs +40 -14
  129. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +99 -0
  130. package/esm2022/lib/region-editor/file-stem.mjs +13 -0
  131. package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
  132. package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
  133. package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
  134. package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
  135. package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
  136. package/esm2022/lib/region-editor/region-editor.component.mjs +402 -651
  137. package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
  138. package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
  139. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -0
  140. package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
  141. package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
  142. package/esm2022/lib/region-ops.service.mjs +28 -70
  143. package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
  144. package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
  145. package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
  146. package/esm2022/lib/render-orchestrator.mjs +14 -11
  147. package/esm2022/lib/render-session.mjs +207 -0
  148. package/esm2022/lib/routing-visualizer.service.mjs +459 -411
  149. package/esm2022/lib/spatial/density-raster.mjs +14 -0
  150. package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
  151. package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
  152. package/esm2022/lib/spatial/gene-search.mjs +1 -1
  153. package/esm2022/lib/spatial/glyphs.mjs +97 -0
  154. package/esm2022/lib/spatial/lod.mjs +187 -0
  155. package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
  156. package/esm2022/lib/spatial/spatial-density.mjs +25 -16
  157. package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
  158. package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
  159. package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
  160. package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
  161. package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
  162. package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
  163. package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
  164. package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
  165. package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
  166. package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
  167. package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
  168. package/esm2022/lib/spatial/stats.mjs +71 -0
  169. package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
  170. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
  171. package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
  172. package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
  173. package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
  174. package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
  175. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
  176. package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
  177. package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
  178. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
  179. package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
  180. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
  181. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
  182. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
  183. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
  184. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
  185. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
  186. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
  187. package/esm2022/lib/store/class-color.util.mjs +46 -3
  188. package/esm2022/lib/store/region-history.mjs +146 -0
  189. package/esm2022/lib/store/region-scope-cache.mjs +140 -0
  190. package/esm2022/lib/store/region-selection.mjs +82 -0
  191. package/esm2022/lib/store/region-store.service.mjs +279 -675
  192. package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
  193. package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
  194. package/esm2022/lib/toast-outlets.mjs +5 -4
  195. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
  196. package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
  197. package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
  198. package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
  199. package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
  200. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +114 -0
  201. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
  202. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
  203. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
  204. package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
  205. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
  206. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
  207. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
  208. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
  209. package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
  210. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
  211. package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
  212. package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
  213. package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
  214. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +81 -0
  215. package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
  216. package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
  217. package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
  218. package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
  219. package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
  220. package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
  221. package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
  222. package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
  223. package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
  224. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
  225. package/esm2022/lib/toolbar/toolbar.component.mjs +68 -117
  226. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
  227. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
  228. package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
  229. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
  230. package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
  231. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
  232. package/esm2022/lib/util/mark-for-check.mjs +17 -0
  233. package/esm2022/lib/util/supersede.mjs +56 -0
  234. package/esm2022/lib/visualization.module.mjs +39 -141
  235. package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
  236. package/esm2022/lib/visualizer/region-actions.mjs +149 -0
  237. package/esm2022/lib/visualizer/region-load.mjs +60 -0
  238. package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
  239. package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
  240. package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
  241. package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
  242. package/esm2022/lib/visualizer.component.mjs +480 -1902
  243. package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
  244. package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
  245. package/esm2022/lib/workers/spatial-math.mjs +190 -0
  246. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs +41083 -0
  247. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
  248. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
  249. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map +1 -0
  250. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
  251. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
  252. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
  253. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  254. package/fesm2022/mask.worker.js +36 -917
  255. package/fesm2022/onnx-sam.worker.js +52 -16
  256. package/fesm2022/spatial-math.worker.js +471 -0
  257. package/fesm2022/tsne.worker.js +32 -15
  258. package/index.d.ts +13 -10
  259. package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
  260. package/lib/contracts/capabilities.contract.d.ts +4 -2
  261. package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
  262. package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
  263. package/lib/contracts/color.d.ts +27 -0
  264. package/lib/contracts/colormap-lut.d.ts +19 -4
  265. package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
  266. package/lib/contracts/display-types.d.ts +21 -0
  267. package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
  268. package/lib/contracts/intensity.d.ts +13 -2
  269. package/lib/contracts/plot-type.d.ts +3 -1
  270. package/lib/contracts/ports/image-state.port.d.ts +6 -2
  271. package/lib/contracts/ports/preferences.port.d.ts +4 -0
  272. package/lib/contracts/ports/region-io.port.d.ts +1 -0
  273. package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
  274. package/lib/contracts/ports/tile-access.port.d.ts +1 -0
  275. package/lib/contracts/region-editor-api.contract.d.ts +1 -1
  276. package/lib/contracts/region-overlay.contract.d.ts +5 -0
  277. package/lib/contracts/sam.contract.d.ts +7 -0
  278. package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
  279. package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
  280. package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
  281. package/lib/contracts/visualizer.contract.d.ts +221 -54
  282. package/lib/contracts/viz-config.d.ts +1 -0
  283. package/lib/geometry/contour.d.ts +24 -0
  284. package/lib/geometry/raster.d.ts +42 -0
  285. package/lib/geometry/ring.d.ts +67 -0
  286. package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
  287. package/lib/implementations/base-store-visualizer.d.ts +61 -15
  288. package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
  289. package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
  290. package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
  291. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
  292. package/lib/implementations/napari-js/napari-loading-badge.d.ts +0 -1
  293. package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
  294. package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
  295. package/lib/implementations/napari-js/napari-scene.d.ts +93 -0
  296. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
  297. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
  298. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
  299. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +89 -0
  300. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
  301. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
  302. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
  303. package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
  304. package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
  305. package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
  306. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +121 -883
  307. package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -0
  308. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
  309. package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
  310. package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
  311. package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
  312. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
  313. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
  314. package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
  315. package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
  316. package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
  317. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
  318. package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
  319. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
  320. package/lib/implementations/osd/display-pipeline.d.ts +38 -9
  321. package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
  322. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
  323. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
  324. package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
  325. package/lib/implementations/osd/osd-coords.d.ts +6 -4
  326. package/lib/implementations/osd/osd-export.d.ts +36 -0
  327. package/lib/implementations/osd/osd-lib.d.ts +7 -0
  328. package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
  329. package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
  330. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +37 -0
  331. package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
  332. package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
  333. package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
  334. package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
  335. package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
  336. package/lib/implementations/osd/osd-viewport.d.ts +77 -0
  337. package/lib/implementations/osd/osd-zoom.d.ts +6 -0
  338. package/lib/implementations/osd/simple-source.d.ts +161 -0
  339. package/lib/implementations/osd/slice-cache.d.ts +12 -3
  340. package/lib/implementations/osd/tile-client.d.ts +11 -14
  341. package/lib/implementations/osd/tile-recolor.d.ts +141 -0
  342. package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
  343. package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
  344. package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
  345. package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
  346. package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
  347. package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
  348. package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
  349. package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
  350. package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
  351. package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
  352. package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
  353. package/lib/implementations/plotly/plotly.service.d.ts +136 -401
  354. package/lib/implementations/region-centroids.d.ts +14 -0
  355. package/lib/implementations/simple-slice-access.service.d.ts +7 -4
  356. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
  357. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
  358. package/lib/implementations/tile-server/index.d.ts +5 -0
  359. package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
  360. package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
  361. package/lib/implementations/tile-server/tile-protocol.d.ts +80 -0
  362. package/lib/implementations/tile-server/transport.d.ts +62 -0
  363. package/lib/intensity/intensity-profile.d.ts +66 -0
  364. package/lib/intensity/intensity-profile.service.d.ts +108 -0
  365. package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
  366. package/lib/models/bezier.d.ts +0 -5
  367. package/lib/models/class-preset.d.ts +18 -0
  368. package/lib/models/geometry.d.ts +14 -48
  369. package/lib/models/polygon-edit.d.ts +72 -0
  370. package/lib/models/polygon-factory.d.ts +40 -0
  371. package/lib/models/region-clone.d.ts +20 -0
  372. package/lib/models/region-geojson.d.ts +17 -0
  373. package/lib/models/region.d.ts +40 -4
  374. package/lib/models/shape.d.ts +8 -0
  375. package/lib/plot-mode/contribution-host.d.ts +125 -0
  376. package/lib/plot-mode/plot-type-menu.d.ts +60 -0
  377. package/lib/plot-mode/tool-params-model.d.ts +49 -0
  378. package/lib/plot.utilities.d.ts +19 -30
  379. package/lib/processing/processing-image.d.ts +5 -2
  380. package/lib/provide-visualization.d.ts +19 -2
  381. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +56 -0
  382. package/lib/region-editor/file-stem.d.ts +7 -0
  383. package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
  384. package/lib/region-editor/mask-export.service.d.ts +54 -0
  385. package/lib/region-editor/mask-raster.d.ts +2 -8
  386. package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
  387. package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
  388. package/lib/region-editor/region-editor.component.d.ts +166 -199
  389. package/lib/region-editor/region-metrics.d.ts +26 -0
  390. package/lib/region-editor/region-persistence.service.d.ts +69 -0
  391. package/lib/region-editor/region-table/region-table.component.d.ts +83 -0
  392. package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
  393. package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
  394. package/lib/region-ops.service.d.ts +1 -7
  395. package/lib/region-overlay/region-geometry.d.ts +157 -0
  396. package/lib/region-overlay/region-hit-test.d.ts +38 -0
  397. package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
  398. package/lib/render-orchestrator.d.ts +6 -2
  399. package/lib/render-session.d.ts +75 -0
  400. package/lib/routing-visualizer.service.d.ts +110 -58
  401. package/lib/spatial/density-raster.d.ts +6 -0
  402. package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
  403. package/lib/spatial/embedding-compute.d.ts +21 -2
  404. package/lib/spatial/glyphs.d.ts +16 -0
  405. package/lib/spatial/lod.d.ts +94 -0
  406. package/lib/spatial/spatial-controls.facade.d.ts +64 -0
  407. package/lib/spatial/spatial-density.d.ts +15 -5
  408. package/lib/spatial/spatial-encoding.d.ts +11 -44
  409. package/lib/spatial/spatial-expression.d.ts +40 -22
  410. package/lib/spatial/spatial-framing.d.ts +1 -0
  411. package/lib/spatial/spatial-heatmap.d.ts +2 -0
  412. package/lib/spatial/spatial-hover.d.ts +4 -16
  413. package/lib/spatial/spatial-panel-model.d.ts +135 -0
  414. package/lib/spatial/spatial-selection.d.ts +21 -26
  415. package/lib/spatial/spatial-tile-merge.d.ts +41 -0
  416. package/lib/spatial/spatial-tiles.d.ts +9 -256
  417. package/lib/spatial/stats.d.ts +38 -0
  418. package/lib/spatial/transcript-grouping.d.ts +119 -0
  419. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
  420. package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
  421. package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
  422. package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
  423. package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
  424. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
  425. package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
  426. package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
  427. package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
  428. package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
  429. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
  430. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
  431. package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
  432. package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
  433. package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
  434. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
  435. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
  436. package/lib/store/class-color.util.d.ts +35 -1
  437. package/lib/store/region-history.d.ts +66 -0
  438. package/lib/store/region-scope-cache.d.ts +63 -0
  439. package/lib/store/region-selection.d.ts +36 -0
  440. package/lib/store/region-store.service.d.ts +104 -112
  441. package/lib/store/visualizer-store.service.d.ts +22 -33
  442. package/lib/toast-outlets.d.ts +4 -3
  443. package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
  444. package/lib/toolbar/canvas-tools.d.ts +20 -0
  445. package/lib/toolbar/crop/slide-crop.d.ts +10 -4
  446. package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
  447. package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
  448. package/lib/toolbar/region-tools/region-tools.component.d.ts +60 -0
  449. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
  450. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
  451. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
  452. package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
  453. package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
  454. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
  455. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
  456. package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
  457. package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
  458. package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
  459. package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
  460. package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
  461. package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
  462. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +40 -0
  463. package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
  464. package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
  465. package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
  466. package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
  467. package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
  468. package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
  469. package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
  470. package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
  471. package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
  472. package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
  473. package/lib/toolbar/toolbar.component.d.ts +47 -83
  474. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
  475. package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
  476. package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
  477. package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
  478. package/lib/toolbar/wand/wand.service.d.ts +22 -116
  479. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
  480. package/lib/util/mark-for-check.d.ts +11 -0
  481. package/lib/util/supersede.d.ts +53 -0
  482. package/lib/visualization.module.d.ts +18 -39
  483. package/lib/visualizer/floating-drag.directive.d.ts +30 -0
  484. package/lib/visualizer/region-actions.d.ts +54 -0
  485. package/lib/visualizer/region-load.d.ts +27 -0
  486. package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
  487. package/lib/visualizer/tool-modes.d.ts +49 -0
  488. package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
  489. package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
  490. package/lib/visualizer.component.d.ts +201 -447
  491. package/lib/workers/spatial-math-ops.d.ts +65 -0
  492. package/lib/workers/spatial-math-worker.d.ts +7 -0
  493. package/lib/workers/spatial-math.d.ts +74 -0
  494. package/package.json +12 -3
  495. package/src/lib/styles/_viz-icons-rules.scss +73 -0
  496. package/src/lib/styles/viz-icons.scss +14 -0
  497. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
  498. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
  499. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
  500. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
  501. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
  502. package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
  503. package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
  504. package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
  505. package/src/lib/assets/cell-detection.svg +0 -37
  506. package/src/lib/assets/click.svg +0 -1
  507. package/src/lib/assets/colormap-luts.json +0 -1
  508. package/src/lib/assets/edit-selection-white.svg +0 -47
  509. package/src/lib/assets/icons/colormap-earth.png +0 -0
  510. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  511. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  512. package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
  513. package/src/lib/assets/picture-segmentation.svg +0 -43
  514. package/src/lib/assets/test/download-379.svg +0 -1
  515. package/src/lib/assets/test/download-98.svg +0 -1
  516. package/src/lib/assets/test/json-1.svg +0 -1
  517. package/src/lib/assets/test/load-53.svg +0 -1
  518. package/src/lib/assets/test/mask-44.svg +0 -1
  519. package/src/lib/assets/test/mask-download-44.svg +0 -15
  520. package/src/lib/assets/test/mask-save-44.svg +0 -11
  521. package/src/lib/assets/test/overlay-1.svg +0 -1
  522. package/src/lib/assets/test/overlay-4.svg +0 -1
  523. package/src/lib/assets/test/region-26.svg +0 -1
  524. package/src/lib/assets/test/save-56.svg +0 -1
  525. package/src/lib/assets/test/upload-43.svg +0 -1
@@ -1,47 +1,81 @@
1
- import { ChangeDetectorRef, ElementRef, EventEmitter, OnDestroy, Renderer2 } from '@angular/core';
1
+ import { ChangeDetectorRef, ElementRef, EventEmitter, NgZone, OnDestroy, Renderer2 } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
+ /**
4
+ * A compact colour picker: a swatch button that opens a honeycomb palette with a
5
+ * hex field, the system colour picker, HSL sliders and RGB fields. Bind `[color]`
6
+ * and listen to `(colorChange)` (committed picks) and, for a live preview,
7
+ * `(colorInput)` (every intermediate colour while dragging).
8
+ */
3
9
  export declare class HexColorPickerComponent implements OnDestroy {
4
10
  private elRef;
5
11
  private renderer;
6
12
  private cdr;
13
+ private ngZone;
7
14
  private static readonly DROPDOWN_WIDTH;
8
- private _color;
15
+ /** The colour shown (the swatch, the hex field, the selected cell). */
16
+ private readonly current;
17
+ /** The committed colour: a swatch/hex pick, or a slider/field/system-picker
18
+ * edit once it is released. Hosts commit their state on this. */
9
19
  colorChange: EventEmitter<string>;
10
- open: boolean;
11
- swatchBtn: ElementRef<HTMLButtonElement>;
12
- dropdownRef: ElementRef<HTMLDivElement>;
13
- hue: number;
14
- saturation: number;
15
- lightness: number;
16
- red: number;
17
- green: number;
18
- blue: number;
19
- readonly colorRows: string[][];
20
+ /** Every intermediate colour while a slider, number field or the system picker
21
+ * is being dragged — for a live preview; {@link colorChange} follows on release. */
22
+ colorInput: EventEmitter<string>;
23
+ /** The last colour emitted on (or received through) `color`, so a release
24
+ * without a change doesn't commit again. */
25
+ private committed;
26
+ /** Removes the document click listener; set only while the dropdown is open. */
27
+ private unlistenDocumentClick;
28
+ /** The palette dropdown is open. */
29
+ protected readonly open: import("@angular/core").WritableSignal<boolean>;
30
+ private swatchBtn;
31
+ private dropdownRef;
32
+ protected readonly hue: import("@angular/core").WritableSignal<number>;
33
+ protected readonly saturation: import("@angular/core").WritableSignal<number>;
34
+ protected readonly lightness: import("@angular/core").WritableSignal<number>;
35
+ protected readonly red: import("@angular/core").WritableSignal<number>;
36
+ protected readonly green: import("@angular/core").WritableSignal<number>;
37
+ protected readonly blue: import("@angular/core").WritableSignal<number>;
38
+ /** Slider tracks: hue is fixed; saturation and lightness follow the other two. */
39
+ protected readonly hueGradient: string;
40
+ protected readonly satGradient: import("@angular/core").Signal<string>;
41
+ protected readonly lightGradient: import("@angular/core").Signal<string>;
42
+ protected readonly colorRows: string[][];
20
43
  private normalizeHexColor;
44
+ /** The colour (`#RRGGBB`) to show; upper-cased on the way in. */
21
45
  get color(): string;
22
46
  set color(val: string);
23
- constructor(elRef: ElementRef, renderer: Renderer2, cdr: ChangeDetectorRef);
47
+ constructor(elRef: ElementRef, renderer: Renderer2, cdr: ChangeDetectorRef, ngZone: NgZone);
24
48
  ngOnDestroy(): void;
25
- toggle(): void;
49
+ protected toggle(): void;
50
+ /**
51
+ * Close on a click outside the swatch and dropdown. Registered only while
52
+ * open and outside the Angular zone, so the many pickers on a page (one per
53
+ * class row and channel) don't each run app-wide change detection on every
54
+ * click anywhere (RT-22).
55
+ */
56
+ private listenForOutsideClicks;
57
+ private stopListeningForOutsideClicks;
26
58
  private appendDropdownToBody;
27
59
  private removeDropdownFromBody;
28
- selectColor(hex: string): void;
29
- selectAndClose(hex: string): void;
60
+ protected selectColor(hex: string): void;
61
+ /** Live preview from the system colour picker while it is open. */
62
+ protected previewColor(hex: string): void;
63
+ /** Commit the current colour (`colorChange`) unless it was already committed. */
64
+ protected commitColor(): void;
65
+ protected selectAndClose(hex: string): void;
66
+ /** Close the palette dropdown (no-op when closed). */
30
67
  close(): void;
31
- onHexInput(value: string): void;
32
- onHslChange(): void;
33
- onRgbChange(): void;
34
- get hueGradient(): string;
35
- get satGradient(): string;
36
- get lightGradient(): string;
37
- onDocumentClick(event: Event): void;
68
+ protected onHexInput(value: string): void;
69
+ protected onHslChange(): void;
70
+ protected onRgbChange(): void;
71
+ /** Close the dropdown when `event` is a click outside the picker. */
72
+ protected onDocumentClick(event: Event): void;
73
+ private isOutside;
38
74
  private syncFromHex;
39
75
  private syncRgbFromHex;
76
+ private setRgb;
40
77
  private syncHslFromRgb;
41
- private hexToRgb;
42
- private rgbToHex;
43
78
  private rgbToHsl;
44
- private hslToHex;
45
79
  static ɵfac: i0.ɵɵFactoryDeclaration<HexColorPickerComponent, never>;
46
- static ɵcmp: i0.ɵɵComponentDeclaration<HexColorPickerComponent, "hex-color-picker", never, { "color": { "alias": "color"; "required": false; }; }, { "colorChange": "colorChange"; }, never, never, false, never>;
80
+ static ɵcmp: i0.ɵɵComponentDeclaration<HexColorPickerComponent, "hex-color-picker", never, { "color": { "alias": "color"; "required": false; }; }, { "colorChange": "colorChange"; "colorInput": "colorInput"; }, never, never, true, never>;
47
81
  }
@@ -1,28 +1,35 @@
1
1
  import { Observable } from 'rxjs';
2
2
  import { IDisplayOptions, IRegionStore } from '../contracts/visualizer.contract';
3
3
  import { Region } from '../models/region';
4
- import { ColormapNode } from '../contracts/display-types';
4
+ import { CanvasToolId, CanvasToolOptions, ColormapNode, IBrushOptions, IWandOptions } from '../contracts/display-types';
5
+ import type { CanvasToolManager } from '../toolbar/tool-kit/canvas-tool-manager';
5
6
  import { IImageMetadata } from '../contracts/image.contract';
6
7
  import { RegionStore } from '../store/region-store.service';
7
8
  import { VisualizerStore } from '../store/visualizer-store.service';
8
9
  /**
9
- * Shared store-delegation base for the OpenSeadragon and napari-js
10
+ * Shared store-delegation base for the OpenSeadragon, napari-js and Plotly
10
11
  * `IVisualizer` backends. The entire `IRegionStore` and `IDisplayOptions`
11
12
  * surfaces (plus the two classification-colour members) are pure forwarders to
12
- * the shared `RegionStore` / `VisualizerStore` in BOTH backends — so they live
13
- * here once, as a single source of truth, rather than being copied per backend.
14
- * (This is the "cross-backend behaviour that isn't rendering belongs in a
15
- * shared abstraction" convention from CLAUDE.md; the extraction closes
16
- * SHARED-BACKEND-REFACTOR.md.)
13
+ * the shared `RegionStore` / `VisualizerStore` — so they live here once, as a
14
+ * single source of truth, rather than being copied per backend. (This is the
15
+ * "cross-backend behaviour that isn't rendering belongs in a shared
16
+ * abstraction" convention from CLAUDE.md; see
17
+ * docs/history/2026-07-shared-backend-refactor.md.)
18
+ *
19
+ * The on-canvas tool controls (`setActiveTool` and the per-tool setters) live
20
+ * here too: each subclass creates its own {@link CanvasToolManager} over its own
21
+ * tool host and gates pointer/readback in {@link beforeToolChange}.
17
22
  *
18
23
  * Backend-specific members — `load`/`plot`/`reset`/zoom/`setZIndex`/readback,
19
- * the region OVERLAY, tool wiring, histograms, scale bar, tiling, colormap LUT
20
- * application — deliberately stay in each subclass.
24
+ * the region OVERLAY, the tool host, SAM/Cellpose runs, histograms, scale bar,
25
+ * tiling, colormap LUT application — deliberately stay in each subclass. Plotly keeps a Plotly-shape
26
+ * working-set beside the store and redraws it from the store's update events
27
+ * (like the OSD/napari overlays), so it overrides only the colormap and reverse
28
+ * scale (a live restyle) and `exportRegions` (the file name).
21
29
  *
22
30
  * NOT `@Injectable`: an abstract base doesn't participate in Angular DI. Each
23
31
  * subclass stays `@Injectable`, declares its own injected dependencies
24
- * (including the two stores), and passes them to `super(...)`. Plotly is
25
- * intentionally not a subclass — it has its own region model.
32
+ * (including the two stores), and passes them to `super(...)`.
26
33
  */
27
34
  export declare abstract class BaseStoreVisualizer implements IRegionStore, IDisplayOptions {
28
35
  protected readonly regionStore: RegionStore;
@@ -39,9 +46,6 @@ export declare abstract class BaseStoreVisualizer implements IRegionStore, IDisp
39
46
  getShowShapeLabel(): boolean;
40
47
  getShapeColor(): string;
41
48
  getFillColor(): string;
42
- plotPreviousShapes(): void;
43
- setPreviousShapes(shapes: any[]): void;
44
- getPreviousShapes(): any[];
45
49
  undo(): void;
46
50
  redo(): void;
47
51
  canUndo(): boolean;
@@ -59,13 +63,55 @@ export declare abstract class BaseStoreVisualizer implements IRegionStore, IDisp
59
63
  setDisplaySlice(z: number): void;
60
64
  getSliceRegions(): Region[];
61
65
  getStackSaveSlices(): Map<number, Region[]>;
66
+ /** This backend's canvas tools, created by the subclass over its own host. */
67
+ protected abstract readonly canvasTools: CanvasToolManager;
68
+ /**
69
+ * Runs before every tool change, for the backend's pointer and readback
70
+ * gating (pan/zoom off while a tool holds the pointer, a fresh pixel
71
+ * readback). Return false to arm nothing; the armed tool is disarmed anyway.
72
+ */
73
+ protected beforeToolChange(_next: CanvasToolId | null): boolean;
74
+ /**
75
+ * Arm one on-canvas tool, disarming the armed one; null — or any id that is
76
+ * not a canvas tool (a region draw mode, pan) — disarms only. Re-arming the
77
+ * armed tool applies `options` and keeps its work in progress.
78
+ */
79
+ setActiveTool(id: string | null, options?: CanvasToolOptions): void;
80
+ /** @deprecated Use {@link setActiveTool}(`'wand'`, options) / (null). */
81
+ setWandMode(active: boolean, options?: IWandOptions): void;
82
+ setWandOptions(options: IWandOptions): void;
83
+ clearActiveWandRegion(): void;
84
+ /** @deprecated Use {@link setActiveTool}(`'brush'`, options) / (null). */
85
+ setBrushMode(active: boolean, options?: IBrushOptions): void;
86
+ setBrushOptions(options: IBrushOptions): void;
87
+ /** @deprecated Use {@link setActiveTool}(`'eraseVertex'`, { radius }) / (null). */
88
+ setVertexEraserMode(active: boolean): void;
89
+ setVertexEraserRadius(radius: number): void;
90
+ /** @deprecated Use {@link setActiveTool}(`'zoomToBox'`) / (null). */
91
+ setZoomToBoxMode(active: boolean): void;
92
+ /** @deprecated Use {@link setActiveTool}(`'samPoint'`) / (null). */
93
+ setSamPointMode(active: boolean): void;
94
+ commitSamPoints(): void;
95
+ clearSamPoints(): void;
96
+ /** A per-tool setter: arm `id`, or disarm it if it is the armed tool. */
97
+ private setToolMode;
98
+ /** Drop what is bound to the view (each backend's own teardown). */
99
+ abstract unsubscribe(): void;
100
+ /** The view is going away: release what is bound to it (`IViewerBackend.detach`) —
101
+ * first the armed tool, whose overlay canvas and ResizeObserver sit on the view's
102
+ * container (the backend outlives the view). */
103
+ detach(): void;
104
+ /** Each backend's own fit (Plotly autorange, OSD home, napari camera fit). */
105
+ abstract autoscale(): void;
106
+ /** Fit the image into the view (`IViewerBackend.fitToView`). */
107
+ fitToView(): void;
62
108
  getClassificationColors(): Map<string, string>;
63
109
  setClassificationColor(label: string, color: string): void;
64
110
  getColormap(): Observable<ColormapNode | null>;
65
111
  setColormap(colormap: ColormapNode): void;
66
112
  getColormapOptions(): ColormapNode[];
67
113
  getReverseScale(): Observable<boolean>;
68
- setReverseScale(reverscale: any): void;
114
+ setReverseScale(reverscale: boolean): void;
69
115
  setImageMeta(imageMeta: IImageMetadata[]): void;
70
116
  getImageMeta(): Observable<IImageMetadata[]>;
71
117
  }
@@ -0,0 +1,36 @@
1
+ import type { AxesLayer, SurfaceLayer, Viewer } from 'napari-js';
2
+ import type { AxisLabelSpec } from 'napari-js/overlays';
3
+ import { ISurface3dControls } from '../../contracts/visualizer.contract';
4
+ import type { SceneContext } from './napari-scene';
5
+ /** A centred world box. */
6
+ export interface Box3 {
7
+ width: number;
8
+ height: number;
9
+ depth: number;
10
+ }
11
+ /**
12
+ * The 3D coordinate-axes / scale gizmo (review Appendix B): napari-js's `AxesLayer` plus the DOM
13
+ * X/Y/Z labels that track it (its `AxesLabelsOverlay`) — what the volume and the surface used to
14
+ * build twice.
15
+ */
16
+ export declare class Axes3dGizmo {
17
+ private readonly viewer;
18
+ readonly layer: AxesLayer;
19
+ private readonly labels;
20
+ constructor(viewer: Viewer, host: HTMLElement, box: Box3, labels: AxisLabelSpec[], opts: {
21
+ visible: boolean;
22
+ voxelSize?: [number, number, number];
23
+ });
24
+ setVisible(visible: boolean): void;
25
+ /** The box's depth changed (the volume's Z-height handle): restretch the axis and its labels. */
26
+ setDepth(depth: number, labels: AxisLabelSpec[]): void;
27
+ destroy(): void;
28
+ }
29
+ /** A Plotly-style 3D drag mode, as napari-js's camera drag mode (orbit/turntable → rotate). */
30
+ export declare function cameraDragMode(mode: string): 'pan' | 'zoom' | 'rotate';
31
+ /**
32
+ * The 3D view controls every 3D image scene offers: camera drag mode and re-framing, the axes
33
+ * gizmo's visibility and the surface's wireframe — both persisted in the viewer settings, so the
34
+ * next mount re-applies them.
35
+ */
36
+ export declare function surface3dControls(ctx: SceneContext, gizmo: () => Axes3dGizmo | null, surface?: () => SurfaceLayer | null): ISurface3dControls;
@@ -0,0 +1,76 @@
1
+ import { Subscription } from 'rxjs';
2
+ import type { Colormap } from 'napari-js';
3
+ import { IChannelState } from '../../contracts/channel-histogram-api.contract';
4
+ import { Rgb } from '../../contracts/colormap-lut';
5
+ import { ColormapNode, SpatialViewState } from '../../contracts/display-types';
6
+ import { VisualizerStore } from '../../store/visualizer-store.service';
7
+ /** The display settings every napari layer's colours are derived from. */
8
+ export interface DisplaySnapshot {
9
+ /** The selected display colormap node (a name or inline stops in `data.value`), if any. */
10
+ colormap: ColormapNode | null;
11
+ reverse: boolean;
12
+ invert: boolean;
13
+ }
14
+ /** The grayscale display colormap from the store selection (+reverse), defaulting to gray.
15
+ * Maps the store colormap node to a napari `Colormap` via the library's LUT factory; the
16
+ * multichannel tint ramps are built inside napari-js's `MultiChannelImageView` from each
17
+ * channel's hex colour. */
18
+ export declare function grayscaleColormap(s: DisplaySnapshot): Colormap | string;
19
+ /** A channel's tint colormap (black→colour), flipped for reverse-scale. Invert is not a colormap
20
+ * flip: it goes on the layer (`invert`), before gamma, as on the 2D image. */
21
+ export declare function channelTintColormap(color: string, s: DisplaySnapshot): Colormap | string;
22
+ /**
23
+ * Colour map for the volume/isosurface (and the surface and 3D scatter). A real colormap
24
+ * selection (viridis/magma/…) wins; otherwise the channel's colour tints it (so the channel-dialog
25
+ * colour swatch recolors the 3D render). Reverse-scale flips the ramp; invert is the layer's own
26
+ * `invert` (window → invert → gamma → colormap), not a second flip — the two differ once gamma ≠ 1.
27
+ */
28
+ export declare function volumeColormap(st: IChannelState | undefined, s: DisplaySnapshot): Colormap | string;
29
+ /** The LUT a continuous spatial layer draws with: the view's own choice, else the display
30
+ * colormap and its reverse flag — one rule for the markers, the cloud and both gene maps. */
31
+ export declare function spatialLut(view: SpatialViewState, s: DisplaySnapshot): Rgb[];
32
+ /**
33
+ * Identity of the colour scale a continuous spatial layer will draw with, for a
34
+ * cache key: the explicit choice, or else the display colormap and its reverse
35
+ * flag, since that is what {@link spatialLut} falls back to.
36
+ *
37
+ * The gene maps cache their coloured output, so without this in the key a change
38
+ * of colour scale left the field on screen in the previous colours — the markers
39
+ * recoloured and the map under them did not.
40
+ */
41
+ export declare function continuousColormapKey(view: SpatialViewState, s: DisplaySnapshot): string;
42
+ /**
43
+ * The store's display state as the napari layers consume it (review Appendix B, step 3;
44
+ * NAPARI-SVC-21): one subscription to channel states, colormap, reverse, invert and the selected
45
+ * channel, a {@link DisplaySnapshot} of the last values seen, and the colormap/LUT derivations
46
+ * every scene shares.
47
+ *
48
+ * The snapshot outlives a scene, as the scenes' builders read it before their own subscription
49
+ * has emitted; each scene owns the subscription {@link watch} hands it.
50
+ */
51
+ export declare class NapariDisplayState implements DisplaySnapshot {
52
+ private readonly store;
53
+ colormap: ColormapNode | null;
54
+ reverse: boolean;
55
+ invert: boolean;
56
+ constructor(store: VisualizerStore);
57
+ /**
58
+ * Follow the store: record the colormap/reverse/invert the builders read, then hand `apply`
59
+ * the channel states and the selected channel. Emits at once with the current values.
60
+ */
61
+ watch(apply: (channels: IChannelState[], selected: number) => void): Subscription;
62
+ /**
63
+ * Follow the invert setting alone: record it for the builders, then hand it to `apply` — for a
64
+ * scene that draws inverted layers without the channel states (the spatial cloud's density
65
+ * volumes). Emits at once with the current value.
66
+ */
67
+ watchInvert(apply: (invert: boolean) => void): Subscription;
68
+ /** The spatial scenes' share: they follow the colormap and reverse flag (not invert) through
69
+ * their own subscription, because a gene map recolours with them. */
70
+ record(colormap: ColormapNode | null, reverse: boolean): void;
71
+ grayscaleColormap(): Colormap | string;
72
+ channelTintColormap(color: string): Colormap | string;
73
+ volumeColormap(st: IChannelState | undefined): Colormap | string;
74
+ spatialLut(view: SpatialViewState): Rgb[];
75
+ continuousColormapKey(view: SpatialViewState): string;
76
+ }
@@ -0,0 +1,129 @@
1
+ import type { ChannelView } from 'napari-js';
2
+ import { IImageInfo } from '../../contracts/image.contract';
3
+ import { IHistogram } from '../../contracts/channel-histogram-api.contract';
4
+ /**
5
+ * Pure helpers and constants of the napari-js backend: no viewer, no store, no network. Shared by
6
+ * the service and its scenes (review Appendix B, step 1).
7
+ */
8
+ /**
9
+ * A short, stable id for a colormap value, for cache keys.
10
+ *
11
+ * Half the library's colormaps are NAMES and half are inline `[stop, colour]`
12
+ * arrays of 256 entries. Stringifying the array kind would put 6 KB in a key that
13
+ * is rebuilt and compared on every view change; hashing it keeps the key small,
14
+ * and it only has to distinguish one colormap from another.
15
+ */
16
+ export declare function colormapId(value: unknown): string;
17
+ export declare const VOLUME_MAX_SLICE = 1024;
18
+ /** Reference in-plane world size (long side) for the volume/axes box, in arbitrary world units.
19
+ * The box is anchored to this reference regardless of the chosen decimate factor, so changing the
20
+ * resolution changes DETAIL, not the volume's proportions (Z no longer appears to shrink when the
21
+ * in-plane sampling grows). Set to the DEFAULT decimate's in-plane cap so the default view is
22
+ * unchanged; higher/lower resolutions keep that same shape. */
23
+ export declare const VOLUME_WORLD_INPLANE_REF: number;
24
+ /** Max concurrent slice fetches when assembling a volume — keeps the connection pool busy
25
+ * without flooding it (browsers cap ~6/host) on a deep stack. */
26
+ export declare const VOLUME_FETCH_CONCURRENCY = 8;
27
+ /** Volume/isosurface sampling for a decimate factor `scale` (1 = Full 1024, 2 = ½ 512, 4 = ¼ 256
28
+ * default, 8 = ⅛ 128): the in-plane cap halves each step; slices stay un-subsampled until ⅛, then
29
+ * subsample. */
30
+ export declare function volumeResolutionFor(scale: number): {
31
+ maxSlice: number;
32
+ sliceStep: number;
33
+ };
34
+ /** Fully-normalized intensity height as a fraction of the in-plane extent — matches the Plotly
35
+ * SURFACE z-aspect (~0.4) so the relief isn't exaggerated. */
36
+ export declare const SURFACE_Z_ASPECT = 0.4;
37
+ /** "Full" mesh grid cap; the decimate factor divides it (default ¼ → 220, ½ → 440, Full → 880). */
38
+ export declare const SURFACE_MAX_GRID = 880;
39
+ /** Coefficient scaling the pyramid tile budget with the target resolution — a higher target pulls a
40
+ * finer pyramid level (more real detail). Shared by the surface plane fetch + volume assembly. */
41
+ export declare const STITCH_BUDGET_COEFF = 16;
42
+ /** Surface mesh target grid for a decimate factor `scale`: the grid cap shrinks by `scale` (every
43
+ * slice is kept — the z-slider needs them all). The source is fetched at a matching resolution. */
44
+ export declare function surfaceResolutionFor(scale: number): {
45
+ maxGrid: number;
46
+ };
47
+ /** 3D scatter: in-plane cap for the assembled voxel grid, and the max number of points emitted
48
+ * (the grid is flat-strided down to this) — keeps the billboard count interactive. */
49
+ export declare const SCATTER3D_MAX_XY = 64;
50
+ export declare const SCATTER3D_MAX_POINTS = 150000;
51
+ /** How long a pan/zoom must settle before the viewport (and, for pixel tools, the canvas
52
+ * readback) is refreshed — coalesces the camera's per-frame changes. */
53
+ export declare const READBACK_DEBOUNCE_MS = 250;
54
+ export declare const TILE_SIZE = 512;
55
+ /** Max tiles stitched for one displayed slice (512px tiles → up to ~6144² at full res). Beyond
56
+ * this we step to a coarser pyramid level so a large image stays tractable. */
57
+ export declare const MAX_STITCH_TILES = 144;
58
+ /** WebGPU default `maxTextureDimension2D` — a stitched slice's longest side must fit a texture. */
59
+ export declare const MAX_TEXTURE_DIM = 8192;
60
+ /** Concurrent tile requests per stitched slice. Firing a whole grid at once (hundreds of requests
61
+ * for a large level) overwhelmed the tile server (504s); a small pool keeps the pipe full without
62
+ * flooding it — and slice-level workers already run several stitches in parallel on top of this. */
63
+ export declare const TILE_FETCH_CONCURRENCY = 6;
64
+ /** Split RGB tiles kept for a band that asks after the other two (see
65
+ * `NapariTileClient.rgbBandSources`): ~3 × 256 KB per 512px tile. */
66
+ export declare const RGB_BAND_CACHE_TILES = 16;
67
+ /** How long to poll `/tiles/info` (202 while the server caches the source) before falling back to
68
+ * a single tile. Generous like the OSD backend — a cold whole-slide can take minutes to cache. */
69
+ export declare const DESCRIPTOR_TIMEOUT_MS = 120000;
70
+ /** Wait between two `/tiles/info` polls while the server answers 202. */
71
+ export declare const DESCRIPTOR_POLL_INTERVAL_MS = 1200;
72
+ /** A decoded single-channel uint8 plane. */
73
+ export interface LumaPlane {
74
+ data: Uint8Array;
75
+ width: number;
76
+ height: number;
77
+ }
78
+ /**
79
+ * `IChannelState.gamma` → the `gamma` a napari-js layer or view takes.
80
+ *
81
+ * The shared channel state follows the ImageJ/Fiji convention the OSD backend draws
82
+ * (`osd/display-pipeline.ts`: output = t^(1/γ), so γ > 1 BRIGHTENS the midtones), while
83
+ * napari-js's shaders apply `pow(t, gamma)` (napari's convention: γ > 1 darkens). Every gamma
84
+ * handed to napari-js goes through here, so one slider in the Channels & Histogram dialog moves
85
+ * both backends the same way. Both backends apply window → invert → gamma, per channel before
86
+ * an additive merge (NAPARI-BOUNDARY-2; pinned by `osd/display-pipeline.cross-backend.spec.ts`).
87
+ */
88
+ export declare function toNapariGamma(gamma: number | undefined): number;
89
+ /** A 2D canvas (an `OffscreenCanvas` where available) and its context; throws, naming `what`,
90
+ * when no 2D context can be had. */
91
+ export declare function create2dCanvas(width: number, height: number, what: string): {
92
+ canvas: HTMLCanvasElement | OffscreenCanvas;
93
+ ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;
94
+ };
95
+ /**
96
+ * Run `fn` over `items` with at most `concurrency` in flight — keeps the connection pool busy
97
+ * without flooding the server — starting no further item once `stop()` says so.
98
+ */
99
+ export declare function mapPool<T>(items: readonly T[], concurrency: number, fn: (item: T) => Promise<void>, stop?: () => boolean): Promise<void>;
100
+ /** A serverless multichannel stack (`tiled:false` + `channelUrls`): no tile descriptor, so its
101
+ * channel count comes from `imageMeta`, and each band is fetched from its own plane URLs. */
102
+ export declare function isServerlessMultichannel(simple: boolean, info: IImageInfo | undefined): boolean;
103
+ /** The stack's declared slice count (`imageMeta.z`, else one URL per slice); 0 when unknown. */
104
+ export declare function stackDepth(info: IImageInfo | undefined): number;
105
+ /** The R, G and B bands of RGBA8 pixels as three uint8 planes (alpha dropped). */
106
+ export declare function splitRgbBands(px: {
107
+ data: ArrayLike<number>;
108
+ width: number;
109
+ height: number;
110
+ }): LumaPlane[];
111
+ /** A decoded single-channel uint8 plane as a napari-js typed image source. */
112
+ export declare function typedPlane(d: LumaPlane): ChannelView['source'];
113
+ /** Default tint for a channel index, cycling the Fiji palette. */
114
+ export declare function tintFor(channel: number): string;
115
+ /** Convert a napari-js `Histogram` (bin count + min/max) to the pane's `IHistogram` (bin edges). */
116
+ export declare function toIHistogram(h: {
117
+ counts: Uint32Array;
118
+ bins: number;
119
+ min: number;
120
+ max: number;
121
+ }): IHistogram;
122
+ /**
123
+ * Additively composite grayscale channel images, each tinted with its display colour —
124
+ * the navigator's picture of a multichannel image.
125
+ */
126
+ export declare function tintedComposite(images: Array<CanvasImageSource & {
127
+ width: number;
128
+ height: number;
129
+ }>, colors: string[]): HTMLCanvasElement;
@@ -0,0 +1,162 @@
1
+ import type { TiledSource } from 'napari-js';
2
+ import { IHistogram } from '../../contracts/channel-histogram-api.contract';
3
+ import { TileDescriptor } from '../tile-server';
4
+ import type { NapariScene, SceneContext } from './napari-scene';
5
+ /** What the scenes built over the 2D image add to it. */
6
+ export interface Image2dOptions {
7
+ /** Draw the loaded image (false: an image-less spatial dataset, the observations alone). */
8
+ image?: boolean;
9
+ /** Whether to fit the camera to the image once it is drawn (default: when there is one). */
10
+ fit?: () => boolean;
11
+ /** After a slice change. `rerendered` when the stitched path re-rendered the image — which
12
+ * CLEARS the layer list, taking every other layer with it. */
13
+ onSlice?: (rerendered: boolean) => void;
14
+ /** The pointer entered the navigator (e.g. to hide a hover tooltip over the canvas). */
15
+ onNavigatorInteract?: () => void;
16
+ }
17
+ /**
18
+ * The 2D image (review Appendix B, cluster E): pyramidal `TiledSource`s against the `/tile`
19
+ * endpoint when `/tiles/info` describes the image, else a single stitched level (`tiled:false`
20
+ * stacks fetch each slice's own URL, a serverless multichannel stack each channel's own plane);
21
+ * multichannel additive tints, grayscale colormap or RGB (recoloured per band, see
22
+ * {@link syncRgbBands}); the coarse histogram samples of the tiled path, the scale bar, the
23
+ * overview navigator and the 2D interaction stack (region overlay + pixel tools). The
24
+ * region-centroid scatter and the spatial 2D scene are built over it.
25
+ */
26
+ export declare class Image2dScene implements NapariScene {
27
+ private readonly ctx;
28
+ private readonly opts;
29
+ /** How the image is composited (drives the histogram and the display-state updates). */
30
+ imageMode: 'grayscale' | 'multichannel' | 'rgb';
31
+ /** True when the image is rendered via pyramidal TiledSources (descriptor available). */
32
+ tiled: boolean;
33
+ /** napari-js high-level view owning the per-channel layer set for {@link imageMode}. */
34
+ private channelView;
35
+ /** Latest wins for a stitched slice: a slow older slice can't clobber a newer one. */
36
+ private sliceReq;
37
+ /** RGB: the R, G and B bands as layer sources (typed planes, or band `TiledSource`s that share
38
+ * one request per tile) and the stitched level's scale — what {@link syncRgbBands} draws. */
39
+ private rgbBands;
40
+ /** RGB: the three additive band layers while the channel states recolour the image; null while
41
+ * the RGB layer draws it as it is. */
42
+ private bandLayers;
43
+ /** Coarse per-channel luminance sample (keyed by channel index) for the histogram in tiled mode,
44
+ * where the layers have no full in-memory pixels — and an RGB image's raw bands in either mode.
45
+ * Refreshed on mount + slice change. */
46
+ readonly histSamples: Map<number, Uint8Array>;
47
+ /** Latest-wins token for {@link refreshHistogramSamples}. */
48
+ private histGen;
49
+ /** Physical scale bar overlay (null when the image has no µm/pixel). */
50
+ private scaleBar;
51
+ /** Overview minimap (bottom-right), as OSD's navigator. */
52
+ private navigator;
53
+ /** Bumped per thumbnail request, so a slow one cannot overwrite a newer slice's. */
54
+ private navigatorToken;
55
+ /** The current slice's per-channel thumbnail bitmaps (multichannel only), kept so a tint or
56
+ * visibility change recolours the thumbnail without re-fetching it. */
57
+ private navigatorChannels;
58
+ /** The tints/visibility the thumbnail was last composited with — see {@link recolorNavigator}. */
59
+ private navigatorTintKey;
60
+ private displaySub;
61
+ constructor(ctx: SceneContext, opts?: Image2dOptions);
62
+ private get hasImage();
63
+ mount(): Promise<void>;
64
+ setZ(z: number): void;
65
+ histogram(channel: number, bins: number): IHistogram | null;
66
+ setImageSmoothing(enabled: boolean): void;
67
+ setNavigatorVisible(visible: boolean): void;
68
+ /** Show the navigator only for a dataset that brings pixels of its own (and when the user
69
+ * wants it): with no image of its own there is nothing for an overview to show. */
70
+ showNavigatorFor(datasetHasPixels: boolean): void;
71
+ dispose(): void;
72
+ /**
73
+ * Render slice `z`. With a server pyramid descriptor each layer is a pyramidal
74
+ * {@link TiledSource}, so the view refines to higher resolution on zoom (like OSD) and sits
75
+ * naturally in full-resolution coordinates; without one, the single-level stitch. Three display
76
+ * modes either way: multichannel additive tint, grayscale colormap, RGB.
77
+ */
78
+ render(z: number, token?: number): Promise<void>;
79
+ /** Single-level stitch fallback (no descriptor): the pre-tiling path. */
80
+ private renderStitched;
81
+ /**
82
+ * Render with pyramidal {@link TiledSource}s — the view refines to higher resolution as you
83
+ * zoom in (the visual fetches the level whose texels ≈ screen pixels) and sits in full-res
84
+ * coordinates so regions align. Same three modes as the stitch path. Per-channel layers use the
85
+ * REAL pyramid levels (per-channel tiles only exist there); the composite uses all levels.
86
+ */
87
+ private renderTiled;
88
+ /** A pyramidal TiledSource whose tiles count on the loading badge while `scene` (the render that
89
+ * asked for it, taken before its awaits) is current. */
90
+ tiledSource(desc: TileDescriptor, channel: number | undefined, channels: 1 | 4, scene: AbortSignal): TiledSource;
91
+ /** Channel `c`'s layer in the additive multichannel composite: tinted by its display colour
92
+ * (store, else descriptor, else the Fiji palette), with its window, gamma and visibility. */
93
+ private tintedChannelView;
94
+ /** The single grayscale layer: the selected colormap, with the channel's window and gamma. */
95
+ private grayscaleChannelView;
96
+ /** (Re)fetch a coarse per-channel luminance sample for the histogram (tiled mode has no full
97
+ * in-memory pixels). One cheap overview tile per channel, fetched together; cached by channel
98
+ * index. Latest wins: a scrub fires one refresh per slice, and an older slice's samples that
99
+ * land after a newer one's are dropped rather than shown as the current distribution. */
100
+ refreshHistogramSamples(z: number, desc: Pick<TileDescriptor, 'channels'>): Promise<void>;
101
+ /** Channel states + grayscale colormap → live-apply to the rendered layers (no re-fetch; only z
102
+ * changes re-fetch), and recolour the navigator thumbnail. */
103
+ private followDisplayState;
104
+ /** Apply the current channel states / colormap to the live layers (no re-fetch), delegating the
105
+ * per-channel layer mutations to the {@link MultiChannelImageView}. */
106
+ private applyDisplayState;
107
+ /**
108
+ * RGB: draw the image as it is while its channel states leave it so (default R/G/B tints, full
109
+ * window, γ 1, all shown, no invert: {@link rgbNeedsRecolor}) — the RGB layer, unchanged, with
110
+ * the coarse underlay a tiled one keeps while it pans. Otherwise draw its R, G and B bands as
111
+ * three additive layers, each with its channel's window, invert, gamma, tint and visibility —
112
+ * what OSD's RGB recolour computes per pixel (the merge order of `osd/display-pipeline`). The
113
+ * band layers sit just above the hidden RGB layer, so whatever is drawn over the image stays
114
+ * over it. A host with no R/G/B channel model (fewer than three states) gets only the invert.
115
+ */
116
+ private syncRgbBands;
117
+ /** (Re)install the physical scale bar (napari-js's `ScaleBarOverlay` on the 2D camera's zoom),
118
+ * sized from the image's µm/pixel (`/tiles/info` mppX, falling back to the image metadata).
119
+ * No-op without a physical size. */
120
+ installScaleBar(): void;
121
+ /**
122
+ * The overview navigator (napari-js's `NavigatorOverlay`): a coarse thumbnail of the whole
123
+ * image with the viewport on it; click or drag to pan at the current zoom (as OSD).
124
+ */
125
+ private installNavigator;
126
+ /**
127
+ * Draw the navigator's thumbnail from the coarsest pyramid level. A multichannel image
128
+ * is composited from its channels in their display colours (see {@link recolorNavigator}),
129
+ * so the overview looks like the view rather than like channel 0 in grey.
130
+ */
131
+ private refreshNavigatorImage;
132
+ /** Replace the per-channel thumbnail bitmaps (closing the previous ones). */
133
+ private setNavigatorChannels;
134
+ /**
135
+ * Composite the multichannel thumbnail in the channels' CURRENT display tints, skipping hidden
136
+ * channels — the store's channel states, as the 2D layers use, not the server's defaults.
137
+ * Re-run on every display-state change; it only redraws (never re-fetches), and only when a
138
+ * tint or a visibility actually changed, so a window/gamma drag costs a string compare.
139
+ */
140
+ private recolorNavigator;
141
+ }
142
+ /**
143
+ * NAPARI_SCATTER (review Appendix B, cluster H): the slice image with a points layer at each
144
+ * region's centroid (the napari-js analog of Plotly's region-centroid scatter), rebuilt live as
145
+ * regions change. This mode plots REGION centroids, so the image's region tools come with it —
146
+ * drawing a region adds a point at once.
147
+ */
148
+ export declare class ScatterRegionsScene implements NapariScene {
149
+ private readonly ctx;
150
+ readonly image: Image2dScene;
151
+ private points;
152
+ private regionSub;
153
+ constructor(ctx: SceneContext);
154
+ mount(): Promise<void>;
155
+ setZ(z: number): void;
156
+ histogram(channel: number, bins: number): IHistogram | null;
157
+ setImageSmoothing(enabled: boolean): void;
158
+ setNavigatorVisible(visible: boolean): void;
159
+ dispose(): void;
160
+ /** (Re)build the point layer at the current region centroids. */
161
+ private rebuildPoints;
162
+ }
@@ -7,7 +7,6 @@
7
7
  */
8
8
  export declare const SHOW_AFTER_MS = 150;
9
9
  export declare class NapariLoadingBadge {
10
- private readonly host;
11
10
  private readonly el;
12
11
  private names;
13
12
  private timer;