@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,112 +1,112 @@
1
1
  import { OnDestroy, OnInit } from '@angular/core';
2
- import { OverlayPanel } from 'primeng/overlaypanel';
3
2
  import { Region } from '../models/region';
4
3
  import { PresetSet, ClassPreset } from '../models/class-preset';
5
4
  import { ConfirmationService, MessageService } from 'primeng/api';
6
5
  import { IRegionEditorApi } from '../contracts/region-editor-api.contract';
7
- import { RegionIoPort } from '../contracts/ports/region-io.port';
6
+ import { RegionPersistenceService } from './region-persistence.service';
7
+ import { ClassColorEdit } from './region-color-dialog/region-color-dialog.component';
8
+ import { MaskExportService, MaskMode } from './mask-export.service';
9
+ import { PixelSize } from './region-metrics';
8
10
  import * as i0 from "@angular/core";
11
+ /**
12
+ * The Region Editor (`<region-editor>`): the table of the active image's
13
+ * annotation regions with class presets, colours, labels, GeoJSON import /
14
+ * export / server save and mask export. Self-contained: it talks to the viewer
15
+ * only through {@link REGION_EDITOR_API} (and the host's REGION_IO_PORT), so it
16
+ * has no inputs or outputs.
17
+ *
18
+ * OnPush: template events re-render it; state that lands asynchronously (the
19
+ * API's region / selection / preset / image-meta streams, save and mask-export
20
+ * progress, file reads) marks it for check.
21
+ */
9
22
  export declare class RegionEditorComponent implements OnInit, OnDestroy {
10
23
  private regionApi;
11
- messageService: MessageService;
24
+ private messageService;
12
25
  private confirmationService;
13
- private regionIo;
14
- protected readonly Array: ArrayConstructor;
15
- overlayPanel: OverlayPanel;
16
- regions: Region[];
17
- regionsCopy: Region[];
18
- selectedRegions: Region[];
19
- showShapeLabel: boolean;
20
- shapeColor: string;
21
- fillColor: string;
22
- displayHelpDialog: boolean;
23
- showColorDialog: boolean;
26
+ private persistence;
27
+ private maskExport;
28
+ private overlayPanel;
29
+ protected regions: Region[];
30
+ protected selectedRegions: Region[];
31
+ protected showShapeLabel: boolean;
32
+ protected shapeColor: string;
33
+ protected fillColor: string;
34
+ protected displayHelpDialog: boolean;
35
+ protected showColorDialog: boolean;
24
36
  /** One colour editor per unique class among the selected regions, shown in the
25
37
  * "edit colour of selected regions" dialog. Unclassified regions (no label)
26
38
  * are grouped under a single entry with an empty `label`. */
27
- classColorEdits: {
28
- label: string;
29
- color: string;
30
- }[];
31
- labelColors: Map<string, string>;
32
- selectedLabelColor: string;
39
+ protected classColorEdits: ClassColorEdit[];
33
40
  /** "Edit class on selected rows" popup: chosen existing class, and a new-class name. */
34
- bulkClass: string;
35
- newBulkClass: string;
41
+ protected bulkClass: string;
42
+ protected newBulkClass: string;
36
43
  /** Local mirror of the per-user preset set (chip strip, Class dropdown, dialog). */
37
- presetSet: PresetSet;
38
- /** Class applied to newly drawn/added regions and to bulk chip-clicks. */
39
- activeClass: string | null;
40
- showManageDialog: boolean;
44
+ protected presetSet: PresetSet;
45
+ /** The class last picked in the panel; a chip-click applies it to the selected rows. */
46
+ protected activeClass: string | null;
47
+ protected showManageDialog: boolean;
41
48
  /** Working copy edited inside the Manage-classes dialog; committed on Apply/Done. */
42
- presetDraft: PresetSet | null;
49
+ protected presetDraft: PresetSet | null;
43
50
  /** class name (match-mode keyed) → number of regions currently using it. */
44
- classCounts: Map<string, number>;
51
+ protected classCounts: Map<string, number>;
45
52
  /** Fallback class that a region reverts to when its class is deleted (jit-ui#70). */
46
- readonly defaultClassName = "Region";
53
+ protected readonly defaultClassName = "Region";
47
54
  /** Classes as shown in the panel: sorted by region count (desc), then name. */
48
- displayClasses: ClassPreset[];
49
- readonly matchModeOptions: {
50
- label: string;
51
- value: string;
52
- }[];
53
- paginatorFirst: number;
54
- paginatorRows: number;
55
- readonly rowsPerPageOptions: number[];
56
- /** Regions whose Class cell is currently in edit mode.
57
- * Using object identity as the key avoids needing a unique id field. */
58
- editingLabelRegions: Set<any>;
59
- showSaveAsDialog: boolean;
60
- saveAsFilename: string;
61
- saveAsFileExists: boolean;
55
+ protected displayClasses: ClassPreset[];
56
+ protected paginatorFirst: number;
57
+ protected paginatorRows: number;
58
+ protected readonly rowsPerPageOptions: number[];
59
+ /** Regions whose Class cell is currently in edit mode → the label being typed.
60
+ * The draft is committed on Enter and discarded on Escape/✕, so typing never
61
+ * writes into the store's region (RT-18). Keyed by object identity, which
62
+ * avoids needing a unique id field. */
63
+ protected editingLabelRegions: Map<Region, string>;
64
+ protected showSaveAsDialog: boolean;
65
+ protected saveAsFilename: string;
66
+ protected saveAsFileExists: boolean;
62
67
  /** True while a GeoJSON persist is serializing/uploading — drives the dialog's
63
68
  * progress bar and Cancel button (parity with the Save-mask dialog). */
64
- saveAsBusy: boolean;
65
- private _saveAsCheck$;
69
+ protected saveAsBusy: boolean;
70
+ /** The running GeoJSON save; unsubscribing cancels it (Cancel / destroy). */
66
71
  private _saveAsSub?;
67
- /** Handle for the deferred-serialize timer so Cancel/destroy can abort it
68
- * before it fires (otherwise the upload would still start). */
69
- private _saveAsTimer?;
70
- showExportDialog: boolean;
71
- exportFilename: string;
72
- showSaveMaskDialog: boolean;
73
- saveMaskFilename: string;
72
+ /** Save-as file names to check for an existing file (debounced). */
73
+ private readonly saveAsCheck$;
74
+ protected showExportDialog: boolean;
75
+ protected exportFilename: string;
76
+ protected showSaveMaskDialog: boolean;
77
+ protected saveMaskFilename: string;
74
78
  /** Mask type chosen in the Save-mask dialog: a binary foreground/background
75
79
  * mask, or a multi-class mask with a distinct id per region. */
76
- maskMode: 'binary' | 'multiclass';
80
+ protected maskMode: MaskMode;
77
81
  /** True while the mask worker is rasterizing/encoding — drives the progress
78
82
  * bar and the Cancel button in the dialog. */
79
- maskBusy: boolean;
83
+ protected maskBusy: boolean;
80
84
  /** 0–100 rasterization progress; switches to indeterminate during encoding. */
81
- maskProgress: number;
82
- maskEncoding: boolean;
83
- private maskWorker?;
84
- private pendingMaskFilename;
85
+ protected maskProgress: number;
86
+ protected maskEncoding: boolean;
87
+ /** The running mask export; unsubscribing cancels it (terminates its worker). */
88
+ private maskJob?;
85
89
  /**
86
90
  * PrimeNG p-table multi-selection mode toggle. When true, single-click
87
91
  * selects one row (replacing prior); meta/ctrl-click toggles a row in/out
88
92
  * of the selection. When false, every click toggles. Default true to
89
93
  * match the most common spreadsheet-like UX.
90
94
  */
91
- metaKey: boolean;
95
+ protected metaKey: boolean;
92
96
  private _updatingFromEditor;
93
97
  private _suppressSelectionSyncToPlot;
94
- private _regionSub;
95
- private _selectedIdxSub;
96
- private _metaSub;
97
- private _presetSub;
98
+ private readonly destroyRef;
99
+ private readonly cdr;
100
+ private readonly zone;
101
+ /** Re-render this OnPush view, re-entering the zone when the change came from outside it. */
102
+ private changed;
98
103
  /** Physical pixel size (µm/pixel) of the active image, for region areas in
99
- * µm². Undefined when the format reports no physical size. */
100
- private mppX?;
101
- private mppY?;
102
- constructor(regionApi: IRegionEditorApi, messageService: MessageService, confirmationService: ConfirmationService, regionIo: RegionIoPort);
103
- /**
104
- * Deep copy of regions for dirty-tracking (`regionsCopy`). Returns plain-object
105
- * clones — only structural equality matters here, not prototypes.
106
- * TODO: replace with `structuredClone` once verified.
107
- */
108
- private deepClone;
104
+ * µm²; empty when the format reports no physical size. */
105
+ protected mpp: PixelSize;
106
+ constructor(regionApi: IRegionEditorApi, messageService: MessageService, confirmationService: ConfirmationService, persistence: RegionPersistenceService, maskExport: MaskExportService);
109
107
  ngOnInit(): void;
108
+ /** Cancels a running GeoJSON save (aborts its upload) and mask export (terminates
109
+ * its worker); the API subscriptions end through `takeUntilDestroyed`. */
110
110
  ngOnDestroy(): void;
111
111
  /**
112
112
  * Table → Plot: PrimeNG fires onRowSelect/onRowUnselect after updating
@@ -114,96 +114,81 @@ export declare class RegionEditorComponent implements OnInit, OnDestroy {
114
114
  * the package maps them to its internal index space (which includes the
115
115
  * intensity-profile lines the editor never sees).
116
116
  */
117
- onSelectionChanged(): void;
117
+ protected onSelectionChanged(): void;
118
118
  /**
119
- * Apply classification colours and refresh the label→colour map for regions
120
- * coming from the visualizer. The visualizer hands back neutral `Region`
121
- * objects with bounds, colour and label already populated, so the editor no
122
- * longer parses any backend-specific shape format — it only fills in a
123
- * fallback colour and rebuilds its local label→colour lookup.
119
+ * Rows for regions coming from the visualizer: neutral `Region`s with bounds,
120
+ * colour and label already populated. A region without a colour is shown with
121
+ * its classification colour (or the default shape colour) — as a copy: the
122
+ * store's instances are shared with its undo history and must not be changed
123
+ * in place (RT-1).
124
124
  */
125
125
  private applyRegionColors;
126
126
  /**
127
- * Push edits from the editor to the diagram in live-edit mode (no save /
128
- * cancel buttons). The `_updatingFromEditor` guard is still used so the
129
- * resulting regionUpdateEvent doesn't bounce back as an external change.
127
+ * The editor's one write path (RT-1): make `next` the table's rows and commit
128
+ * them to the store — live, as one undoable step (isRegionSaveOn=true; the
129
+ * router keeps the intensity-profile lines). Rows are the store's instances,
130
+ * so an edit passes copies ({@link patchRegions}), never changed rows. The
131
+ * resulting region-update event is ignored (`_updatingFromEditor`), so the
132
+ * class list and counts are refreshed here (a typed class is added; jit-ui#70).
133
+ */
134
+ private commit;
135
+ /**
136
+ * Copy-on-write edit (review RT-1). The editor's rows are the region store's
137
+ * live instances, and the store takes its undo snapshot only when the edit is
138
+ * committed — so an edit must replace a region with a patched copy (and any
139
+ * bounds it changes with new bounds), never mutate the instance the store
140
+ * holds. Returns the copies by original; the selection and an open label edit
141
+ * follow them.
130
142
  */
131
- private setRegionsFromEditor;
132
- /** Set one region's outline colour from the per-row picker and commit live.
133
- * Remembers it as the label's colour so same-class regions added later match
134
- * (jit-ui#85 — the Region Editor's per-region Color column). */
135
- changeRegionColor(region: Region, color: string): void;
136
- addRectangle(): void;
143
+ private patchRegions;
144
+ /** Set one region's outline colour (an explicit override) and commit live. */
145
+ protected changeRegionColor(region: Region, color: string): void;
137
146
  /**
138
- * Update the label of the region on enter key pressed (when editing a label cell in the table)
139
- * @param region
140
- * @param setRegion
147
+ * After a label edit on `region`: give every labelled row without a colour its
148
+ * class colour (preset or fallback, as the store will), and commit when
149
+ * `commit` is set.
141
150
  */
142
- labelRegionUpdate(region: Region, setRegion?: boolean): void;
143
- xRectUpdate(region: Region, event: any): void;
144
- yRectUpdate(region: Region, event: any): void;
145
- widthRectUpdate(region: Region, event: any): void;
146
- heightRectUpdate(region: Region, event: any): void;
147
- onPageChange(event: {
151
+ protected labelRegionUpdate(region: Region, commit?: boolean): void;
152
+ /** Labelled rows without a colour get their class colour (copies). */
153
+ private fillClassColors;
154
+ /** The current page of the table. Memoized on (regions, first, rows), so
155
+ * change detection doesn't hand p-table a new array every tick (RT-20). */
156
+ protected get pagedRegions(): Region[];
157
+ private _pageKey;
158
+ private _page;
159
+ protected onPageChange(event: {
148
160
  first?: number;
149
161
  rows?: number;
150
162
  }): void;
151
163
  /** Select every region in the table (and highlight them on the diagram). */
152
- selectAllRegions(): void;
153
- deleteSelectedRegions(): void;
154
- clearAllRegions(): void;
155
- addPolygon(): void;
156
- deleteRegion(shapeIdx: number): void;
164
+ protected selectAllRegions(): void;
165
+ protected deleteSelectedRegions(): void;
166
+ protected clearAllRegions(): void;
167
+ protected deleteRegion(shapeIdx: number): void;
157
168
  private clampPaginatorFirst;
158
- changeShowShapeLabel(showLabel: boolean): void;
159
- isEditingLabel(region: any): boolean;
160
- startEditLabel(region: any, event?: Event): void;
161
- stopEditLabel(region: any, commit: boolean, event?: Event): void;
162
- isRectangle(region: Region): boolean;
163
- /**
164
- * Region area for display: in µm² (or mm²) when the image reports a physical
165
- * pixel size, otherwise in px². Empty string for degenerate regions.
166
- */
167
- regionArea(region: Region): string;
168
- /**
169
- * Choose the physical pixel size (µm/pixel) for area display from the image
170
- * meta. The calibration may sit on any channel entry — not necessarily [0] —
171
- * so pick the first entry with a positive mppX (mirrors
172
- * PlotlyService.currentMpp). Falls back to square pixels (mppY = mppX) when
173
- * only one axis is reported, so a scaled image shows µm²/mm² rather than px².
174
- */
175
- private pickMpp;
176
- /** Pixel area: width·height for rectangles, shoelace formula for polygons.
177
- * Interior rings (holes) are subtracted, so a donut reports the annulus area,
178
- * not the filled exterior (jit-ui#85). */
179
- private areaInPixels;
180
- /** Polygon area: exterior shoelace minus each interior ring (hole). */
181
- private polygonArea;
182
- /** Absolute shoelace area of a single ring. */
183
- private ringArea;
184
- private fmtArea;
169
+ protected changeShowShapeLabel(showLabel: boolean): void;
170
+ protected isEditingLabel(region: Region): boolean;
171
+ protected startEditLabel(region: Region, event?: Event): void;
172
+ /** The label typed so far for a row in edit mode (no re-render needed). */
173
+ protected setLabelDraft(region: Region, value: string): void;
174
+ protected stopEditLabel(region: Region, commit: boolean, event?: Event): void;
175
+ /** Region area for display (µm²/mm² when the image is scaled, else px²);
176
+ * empty for a degenerate region. See `region-metrics`. */
177
+ protected regionArea(region: Region): string;
185
178
  /**
186
179
  * This method rounds all the rectangle regions lengths to multiple of 512
187
180
  */
188
- roundRectangleLengths(): void;
189
- /**
190
- * Stop key arrow event propagation
191
- * @param event
192
- */
193
- disableArrowKeys(event: any): void;
194
- changeShapeColor(event: any): void;
195
- showHelp(): void;
181
+ protected roundRectangleLengths(): void;
182
+ protected showHelp(): void;
196
183
  /** Open the colour dialog for the currently-selected region(s), building one
197
184
  * colour picker per unique class in the selection. Each picker is seeded with
198
- * the class's current colour (the label→colour map, falling back to the first
199
- * selected region of that class). */
200
- openColorDialog(): void;
201
- /** Apply each class's chosen colour to the selected regions of that class and
202
- * commit live. Remembers the colour per class so same-class regions added
203
- * later match. */
204
- applyColorToSelected(): void;
185
+ * the first selected region of that class's colour (else the class colour). */
186
+ protected openColorDialog(): void;
187
+ /** Apply each class's chosen colour to the selected regions of that class (an
188
+ * explicit override) and commit live. */
189
+ protected applyColorToSelected(edits?: ClassColorEdit[]): void;
205
190
  /** Resolve the display colour for a class name (preset colour or deterministic fallback). */
206
- colorForName(name?: string): string;
191
+ protected colorForName(name?: string): string;
207
192
  /**
208
193
  * Ensure every class label present in the loaded regions exists in the preset
209
194
  * list, auto-adding any that are missing (using the region's already-resolved
@@ -217,89 +202,71 @@ export declare class RegionEditorComponent implements OnInit, OnDestroy {
217
202
  private recomputeClassCounts;
218
203
  /** Rebuild the panel's display order — most-used classes first, then by name. */
219
204
  private updateDisplayClasses;
220
- /** trackBy for the class rows so re-sorting doesn't re-create the pickers. */
221
- trackByClassName: (_: number, c: ClassPreset) => string;
222
205
  /** Number of regions currently using a class (keyed by the active match mode). */
223
- classCount(name: string): number;
206
+ protected classCount(name: string): number;
224
207
  /** Recolour a class from its panel swatch and repaint its (non-overridden) regions. */
225
- setClassColor(name: string, color: string): void;
226
- /** Tooltip for a class's delete button in the panel. */
227
- deleteClassTooltip(name: string): string;
208
+ protected setClassColor(name: string, color: string): void;
228
209
  /** Remove a class. Any regions still using it fall back to the default
229
210
  * "Region" class, so they aren't orphaned (and the class isn't immediately
230
211
  * re-added from its regions by syncClassesFromRegions). */
231
- deleteClass(name: string): void;
212
+ protected deleteClass(name: string): void;
232
213
  /** Regions labelled with any of `removedNames` revert to the default
233
214
  * {@link defaultClassName} ("Region"): its class colour, override cleared.
234
215
  * Skips the default itself so deleting "Region" can't self-reassign. (jit-ui#70) */
235
216
  private reassignRegionsToDefaultClass;
236
217
  /** Stamp a class (and its preset/fallback colour) onto one region from the Class
237
218
  * dropdown; choosing a class opts the region back into the preset colour. */
238
- applyPresetToRegion(region: Region, className: string): void;
219
+ protected applyPresetToRegion(region: Region, className: string): void;
239
220
  /** Make a class active (used for new regions) and, if rows are selected, apply
240
221
  * it to them in one commit. */
241
- selectActiveClass(name: string): void;
222
+ protected selectActiveClass(name: string): void;
242
223
  /** Apply a class (label + preset/fallback colour) to the current selection and commit. */
243
224
  private applyClassToSelected;
244
225
  /** "Edit class on selected rows" popup — apply the chosen existing class. */
245
- applyBulkClass(): void;
226
+ protected applyBulkClass(): void;
246
227
  /** "Edit class on selected rows" popup — add a new class and set it on the selection. */
247
- addAndApplyBulkClass(): void;
248
- openManageDialog(): void;
228
+ protected addAndApplyBulkClass(): void;
229
+ protected openManageDialog(): void;
249
230
  private clonePresetSet;
250
- addPresetClass(): void;
251
- removePresetClass(i: number): void;
252
- addFallbackColor(): void;
253
- removeFallbackColor(i: number): void;
254
231
  /** Commit the draft: drop blank/duplicate names, persist, and recolour
255
232
  * non-overridden regions with the updated presets. */
256
- applyManageDialog(close: boolean): void;
257
- resetPresetsToDefaults(): void;
258
- exportPresets(): void;
259
- importPresets(event: Event): void;
260
- importRois(event: Event): void;
261
- /**
262
- * Regions to serialize on save/export. For a single-file z-stack the store
263
- * keeps only the current slice live, so pull EVERY slice's annotations (each
264
- * tagged with its zero-based Region.z) to write one combined z-indexed
265
- * geojson (jit-ui#93). Otherwise (single-plane image, or a folder stack whose
266
- * slices save to their own per-slice files) the current set. (jit-ui#93)
267
- */
233
+ protected applyManageDialog(close: boolean): void;
234
+ protected resetPresetsToDefaults(): void;
235
+ protected exportPresets(): void;
236
+ protected importPresets(event: Event): void;
237
+ /** Validate and apply an imported annotation-classes JSON file. */
238
+ private applyImportedPresets;
239
+ protected importRois(event: Event): void;
240
+ /** Replace the regions with an imported GeoJSON file's. */
241
+ private applyImportedRois;
242
+ /** Regions to serialize on save/export (every slice for a combined z-stack). */
268
243
  private regionsForSave;
269
- exportRois(): void;
270
- confirmExport(): void;
244
+ protected exportRois(): void;
245
+ protected confirmExport(): void;
271
246
  /** Open the "Save mask" dialog, seeded with `<image-stem>_mask.png`. */
272
- openSaveMaskDialog(): void;
247
+ protected openSaveMaskDialog(): void;
273
248
  /**
274
249
  * Rasterize the regions to the chosen mask type and download as a PNG. The
275
- * heavy work (full-res rasterize + PNG encode) runs in a Web Worker so the UI
276
- * never freezes on large/whole-slide images and the job can be cancelled
277
- * (jit-ui#95). The dialog stays open showing a progress bar until done.
250
+ * heavy work runs in a Web Worker ({@link MaskExportService}) so the UI never
251
+ * freezes on whole-slide images and the job can be cancelled (jit-ui#95);
252
+ * the dialog stays open with a progress bar until done.
278
253
  */
279
- confirmSaveMask(): void;
280
- /** Cancel an in-progress mask export: terminate the worker and reset state. */
281
- cancelSaveMask(): void;
282
- /** Worker factory — async so the worker module (and its `import.meta.url`,
283
- * which the CommonJS test compile rejects) is loaded via a dynamic import,
284
- * exactly like the segmentation worker. Overridable in tests. */
285
- protected createMaskWorker(): Promise<Worker>;
254
+ protected confirmSaveMask(): void;
255
+ /** Cancel an in-progress mask export (terminates its worker) and reset state. */
256
+ protected cancelSaveMask(): void;
286
257
  private finishMask;
287
258
  private maskError;
288
- private teardownMaskWorker;
289
- persistRegions(): void;
290
- /**
291
- * Save a folder stack's regions as one geojson per slice-file (jit-ui#93).
292
- * Groups the store's per-slice regions by slice index and serializes each on
293
- * the default plane (z=0) — each slice-file is itself one plane, and the
294
- * loader re-derives the slice index from the file's position in the series.
295
- * Slices cleared since load are included (empty) so their file is overwritten.
296
- */
259
+ protected persistRegions(): void;
260
+ /** Save a folder stack's regions as one geojson per slice-file (jit-ui#93).
261
+ * No dialog covers the toolbar meanwhile, so a Save while one is uploading
262
+ * is ignored rather than starting a second write (and orphaning the first). */
297
263
  private saveStackSlices;
298
- checkSaveAsFileExists(): void;
299
- confirmSaveAs(): void;
264
+ protected checkSaveAsFileExists(): void;
265
+ protected confirmSaveAs(): void;
300
266
  /** Cancel an in-progress GeoJSON persist: abort the deferred serialize and/or
301
267
  * the in-flight upload, and reset state. */
302
- cancelSaveAs(): void;
268
+ protected cancelSaveAs(): void;
269
+ private toast;
303
270
  static ɵfac: i0.ɵɵFactoryDeclaration<RegionEditorComponent, never>;
304
- static ɵcmp: i0.ɵɵComponentDeclaration<RegionEditorComponent, "region-editor", never, {}, {}, never, never, false, never>;
271
+ static ɵcmp: i0.ɵɵComponentDeclaration<RegionEditorComponent, "region-editor", never, {}, {}, never, never, true, never>;
305
272
  }
@@ -0,0 +1,26 @@
1
+ import { Region } from '../models/region';
2
+ import { IImageMetadata } from '../contracts/image.contract';
3
+ /** Physical pixel size (µm/pixel); both undefined when the image is unscaled. */
4
+ export interface PixelSize {
5
+ mppX?: number;
6
+ mppY?: number;
7
+ }
8
+ /**
9
+ * Choose the physical pixel size for area display from the image meta. The
10
+ * calibration may sit on any channel entry, not necessarily [0], so take the
11
+ * first entry with a positive mppX (as PlotlyService.currentMpp does). With
12
+ * only one axis reported, pixels are square (mppY = mppX), so a scaled image
13
+ * shows µm²/mm² rather than px².
14
+ */
15
+ export declare function pickMpp(meta: IImageMetadata[] | undefined): PixelSize;
16
+ /**
17
+ * A region's area in px²: width·height for a rectangle, shoelace for a polygon
18
+ * with each interior ring (hole) subtracted (a donut reports the annulus), and
19
+ * the sum of the parts for a multi-polygon (jit-ui#85). 0 for anything else.
20
+ */
21
+ export declare function regionAreaPx(region: Pick<Region, 'bounds'>): number;
22
+ /**
23
+ * An area for display: µm² (mm² from 1e6 µm²) when the pixel size is known,
24
+ * otherwise px². Empty for a degenerate (non-positive) area.
25
+ */
26
+ export declare function formatArea(px: number, mpp?: PixelSize): string;
@@ -0,0 +1,69 @@
1
+ import { Observable } from 'rxjs';
2
+ import { Region } from '../models/region';
3
+ import { IRegionEditorApi } from '../contracts/region-editor-api.contract';
4
+ import { RegionIoPort } from '../contracts/ports/region-io.port';
5
+ import * as i0 from "@angular/core";
6
+ /** One slice-file's serialized regions (folder stack, jit-ui#93). */
7
+ export interface SliceGeoJson {
8
+ z: number;
9
+ geoJsonStr: string;
10
+ }
11
+ /**
12
+ * Region file I/O for the Region Editor: default file names, GeoJSON download
13
+ * (export), save to the host through {@link RegionIoPort} (with a debounced
14
+ * "file exists" check), per-slice saves for folder stacks, and reading an
15
+ * imported file. Provided by the editor; it holds no state — the editor owns
16
+ * the dialogs, the toasts and the running jobs.
17
+ */
18
+ export declare class RegionPersistenceService {
19
+ private readonly api;
20
+ private readonly io;
21
+ constructor(api: IRegionEditorApi, io: RegionIoPort);
22
+ /** The selected image's file name, if any. */
23
+ selectedFileName(): string | undefined;
24
+ /** `<image-stem>.geojson` for a server save; undefined with no image selected. */
25
+ defaultSaveName(): string | undefined;
26
+ /** `<image-stem>.geojson` (or `rois.geojson`) for a download. */
27
+ defaultExportName(): string;
28
+ /** `<image-stem>_mask.png` (or `regions_mask.png`) for a mask download. */
29
+ defaultMaskName(): string;
30
+ /** True when a save writes one geojson per slice-file (folder stack, jit-ui#93). */
31
+ savesPerSlice(): boolean;
32
+ /**
33
+ * Regions to serialize on save/export. For a single-file z-stack the store
34
+ * keeps only the current slice live, so take EVERY slice's annotations (each
35
+ * tagged with its zero-based Region.z) for one combined z-indexed geojson
36
+ * (jit-ui#93); otherwise `live` (single plane, or a folder stack whose slices
37
+ * save to their own files).
38
+ */
39
+ regionsForSave(live: Region[]): Region[];
40
+ /**
41
+ * Whether each file name in `names` already exists on the host, debounced
42
+ * 400 ms; a newer name supersedes an in-flight check. A failed check reads as
43
+ * "does not exist" and later checks keep working.
44
+ */
45
+ fileExists(names: Observable<string>): Observable<boolean>;
46
+ /** Download `regions` as a GeoJSON file named `filename`. */
47
+ download(regions: Region[], filename: string): void;
48
+ /**
49
+ * Save `regions()` to the host as `filename`. Serializing is deferred one
50
+ * tick (so a progress indicator paints before a large synchronous
51
+ * serialize); unsubscribing before then cancels the save entirely, and after
52
+ * it cancels the upload. A serialize failure is an error, like an upload one.
53
+ */
54
+ save(regions: () => Region[], filename: string): Observable<void>;
55
+ /**
56
+ * A folder stack's regions as one geojson per slice-file (jit-ui#93), each
57
+ * serialized on the default plane (z=0): every slice-file is one plane, and
58
+ * the loader re-derives the slice index from the file's position. Slices
59
+ * cleared since load are included (empty) so their file is overwritten.
60
+ */
61
+ sliceGeoJsons(): SliceGeoJson[];
62
+ /** Write per-slice geojsons through the host port. */
63
+ saveSlices(slices: SliceGeoJson[]): Observable<void>;
64
+ /** Read the file chosen in a file input's change event as text, then call
65
+ * `onText`. No-op when no file was chosen. */
66
+ readChosenFile(event: Event, onText: (text: string) => void): void;
67
+ static ɵfac: i0.ɵɵFactoryDeclaration<RegionPersistenceService, never>;
68
+ static ɵprov: i0.ɵɵInjectableDeclaration<RegionPersistenceService>;
69
+ }