@jax-data-science/sci-image-visualizer 0.3.3 → 0.5.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 (98) hide show
  1. package/README.md +268 -4
  2. package/esm2022/index.mjs +21 -1
  3. package/esm2022/lib/contracts/display-types.mjs +20 -2
  4. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +66 -0
  6. package/esm2022/lib/contracts/plot-type.mjs +41 -1
  7. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +3 -0
  8. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +45 -0
  9. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  10. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +10 -19
  11. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +71 -7
  12. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +1 -1
  13. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +96 -0
  14. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +1934 -55
  15. package/esm2022/lib/implementations/napari-js/napari-zoom.mjs +18 -0
  16. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +73 -8
  17. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +8 -1
  18. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +3 -4
  19. package/esm2022/lib/implementations/osd/osd-zoom.mjs +20 -0
  20. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +555 -0
  21. package/esm2022/lib/implementations/plotly/plotly.service.mjs +13 -7
  22. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +304 -0
  23. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +179 -0
  24. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +329 -0
  25. package/esm2022/lib/routing-visualizer.service.mjs +228 -12
  26. package/esm2022/lib/spatial/embedding-compute.mjs +142 -0
  27. package/esm2022/lib/spatial/gene-search.mjs +77 -0
  28. package/esm2022/lib/spatial/spatial-density.mjs +224 -0
  29. package/esm2022/lib/spatial/spatial-encoding.mjs +232 -0
  30. package/esm2022/lib/spatial/spatial-expression.mjs +257 -0
  31. package/esm2022/lib/spatial/spatial-framing.mjs +60 -0
  32. package/esm2022/lib/spatial/spatial-heatmap.mjs +185 -0
  33. package/esm2022/lib/spatial/spatial-hover.mjs +79 -0
  34. package/esm2022/lib/spatial/spatial-sections.mjs +96 -0
  35. package/esm2022/lib/spatial/spatial-selection.mjs +264 -0
  36. package/esm2022/lib/spatial/spatial-volume-image.mjs +163 -0
  37. package/esm2022/lib/spatial/tsne-worker.mjs +10 -0
  38. package/esm2022/lib/spatial/world-grid.mjs +77 -0
  39. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +1278 -0
  40. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +621 -0
  41. package/esm2022/lib/store/spatial-selection.service.mjs +47 -0
  42. package/esm2022/lib/store/visualizer-store.service.mjs +23 -1
  43. package/esm2022/lib/toolbar/toolbar.component.mjs +61 -21
  44. package/esm2022/lib/visualization.module.mjs +23 -5
  45. package/esm2022/lib/visualizer.component.mjs +527 -44
  46. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs} +6 -4
  47. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-ci1q0xnJ.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map} +1 -1
  48. package/fesm2022/jax-data-science-sci-image-visualizer-tsne-worker-B_nXDGf0.mjs +12 -0
  49. package/fesm2022/jax-data-science-sci-image-visualizer-tsne-worker-B_nXDGf0.mjs.map +1 -0
  50. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +15971 -7808
  51. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  52. package/fesm2022/tsne.worker.js +19091 -0
  53. package/index.d.ts +16 -0
  54. package/lib/contracts/display-types.d.ts +131 -0
  55. package/lib/contracts/image.contract.d.ts +7 -0
  56. package/lib/contracts/plot-type-contribution.contract.d.ts +172 -0
  57. package/lib/contracts/plot-type.d.ts +52 -2
  58. package/lib/contracts/ports/spatial-data.port.d.ts +90 -0
  59. package/lib/contracts/spatial-dataset.contract.d.ts +281 -0
  60. package/lib/contracts/visualizer.contract.d.ts +104 -1
  61. package/lib/implementations/napari-js/napari-axes-labels.d.ts +9 -7
  62. package/lib/implementations/napari-js/napari-region-overlay.d.ts +38 -4
  63. package/lib/implementations/napari-js/napari-scale-bar.d.ts +7 -3
  64. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +32 -0
  65. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +497 -16
  66. package/lib/implementations/napari-js/napari-zoom.d.ts +15 -0
  67. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +21 -0
  68. package/lib/implementations/osd/osd-coordinate-transform.d.ts +6 -0
  69. package/lib/implementations/osd/osd-zoom.d.ts +19 -0
  70. package/lib/implementations/plotly/omics-trace-builders.d.ts +193 -0
  71. package/lib/implementations/plotly/plotly.service.d.ts +9 -0
  72. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +123 -0
  73. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +115 -0
  74. package/lib/plot-mode/plot-mode-controller.d.ts +130 -0
  75. package/lib/routing-visualizer.service.d.ts +49 -6
  76. package/lib/spatial/embedding-compute.d.ts +73 -0
  77. package/lib/spatial/gene-search.d.ts +48 -0
  78. package/lib/spatial/spatial-density.d.ts +73 -0
  79. package/lib/spatial/spatial-encoding.d.ts +155 -0
  80. package/lib/spatial/spatial-expression.d.ts +144 -0
  81. package/lib/spatial/spatial-framing.d.ts +37 -0
  82. package/lib/spatial/spatial-heatmap.d.ts +111 -0
  83. package/lib/spatial/spatial-hover.d.ts +49 -0
  84. package/lib/spatial/spatial-sections.d.ts +59 -0
  85. package/lib/spatial/spatial-selection.d.ts +113 -0
  86. package/lib/spatial/spatial-volume-image.d.ts +67 -0
  87. package/lib/spatial/tsne-worker.d.ts +7 -0
  88. package/lib/spatial/world-grid.d.ts +58 -0
  89. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +439 -0
  90. package/lib/spatial-controls/spatial-controls.component.d.ts +257 -0
  91. package/lib/store/spatial-selection.service.d.ts +27 -0
  92. package/lib/store/visualizer-store.service.d.ts +13 -0
  93. package/lib/toolbar/toolbar.component.d.ts +36 -8
  94. package/lib/visualization.module.d.ts +28 -24
  95. package/lib/visualizer.component.d.ts +139 -7
  96. package/package.json +6 -2
  97. package/src/lib/assets/spatial-omics-3d.svg +31 -0
  98. package/src/lib/assets/spatial-omics.svg +27 -0
@@ -89,4 +89,4 @@ export class NapariScaleBar {
89
89
  this.bar.parentNode.removeChild(this.bar);
90
90
  }
91
91
  }
92
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNjYWxlLWJhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktc2NhbGUtYmFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILG9FQUFvRTtBQUNwRSxTQUFTLFVBQVUsQ0FBQyxDQUFTO0lBQzNCLElBQUksQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDbkIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzFELE9BQU8sSUFBSSxHQUFHLElBQUksQ0FBQztBQUNyQixDQUFDO0FBRUQ7MkRBQzJEO0FBQzNELE1BQU0sVUFBVSxRQUFRLENBQUMsRUFBVTtJQUNqQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQVMsRUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFFLElBQUksRUFBRSxJQUFJLEdBQUc7UUFBRSxPQUFPLEdBQUcsSUFBSSxDQUFDLEVB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O1FBQ1osTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxnQ0FBZ0M7UUFDdkUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUNoQyxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDO1FBQy9DLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxvQkFBb0I7UUFDcEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDO1FBQ2xFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxjQUFjLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFDbEMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVU7WUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGh5c2ljYWwgc2NhbGUgYmFyIGZvciB0aGUgbmFwYXJpLWpzIFdlYkdQVSBpbWFnZSB2aWV3IChqaXQtdWkjMTAyKSwgbWlycm9yaW5nIHRoZSBPU0RcbiAqIGJhY2tlbmQncyB7QGxpbmsgT3NkU2NhbGVCYXJ9LiBuYXBhcmkga2VlcHMgbGF5ZXJzIGF0IHBpeGVsIHNjYWxlLCBzbyB0aGUgY2FtZXJhJ3MgYHpvb21gXG4gKiAoQ1NTIHB4IHBlciB3b3JsZCB1bml0KSBpcyBleGFjdGx5IHNjcmVlbiBweCBwZXIgaW1hZ2UgcGl4ZWw7IGNvbWJpbmVkIHdpdGggdGhlIGltYWdlJ3NcbiAqIMK1bS9waXhlbCAoYG1wcFhgLCBmcm9tIEJpby1Gb3JtYXRzIGAvdGlsZXMvaW5mb2ApIHRoYXQgZ2l2ZXMgYSByZWFsLXdvcmxkIGJhciBsZW5ndGguXG4gKiBSZWNvbXB1dGVzIG9uIGV2ZXJ5IGNhbWVyYSBjaGFuZ2UgYW5kIGhvc3QgcmVzaXplLiBIaWRkZW4gd2hlbiB0aGUgaW1hZ2UgaGFzIG5vIHBoeXNpY2FsIHNpemUuXG4gKi9cblxuLyoqIFJvdW5kIHVwIHRvIGEgXCJuaWNlXCIgMS8yLzUgw5cgMTDigb8gdmFsdWUgZm9yIHNjYWxlLWJhciBsZW5ndGhzLiAqL1xuZnVuY3Rpb24gbmljZUxlbmd0aCh4OiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoeCA8PSAwKSByZXR1cm4gMTtcbiAgY29uc3QgYmFzZSA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nMTAoeCkpKTtcbiAgY29uc3QgZiA9IHggLyBiYXNlO1xuICBjb25zdCBuaWNlID0gZiA8IDEuNSA/IDEgOiBmIDwgMy41ID8gMiA6IGYgPCA3LjUgPyA1IDogMTA7XG4gIHJldHVybiBuaWNlICogYmFzZTtcbn1cblxuLyoqIEZvcm1hdCBhIGxlbmd0aCBnaXZlbiBpbiBtaWNyb21ldHJlcywgcGlja2luZyB0aGUgdW5pdCB0aGF0IHN1aXRzIGl0cyBtYWduaXR1ZGUgKGppdC1zZXJ2aWNlXG4gKiAgbm9ybWFsaXNlcyB3aGF0ZXZlciB1bml0IEJpby1Gb3JtYXRzIHJlcG9ydHMgdG8gwrVtKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRVbSh1bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbSA9IChuOiBudW1iZXIpOiBzdHJpbmcgPT4gKG4gJSAxID09PSAwID8gYCR7bn1gIDogbi50b0ZpeGVkKDEpKTtcbiAgaWYgKHVtID49IDFlNikgcmV0dXJuIGAke3RyaW0odW0gLyAxZTYpfSBtYDtcbiAgaWYgKHVtID49IDFlNCkgcmV0dXJuIGAke3RyaW0odW0gLyAxZTQpfSBjbWA7XG4gIGlmICh1bSA+PSAxZTMpIHJldHVybiBgJHt0cmltKHVtIC8gMWUzKX0gbW1gO1xuICBpZiAodW0gPj0gMSkgcmV0dXJuIGAke3RyaW0odW0pfSDCtW1gO1xuICByZXR1cm4gYCR7dHJpbSh1bSAqIDEwMDApfSBubWA7XG59XG5cbi8qKiBUaGUgc2xpY2Ugb2YgdGhlIG5hcGFyaSBDYW1lcmEgdGhlIHNjYWxlIGJhciByZWFkcyAoem9vbSA9IENTUyBweCBwZXIgd29ybGQvaW1hZ2UgcGl4ZWwpLiAqL1xuaW50ZXJmYWNlIFNjYWxlQmFyQ2FtZXJhIHtcbiAgcmVhZG9ubHkgem9vbTogbnVtYmVyO1xuICByZWFkb25seSBjaGFuZ2VkOiB7IGNvbm5lY3QobGlzdGVuZXI6ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkIH07XG59XG5cbmV4cG9ydCBjbGFzcyBOYXBhcmlTY2FsZUJhciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFyOiBIVE1MRGl2RWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBsaW5lOiBIVE1MRGl2RWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBsYWJlbDogSFRNTFNwYW5FbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc2Nvbm5lY3RDYW1lcmE6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzaXplT2JzZXJ2ZXI/OiBSZXNpemVPYnNlcnZlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IEhUTUxFbGVtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FtZXJhOiBTY2FsZUJhckNhbWVyYSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1wcFg6IG51bWJlcixcbiAgKSB7XG4gICAgLy8gVGhlIGJhciBpcyBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgd2l0aGluIHRoZSBob3N0LCBzbyB0aGUgaG9zdCBtdXN0IGVzdGFibGlzaCBhIGNvbnRhaW5pbmdcbiAgICAvLyBibG9jayAodGhlIHBsb3QgaG9zdCBpcyBvZnRlbiBzdGF0aWNhbGx5IHBvc2l0aW9uZWQpLlxuICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKGhvc3QpLnBvc2l0aW9uID09PSAnc3RhdGljJykgaG9zdC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG5cbiAgICB0aGlzLmJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5iYXIuc3R5bGUsIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogJzEycHgnLFxuICAgICAgYm90dG9tOiAnMTJweCcsXG4gICAgICB6SW5kZXg6ICczMCcsXG4gICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICBjb2xvcjogJyNmZmYnLFxuICAgICAgZm9udDogJzExcHggc2Fucy1zZXJpZicsXG4gICAgICB0ZXh0U2hhZG93OiAnMCAwIDNweCAjMDAwJyxcbiAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG4gICAgfSBhcyBQYXJ0aWFsPENTU1N0eWxlRGVjbGFyYXRpb24+KTtcbiAgICB0aGlzLmxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHRoaXMubGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5saW5lLnN0eWxlLCB7XG4gICAgICBoZWlnaHQ6ICc0cHgnLFxuICAgICAgbWFyZ2luVG9wOiAnMnB4JyxcbiAgICAgIGJhY2tncm91bmQ6ICdyZ2JhKDI1NSwyNTUsMjU1LDAuOSknLFxuICAgICAgYm9yZGVyTGVmdDogJzFweCBzb2xpZCAjZmZmJyxcbiAgICAgIGJvcmRlclJpZ2h0OiAnMXB4IHNvbGlkICNmZmYnLFxuICAgICAgYm94U2hhZG93OiAnMCAwIDNweCAjMDAwJyxcbiAgICB9IGFzIFBhcnRpYWw8Q1NTU3R5bGVEZWNsYXJhdGlvbj4pO1xuICAgIHRoaXMuYmFyLmFwcGVuZENoaWxkKHRoaXMubGFiZWwpO1xuICAgIHRoaXMuYmFyLmFwcGVuZENoaWxkKHRoaXMubGluZSk7XG4gICAgdGhpcy5ob3N0LmFwcGVuZENoaWxkKHRoaXMuYmFyKTtcblxuICAgIHRoaXMuZGlzY29ubmVjdENhbWVyYSA9IHRoaXMuY2FtZXJhLmNoYW5nZWQuY29ubmVjdCgoKSA9PiB0aGlzLnVwZGF0ZSgpKTtcbiAgICBpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLnVwZGF0ZSgpKTtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmhvc3QpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgcHhQZXJJbWFnZVB4ID0gdGhpcy5jYW1lcmEuem9vbTsgLy8gQ1NTIHNjcmVlbiBweCBwZXIgaW1hZ2UgcGl4ZWxcbiAgICBpZiAoISh0aGlzLm1wcFggPiAwKSB8fCAhKHB4UGVySW1hZ2VQeCA+IDApKSB7XG4gICAgICB0aGlzLmJhci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1bVBlclNjcmVlblB4ID0gdGhpcy5tcHBYIC8gcHhQZXJJbWFnZVB4O1xuICAgIGNvbnN0IG5pY2VVbSA9IG5pY2VMZW5ndGgoMTIwICogdW1QZXJTY3JlZW5QeCk7IC8vIHRhcmdldCB+MTIwcHggYmFyXG4gICAgdGhpcy5iYXIuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIHRoaXMubGluZS5zdHlsZS53aWR0aCA9IGAke01hdGgucm91bmQobmljZVVtIC8gdW1QZXJTY3JlZW5QeCl9cHhgO1xuICAgIHRoaXMubGFiZWwudGV4dENvbnRlbnQgPSBmb3JtYXRVbShuaWNlVW0pO1xuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2Nvbm5lY3RDYW1lcmEoKTtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgaWYgKHRoaXMuYmFyLnBhcmVudE5vZGUpIHRoaXMuYmFyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5iYXIpO1xuICB9XG59XG4iXX0=
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNjYWxlLWJhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktc2NhbGUtYmFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILG9FQUFvRTtBQUNwRSxTQUFTLFVBQVUsQ0FBQyxDQUFTO0lBQzNCLElBQUksQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDbkIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzFELE9BQU8sSUFBSSxHQUFHLElBQUksQ0FBQztBQUNyQixDQUFDO0FBRUQ7MkRBQzJEO0FBQzNELE1BQU0sVUFBVSxRQUFRLENBQUMsRUFBVTtJQUNqQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQVMsRUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFFLElBQUksRUFBRSxJQUFJLEdBQUc7UUFBRSxPQUFPLEdBQUcsSUFBSSxDQUFDLEVB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O1FBQ1osTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxnQ0FBZ0M7UUFDdkUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUNoQyxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDO1FBQy9DLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxvQkFBb0I7UUFDcEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDO1FBQ2xFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxjQUFjLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFDbEMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVU7WUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGh5c2ljYWwgc2NhbGUgYmFyIGZvciB0aGUgbmFwYXJpLWpzIFdlYkdQVSBpbWFnZSB2aWV3IChqaXQtdWkjMTAyKSwgbWlycm9yaW5nIHRoZSBPU0RcbiAqIGJhY2tlbmQncyB7QGxpbmsgT3NkU2NhbGVCYXJ9LiBuYXBhcmkga2VlcHMgbGF5ZXJzIGF0IHBpeGVsIHNjYWxlLCBzbyB0aGUgY2FtZXJhJ3MgYHpvb21gXG4gKiAoQ1NTIHB4IHBlciB3b3JsZCB1bml0KSBpcyBleGFjdGx5IHNjcmVlbiBweCBwZXIgaW1hZ2UgcGl4ZWw7IGNvbWJpbmVkIHdpdGggdGhlIGltYWdlJ3NcbiAqIMK1bS9waXhlbCAoYG1wcFhgLCBmcm9tIEJpby1Gb3JtYXRzIGAvdGlsZXMvaW5mb2ApIHRoYXQgZ2l2ZXMgYSByZWFsLXdvcmxkIGJhciBsZW5ndGguXG4gKiBSZWNvbXB1dGVzIG9uIGV2ZXJ5IGNhbWVyYSBjaGFuZ2UgYW5kIGhvc3QgcmVzaXplLiBIaWRkZW4gd2hlbiB0aGUgaW1hZ2UgaGFzIG5vIHBoeXNpY2FsIHNpemUuXG4gKi9cblxuLyoqIFJvdW5kIHVwIHRvIGEgXCJuaWNlXCIgMS8yLzUgw5cgMTDigb8gdmFsdWUgZm9yIHNjYWxlLWJhciBsZW5ndGhzLiAqL1xuZnVuY3Rpb24gbmljZUxlbmd0aCh4OiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoeCA8PSAwKSByZXR1cm4gMTtcbiAgY29uc3QgYmFzZSA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nMTAoeCkpKTtcbiAgY29uc3QgZiA9IHggLyBiYXNlO1xuICBjb25zdCBuaWNlID0gZiA8IDEuNSA/IDEgOiBmIDwgMy41ID8gMiA6IGYgPCA3LjUgPyA1IDogMTA7XG4gIHJldHVybiBuaWNlICogYmFzZTtcbn1cblxuLyoqIEZvcm1hdCBhIGxlbmd0aCBnaXZlbiBpbiBtaWNyb21ldHJlcywgcGlja2luZyB0aGUgdW5pdCB0aGF0IHN1aXRzIGl0cyBtYWduaXR1ZGUgKGppdC1zZXJ2aWNlXG4gKiAgbm9ybWFsaXNlcyB3aGF0ZXZlciB1bml0IEJpby1Gb3JtYXRzIHJlcG9ydHMgdG8gwrVtKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRVbSh1bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbSA9IChuOiBudW1iZXIpOiBzdHJpbmcgPT4gKG4gJSAxID09PSAwID8gYCR7bn1gIDogbi50b0ZpeGVkKDEpKTtcbiAgaWYgKHVtID49IDFlNikgcmV0dXJuIGAke3RyaW0odW0gLyAxZTYpfSBtYDtcbiAgaWYgKHVtID49IDFlNCkgcmV0dXJuIGAke3RyaW0odW0gLyAxZTQpfSBjbWA7XG4gIGlmICh1bSA+PSAxZTMpIHJldHVybiBgJHt0cmltKHVtIC8gMWUzKX0gbW1gO1xuICBpZiAodW0gPj0gMSkgcmV0dXJuIGAke3RyaW0odW0pfSDCtW1gO1xuICByZXR1cm4gYCR7dHJpbSh1bSAqIDEwMDApfSBubWA7XG59XG5cbi8qKlxuICogVGhlIHNsaWNlIG9mIHRoZSBuYXBhcmkgQ2FtZXJhIHRoZSBzY2FsZSBiYXIgcmVhZHMgKHpvb20gPSBDU1MgcHggcGVyIHdvcmxkL2ltYWdlIHBpeGVsKS5cbiAqXG4gKiBFeHBvcnRlZCBzbyB0aGUgM0Qgc3BhdGlhbCB2aWV3IGNhbiBzYXRpc2Z5IGl0IHdpdGggYSBzaGltOiBhbiBvcmJpdCBjYW1lcmEgaGFzIG5vIGB6b29tYCwgYnV0XG4gKiBweC1wZXItd29ybGQtdW5pdCBBVCBUSEUgUElWT1QgREVQVEggaXMgd2VsbCBkZWZpbmVkLCBhbmQgdGhhdCBpcyB3aGF0IGEgM0Qgc2NhbGUgYmFyIG1lYW5zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjYWxlQmFyQ2FtZXJhIHtcbiAgcmVhZG9ubHkgem9vbTogbnVtYmVyO1xuICByZWFkb25seSBjaGFuZ2VkOiB7IGNvbm5lY3QobGlzdGVuZXI6ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkIH07XG59XG5cbmV4cG9ydCBjbGFzcyBOYXBhcmlTY2FsZUJhciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFyOiBIVE1MRGl2RWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBsaW5lOiBIVE1MRGl2RWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBsYWJlbDogSFRNTFNwYW5FbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc2Nvbm5lY3RDYW1lcmE6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzaXplT2JzZXJ2ZXI/OiBSZXNpemVPYnNlcnZlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IEhUTUxFbGVtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FtZXJhOiBTY2FsZUJhckNhbWVyYSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1wcFg6IG51bWJlcixcbiAgKSB7XG4gICAgLy8gVGhlIGJhciBpcyBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgd2l0aGluIHRoZSBob3N0LCBzbyB0aGUgaG9zdCBtdXN0IGVzdGFibGlzaCBhIGNvbnRhaW5pbmdcbiAgICAvLyBibG9jayAodGhlIHBsb3QgaG9zdCBpcyBvZnRlbiBzdGF0aWNhbGx5IHBvc2l0aW9uZWQpLlxuICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKGhvc3QpLnBvc2l0aW9uID09PSAnc3RhdGljJykgaG9zdC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG5cbiAgICB0aGlzLmJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5iYXIuc3R5bGUsIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogJzEycHgnLFxuICAgICAgYm90dG9tOiAnMTJweCcsXG4gICAgICB6SW5kZXg6ICczMCcsXG4gICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICBjb2xvcjogJyNmZmYnLFxuICAgICAgZm9udDogJzExcHggc2Fucy1zZXJpZicsXG4gICAgICB0ZXh0U2hhZG93OiAnMCAwIDNweCAjMDAwJyxcbiAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG4gICAgfSBhcyBQYXJ0aWFsPENTU1N0eWxlRGVjbGFyYXRpb24+KTtcbiAgICB0aGlzLmxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHRoaXMubGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5saW5lLnN0eWxlLCB7XG4gICAgICBoZWlnaHQ6ICc0cHgnLFxuICAgICAgbWFyZ2luVG9wOiAnMnB4JyxcbiAgICAgIGJhY2tncm91bmQ6ICdyZ2JhKDI1NSwyNTUsMjU1LDAuOSknLFxuICAgICAgYm9yZGVyTGVmdDogJzFweCBzb2xpZCAjZmZmJyxcbiAgICAgIGJvcmRlclJpZ2h0OiAnMXB4IHNvbGlkICNmZmYnLFxuICAgICAgYm94U2hhZG93OiAnMCAwIDNweCAjMDAwJyxcbiAgICB9IGFzIFBhcnRpYWw8Q1NTU3R5bGVEZWNsYXJhdGlvbj4pO1xuICAgIHRoaXMuYmFyLmFwcGVuZENoaWxkKHRoaXMubGFiZWwpO1xuICAgIHRoaXMuYmFyLmFwcGVuZENoaWxkKHRoaXMubGluZSk7XG4gICAgdGhpcy5ob3N0LmFwcGVuZENoaWxkKHRoaXMuYmFyKTtcblxuICAgIHRoaXMuZGlzY29ubmVjdENhbWVyYSA9IHRoaXMuY2FtZXJhLmNoYW5nZWQuY29ubmVjdCgoKSA9PiB0aGlzLnVwZGF0ZSgpKTtcbiAgICBpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLnVwZGF0ZSgpKTtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmhvc3QpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgcHhQZXJJbWFnZVB4ID0gdGhpcy5jYW1lcmEuem9vbTsgLy8gQ1NTIHNjcmVlbiBweCBwZXIgaW1hZ2UgcGl4ZWxcbiAgICBpZiAoISh0aGlzLm1wcFggPiAwKSB8fCAhKHB4UGVySW1hZ2VQeCA+IDApKSB7XG4gICAgICB0aGlzLmJhci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1bVBlclNjcmVlblB4ID0gdGhpcy5tcHBYIC8gcHhQZXJJbWFnZVB4O1xuICAgIGNvbnN0IG5pY2VVbSA9IG5pY2VMZW5ndGgoMTIwICogdW1QZXJTY3JlZW5QeCk7IC8vIHRhcmdldCB+MTIwcHggYmFyXG4gICAgdGhpcy5iYXIuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIHRoaXMubGluZS5zdHlsZS53aWR0aCA9IGAke01hdGgucm91bmQobmljZVVtIC8gdW1QZXJTY3JlZW5QeCl9cHhgO1xuICAgIHRoaXMubGFiZWwudGV4dENvbnRlbnQgPSBmb3JtYXRVbShuaWNlVW0pO1xuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2Nvbm5lY3RDYW1lcmEoKTtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgaWYgKHRoaXMuYmFyLnBhcmVudE5vZGUpIHRoaXMuYmFyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5iYXIpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Cursor tooltip naming the observation under the pointer, for the spatial-omics
3
+ * views — the same overlay-in-the-host pattern as {@link NapariScaleBar}.
4
+ *
5
+ * A 34-entry legend cannot be read back from a dot: several classes get similar
6
+ * colours, and matching one to a swatch by eye is the job a tooltip removes. It
7
+ * shows what the cloud is CURRENTLY coloured by, so it always agrees with the
8
+ * legend beside it.
9
+ *
10
+ * Deliberately not PrimeNG's `pTooltip`: that binds to an element, and these
11
+ * points are pixels in a WebGPU canvas with no DOM of their own.
12
+ */
13
+ export class NapariSpatialTooltip {
14
+ /** Gap between the cursor and the box, so the box never sits under the arrow. */
15
+ static { this.OFFSET = 14; }
16
+ constructor(host) {
17
+ this.host = host;
18
+ // Absolutely positioned within the host, so the host must establish a
19
+ // containing block (the plot host is often statically positioned). Tested for
20
+ // what it must NOT be rather than for 'static': a computed position can also
21
+ // come back empty, and treating that as already-positioned would leave the box
22
+ // anchored to some ancestor instead.
23
+ const positioned = ['relative', 'absolute', 'fixed', 'sticky'];
24
+ if (!positioned.includes(getComputedStyle(host).position)) {
25
+ host.style.position = 'relative';
26
+ }
27
+ this.el = document.createElement('div');
28
+ Object.assign(this.el.style, {
29
+ position: 'absolute',
30
+ display: 'none',
31
+ // Above the canvas and the region overlay, below any dialog.
32
+ zIndex: '6',
33
+ // The pointer has to reach the canvas underneath: a tooltip that ate
34
+ // pointer events would kill orbiting the moment it appeared.
35
+ pointerEvents: 'none',
36
+ padding: '4px 8px',
37
+ borderRadius: '4px',
38
+ background: 'rgba(17, 17, 20, 0.88)',
39
+ color: '#fff',
40
+ font: '12px/1.35 system-ui, sans-serif',
41
+ whiteSpace: 'nowrap',
42
+ boxShadow: '0 2px 8px rgba(0, 0, 0, 0.35)',
43
+ maxWidth: '22rem',
44
+ overflow: 'hidden',
45
+ textOverflow: 'ellipsis',
46
+ });
47
+ this.primary = document.createElement('span');
48
+ Object.assign(this.primary.style, { display: 'block', fontWeight: '600' });
49
+ this.secondary = document.createElement('span');
50
+ Object.assign(this.secondary.style, {
51
+ display: 'block',
52
+ opacity: '0.7',
53
+ fontSize: '11px',
54
+ });
55
+ this.el.append(this.primary, this.secondary);
56
+ host.appendChild(this.el);
57
+ }
58
+ /**
59
+ * Show `lines` at a point given in HOST-relative pixels.
60
+ *
61
+ * Flips to the other side of the cursor near an edge rather than being clipped
62
+ * by the host — a tooltip half outside the plot is worse than one on the left.
63
+ */
64
+ show(lines, hostX, hostY) {
65
+ if (lines.length === 0) {
66
+ this.hide();
67
+ return;
68
+ }
69
+ this.primary.textContent = lines[0];
70
+ this.secondary.textContent = lines[1] ?? '';
71
+ this.secondary.style.display = lines[1] ? 'block' : 'none';
72
+ // Measured while visible: offsetWidth is 0 on a `display: none` element, so
73
+ // the flip below would always think the box fits.
74
+ this.el.style.display = 'block';
75
+ const gap = NapariSpatialTooltip.OFFSET;
76
+ const w = this.el.offsetWidth;
77
+ const h = this.el.offsetHeight;
78
+ const hostW = this.host.clientWidth;
79
+ const hostH = this.host.clientHeight;
80
+ const left = hostX + gap + w > hostW ? Math.max(0, hostX - gap - w) : hostX + gap;
81
+ const top = hostY + gap + h > hostH ? Math.max(0, hostY - gap - h) : hostY + gap;
82
+ this.el.style.left = `${Math.round(left)}px`;
83
+ this.el.style.top = `${Math.round(top)}px`;
84
+ }
85
+ hide() {
86
+ this.el.style.display = 'none';
87
+ }
88
+ /** True while the box is on screen — for tests, and to skip redundant hides. */
89
+ get visible() {
90
+ return this.el.style.display !== 'none';
91
+ }
92
+ dispose() {
93
+ this.el.remove();
94
+ }
95
+ }
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNwYXRpYWwtdG9vbHRpcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktc3BhdGlhbC10b29sdGlwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxPQUFPLG9CQUFvQjtJQUkvQixpRkFBaUY7YUFDekQsV0FBTSxHQUFHLEVBQUUsQ0FBQztJQUVwQyxZQUE2QixJQUFpQjtRQUFqQixTQUFJLEdBQUosSUFBSSxDQUFhO1FBQzVDLHNFQUFzRTtRQUN0RSw4RUFBOEU7UUFDOUUsNkVBQTZFO1FBQzdFLCtFQUErRTtRQUMvRSxxQ0FBcUM7UUFDckMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztRQUNuQyxDQUFDO1FBRUQsSUFBSSxDQUFDLEVBQUUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUU7WUFDM0IsUUFBUSxFQUFFLFVBQVU7WUFDcEIsT0FBTyxFQUFFLE1BQU07WUFDZiw2REFBNkQ7WUFDN0QsTUFBTSxFQUFFLEdBQUc7WUFDWCxxRUFBcUU7WUFDckUsNkRBQTZEO1lBQzdELGFBQWEsRUFBRSxNQUFNO1lBQ3JCLE9BQU8sRUFBRSxTQUFTO1lBQ2xCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFVBQVUsRUFBRSx3QkFBd0I7WUFDcEMsS0FBSyxFQUFFLE1BQU07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QUM3QyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQUk7UUFDRixJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxnRkFBZ0Y7SUFDaEYsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEtBQUssTUFBTSxDQUFDO0lBQzFDLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJzb3IgdG9vbHRpcCBuYW1pbmcgdGhlIG9ic2VydmF0aW9uIHVuZGVyIHRoZSBwb2ludGVyLCBmb3IgdGhlIHNwYXRpYWwtb21pY3NcbiAqIHZpZXdzIOKAlCB0aGUgc2FtZSBvdmVybGF5LWluLXRoZS1ob3N0IHBhdHRlcm4gYXMge0BsaW5rIE5hcGFyaVNjYWxlQmFyfS5cbiAqXG4gKiBBIDM0LWVudHJ5IGxlZ2VuZCBjYW5ub3QgYmUgcmVhZCBiYWNrIGZyb20gYSBkb3Q6IHNldmVyYWwgY2xhc3NlcyBnZXQgc2ltaWxhclxuICogY29sb3VycywgYW5kIG1hdGNoaW5nIG9uZSB0byBhIHN3YXRjaCBieSBleWUgaXMgdGhlIGpvYiBhIHRvb2x0aXAgcmVtb3Zlcy4gSXRcbiAqIHNob3dzIHdoYXQgdGhlIGNsb3VkIGlzIENVUlJFTlRMWSBjb2xvdXJlZCBieSwgc28gaXQgYWx3YXlzIGFncmVlcyB3aXRoIHRoZVxuICogbGVnZW5kIGJlc2lkZSBpdC5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgbm90IFByaW1lTkcncyBgcFRvb2x0aXBgOiB0aGF0IGJpbmRzIHRvIGFuIGVsZW1lbnQsIGFuZCB0aGVzZVxuICogcG9pbnRzIGFyZSBwaXhlbHMgaW4gYSBXZWJHUFUgY2FudmFzIHdpdGggbm8gRE9NIG9mIHRoZWlyIG93bi5cbiAqL1xuZXhwb3J0IGNsYXNzIE5hcGFyaVNwYXRpYWxUb29sdGlwIHtcbiAgcHJpdmF0ZSByZWFkb25seSBlbDogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJpbWFyeTogSFRNTFNwYW5FbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHNlY29uZGFyeTogSFRNTFNwYW5FbGVtZW50O1xuICAvKiogR2FwIGJldHdlZW4gdGhlIGN1cnNvciBhbmQgdGhlIGJveCwgc28gdGhlIGJveCBuZXZlciBzaXRzIHVuZGVyIHRoZSBhcnJvdy4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgT0ZGU0VUID0gMTQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBob3N0OiBIVE1MRWxlbWVudCkge1xuICAgIC8vIEFic29sdXRlbHkgcG9zaXRpb25lZCB3aXRoaW4gdGhlIGhvc3QsIHNvIHRoZSBob3N0IG11c3QgZXN0YWJsaXNoIGFcbiAgICAvLyBjb250YWluaW5nIGJsb2NrICh0aGUgcGxvdCBob3N0IGlzIG9mdGVuIHN0YXRpY2FsbHkgcG9zaXRpb25lZCkuIFRlc3RlZCBmb3JcbiAgICAvLyB3aGF0IGl0IG11c3QgTk9UIGJlIHJhdGhlciB0aGFuIGZvciAnc3RhdGljJzogYSBjb21wdXRlZCBwb3NpdGlvbiBjYW4gYWxzb1xuICAgIC8vIGNvbWUgYmFjayBlbXB0eSwgYW5kIHRyZWF0aW5nIHRoYXQgYXMgYWxyZWFkeS1wb3NpdGlvbmVkIHdvdWxkIGxlYXZlIHRoZSBib3hcbiAgICAvLyBhbmNob3JlZCB0byBzb21lIGFuY2VzdG9yIGluc3RlYWQuXG4gICAgY29uc3QgcG9zaXRpb25lZCA9IFsncmVsYXRpdmUnLCAnYWJzb2x1dGUnLCAnZml4ZWQnLCAnc3RpY2t5J107XG4gICAgaWYgKCFwb3NpdGlvbmVkLmluY2x1ZGVzKGdldENvbXB1dGVkU3R5bGUoaG9zdCkucG9zaXRpb24pKSB7XG4gICAgICBob3N0LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB9XG5cbiAgICB0aGlzLmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLmVsLnN0eWxlLCB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGRpc3BsYXk6ICdub25lJyxcbiAgICAgIC8vIEFib3ZlIHRoZSBjYW52YXMgYW5kIHRoZSByZWdpb24gb3ZlcmxheSwgYmVsb3cgYW55IGRpYWxvZy5cbiAgICAgIHpJbmRleDogJzYnLFxuICAgICAgLy8gVGhlIHBvaW50ZXIgaGFzIHRvIHJlYWNoIHRoZSBjYW52YXMgdW5kZXJuZWF0aDogYSB0b29sdGlwIHRoYXQgYXRlXG4gICAgICAvLyBwb2ludGVyIGV2ZW50cyB3b3VsZCBraWxsIG9yYml0aW5nIHRoZSBtb21lbnQgaXQgYXBwZWFyZWQuXG4gICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICBwYWRkaW5nOiAnNHB4IDhweCcsXG4gICAgICBib3JkZXJSYWRpdXM6ICc0cHgnLFxuICAgICAgYmFja2dyb3VuZDogJ3JnYmEoMTcsIDE3LCAyMCwgMC44OCknLFxuICAgICAgY29sb3I6ICcjZmZmJyxcbiAgICAgIGZvbnQ6ICcxMnB4LzEuMzUgc3lzdGVtLXVpLCBzYW5zLXNlcmlmJyxcbiAgICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnLFxuICAgICAgYm94U2hhZG93OiAnMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zNSknLFxuICAgICAgbWF4V2lkdGg6ICcyMnJlbScsXG4gICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICB0ZXh0T3ZlcmZsb3c6ICdlbGxpcHNpcycsXG4gICAgfSBhcyBQYXJ0aWFsPENTU1N0eWxlRGVjbGFyYXRpb24+KTtcblxuICAgIHRoaXMucHJpbWFyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMucHJpbWFyeS5zdHlsZSwgeyBkaXNwbGF5OiAnYmxvY2snLCBmb250V2VpZ2h0OiAnNjAwJyB9KTtcbiAgICB0aGlzLnNlY29uZGFyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuc2Vjb25kYXJ5LnN0eWxlLCB7XG4gICAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgICAgb3BhY2l0eTogJzAuNycsXG4gICAgICBmb250U2l6ZTogJzExcHgnLFxuICAgIH0gYXMgUGFydGlhbDxDU1NTdHlsZURlY2xhcmF0aW9uPik7XG5cbiAgICB0aGlzLmVsLmFwcGVuZCh0aGlzLnByaW1hcnksIHRoaXMuc2Vjb25kYXJ5KTtcbiAgICBob3N0LmFwcGVuZENoaWxkKHRoaXMuZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgYGxpbmVzYCBhdCBhIHBvaW50IGdpdmVuIGluIEhPU1QtcmVsYXRpdmUgcGl4ZWxzLlxuICAgKlxuICAgKiBGbGlwcyB0byB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgY3Vyc29yIG5lYXIgYW4gZWRnZSByYXRoZXIgdGhhbiBiZWluZyBjbGlwcGVkXG4gICAqIGJ5IHRoZSBob3N0IOKAlCBhIHRvb2x0aXAgaGFsZiBvdXRzaWRlIHRoZSBwbG90IGlzIHdvcnNlIHRoYW4gb25lIG9uIHRoZSBsZWZ0LlxuICAgKi9cbiAgc2hvdyhsaW5lczogcmVhZG9ubHkgc3RyaW5nW10sIGhvc3RYOiBudW1iZXIsIGhvc3RZOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAobGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wcmltYXJ5LnRleHRDb250ZW50ID0gbGluZXNbMF07XG4gICAgdGhpcy5zZWNvbmRhcnkudGV4dENvbnRlbnQgPSBsaW5lc1sxXSA/PyAnJztcbiAgICB0aGlzLnNlY29uZGFyeS5zdHlsZS5kaXNwbGF5ID0gbGluZXNbMV0gPyAnYmxvY2snIDogJ25vbmUnO1xuICAgIC8vIE1lYXN1cmVkIHdoaWxlIHZpc2libGU6IG9mZnNldFdpZHRoIGlzIDAgb24gYSBgZGlzcGxheTogbm9uZWAgZWxlbWVudCwgc29cbiAgICAvLyB0aGUgZmxpcCBiZWxvdyB3b3VsZCBhbHdheXMgdGhpbmsgdGhlIGJveCBmaXRzLlxuICAgIHRoaXMuZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICBjb25zdCBnYXAgPSBOYXBhcmlTcGF0aWFsVG9vbHRpcC5PRkZTRVQ7XG4gICAgY29uc3QgdyA9IHRoaXMuZWwub2Zmc2V0V2lkdGg7XG4gICAgY29uc3QgaCA9IHRoaXMuZWwub2Zmc2V0SGVpZ2h0O1xuICAgIGNvbnN0IGhvc3RXID0gdGhpcy5ob3N0LmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IGhvc3RIID0gdGhpcy5ob3N0LmNsaWVudEhlaWdodDtcbiAgICBjb25zdCBsZWZ0ID0gaG9zdFggKyBnYXAgKyB3ID4gaG9zdFcgPyBNYXRoLm1heCgwLCBob3N0WCAtIGdhcCAtIHcpIDogaG9zdFggKyBnYXA7XG4gICAgY29uc3QgdG9wID0gaG9zdFkgKyBnYXAgKyBoID4gaG9zdEggPyBNYXRoLm1heCgwLCBob3N0WSAtIGdhcCAtIGgpIDogaG9zdFkgKyBnYXA7XG4gICAgdGhpcy5lbC5zdHlsZS5sZWZ0ID0gYCR7TWF0aC5yb3VuZChsZWZ0KX1weGA7XG4gICAgdGhpcy5lbC5zdHlsZS50b3AgPSBgJHtNYXRoLnJvdW5kKHRvcCl9cHhgO1xuICB9XG5cbiAgaGlkZSgpOiB2b2lkIHtcbiAgICB0aGlzLmVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGlsZSB0aGUgYm94IGlzIG9uIHNjcmVlbiDigJQgZm9yIHRlc3RzLCBhbmQgdG8gc2tpcCByZWR1bmRhbnQgaGlkZXMuICovXG4gIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVsLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJztcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5lbC5yZW1vdmUoKTtcbiAgfVxufVxuIl19