@jax-data-science/sci-image-visualizer 0.8.3 → 0.10.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 (579) hide show
  1. package/README.md +201 -460
  2. package/esm2022/index.mjs +34 -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/image.contract.mjs +1 -1
  12. package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
  13. package/esm2022/lib/contracts/intensity.mjs +48 -5
  14. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  15. package/esm2022/lib/contracts/plot-type.mjs +134 -17
  16. package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
  17. package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
  18. package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
  19. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
  20. package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
  21. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  22. package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
  23. package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
  24. package/esm2022/lib/contracts/sam.contract.mjs +1 -1
  25. package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
  26. package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
  27. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  28. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
  29. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  30. package/esm2022/lib/contracts/viz-config.mjs +2 -1
  31. package/esm2022/lib/geometry/contour.mjs +63 -0
  32. package/esm2022/lib/geometry/loft.mjs +128 -0
  33. package/esm2022/lib/geometry/polylabel.mjs +156 -0
  34. package/esm2022/lib/geometry/raster.mjs +98 -0
  35. package/esm2022/lib/geometry/reconstruct.mjs +315 -0
  36. package/esm2022/lib/geometry/reslice-image.mjs +57 -0
  37. package/esm2022/lib/geometry/ring.mjs +201 -0
  38. package/esm2022/lib/geometry/section.mjs +215 -0
  39. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
  40. package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
  41. package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
  42. package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
  43. package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
  44. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
  45. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +12 -9
  46. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +83 -0
  47. package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
  48. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +180 -591
  49. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
  50. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
  51. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
  52. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
  53. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +270 -0
  54. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
  55. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
  56. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
  57. package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
  58. package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
  59. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +347 -0
  60. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +427 -4207
  61. package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
  62. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +550 -0
  63. package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
  64. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
  65. package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
  66. package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
  67. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +194 -0
  68. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
  69. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
  70. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
  71. package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
  72. package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
  73. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
  74. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
  75. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
  76. package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
  77. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
  78. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
  79. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
  80. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
  81. package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
  82. package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
  83. package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
  84. package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
  85. package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
  86. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +164 -0
  87. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +213 -716
  88. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
  89. package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
  90. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
  91. package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
  92. package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
  93. package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
  94. package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
  95. package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
  96. package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
  97. package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
  98. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
  99. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
  100. package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
  101. package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
  102. package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
  103. package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
  104. package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
  105. package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
  106. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
  107. package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
  108. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
  109. package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
  110. package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
  111. package/esm2022/lib/implementations/region-centroids.mjs +47 -0
  112. package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
  113. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
  114. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
  115. package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
  116. package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
  117. package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
  118. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
  119. package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
  120. package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
  121. package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
  122. package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
  123. package/esm2022/lib/models/bezier.mjs +1 -11
  124. package/esm2022/lib/models/class-preset.mjs +41 -3
  125. package/esm2022/lib/models/geometry.mjs +27 -164
  126. package/esm2022/lib/models/polygon-edit.mjs +254 -0
  127. package/esm2022/lib/models/polygon-factory.mjs +134 -0
  128. package/esm2022/lib/models/region-clone.mjs +68 -0
  129. package/esm2022/lib/models/region-geojson.mjs +411 -0
  130. package/esm2022/lib/models/region.mjs +34 -33
  131. package/esm2022/lib/models/shape.mjs +18 -16
  132. package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
  133. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
  134. package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
  135. package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
  136. package/esm2022/lib/plot.utilities.mjs +296 -473
  137. package/esm2022/lib/processing/image-crop.mjs +1 -1
  138. package/esm2022/lib/processing/processing-image.mjs +28 -15
  139. package/esm2022/lib/provide-visualization.mjs +40 -14
  140. package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
  141. package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
  142. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +163 -0
  143. package/esm2022/lib/region-editor/file-stem.mjs +13 -0
  144. package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
  145. package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
  146. package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
  147. package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
  148. package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
  149. package/esm2022/lib/region-editor/region-editor.component.mjs +896 -660
  150. package/esm2022/lib/region-editor/region-metrics.mjs +86 -0
  151. package/esm2022/lib/region-editor/region-persistence.service.mjs +160 -0
  152. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +169 -0
  153. package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
  154. package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
  155. package/esm2022/lib/region-ops.service.mjs +28 -70
  156. package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
  157. package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
  158. package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
  159. package/esm2022/lib/region-overlay/region-style.mjs +97 -0
  160. package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
  161. package/esm2022/lib/region-source/http-region-source.mjs +104 -0
  162. package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
  163. package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
  164. package/esm2022/lib/region-source/region-source.mjs +67 -0
  165. package/esm2022/lib/region-source/region-tiles.mjs +708 -0
  166. package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
  167. package/esm2022/lib/render-orchestrator.mjs +14 -11
  168. package/esm2022/lib/render-session.mjs +207 -0
  169. package/esm2022/lib/routing-visualizer.service.mjs +858 -414
  170. package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
  171. package/esm2022/lib/spatial/density-raster.mjs +14 -0
  172. package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
  173. package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
  174. package/esm2022/lib/spatial/gene-search.mjs +1 -1
  175. package/esm2022/lib/spatial/glyphs.mjs +97 -0
  176. package/esm2022/lib/spatial/lod.mjs +187 -0
  177. package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
  178. package/esm2022/lib/spatial/spatial-density.mjs +25 -16
  179. package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
  180. package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
  181. package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
  182. package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
  183. package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
  184. package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
  185. package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
  186. package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
  187. package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
  188. package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
  189. package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
  190. package/esm2022/lib/spatial/stats.mjs +71 -0
  191. package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
  192. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
  193. package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
  194. package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
  195. package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
  196. package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
  197. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
  198. package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
  199. package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
  200. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
  201. package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
  202. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
  203. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
  204. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
  205. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
  206. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
  207. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
  208. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
  209. package/esm2022/lib/store/class-color.util.mjs +53 -5
  210. package/esm2022/lib/store/class-signatures.mjs +63 -0
  211. package/esm2022/lib/store/region-history.mjs +146 -0
  212. package/esm2022/lib/store/region-scope-cache.mjs +144 -0
  213. package/esm2022/lib/store/region-selection.mjs +82 -0
  214. package/esm2022/lib/store/region-source-scope.mjs +171 -0
  215. package/esm2022/lib/store/region-store.service.mjs +986 -670
  216. package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
  217. package/esm2022/lib/store/visualizer-store.service.mjs +81 -76
  218. package/esm2022/lib/toast-outlets.mjs +5 -4
  219. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
  220. package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
  221. package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
  222. package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
  223. package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
  224. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +120 -0
  225. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
  226. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
  227. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
  228. package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
  229. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
  230. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
  231. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
  232. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
  233. package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
  234. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
  235. package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
  236. package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
  237. package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
  238. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +121 -0
  239. package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
  240. package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
  241. package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
  242. package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
  243. package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
  244. package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
  245. package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
  246. package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
  247. package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
  248. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
  249. package/esm2022/lib/toolbar/toolbar.component.mjs +84 -119
  250. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
  251. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
  252. package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
  253. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
  254. package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
  255. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
  256. package/esm2022/lib/util/mark-for-check.mjs +17 -0
  257. package/esm2022/lib/util/supersede.mjs +56 -0
  258. package/esm2022/lib/visualization.module.mjs +39 -141
  259. package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
  260. package/esm2022/lib/visualizer/region-actions.mjs +149 -0
  261. package/esm2022/lib/visualizer/region-load.mjs +123 -0
  262. package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
  263. package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
  264. package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
  265. package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
  266. package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
  267. package/esm2022/lib/visualizer.component.mjs +602 -1902
  268. package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
  269. package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
  270. package/esm2022/lib/workers/spatial-math.mjs +190 -0
  271. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs +47169 -0
  272. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +1 -0
  273. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs +238 -0
  274. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map +1 -0
  275. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
  276. package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
  277. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
  278. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
  279. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
  280. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  281. package/fesm2022/mask.worker.js +36 -917
  282. package/fesm2022/onnx-sam.worker.js +52 -16
  283. package/fesm2022/region-source.worker.js +1067 -0
  284. package/fesm2022/spatial-math.worker.js +471 -0
  285. package/fesm2022/tsne.worker.js +32 -15
  286. package/index.d.ts +19 -10
  287. package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
  288. package/lib/contracts/capabilities.contract.d.ts +4 -2
  289. package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
  290. package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
  291. package/lib/contracts/color.d.ts +27 -0
  292. package/lib/contracts/colormap-lut.d.ts +19 -4
  293. package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
  294. package/lib/contracts/display-types.d.ts +21 -0
  295. package/lib/contracts/image.contract.d.ts +4 -0
  296. package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
  297. package/lib/contracts/intensity.d.ts +13 -2
  298. package/lib/contracts/plot-type.d.ts +3 -1
  299. package/lib/contracts/ports/image-state.port.d.ts +6 -2
  300. package/lib/contracts/ports/preferences.port.d.ts +4 -0
  301. package/lib/contracts/ports/region-io.port.d.ts +1 -0
  302. package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
  303. package/lib/contracts/ports/tile-access.port.d.ts +1 -0
  304. package/lib/contracts/region-editor-api.contract.d.ts +85 -1
  305. package/lib/contracts/region-overlay.contract.d.ts +5 -0
  306. package/lib/contracts/region-store.contract.d.ts +22 -0
  307. package/lib/contracts/sam.contract.d.ts +7 -0
  308. package/lib/contracts/section-view.contract.d.ts +44 -0
  309. package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
  310. package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
  311. package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
  312. package/lib/contracts/visualizer.contract.d.ts +231 -54
  313. package/lib/contracts/viz-config.d.ts +9 -0
  314. package/lib/geometry/contour.d.ts +24 -0
  315. package/lib/geometry/loft.d.ts +22 -0
  316. package/lib/geometry/polylabel.d.ts +23 -0
  317. package/lib/geometry/raster.d.ts +42 -0
  318. package/lib/geometry/reconstruct.d.ts +54 -0
  319. package/lib/geometry/reslice-image.d.ts +33 -0
  320. package/lib/geometry/ring.d.ts +67 -0
  321. package/lib/geometry/section.d.ts +52 -0
  322. package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
  323. package/lib/implementations/base-store-visualizer.d.ts +61 -15
  324. package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
  325. package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
  326. package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
  327. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
  328. package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -3
  329. package/lib/implementations/napari-js/napari-loading-state.d.ts +37 -0
  330. package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
  331. package/lib/implementations/napari-js/napari-region-overlay.d.ts +68 -71
  332. package/lib/implementations/napari-js/napari-scene.d.ts +126 -0
  333. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
  334. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
  335. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
  336. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +91 -0
  337. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
  338. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
  339. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
  340. package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
  341. package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
  342. package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
  343. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +169 -883
  344. package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
  345. package/lib/implementations/napari-js/napari-volume-scene.d.ts +148 -0
  346. package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
  347. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
  348. package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
  349. package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
  350. package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
  351. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
  352. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
  353. package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
  354. package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
  355. package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
  356. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
  357. package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
  358. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
  359. package/lib/implementations/osd/display-pipeline.d.ts +38 -9
  360. package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
  361. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
  362. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
  363. package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
  364. package/lib/implementations/osd/osd-coords.d.ts +6 -4
  365. package/lib/implementations/osd/osd-export.d.ts +36 -0
  366. package/lib/implementations/osd/osd-lib.d.ts +7 -0
  367. package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
  368. package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
  369. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +38 -0
  370. package/lib/implementations/osd/osd-region-overlay.d.ts +46 -51
  371. package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
  372. package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
  373. package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
  374. package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
  375. package/lib/implementations/osd/osd-viewport.d.ts +77 -0
  376. package/lib/implementations/osd/osd-zoom.d.ts +6 -0
  377. package/lib/implementations/osd/simple-source.d.ts +161 -0
  378. package/lib/implementations/osd/slice-cache.d.ts +12 -3
  379. package/lib/implementations/osd/tile-client.d.ts +11 -14
  380. package/lib/implementations/osd/tile-recolor.d.ts +141 -0
  381. package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
  382. package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
  383. package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
  384. package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
  385. package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
  386. package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
  387. package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
  388. package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
  389. package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
  390. package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
  391. package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
  392. package/lib/implementations/plotly/plotly.service.d.ts +136 -401
  393. package/lib/implementations/region-centroids.d.ts +14 -0
  394. package/lib/implementations/simple-slice-access.service.d.ts +7 -4
  395. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
  396. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
  397. package/lib/implementations/tile-server/index.d.ts +5 -0
  398. package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
  399. package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
  400. package/lib/implementations/tile-server/tile-protocol.d.ts +83 -0
  401. package/lib/implementations/tile-server/transport.d.ts +62 -0
  402. package/lib/intensity/intensity-profile.d.ts +66 -0
  403. package/lib/intensity/intensity-profile.service.d.ts +108 -0
  404. package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
  405. package/lib/models/bezier.d.ts +0 -5
  406. package/lib/models/class-preset.d.ts +25 -0
  407. package/lib/models/geometry.d.ts +14 -48
  408. package/lib/models/polygon-edit.d.ts +72 -0
  409. package/lib/models/polygon-factory.d.ts +45 -0
  410. package/lib/models/region-clone.d.ts +20 -0
  411. package/lib/models/region-geojson.d.ts +57 -0
  412. package/lib/models/region.d.ts +59 -4
  413. package/lib/models/shape.d.ts +8 -0
  414. package/lib/plot-mode/contribution-host.d.ts +125 -0
  415. package/lib/plot-mode/plot-type-menu.d.ts +60 -0
  416. package/lib/plot-mode/tool-params-model.d.ts +49 -0
  417. package/lib/plot.utilities.d.ts +19 -30
  418. package/lib/processing/processing-image.d.ts +5 -2
  419. package/lib/provide-visualization.d.ts +19 -2
  420. package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
  421. package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
  422. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +86 -0
  423. package/lib/region-editor/file-stem.d.ts +7 -0
  424. package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
  425. package/lib/region-editor/mask-export.service.d.ts +54 -0
  426. package/lib/region-editor/mask-raster.d.ts +2 -8
  427. package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
  428. package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
  429. package/lib/region-editor/region-editor.component.d.ts +283 -200
  430. package/lib/region-editor/region-metrics.d.ts +34 -0
  431. package/lib/region-editor/region-persistence.service.d.ts +77 -0
  432. package/lib/region-editor/region-table/region-table.component.d.ts +89 -0
  433. package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
  434. package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
  435. package/lib/region-ops.service.d.ts +1 -7
  436. package/lib/region-overlay/region-geometry.d.ts +158 -0
  437. package/lib/region-overlay/region-hit-test.d.ts +38 -0
  438. package/lib/region-overlay/region-source-layer.d.ts +96 -0
  439. package/lib/region-overlay/region-style.d.ts +52 -0
  440. package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
  441. package/lib/region-source/http-region-source.d.ts +45 -0
  442. package/lib/region-source/region-source-ops.d.ts +89 -0
  443. package/lib/region-source/region-source-worker.d.ts +7 -0
  444. package/lib/region-source/region-source.d.ts +82 -0
  445. package/lib/region-source/region-tiles.d.ts +289 -0
  446. package/lib/region-source/worker-region-source.d.ts +65 -0
  447. package/lib/render-orchestrator.d.ts +6 -2
  448. package/lib/render-session.d.ts +75 -0
  449. package/lib/routing-visualizer.service.d.ts +248 -59
  450. package/lib/section-pane/section-pane.component.d.ts +47 -0
  451. package/lib/spatial/density-raster.d.ts +6 -0
  452. package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
  453. package/lib/spatial/embedding-compute.d.ts +21 -2
  454. package/lib/spatial/glyphs.d.ts +16 -0
  455. package/lib/spatial/lod.d.ts +94 -0
  456. package/lib/spatial/spatial-controls.facade.d.ts +64 -0
  457. package/lib/spatial/spatial-density.d.ts +15 -5
  458. package/lib/spatial/spatial-encoding.d.ts +11 -44
  459. package/lib/spatial/spatial-expression.d.ts +40 -22
  460. package/lib/spatial/spatial-framing.d.ts +1 -0
  461. package/lib/spatial/spatial-heatmap.d.ts +2 -0
  462. package/lib/spatial/spatial-hover.d.ts +4 -16
  463. package/lib/spatial/spatial-panel-model.d.ts +135 -0
  464. package/lib/spatial/spatial-selection.d.ts +21 -26
  465. package/lib/spatial/spatial-tile-merge.d.ts +41 -0
  466. package/lib/spatial/spatial-tiles.d.ts +9 -256
  467. package/lib/spatial/stats.d.ts +38 -0
  468. package/lib/spatial/transcript-grouping.d.ts +119 -0
  469. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
  470. package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
  471. package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
  472. package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
  473. package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
  474. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
  475. package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
  476. package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
  477. package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
  478. package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
  479. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
  480. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
  481. package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
  482. package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
  483. package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
  484. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
  485. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
  486. package/lib/store/class-color.util.d.ts +39 -2
  487. package/lib/store/class-signatures.d.ts +11 -0
  488. package/lib/store/region-history.d.ts +66 -0
  489. package/lib/store/region-scope-cache.d.ts +65 -0
  490. package/lib/store/region-selection.d.ts +36 -0
  491. package/lib/store/region-source-scope.d.ts +68 -0
  492. package/lib/store/region-store.service.d.ts +312 -116
  493. package/lib/store/visualizer-store.service.d.ts +32 -33
  494. package/lib/toast-outlets.d.ts +4 -3
  495. package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
  496. package/lib/toolbar/canvas-tools.d.ts +20 -0
  497. package/lib/toolbar/crop/slide-crop.d.ts +10 -4
  498. package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
  499. package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
  500. package/lib/toolbar/region-tools/region-tools.component.d.ts +62 -0
  501. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
  502. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
  503. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
  504. package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
  505. package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
  506. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
  507. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
  508. package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
  509. package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
  510. package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
  511. package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
  512. package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
  513. package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
  514. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +51 -0
  515. package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
  516. package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
  517. package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
  518. package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
  519. package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
  520. package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
  521. package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
  522. package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
  523. package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
  524. package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
  525. package/lib/toolbar/toolbar.component.d.ts +55 -84
  526. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
  527. package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
  528. package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
  529. package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
  530. package/lib/toolbar/wand/wand.service.d.ts +22 -116
  531. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
  532. package/lib/util/mark-for-check.d.ts +11 -0
  533. package/lib/util/supersede.d.ts +53 -0
  534. package/lib/visualization.module.d.ts +18 -39
  535. package/lib/visualizer/floating-drag.directive.d.ts +30 -0
  536. package/lib/visualizer/region-actions.d.ts +54 -0
  537. package/lib/visualizer/region-load.d.ts +46 -0
  538. package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
  539. package/lib/visualizer/tool-modes.d.ts +49 -0
  540. package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
  541. package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
  542. package/lib/visualizer/volume-sections.d.ts +64 -0
  543. package/lib/visualizer.component.d.ts +232 -447
  544. package/lib/workers/spatial-math-ops.d.ts +65 -0
  545. package/lib/workers/spatial-math-worker.d.ts +7 -0
  546. package/lib/workers/spatial-math.d.ts +74 -0
  547. package/package.json +12 -3
  548. package/src/lib/assets/slice.svg +23 -0
  549. package/src/lib/styles/_viz-icons-rules.scss +73 -0
  550. package/src/lib/styles/viz-icons.scss +14 -0
  551. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
  552. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
  553. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
  554. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
  555. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
  556. package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
  557. package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
  558. package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
  559. package/src/lib/assets/cell-detection.svg +0 -37
  560. package/src/lib/assets/click.svg +0 -1
  561. package/src/lib/assets/colormap-luts.json +0 -1
  562. package/src/lib/assets/edit-selection-white.svg +0 -47
  563. package/src/lib/assets/icons/colormap-earth.png +0 -0
  564. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  565. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  566. package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
  567. package/src/lib/assets/picture-segmentation.svg +0 -43
  568. package/src/lib/assets/test/download-379.svg +0 -1
  569. package/src/lib/assets/test/download-98.svg +0 -1
  570. package/src/lib/assets/test/json-1.svg +0 -1
  571. package/src/lib/assets/test/load-53.svg +0 -1
  572. package/src/lib/assets/test/mask-44.svg +0 -1
  573. package/src/lib/assets/test/mask-download-44.svg +0 -15
  574. package/src/lib/assets/test/mask-save-44.svg +0 -11
  575. package/src/lib/assets/test/overlay-1.svg +0 -1
  576. package/src/lib/assets/test/overlay-4.svg +0 -1
  577. package/src/lib/assets/test/region-26.svg +0 -1
  578. package/src/lib/assets/test/save-56.svg +0 -1
  579. package/src/lib/assets/test/upload-43.svg +0 -1
@@ -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
+ }
@@ -1,19 +1,20 @@
1
1
  /**
2
2
  * "Transcripts reloading…" at the bottom of the canvas while a layer's data is in flight: one
3
3
  * line naming every layer still loading, on a semi-opaque backing so it reads over any tissue.
4
+ * Longer work names itself ("Building HPF in 3D…") and joins the line.
4
5
  *
5
6
  * Shown only once something has been loading for {@link SHOW_AFTER_MS}, so a redraw served from
6
7
  * cache does not flash it.
7
8
  */
8
9
  export declare const SHOW_AFTER_MS = 150;
9
10
  export declare class NapariLoadingBadge {
10
- private readonly host;
11
11
  private readonly el;
12
12
  private names;
13
+ private tasks;
13
14
  private timer;
14
15
  constructor(host: HTMLElement);
15
- /** The layers loading now; empty hides the badge. */
16
- set(names: readonly string[]): void;
16
+ /** The layers loading now, and the tasks running (their messages); both empty hides the badge. */
17
+ set(names: readonly string[], tasks?: readonly string[]): void;
17
18
  /** The text currently set (shown or about to be). */
18
19
  get text(): string;
19
20
  destroy(): void;
@@ -0,0 +1,37 @@
1
+ /** What the service itself counts on the badge; the spatial tile layers report their own names. */
2
+ export type LoadingSource = 'Image' | 'Observations';
3
+ /**
4
+ * "x reloading…" at the bottom of the canvas, aggregated over everything that loads into one
5
+ * scene: image tiles (the tile client), observation colourings (the spatial scenes) and the
6
+ * spatial tile layers' own loads (which report a list of layer names).
7
+ *
8
+ * Each load is a {@link begin} that hands back its own `end`. {@link reset} starts a new scene:
9
+ * the counts are dropped, and an `end` from a load that began before it is a no-op, so a load
10
+ * that settles after a re-plot can neither un-count the new scene's work nor drive a count below
11
+ * zero (which hid the next scene's "Observations reloading…" until a second load overlapped it).
12
+ *
13
+ * A {@link beginTask} is work that outlives a scene (a region's 3D reconstruction, built for
14
+ * whichever volume is on screen when it is done): its message stays across a reset.
15
+ */
16
+ export declare class LoadingBadgeState {
17
+ private host;
18
+ private badge;
19
+ private readonly counts;
20
+ private tileLayers;
21
+ private generation;
22
+ private readonly tasks;
23
+ /** The element the badge is drawn into (the plot host); set per plot. */
24
+ attach(host: HTMLElement): void;
25
+ /** One load of `source` started; call the returned function once it settles. */
26
+ begin(source: LoadingSource): () => void;
27
+ /** A task started, shown by its `message` ("Building HPF in 3D…"); call the returned function
28
+ * once it settles. */
29
+ beginTask(message: string): () => void;
30
+ /** The spatial tile layers still loading (their own names, in their order). */
31
+ setTileLayers(layers: readonly string[]): void;
32
+ /** The text the badge has set (shown, or about to be once the show delay passes). */
33
+ get text(): string;
34
+ /** A new scene: forget every count and remove the badge (tasks show again on the next attach). */
35
+ reset(): void;
36
+ private show;
37
+ }
@@ -0,0 +1,32 @@
1
+ import type { RegionMesh3D } from './napari-volume-region-meshes';
2
+ export interface RegionMeshPointerOptions {
3
+ /** The surface under canvas point (`x`, `y`) (CSS px), or null. */
4
+ pickAt(x: number, y: number): RegionMesh3D | null;
5
+ /** Whether a click picks (the selection tool armed, surfaces shown); otherwise clicks are left alone. */
6
+ active(): boolean;
7
+ /** Whether hovering names the surface under the pointer (surfaces shown, whatever the tool). */
8
+ hoverable(): boolean;
9
+ /** A click on a surface (its key), or on none (null); `additive` with Shift / Ctrl / ⌘. */
10
+ onPick(key: string | null, additive: boolean): void;
11
+ }
12
+ /**
13
+ * Clicks and hover on the region surfaces of a volume view: a click (a press that does not orbit)
14
+ * picks the surface under it, or none; resting over a surface shows its name in a tooltip (and a
15
+ * pointer cursor when a click would pick it). Listens on the canvas without stopping events, so the
16
+ * camera still orbits.
17
+ */
18
+ export declare class RegionMeshPointer {
19
+ private readonly canvas;
20
+ private readonly opts;
21
+ private readonly tip;
22
+ private down;
23
+ private hoverTimer;
24
+ constructor(canvas: HTMLElement, host: HTMLElement, opts: RegionMeshPointerOptions);
25
+ destroy(): void;
26
+ private local;
27
+ private readonly onDown;
28
+ private readonly onUp;
29
+ private readonly onMove;
30
+ private readonly onLeave;
31
+ private hide;
32
+ }
@@ -1,16 +1,29 @@
1
1
  import { IRegionOverlay, RegionToolMode } from '../../contracts/region-overlay.contract';
2
2
  import { RegionStore } from '../../store/region-store.service';
3
+ import type { Affine } from '../../region-overlay/svg-region-renderer';
3
4
  /**
4
5
  * The slice of the napari Viewer the overlay needs (coord transforms + control gating).
5
6
  *
7
+ * COORDINATE SPACES: `canvasToWorld` takes CLIENT pixels (viewport coordinates, as a pointer
8
+ * event's `clientX/Y`), exactly as napari-js `Viewer.canvasToWorld` does. `canvasTransform` is
9
+ * the camera's world → CANVAS-LOCAL CSS-pixel affine, napari-js `Viewer.canvasTransform`, which
10
+ * reads no layout: drawing and following the camera use it, so a camera frame costs one
11
+ * `matrix(...)` and no `getBoundingClientRect()` (review NAPARI-BOUNDARY-10). The svg covers the
12
+ * plot host and the canvas is the host's in-flow child at its top-left, so canvas-local and
13
+ * svg-local pixels are the same; a pointer's client pixels are mapped into the svg by the
14
+ * overlay itself.
15
+ *
6
16
  * Exported because the 3D spatial mode supplies a SCREEN-SPACE implementation of it: there the
7
17
  * drawn shape is a lasso in canvas pixels, not a rectangle in image space, so "world" is the
8
- * canvas itself and both transforms collapse to identity. That lets the 3D view reuse this whole
9
- * overlay — every tool, the handles, the store round-trip — with no 3D-specific drawing code.
18
+ * canvas itself — `canvasToWorld` is the client → canvas offset and `canvasTransform` the
19
+ * identity. That lets the 3D view reuse this whole overlay — every tool, the handles, the store
20
+ * round-trip — with no 3D-specific drawing code.
10
21
  */
11
22
  export interface OverlayViewer {
23
+ /** Client px → world. */
12
24
  canvasToWorld(clientX: number, clientY: number): [number, number];
13
- worldToCanvas(worldX: number, worldY: number): [number, number];
25
+ /** World → canvas-local (= svg-local) CSS px, as an SVG affine `[a, b, c, d, e, f]`. */
26
+ canvasTransform(): Affine;
14
27
  setControlsEnabled(enabled: boolean): void;
15
28
  readonly camera: {
16
29
  readonly changed: {
@@ -20,22 +33,34 @@ export interface OverlayViewer {
20
33
  }
21
34
  /**
22
35
  * SVG region overlay for the napari-js WebGPU image view (jit-ui#102), mirroring the OSD backend's
23
- * {@link OsdRegionOverlay} but driven by napari's `canvasToWorld`/`worldToCanvas` transforms.
36
+ * {@link OsdRegionOverlay} but driven by napari's `canvasToWorld`/`canvasTransform` transforms
37
+ * (see {@link OverlayViewer} for their coordinate spaces).
24
38
  * Vector shapes are drawn in an absolutely-positioned `<svg>` over the canvas (no need to push
25
- * them through WebGPU). It writes completed shapes to the shared {@link RegionStore} (so save /
26
- * undo / export work identically to OSD) and re-renders from the store on every camera move,
27
- * region change, and selection change.
39
+ * them through WebGPU) by {@link NapariRegionSvgRenderer} over the shared `SvgRegionRenderer`:
40
+ * in world coordinates inside one transformed group, rebuilt on a region or selection change,
41
+ * while a camera move only rewrites the transform (napari-js's `canvasTransform`, the camera
42
+ * centre/zoom) and the few screen-space handles and labels. This class is
43
+ * the gesture controller: pointer handlers, the tool mode, and the edit/draft/marquee state.
44
+ * It writes completed shapes to the shared {@link RegionStore} (so save / undo / export work
45
+ * identically to OSD).
28
46
  *
29
47
  * Supports (jit-ui#102): rectangle / polygon / freehand path drawing, click-select and rubber-band
30
48
  * marquee select, pan/zoom gating via `setControlsEnabled`, body move, vertex move/add/delete,
31
- * bezier handle editing, and donut holes (including hole vertex + hole-bezier-handle editing) —
32
- * full parity with {@link OsdRegionOverlay}.
49
+ * bezier handle editing, and donut holes (including hole vertex + hole-bezier-handle editing).
50
+ * Hit-testing shares `region-overlay/region-geometry` with the OSD overlay, so both follow
51
+ * the same rules (multi-part regions, holes, open polylines, handle-less bezier curves).
33
52
  */
34
53
  export declare class NapariRegionOverlay implements IRegionOverlay {
35
54
  private readonly host;
36
55
  private readonly viewer;
37
56
  private readonly store;
38
57
  private readonly svg;
58
+ private readonly renderer;
59
+ /** The image's region source, drawn under the regions at the zoom's level of detail; null
60
+ * where world is not the image (the 3D view's screen-space lassos). */
61
+ private readonly sourceLayer;
62
+ /** Client ↔ svg-local ↔ world conversions, with the svg origin read once per gesture/redraw. */
63
+ private readonly projection;
39
64
  private readonly subs;
40
65
  private readonly disconnectCamera;
41
66
  private mode;
@@ -44,15 +69,15 @@ export declare class NapariRegionOverlay implements IRegionOverlay {
44
69
  private draftRect;
45
70
  /** In-progress rubber-band selection marquee (select mode), image-space. */
46
71
  private marquee;
47
- /** Dedicated marquee rect element, updated directly during the drag (no full region redraw). */
48
- private marqueeEl;
49
72
  private draftPath;
50
73
  private drawing;
51
74
  private regionsVisible;
52
75
  /** In-progress manipulation (select/move modes): dragging a body, a polygon vertex, or a
53
76
  * rectangle corner. `anchor` is the fixed opposite corner for a rectangle resize. */
54
77
  private edit;
55
- constructor(host: HTMLElement, viewer: OverlayViewer, store: RegionStore);
78
+ constructor(host: HTMLElement, viewer: OverlayViewer, store: RegionStore, opts?: {
79
+ regionSource?: boolean;
80
+ });
56
81
  /**
57
82
  * Whether a region tool currently owns the pointer.
58
83
  *
@@ -65,88 +90,60 @@ export declare class NapariRegionOverlay implements IRegionOverlay {
65
90
  setMode(mode: RegionToolMode): void;
66
91
  setSelectedBezier(bezier: boolean): void;
67
92
  /**
68
- * How finely a drawn vertex may be placed, in world units.
69
- *
70
- * One by default, because for an image the world IS pixels and a region should align to
71
- * them. A dataset whose coordinates are not pixels sets it finer — seqFISH's whole
72
- * sample spans about 5 x 7 units, where whole-unit vertices leave roughly six by eight
73
- * placeable positions and no ROI can be drawn at all.
93
+ * How finely a drawn vertex may be placed, in world units: one (an image's pixels) by
94
+ * default, finer for a dataset whose coordinates are not pixels (see OverlayProjection).
74
95
  */
75
- private worldQuantum;
76
96
  setWorldQuantum(quantum: number): void;
77
97
  destroy(): void;
78
- /** Pointer client coords → world coords, snapped to {@link worldQuantum}. */
79
- private toImage;
80
- /**
81
- * World units spanned by one screen pixel, measured through the viewer's own transform.
82
- *
83
- * Read from the transform rather than from the camera, so it holds for both the 2D and
84
- * the 3D screen-space adapters without either having to expose a zoom. Falls back to 1
85
- * if the transform gives nothing usable, which keeps the established pixel behaviour
86
- * rather than collapsing the threshold to zero and recording a point per event.
87
- */
88
- private worldPerCanvasPixel;
89
- /** Image coords → SVG-local px (the svg overlays the canvas at the same client rect). */
90
- private toLocal;
91
98
  private readonly onPointerDown;
99
+ private pointerDown;
92
100
  private readonly onPointerMove;
93
101
  private readonly onPointerUp;
102
+ /**
103
+ * The pointer gesture ended without a pointerup (the browser cancelled it, or capture was
104
+ * lost): end it without committing. Also fires after every normal release, when nothing
105
+ * is live any more.
106
+ */
107
+ private readonly onPointerCancel;
108
+ /**
109
+ * End whatever pointer gesture is live without committing it: close the store batch a drag
110
+ * opened (so later edits are emitted again) and forget the drag (so a bare hover no longer
111
+ * moves the region), and drop the marquee and a rectangle/freehand draft. A click-placed
112
+ * polygon is not a pointer gesture and survives.
113
+ */
114
+ private endGesture;
94
115
  /** Click-to-place polygon: add a vertex, or close when clicking near the first one. */
95
116
  private handlePolygonClick;
96
117
  private readonly onDblClick;
97
118
  /** The currently-selected region (single selection), or null. */
98
119
  private selectedRegion;
99
- /** Screen distance (px) between a client point and an image coord. */
100
- private screenDist;
101
120
  /**
102
121
  * Start a select/move interaction: grab a handle (rectangle corner) or vertex of the already-
103
122
  * selected region first; otherwise select the topmost region under the cursor and drag its body.
104
123
  */
105
124
  private beginManipulation;
106
- /** Create/update the marquee rect element directly (avoids a full region redraw per move). */
125
+ /** Show the marquee where it is now (only the marquee element: no full region redraw). */
107
126
  private updateMarqueeEl;
108
- /** Remove the marquee element from the SVG. */
109
- private clearMarqueeEl;
110
- /** Test whether a client point grabs a rectangle corner or a polygon vertex of `region`. */
111
- private hitHandle;
112
- /** Apply the live drag for the active manipulation (image coords `ix,iy`). */
113
- private applyManipulation;
114
- /** addpoint mode: insert a vertex on the selected polygon's nearest edge at the click. */
127
+ /** addpoint mode: insert a vertex at the click on the selected polygon's nearest edge
128
+ * (exterior or a hole ring). */
115
129
  private handleAddPoint;
116
- /** deletepoint mode: remove the selected polygon's vertex nearest the click. */
130
+ /** deletepoint mode: remove the selected polygon's vertex nearest the click (exterior or a
131
+ * hole ring). */
117
132
  private handleDeletePoint;
118
- /** Distance from point (px,py) to segment (ax,ay)-(bx,by), in image units. */
119
- private pointSegDist;
120
- /** Finalize a rubber-band marquee: select every region whose bounding box it overlaps (a tiny
121
- * marquee is treated as a click on empty space → clear the selection). */
133
+ /** Finalize a rubber-band marquee: select every region whose bounding box it overlaps (a
134
+ * marquee under {@link MIN_MARQUEE_PX} is a click on empty space → clear the selection). */
122
135
  private finishMarquee;
123
- /** A region's bounding box in image coords (rectangle, polygon, or multipolygon), or null. */
124
- private regionBBox;
125
136
  private commitRectangle;
126
137
  private commitPolygon;
127
- private hitTest;
128
138
  /** Show or hide the drawn regions. A region being drawn stays visible either way. */
129
139
  setRegionsVisible(visible: boolean): void;
140
+ /** Follow a camera move: one transform attribute plus the screen-space elements. */
141
+ private updateCamera;
142
+ /**
143
+ * Rebuild every element from the store: the regions in world coordinates (one transformed
144
+ * group), their labels, and the overlay. Reads no layout: the camera affine is the viewer's.
145
+ */
130
146
  redraw(): void;
131
- /** Draw a region's classification label at its top-left, when labels are enabled (matches OSD). */
132
- private drawLabel;
133
- /** Draw grab handles for the selected region: rectangle corners or polygon vertices. */
134
- private drawHandles;
135
- /** Draw one bezier control point (anchor + handle offset) as a small circle connected to its
136
- * anchor by a tangent line. `handle` is the [dx,dy] offset from the anchor in image space. */
137
- private drawBezierHandle;
138
- private buildRegionEl;
139
- /** Path data for a polygon: the exterior ring (bezier or straight) plus any holes (bezier when
140
- * the donut carries hole handles, else straight) as sub-paths — even-odd fill cuts them out. */
141
- private polygonPathData;
142
- /** SVG path data for a straight ring/polyline in image coords (closed appends `Z`). */
143
- private straightPath;
144
- /** SVG cubic-bezier path data for any ring (exterior or hole): anchors joined by cubic segments
145
- * whose control points are `anchor + handleOut` (leaving) and `nextAnchor + handleIn` (arriving),
146
- * in image space. Used for both the exterior and (donut) hole rings. */
147
- private ringBezierPath;
148
- private style;
149
- /** Draw the in-progress rectangle / path preview. */
150
- private drawDraft;
151
- private styleDraft;
147
+ /** Rebuild the screen-space overlay only: the selected regions' handles and the draft. */
148
+ private renderOverlay;
152
149
  }