@jax-data-science/sci-image-visualizer 0.7.0 → 0.8.1
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.
- package/esm2022/lib/contracts/display-types.mjs +1 -1
- package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +73 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +418 -29
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +49 -6
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +8 -1
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +7 -1
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +12 -1
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +2 -1
- package/esm2022/lib/routing-visualizer.service.mjs +5 -1
- package/esm2022/lib/spatial/spatial-tiles.mjs +144 -1
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +198 -9
- package/esm2022/lib/toolbar/toolbar.component.mjs +11 -3
- package/esm2022/lib/visualizer.component.mjs +58 -4
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +964 -39
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/lib/contracts/display-types.d.ts +4 -2
- package/lib/contracts/plot-type-contribution.contract.d.ts +9 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +12 -1
- package/lib/contracts/spatial-dataset.contract.d.ts +30 -0
- package/lib/contracts/visualizer.contract.d.ts +7 -1
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +20 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +76 -1
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +7 -0
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +3 -1
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +2 -1
- package/lib/spatial/spatial-tiles.d.ts +38 -1
- package/lib/spatial-controls/spatial-controls.component.d.ts +54 -0
- package/lib/toolbar/toolbar.component.d.ts +5 -1
- package/lib/visualizer.component.d.ts +10 -1
- package/package.json +1 -1
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* "Transcripts reloading…" at the bottom of the canvas while a layer's data is in flight: one
|
|
3
|
+
* line naming every layer still loading, on a semi-opaque backing so it reads over any tissue.
|
|
4
|
+
*
|
|
5
|
+
* Shown only once something has been loading for {@link SHOW_AFTER_MS}, so a redraw served from
|
|
6
|
+
* cache does not flash it.
|
|
7
|
+
*/
|
|
8
|
+
export const SHOW_AFTER_MS = 150;
|
|
9
|
+
export class NapariLoadingBadge {
|
|
10
|
+
constructor(host) {
|
|
11
|
+
this.host = host;
|
|
12
|
+
this.names = [];
|
|
13
|
+
this.timer = null;
|
|
14
|
+
if (getComputedStyle(host).position === 'static')
|
|
15
|
+
host.style.position = 'relative';
|
|
16
|
+
this.el = document.createElement('div');
|
|
17
|
+
this.el.className = 'napari-loading-badge';
|
|
18
|
+
this.el.setAttribute('role', 'status');
|
|
19
|
+
this.el.setAttribute('aria-live', 'polite');
|
|
20
|
+
Object.assign(this.el.style, {
|
|
21
|
+
position: 'absolute',
|
|
22
|
+
left: '50%',
|
|
23
|
+
bottom: '12px',
|
|
24
|
+
transform: 'translateX(-50%)',
|
|
25
|
+
padding: '4px 12px',
|
|
26
|
+
borderRadius: '12px',
|
|
27
|
+
background: 'rgba(0, 0, 0, 0.6)',
|
|
28
|
+
color: '#fff',
|
|
29
|
+
font: '12px/1.4 system-ui, sans-serif',
|
|
30
|
+
whiteSpace: 'nowrap',
|
|
31
|
+
pointerEvents: 'none',
|
|
32
|
+
zIndex: '5',
|
|
33
|
+
display: 'none',
|
|
34
|
+
});
|
|
35
|
+
host.appendChild(this.el);
|
|
36
|
+
}
|
|
37
|
+
/** The layers loading now; empty hides the badge. */
|
|
38
|
+
set(names) {
|
|
39
|
+
this.names = [...new Set(names)];
|
|
40
|
+
if (!this.names.length) {
|
|
41
|
+
if (this.timer)
|
|
42
|
+
clearTimeout(this.timer);
|
|
43
|
+
this.timer = null;
|
|
44
|
+
this.el.style.display = 'none';
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
this.el.textContent = `${listOf(this.names)} reloading…`;
|
|
48
|
+
if (this.el.style.display === 'block' || this.timer)
|
|
49
|
+
return;
|
|
50
|
+
this.timer = setTimeout(() => {
|
|
51
|
+
this.timer = null;
|
|
52
|
+
if (this.names.length)
|
|
53
|
+
this.el.style.display = 'block';
|
|
54
|
+
}, SHOW_AFTER_MS);
|
|
55
|
+
}
|
|
56
|
+
/** The text currently set (shown or about to be). */
|
|
57
|
+
get text() {
|
|
58
|
+
return this.names.length ? this.el.textContent ?? '' : '';
|
|
59
|
+
}
|
|
60
|
+
destroy() {
|
|
61
|
+
if (this.timer)
|
|
62
|
+
clearTimeout(this.timer);
|
|
63
|
+
this.el.remove();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** "A", "A and B", "A, B and C" — the first capitalised, the rest as they are. */
|
|
67
|
+
function listOf(names) {
|
|
68
|
+
const [first, ...rest] = names;
|
|
69
|
+
const lower = rest.map((n) => n.charAt(0).toLowerCase() + n.slice(1));
|
|
70
|
+
const all = [first, ...lower];
|
|
71
|
+
return all.length === 1 ? all[0] : `${all.slice(0, -1).join(', ')} and ${all[all.length - 1]}`;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLWxvYWRpbmctYmFkZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLWxvYWRpbmctYmFkZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQztBQUVqQyxNQUFNLE9BQU8sa0JBQWtCO0lBSzdCLFlBQTZCLElBQWlCO1FBQWpCLFNBQUksR0FBSixJQUFJLENBQWE7UUFIdEMsVUFBSyxHQUFhLEVBQUUsQ0FBQztRQUNyQixVQUFLLEdBQXlDLElBQUksQ0FBQztRQUd6RCxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFRO1lBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO1FBQ25GLElBQUksQ0FBQyxFQUFFLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQztRQUMzQyxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUU7WUFDM0IsUUFBUSxFQUFFLFVBQVU7WUFDcEIsSUFBSSxFQUFFLEtBQUs7WUFDWCxNQUFNLEVBQUUsTUFBTTtZQUNkLFNBQVMsRUFBRSxrQkFBa0I7WUFDN0IsT0FBTyxFQUFFLFVBQVU7WUFDbkIsWUFBWSxFQUFFLE1BQU07WUFDcEIsVUFBVSxFQUFFLG9CQUFvQjtZQUNoQyxLQUFLLEVBQUUsTUFBTTtZQUNiLElBQUksRUFBRSxnQ0FBZ0M7WUFDdEMsVUFBVSxFQUFFLFFBQVE7WUFDcEIsYUFBYSxFQUFFLE1BQU07WUFDckIsTUFBTSxFQUFFLEdBQUc7WUFDWCxPQUFPLEVBQUUsTUFBTTtTQUN1QixDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxHQUFHLENBQUMsS0FBd0I7UUFDMUIsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN2QixJQUFJLElBQUksQ0FBQyxLQUFLO2dCQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDbEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUMvQixPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQ3pELElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU87UUFDNUQsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO2dCQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDekQsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxxREFBcUQ7SUFDckQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLElBQUksQ0FBQyxLQUFLO1lBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQUVELGtGQUFrRjtBQUNsRixTQUFTLE1BQU0sQ0FBQyxLQUFlO0lBQzdCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQztJQUM5QixPQUFPLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNqRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBcIlRyYW5zY3JpcHRzIHJlbG9hZGluZ+KAplwiIGF0IHRoZSBib3R0b20gb2YgdGhlIGNhbnZhcyB3aGlsZSBhIGxheWVyJ3MgZGF0YSBpcyBpbiBmbGlnaHQ6IG9uZVxuICogbGluZSBuYW1pbmcgZXZlcnkgbGF5ZXIgc3RpbGwgbG9hZGluZywgb24gYSBzZW1pLW9wYXF1ZSBiYWNraW5nIHNvIGl0IHJlYWRzIG92ZXIgYW55IHRpc3N1ZS5cbiAqXG4gKiBTaG93biBvbmx5IG9uY2Ugc29tZXRoaW5nIGhhcyBiZWVuIGxvYWRpbmcgZm9yIHtAbGluayBTSE9XX0FGVEVSX01TfSwgc28gYSByZWRyYXcgc2VydmVkIGZyb21cbiAqIGNhY2hlIGRvZXMgbm90IGZsYXNoIGl0LlxuICovXG5leHBvcnQgY29uc3QgU0hPV19BRlRFUl9NUyA9IDE1MDtcblxuZXhwb3J0IGNsYXNzIE5hcGFyaUxvYWRpbmdCYWRnZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWw6IEhUTUxEaXZFbGVtZW50O1xuICBwcml2YXRlIG5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgaG9zdDogSFRNTEVsZW1lbnQpIHtcbiAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShob3N0KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpIGhvc3Quc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgIHRoaXMuZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmVsLmNsYXNzTmFtZSA9ICduYXBhcmktbG9hZGluZy1iYWRnZSc7XG4gICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnc3RhdHVzJyk7XG4gICAgdGhpcy5lbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsICdwb2xpdGUnKTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMuZWwuc3R5bGUsIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogJzUwJScsXG4gICAgICBib3R0b206ICcxMnB4JyxcbiAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTUwJSknLFxuICAgICAgcGFkZGluZzogJzRweCAxMnB4JyxcbiAgICAgIGJvcmRlclJhZGl1czogJzEycHgnLFxuICAgICAgYmFja2dyb3VuZDogJ3JnYmEoMCwgMCwgMCwgMC42KScsXG4gICAgICBjb2xvcjogJyNmZmYnLFxuICAgICAgZm9udDogJzEycHgvMS40IHN5c3RlbS11aSwgc2Fucy1zZXJpZicsXG4gICAgICB3aGl0ZVNwYWNlOiAnbm93cmFwJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgIHpJbmRleDogJzUnLFxuICAgICAgZGlzcGxheTogJ25vbmUnLFxuICAgIH0gc2F0aXNmaWVzIFBhcnRpYWw8Q1NTU3R5bGVEZWNsYXJhdGlvbj4pO1xuICAgIGhvc3QuYXBwZW5kQ2hpbGQodGhpcy5lbCk7XG4gIH1cblxuICAvKiogVGhlIGxheWVycyBsb2FkaW5nIG5vdzsgZW1wdHkgaGlkZXMgdGhlIGJhZGdlLiAqL1xuICBzZXQobmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5uYW1lcyA9IFsuLi5uZXcgU2V0KG5hbWVzKV07XG4gICAgaWYgKCF0aGlzLm5hbWVzLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMudGltZXIpIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcbiAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgdGhpcy5lbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVsLnRleHRDb250ZW50ID0gYCR7bGlzdE9mKHRoaXMubmFtZXMpfSByZWxvYWRpbmfigKZgO1xuICAgIGlmICh0aGlzLmVsLnN0eWxlLmRpc3BsYXkgPT09ICdibG9jaycgfHwgdGhpcy50aW1lcikgcmV0dXJuO1xuICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgaWYgKHRoaXMubmFtZXMubGVuZ3RoKSB0aGlzLmVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIH0sIFNIT1dfQUZURVJfTVMpO1xuICB9XG5cbiAgLyoqIFRoZSB0ZXh0IGN1cnJlbnRseSBzZXQgKHNob3duIG9yIGFib3V0IHRvIGJlKS4gKi9cbiAgZ2V0IHRleHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lcy5sZW5ndGggPyB0aGlzLmVsLnRleHRDb250ZW50ID8/ICcnIDogJyc7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7XG4gICAgdGhpcy5lbC5yZW1vdmUoKTtcbiAgfVxufVxuXG4vKiogXCJBXCIsIFwiQSBhbmQgQlwiLCBcIkEsIEIgYW5kIENcIiDigJQgdGhlIGZpcnN0IGNhcGl0YWxpc2VkLCB0aGUgcmVzdCBhcyB0aGV5IGFyZS4gKi9cbmZ1bmN0aW9uIGxpc3RPZihuYW1lczogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0gbmFtZXM7XG4gIGNvbnN0IGxvd2VyID0gcmVzdC5tYXAoKG4pID0+IG4uY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBuLnNsaWNlKDEpKTtcbiAgY29uc3QgYWxsID0gW2ZpcnN0LCAuLi5sb3dlcl07XG4gIHJldHVybiBhbGwubGVuZ3RoID09PSAxID8gYWxsWzBdIDogYCR7YWxsLnNsaWNlKDAsIC0xKS5qb2luKCcsICcpfSBhbmQgJHthbGxbYWxsLmxlbmd0aCAtIDFdfWA7XG59XG4iXX0=
|