igv 2.13.3 → 2.13.5
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/README.md +10 -10
- package/dist/igv.esm.js +356 -297
- package/dist/igv.esm.min.js +8 -9
- package/dist/igv.esm.min.js.map +1 -1
- package/dist/igv.js +9629 -17442
- package/dist/igv.min.js +5 -7
- package/dist/igv.min.js.map +1 -1
- package/package.json +1 -1
package/dist/igv.esm.js
CHANGED
|
@@ -21237,6 +21237,8 @@ const FRAME_HEIGHT = 25;
|
|
|
21237
21237
|
const FRAME_BORDER = 5;
|
|
21238
21238
|
const BP_PER_PIXEL_THRESHOLD = 1 / 10;
|
|
21239
21239
|
|
|
21240
|
+
const bppFeatureFetchThreshold = 10;
|
|
21241
|
+
|
|
21240
21242
|
class SequenceTrack {
|
|
21241
21243
|
|
|
21242
21244
|
constructor(config, browser) {
|
|
@@ -21289,7 +21291,6 @@ class SequenceTrack {
|
|
|
21289
21291
|
]
|
|
21290
21292
|
}
|
|
21291
21293
|
|
|
21292
|
-
|
|
21293
21294
|
contextMenuItemList(clickState) {
|
|
21294
21295
|
const viewport = clickState.viewport;
|
|
21295
21296
|
if (viewport.referenceFrame.bpPerPixel <= 1) {
|
|
@@ -21340,7 +21341,6 @@ class SequenceTrack {
|
|
|
21340
21341
|
}
|
|
21341
21342
|
}
|
|
21342
21343
|
|
|
21343
|
-
|
|
21344
21344
|
translateSequence(seq) {
|
|
21345
21345
|
|
|
21346
21346
|
const threeFrame = [[], [], []];
|
|
@@ -21367,9 +21367,11 @@ class SequenceTrack {
|
|
|
21367
21367
|
}
|
|
21368
21368
|
|
|
21369
21369
|
async getFeatures(chr, start, end, bpPerPixel) {
|
|
21370
|
+
|
|
21370
21371
|
start = Math.floor(start);
|
|
21371
21372
|
end = Math.floor(end);
|
|
21372
|
-
|
|
21373
|
+
|
|
21374
|
+
if (bpPerPixel && bpPerPixel > bppFeatureFetchThreshold) {
|
|
21373
21375
|
return null
|
|
21374
21376
|
} else {
|
|
21375
21377
|
const sequence = await this.browser.genome.sequence.getSequence(chr, start, end);
|
|
@@ -21388,7 +21390,6 @@ class SequenceTrack {
|
|
|
21388
21390
|
|
|
21389
21391
|
let sequence = options.features.sequence;
|
|
21390
21392
|
if(!sequence) {
|
|
21391
|
-
console.error("No sequence");
|
|
21392
21393
|
return
|
|
21393
21394
|
}
|
|
21394
21395
|
|
|
@@ -21555,17 +21556,9 @@ class Viewport {
|
|
|
21555
21556
|
this.alert = new AlertDialog(this.$viewport.get(0));
|
|
21556
21557
|
}
|
|
21557
21558
|
|
|
21558
|
-
this
|
|
21559
|
-
this.$viewport.
|
|
21560
|
-
|
|
21561
|
-
this.$content.height(this.$viewport.height());
|
|
21562
|
-
this.contentDiv = this.$content.get(0);
|
|
21559
|
+
this.contentTop = 0;
|
|
21560
|
+
this.contentHeight = this.$viewport.height();
|
|
21563
21561
|
|
|
21564
|
-
// this.$canvas = $('<canvas>')
|
|
21565
|
-
// this.$content.append(this.$canvas)
|
|
21566
|
-
//
|
|
21567
|
-
// this.canvas = this.$canvas.get(0)
|
|
21568
|
-
// this.ctx = this.canvas.getContext("2d")
|
|
21569
21562
|
|
|
21570
21563
|
this.$viewport.width(width);
|
|
21571
21564
|
|
|
@@ -21581,7 +21574,8 @@ class Viewport {
|
|
|
21581
21574
|
if (!this.messageDiv) {
|
|
21582
21575
|
this.messageDiv = document.createElement('div');
|
|
21583
21576
|
this.messageDiv.className = 'igv-viewport-message';
|
|
21584
|
-
this.contentDiv.append(this.messageDiv)
|
|
21577
|
+
//this.contentDiv.append(this.messageDiv)
|
|
21578
|
+
this.$viewport.append($$1(this.messageDiv));
|
|
21585
21579
|
}
|
|
21586
21580
|
this.messageDiv.textContent = message;
|
|
21587
21581
|
this.messageDiv.style.display = 'inline-block';
|
|
@@ -21610,15 +21604,15 @@ class Viewport {
|
|
|
21610
21604
|
|
|
21611
21605
|
setTop(contentTop) {
|
|
21612
21606
|
|
|
21613
|
-
|
|
21614
|
-
|
|
21615
|
-
const viewBottom = viewTop + viewportHeight;
|
|
21616
|
-
|
|
21617
|
-
this.$content.css('top', `${contentTop}px`);
|
|
21607
|
+
this.contentTop = contentTop;
|
|
21608
|
+
this.$viewport.height();
|
|
21618
21609
|
|
|
21619
|
-
|
|
21620
|
-
|
|
21621
|
-
|
|
21610
|
+
//this.$content.css('top', `${contentTop}px`)
|
|
21611
|
+
//
|
|
21612
|
+
// if (undefined === this.canvasVerticalRange || this.canvasVerticalRange.bottom < viewBottom || this.canvasVerticalRange.top > viewTop) {
|
|
21613
|
+
// console.log("Repaint " + this.canvasVerticalRange)
|
|
21614
|
+
// this.repaint()
|
|
21615
|
+
// }
|
|
21622
21616
|
|
|
21623
21617
|
}
|
|
21624
21618
|
|
|
@@ -21646,7 +21640,8 @@ class Viewport {
|
|
|
21646
21640
|
} else if (typeof track.computePixelHeight === 'function') {
|
|
21647
21641
|
if (features && features.length > 0) {
|
|
21648
21642
|
let requiredContentHeight = track.computePixelHeight(features);
|
|
21649
|
-
let currentContentHeight = this.$content.height()
|
|
21643
|
+
//let currentContentHeight = this.$content.height()
|
|
21644
|
+
let currentContentHeight = this.contentHeight;
|
|
21650
21645
|
if (requiredContentHeight !== currentContentHeight) {
|
|
21651
21646
|
this.setContentHeight(requiredContentHeight);
|
|
21652
21647
|
}
|
|
@@ -21655,14 +21650,12 @@ class Viewport {
|
|
|
21655
21650
|
}
|
|
21656
21651
|
|
|
21657
21652
|
getContentHeight() {
|
|
21658
|
-
return this.$content.height()
|
|
21653
|
+
//return this.$content.height()
|
|
21654
|
+
return this.contentHeight
|
|
21659
21655
|
}
|
|
21660
21656
|
|
|
21661
21657
|
setContentHeight(contentHeight) {
|
|
21662
|
-
|
|
21663
|
-
// Maximum height of a canvas is ~32,000 pixels on Chrome, possibly smaller on other platforms
|
|
21664
|
-
contentHeight = Math.min(contentHeight, 32000);
|
|
21665
|
-
this.$content.height(contentHeight);
|
|
21658
|
+
this.contentHeight = contentHeight;
|
|
21666
21659
|
}
|
|
21667
21660
|
|
|
21668
21661
|
isLoading() {
|
|
@@ -21686,7 +21679,7 @@ class Viewport {
|
|
|
21686
21679
|
}
|
|
21687
21680
|
|
|
21688
21681
|
getContentTop() {
|
|
21689
|
-
return this.
|
|
21682
|
+
return this.contentTop
|
|
21690
21683
|
}
|
|
21691
21684
|
|
|
21692
21685
|
containsPosition(chr, position) {
|
|
@@ -23852,7 +23845,7 @@ const Cytoband = function (start, end, name, typestain) {
|
|
|
23852
23845
|
}
|
|
23853
23846
|
};
|
|
23854
23847
|
|
|
23855
|
-
const _version = "2.13.
|
|
23848
|
+
const _version = "2.13.5";
|
|
23856
23849
|
function version() {
|
|
23857
23850
|
return _version
|
|
23858
23851
|
}
|
|
@@ -24358,7 +24351,7 @@ class TrackViewport extends Viewport {
|
|
|
24358
24351
|
|
|
24359
24352
|
const track = this.trackView.track;
|
|
24360
24353
|
if ('sequence' !== track.type) {
|
|
24361
|
-
this.$zoomInNotice = this.createZoomInNotice(this.$
|
|
24354
|
+
this.$zoomInNotice = this.createZoomInNotice(this.$viewport);
|
|
24362
24355
|
}
|
|
24363
24356
|
|
|
24364
24357
|
if (track.name && "sequence" !== track.id) {
|
|
@@ -24418,7 +24411,7 @@ class TrackViewport extends Viewport {
|
|
|
24418
24411
|
}
|
|
24419
24412
|
};
|
|
24420
24413
|
|
|
24421
|
-
if (this.trackView.track && "sequence" === this.trackView.track.type && this.referenceFrame.bpPerPixel >
|
|
24414
|
+
if (this.trackView.track && "sequence" === this.trackView.track.type && this.referenceFrame.bpPerPixel > bppFeatureFetchThreshold) {
|
|
24422
24415
|
$$1(this.canvas).remove();
|
|
24423
24416
|
this.canvas = undefined;
|
|
24424
24417
|
//this.featureCache = undefined
|
|
@@ -24469,6 +24462,34 @@ class TrackViewport extends Viewport {
|
|
|
24469
24462
|
}
|
|
24470
24463
|
}
|
|
24471
24464
|
|
|
24465
|
+
/**
|
|
24466
|
+
* Set the content top of the current view. This is triggered by scrolling. If the current canvas extent is not
|
|
24467
|
+
* sufficient to cover the new vertical range repaint.
|
|
24468
|
+
*
|
|
24469
|
+
* @param contentTop - the "top" property of the virtual content div, 0 unless track is scrolled vertically
|
|
24470
|
+
*
|
|
24471
|
+
*
|
|
24472
|
+
*/
|
|
24473
|
+
setTop(contentTop) {
|
|
24474
|
+
super.setTop(contentTop);
|
|
24475
|
+
|
|
24476
|
+
if (!this.canvas) {
|
|
24477
|
+
this.repaint();
|
|
24478
|
+
} else {
|
|
24479
|
+
// See if currently painted canvas covers the vertical range of the viewport. If not repaint
|
|
24480
|
+
const h = this.$viewport.height();
|
|
24481
|
+
const vt = contentTop + this.canvas._data.canvasTop;
|
|
24482
|
+
const vb = contentTop + this.canvas._data.canvasBottom;
|
|
24483
|
+
if (vt > 0 || vb < h) {
|
|
24484
|
+
this.repaint();
|
|
24485
|
+
}
|
|
24486
|
+
}
|
|
24487
|
+
|
|
24488
|
+
// Now offset backing canvas to align with the contentTop visual offset.
|
|
24489
|
+
let offset = contentTop + this.canvas._data.canvasTop;
|
|
24490
|
+
this.canvas.style.top = `${offset}px`;
|
|
24491
|
+
}
|
|
24492
|
+
|
|
24472
24493
|
async loadFeatures() {
|
|
24473
24494
|
|
|
24474
24495
|
const referenceFrame = this.referenceFrame;
|
|
@@ -24476,7 +24497,7 @@ class TrackViewport extends Viewport {
|
|
|
24476
24497
|
|
|
24477
24498
|
// Expand the requested range so we can pan a bit without reloading. But not beyond chromosome bounds
|
|
24478
24499
|
const chrLength = this.browser.genome.getChromosome(chr).bpLength;
|
|
24479
|
-
const pixelWidth = this.$
|
|
24500
|
+
const pixelWidth = this.$viewport.width();// * 3;
|
|
24480
24501
|
const bpWidth = pixelWidth * referenceFrame.bpPerPixel;
|
|
24481
24502
|
const bpStart = Math.floor(Math.max(0, referenceFrame.start - bpWidth));
|
|
24482
24503
|
const bpEnd = Math.ceil(Math.min(chrLength, referenceFrame.start + bpWidth + bpWidth)); // Add one screen width to end
|
|
@@ -24517,6 +24538,12 @@ class TrackViewport extends Viewport {
|
|
|
24517
24538
|
}
|
|
24518
24539
|
}
|
|
24519
24540
|
|
|
24541
|
+
/**
|
|
24542
|
+
* Compute the genomic extent and needed pixelWidth to repaint the canvas for the current genomic state.
|
|
24543
|
+
* Normally the canvas is size 3X the width of the viewport, however there is no left-right panning for WGV so
|
|
24544
|
+
* canvas width is viewport width.
|
|
24545
|
+
* @returns {{bpEnd: *, pixelWidth: (*|number), bpStart: number}}
|
|
24546
|
+
*/
|
|
24520
24547
|
repaintDimensions() {
|
|
24521
24548
|
const isWGV = GenomeUtils.isWholeGenomeView(this.referenceFrame.chr);
|
|
24522
24549
|
const pixelWidth = isWGV ? this.$viewport.width() : 3 * this.$viewport.width();
|
|
@@ -24539,12 +24566,8 @@ class TrackViewport extends Viewport {
|
|
|
24539
24566
|
}
|
|
24540
24567
|
|
|
24541
24568
|
const {features, roiFeatures} = this.featureCache;
|
|
24542
|
-
//this.tile.bpPerPixel = this.referenceFrame.bpPerPixel
|
|
24543
|
-
|
|
24544
|
-
// const isWGV = GenomeUtils.isWholeGenomeView(this.browser.referenceFrameList[0].chr)
|
|
24545
|
-
GenomeUtils.isWholeGenomeView(this.referenceFrame.chr);
|
|
24546
24569
|
|
|
24547
|
-
// Canvas dimensions.
|
|
24570
|
+
// Canvas dimensions.
|
|
24548
24571
|
// For deep tracks we paint a canvas == 3*viewportHeight centered on the current vertical scroll position
|
|
24549
24572
|
const {bpStart, bpEnd, pixelWidth} = this.repaintDimensions();
|
|
24550
24573
|
const viewportHeight = this.$viewport.height();
|
|
@@ -24557,14 +24580,15 @@ class TrackViewport extends Viewport {
|
|
|
24557
24580
|
}
|
|
24558
24581
|
return
|
|
24559
24582
|
}
|
|
24560
|
-
const canvasTop = Math.max(0, -
|
|
24583
|
+
const canvasTop = Math.max(0, -this.contentTop - viewportHeight);
|
|
24584
|
+
|
|
24561
24585
|
|
|
24562
24586
|
const bpPerPixel = this.referenceFrame.bpPerPixel;
|
|
24563
|
-
//const bpStart = this.referenceFrame.start - (isWGV ? 0 : pixelWidth / 3 * bpPerPixel)
|
|
24564
|
-
//const bpEnd = this.referenceFrame.end + (isWGV ? 0 : pixelWidth / 3 * bpPerPixel)
|
|
24565
24587
|
const pixelXOffset = Math.round((bpStart - this.referenceFrame.start) / bpPerPixel);
|
|
24566
24588
|
|
|
24567
|
-
const newCanvas =
|
|
24589
|
+
const newCanvas = document.createElement('canvas');// $('<canvas class="igv-canvas">').get(0)
|
|
24590
|
+
newCanvas.style.position = 'relative';
|
|
24591
|
+
newCanvas.style.display = 'block';
|
|
24568
24592
|
newCanvas.style.width = pixelWidth + "px";
|
|
24569
24593
|
newCanvas.style.height = pixelHeight + "px";
|
|
24570
24594
|
newCanvas.style.left = pixelXOffset + "px";
|
|
@@ -24590,6 +24614,8 @@ class TrackViewport extends Viewport {
|
|
|
24590
24614
|
bpStart: bpStart,
|
|
24591
24615
|
bpEnd: bpEnd,
|
|
24592
24616
|
bpPerPixel,
|
|
24617
|
+
canvasTop,
|
|
24618
|
+
canvasBottom: canvasTop + pixelHeight,
|
|
24593
24619
|
referenceFrame: this.referenceFrame,
|
|
24594
24620
|
selection: this.selection,
|
|
24595
24621
|
viewport: this,
|
|
@@ -24603,7 +24629,7 @@ class TrackViewport extends Viewport {
|
|
|
24603
24629
|
}
|
|
24604
24630
|
newCanvas._data = drawConfiguration;
|
|
24605
24631
|
this.canvas = newCanvas;
|
|
24606
|
-
this.$
|
|
24632
|
+
this.$viewport.append($$1(newCanvas));
|
|
24607
24633
|
|
|
24608
24634
|
}
|
|
24609
24635
|
|
|
@@ -24625,13 +24651,11 @@ class TrackViewport extends Viewport {
|
|
|
24625
24651
|
*/
|
|
24626
24652
|
draw(drawConfiguration, features, roiFeatures) {
|
|
24627
24653
|
|
|
24628
|
-
// console.log(`${ Date.now() } viewport draw(). track ${ this.trackView.track.type }. content-css-top ${ this.$content.css('top') }. canvas-top ${ drawConfiguration.pixelTop }.`)
|
|
24629
|
-
|
|
24630
24654
|
if (features) {
|
|
24631
24655
|
drawConfiguration.features = features;
|
|
24632
24656
|
this.trackView.track.draw(drawConfiguration);
|
|
24633
24657
|
}
|
|
24634
|
-
if (roiFeatures) {
|
|
24658
|
+
if (roiFeatures && roiFeatures.length > 0) {
|
|
24635
24659
|
for (let r of roiFeatures) {
|
|
24636
24660
|
drawConfiguration.features = r.features;
|
|
24637
24661
|
r.track.draw(drawConfiguration);
|
|
@@ -24655,13 +24679,13 @@ class TrackViewport extends Viewport {
|
|
|
24655
24679
|
|
|
24656
24680
|
if (!this.canvas) return
|
|
24657
24681
|
|
|
24658
|
-
const canvasMetadata = this.
|
|
24682
|
+
const canvasMetadata = this.canvas._data;
|
|
24659
24683
|
const canvasTop = canvasMetadata ? canvasMetadata.canvasTop : 0;
|
|
24660
24684
|
const devicePixelRatio = window.devicePixelRatio;
|
|
24661
24685
|
const w = this.$viewport.width() * devicePixelRatio;
|
|
24662
24686
|
const h = this.$viewport.height() * devicePixelRatio;
|
|
24663
24687
|
const x = -$$1(this.canvas).position().left * devicePixelRatio;
|
|
24664
|
-
const y = (-this
|
|
24688
|
+
const y = (-this.contentTop - canvasTop) * devicePixelRatio;
|
|
24665
24689
|
|
|
24666
24690
|
const ctx = this.canvas.getContext("2d");
|
|
24667
24691
|
const imageData = ctx.getImageData(x, y, w, h);
|
|
@@ -24679,57 +24703,82 @@ class TrackViewport extends Viewport {
|
|
|
24679
24703
|
|
|
24680
24704
|
saveSVG() {
|
|
24681
24705
|
|
|
24682
|
-
const
|
|
24706
|
+
const marginTop = 32;
|
|
24707
|
+
const marginLeft = 32;
|
|
24708
|
+
|
|
24709
|
+
let {width, height} = this.browser.columnContainer.getBoundingClientRect();
|
|
24710
|
+
|
|
24711
|
+
const h_render = 8000;
|
|
24683
24712
|
|
|
24684
24713
|
const config =
|
|
24685
24714
|
{
|
|
24715
|
+
|
|
24686
24716
|
width,
|
|
24687
|
-
height,
|
|
24717
|
+
height: h_render,
|
|
24718
|
+
|
|
24719
|
+
backdropColor: 'white',
|
|
24720
|
+
|
|
24721
|
+
multiLocusGap: 0,
|
|
24722
|
+
|
|
24688
24723
|
viewbox:
|
|
24689
24724
|
{
|
|
24690
24725
|
x: 0,
|
|
24691
|
-
y:
|
|
24726
|
+
y: 0,
|
|
24692
24727
|
width,
|
|
24693
|
-
height
|
|
24728
|
+
height: h_render
|
|
24694
24729
|
}
|
|
24695
24730
|
|
|
24696
24731
|
};
|
|
24697
24732
|
|
|
24698
24733
|
const context = new ctx(config);
|
|
24699
24734
|
|
|
24700
|
-
const
|
|
24735
|
+
const delta =
|
|
24736
|
+
{
|
|
24737
|
+
deltaX: marginLeft,
|
|
24738
|
+
deltaY: marginTop
|
|
24739
|
+
};
|
|
24701
24740
|
|
|
24702
|
-
|
|
24703
|
-
const id = `${str}_referenceFrame_${index}_guid_${guid$2()}`;
|
|
24741
|
+
this.renderViewportToSVG(context, delta);
|
|
24704
24742
|
|
|
24705
|
-
|
|
24743
|
+
// reset height to trim away unneeded svg canvas real estate. Yes, a bit of a hack.
|
|
24744
|
+
context.setHeight(height);
|
|
24745
|
+
|
|
24746
|
+
const str = (this.trackView.track.name || this.trackView.track.id).replace(/\W/g, '');
|
|
24747
|
+
const index = this.browser.referenceFrameList.indexOf(this.referenceFrame);
|
|
24706
24748
|
|
|
24707
24749
|
const svg = context.getSerializedSvg(true);
|
|
24708
24750
|
const data = URL.createObjectURL(new Blob([svg], {type: "application/octet-stream"}));
|
|
24709
24751
|
|
|
24752
|
+
const id = `${str}_referenceFrame_${index}_guid_${guid$2()}`;
|
|
24710
24753
|
download(`${id}.svg`, data);
|
|
24754
|
+
|
|
24711
24755
|
}
|
|
24712
24756
|
|
|
24713
24757
|
// called by trackView.renderSVGContext() when rendering
|
|
24714
24758
|
// entire browser as SVG
|
|
24715
24759
|
|
|
24716
|
-
|
|
24760
|
+
renderViewportToSVG(context, {deltaX, deltaY}) {
|
|
24717
24761
|
|
|
24718
|
-
// Nothing to do if zoomInNotice is active
|
|
24719
24762
|
if (this.$zoomInNotice && this.$zoomInNotice.is(":visible")) {
|
|
24720
24763
|
return
|
|
24721
24764
|
}
|
|
24722
24765
|
|
|
24723
|
-
const
|
|
24766
|
+
const {width, height} = this.$viewport.get(0).getBoundingClientRect();
|
|
24724
24767
|
|
|
24768
|
+
const str = (this.trackView.track.name || this.trackView.track.id).replace(/\W/g, '');
|
|
24725
24769
|
const index = this.browser.referenceFrameList.indexOf(this.referenceFrame);
|
|
24726
24770
|
const id = `${str}_referenceFrame_${index}_guid_${guid$2()}`;
|
|
24771
|
+
this.drawSVGWithContext(context, width, height, id, deltaX, deltaY + this.contentTop, -this.contentTop);
|
|
24727
24772
|
|
|
24728
|
-
|
|
24773
|
+
}
|
|
24729
24774
|
|
|
24730
|
-
|
|
24775
|
+
renderSVGContext(context, {deltaX, deltaY}) {
|
|
24731
24776
|
|
|
24732
|
-
this.
|
|
24777
|
+
this.renderViewportToSVG(context, {deltaX, deltaY});
|
|
24778
|
+
|
|
24779
|
+
if (this.$zoomInNotice && this.$zoomInNotice.is(":visible")) {
|
|
24780
|
+
return
|
|
24781
|
+
}
|
|
24733
24782
|
|
|
24734
24783
|
if (this.$trackLabel && true === this.browser.trackLabelsVisible) {
|
|
24735
24784
|
const {x, y, width, height} = relativeDOMBBox(this.$viewport.get(0), this.$trackLabel.get(0));
|
|
@@ -24787,7 +24836,7 @@ class TrackViewport extends Viewport {
|
|
|
24787
24836
|
selection: this.selection
|
|
24788
24837
|
};
|
|
24789
24838
|
|
|
24790
|
-
const features = this.featureCache ? this.featureCache.features :
|
|
24839
|
+
const features = this.featureCache ? this.featureCache.features : undefined;
|
|
24791
24840
|
const roiFeatures = this.featureCache ? this.featureCache.roiFeatures : undefined;
|
|
24792
24841
|
this.draw(config, features, roiFeatures);
|
|
24793
24842
|
|
|
@@ -24805,7 +24854,6 @@ class TrackViewport extends Viewport {
|
|
|
24805
24854
|
}
|
|
24806
24855
|
|
|
24807
24856
|
async getFeatures(track, chr, start, end, bpPerPixel) {
|
|
24808
|
-
|
|
24809
24857
|
if (this.featureCache && this.featureCache.containsRange(chr, start, end, bpPerPixel)) {
|
|
24810
24858
|
return this.featureCache.features
|
|
24811
24859
|
} else if (typeof track.getFeatures === "function") {
|
|
@@ -24887,22 +24935,21 @@ class TrackViewport extends Viewport {
|
|
|
24887
24935
|
viewport.addEventListener('touchend', mu);
|
|
24888
24936
|
|
|
24889
24937
|
// Mouse move
|
|
24890
|
-
if (typeof this.trackView.track.
|
|
24938
|
+
if (typeof this.trackView.track.hoverText === 'function') {
|
|
24891
24939
|
viewport.addEventListener('mousemove', (event => {
|
|
24892
|
-
if (Date.now() - lastHoverUpdateTime > 100) {
|
|
24940
|
+
if (event.buttons === 0 && (Date.now() - lastHoverUpdateTime > 100)) {
|
|
24893
24941
|
lastHoverUpdateTime = Date.now();
|
|
24894
|
-
const clickState = createClickState(event
|
|
24942
|
+
const clickState = this.createClickState(event);
|
|
24895
24943
|
if (clickState) {
|
|
24896
|
-
const
|
|
24897
|
-
if (
|
|
24898
|
-
this.$viewport[0].setAttribute("title",
|
|
24944
|
+
const tooltip = this.trackView.track.hoverText(clickState);
|
|
24945
|
+
if (tooltip) {
|
|
24946
|
+
this.$viewport[0].setAttribute("title", tooltip);
|
|
24899
24947
|
} else {
|
|
24900
24948
|
this.$viewport[0].removeAttribute("title");
|
|
24901
24949
|
}
|
|
24902
24950
|
}
|
|
24903
24951
|
}
|
|
24904
24952
|
}));
|
|
24905
|
-
|
|
24906
24953
|
}
|
|
24907
24954
|
|
|
24908
24955
|
this.addViewportClickHandler(this.$viewport.get(0));
|
|
@@ -24922,7 +24969,7 @@ class TrackViewport extends Viewport {
|
|
|
24922
24969
|
return false
|
|
24923
24970
|
}
|
|
24924
24971
|
|
|
24925
|
-
const clickState = createClickState(event
|
|
24972
|
+
const clickState = this.createClickState(event);
|
|
24926
24973
|
|
|
24927
24974
|
if (undefined === clickState) {
|
|
24928
24975
|
return false
|
|
@@ -25024,7 +25071,7 @@ class TrackViewport extends Viewport {
|
|
|
25024
25071
|
|
|
25025
25072
|
popupTimerID = setTimeout(() => {
|
|
25026
25073
|
|
|
25027
|
-
const content = getPopupContent(event
|
|
25074
|
+
const content = this.getPopupContent(event);
|
|
25028
25075
|
if (content) {
|
|
25029
25076
|
if (this.popover) this.popover.dispose();
|
|
25030
25077
|
this.popover = new Popover(this.browser.columnContainer);
|
|
@@ -25068,57 +25115,58 @@ class TrackViewport extends Viewport {
|
|
|
25068
25115
|
});
|
|
25069
25116
|
}
|
|
25070
25117
|
|
|
25071
|
-
|
|
25118
|
+
createClickState(event) {
|
|
25072
25119
|
|
|
25073
|
-
|
|
25120
|
+
if (!this.canvas) return // Can happen during initialization
|
|
25074
25121
|
|
|
25075
|
-
|
|
25122
|
+
const referenceFrame = this.referenceFrame;
|
|
25123
|
+
const viewportCoords = translateMouseCoordinates$1(event, this.$viewport.get(0));
|
|
25124
|
+
const canvasCoords = translateMouseCoordinates$1(event, this.canvas);
|
|
25125
|
+
const genomicLocation = ((referenceFrame.start) + referenceFrame.toBP(viewportCoords.x));
|
|
25076
25126
|
|
|
25077
|
-
|
|
25078
|
-
|
|
25079
|
-
|
|
25080
|
-
|
|
25127
|
+
return {
|
|
25128
|
+
event,
|
|
25129
|
+
viewport: this,
|
|
25130
|
+
referenceFrame,
|
|
25131
|
+
genomicLocation,
|
|
25132
|
+
y: viewportCoords.y - this.contentTop,
|
|
25133
|
+
canvasX: canvasCoords.x,
|
|
25134
|
+
canvasY: canvasCoords.y
|
|
25135
|
+
}
|
|
25081
25136
|
|
|
25082
|
-
return {
|
|
25083
|
-
event,
|
|
25084
|
-
viewport,
|
|
25085
|
-
referenceFrame,
|
|
25086
|
-
genomicLocation,
|
|
25087
|
-
x: viewportCoords.x,
|
|
25088
|
-
y: viewportCoords.y,
|
|
25089
|
-
canvasX: canvasCoords.x,
|
|
25090
|
-
canvasY: canvasCoords.y
|
|
25091
25137
|
}
|
|
25092
25138
|
|
|
25093
|
-
|
|
25139
|
+
getPopupContent(event) {
|
|
25094
25140
|
|
|
25095
|
-
|
|
25141
|
+
const clickState = this.createClickState(event);
|
|
25096
25142
|
|
|
25097
|
-
|
|
25143
|
+
if (undefined === clickState) {
|
|
25144
|
+
return
|
|
25145
|
+
}
|
|
25098
25146
|
|
|
25099
|
-
|
|
25100
|
-
|
|
25101
|
-
}
|
|
25147
|
+
let track = this.trackView.track;
|
|
25148
|
+
const dataList = track.popupData(clickState);
|
|
25102
25149
|
|
|
25103
|
-
|
|
25104
|
-
const dataList = track.popupData(clickState);
|
|
25150
|
+
const popupClickHandlerResult = this.browser.fireEvent('trackclick', [track, dataList]);
|
|
25105
25151
|
|
|
25106
|
-
|
|
25152
|
+
let content;
|
|
25153
|
+
if (undefined === popupClickHandlerResult || true === popupClickHandlerResult) {
|
|
25154
|
+
// Indicates handler did not handle the result, or the handler wishes default behavior to occur
|
|
25155
|
+
if (dataList && dataList.length > 0) {
|
|
25156
|
+
content = formatPopoverText(dataList);
|
|
25157
|
+
}
|
|
25107
25158
|
|
|
25108
|
-
|
|
25109
|
-
|
|
25110
|
-
// Indicates handler did not handle the result, or the handler wishes default behavior to occur
|
|
25111
|
-
if (dataList && dataList.length > 0) {
|
|
25112
|
-
content = formatPopoverText(dataList);
|
|
25159
|
+
} else if (typeof popupClickHandlerResult === 'string') {
|
|
25160
|
+
content = popupClickHandlerResult;
|
|
25113
25161
|
}
|
|
25114
25162
|
|
|
25115
|
-
|
|
25116
|
-
content = popupClickHandlerResult;
|
|
25163
|
+
return content
|
|
25117
25164
|
}
|
|
25118
25165
|
|
|
25119
|
-
|
|
25166
|
+
|
|
25120
25167
|
}
|
|
25121
25168
|
|
|
25169
|
+
|
|
25122
25170
|
function formatPopoverText(nameValues) {
|
|
25123
25171
|
|
|
25124
25172
|
const rows = nameValues.map(nameValue => {
|
|
@@ -25698,6 +25746,9 @@ function decodeBed(tokens, header) {
|
|
|
25698
25746
|
feature.attributes = {};
|
|
25699
25747
|
for (let kv of attributeKVs) {
|
|
25700
25748
|
feature.attributes[kv[0]] = kv[1];
|
|
25749
|
+
if (header.nameField != undefined && kv[0] === header.nameField) {
|
|
25750
|
+
feature.name = kv[1];
|
|
25751
|
+
}
|
|
25701
25752
|
}
|
|
25702
25753
|
}
|
|
25703
25754
|
if (!feature.name) {
|
|
@@ -26717,6 +26768,7 @@ class TrackBase {
|
|
|
26717
26768
|
* @param config
|
|
26718
26769
|
*/
|
|
26719
26770
|
init(config) {
|
|
26771
|
+
|
|
26720
26772
|
if (config.displayMode) {
|
|
26721
26773
|
config.displayMode = config.displayMode.toUpperCase();
|
|
26722
26774
|
}
|
|
@@ -26772,8 +26824,12 @@ class TrackBase {
|
|
|
26772
26824
|
}
|
|
26773
26825
|
}
|
|
26774
26826
|
|
|
26775
|
-
|
|
26776
|
-
|
|
26827
|
+
// Support for mouse hover text. This can be expensive, off by default.
|
|
26828
|
+
// this.hoverText = function(clickState) => return tool tip text
|
|
26829
|
+
if (config.hoverTextFields) {
|
|
26830
|
+
this.hoverText = hoverText.bind(this);
|
|
26831
|
+
} else if (typeof this.config.hoverText === 'function') {
|
|
26832
|
+
this.hoverText = this.config.hoverText;
|
|
26777
26833
|
}
|
|
26778
26834
|
}
|
|
26779
26835
|
|
|
@@ -26888,7 +26944,7 @@ class TrackBase {
|
|
|
26888
26944
|
*/
|
|
26889
26945
|
setTrackProperties(properties) {
|
|
26890
26946
|
|
|
26891
|
-
if(this.disposed) return
|
|
26947
|
+
if (this.disposed) return // This track was removed during async load
|
|
26892
26948
|
|
|
26893
26949
|
const tracklineConfg = {};
|
|
26894
26950
|
let tokens;
|
|
@@ -26991,20 +27047,20 @@ class TrackBase {
|
|
|
26991
27047
|
}
|
|
26992
27048
|
|
|
26993
27049
|
/**
|
|
26994
|
-
* Return the features clicked over. Default implementation assumes
|
|
27050
|
+
* Return the features clicked over. Default implementation assumes an array of features and only considers
|
|
26995
27051
|
* the genomic location. Overriden by most subclasses.
|
|
26996
27052
|
*
|
|
26997
27053
|
* @param clickState
|
|
26998
27054
|
* @param features
|
|
26999
27055
|
* @returns {[]|*[]}
|
|
27000
27056
|
*/
|
|
27001
|
-
clickedFeatures(clickState
|
|
27057
|
+
clickedFeatures(clickState) {
|
|
27002
27058
|
|
|
27003
27059
|
// We use the cached features rather than method to avoid async load. If the
|
|
27004
27060
|
// feature is not already loaded this won't work, but the user wouldn't be mousing over it either.
|
|
27005
|
-
|
|
27061
|
+
const features = clickState.viewport.cachedFeatures;
|
|
27006
27062
|
|
|
27007
|
-
if (!features || features.length === 0) {
|
|
27063
|
+
if (!features || !Array.isArray(features) || features.length === 0) {
|
|
27008
27064
|
return []
|
|
27009
27065
|
}
|
|
27010
27066
|
|
|
@@ -27102,65 +27158,6 @@ class TrackBase {
|
|
|
27102
27158
|
|
|
27103
27159
|
}
|
|
27104
27160
|
|
|
27105
|
-
/**
|
|
27106
|
-
* Return a plain string for descriptive text given the list of features. The string is used to set a "title"
|
|
27107
|
-
* attribute and cannot contain any html.
|
|
27108
|
-
*
|
|
27109
|
-
* @returns {undefined}
|
|
27110
|
-
*/
|
|
27111
|
-
_hoverText(clickState) {
|
|
27112
|
-
|
|
27113
|
-
const features = this.clickedFeatures(clickState);
|
|
27114
|
-
|
|
27115
|
-
if (features && features.length > 0) {
|
|
27116
|
-
let str = "";
|
|
27117
|
-
for (let i = 0; i < features.length; i++) {
|
|
27118
|
-
if (i === 10) {
|
|
27119
|
-
str += "; ...";
|
|
27120
|
-
break
|
|
27121
|
-
}
|
|
27122
|
-
if (!features[i]) continue
|
|
27123
|
-
|
|
27124
|
-
const f = features[i]._f || features[i];
|
|
27125
|
-
if (str.length > 0) str += "\n";
|
|
27126
|
-
|
|
27127
|
-
if(this.hoverTextFields) {
|
|
27128
|
-
str = "";
|
|
27129
|
-
for(let field of this.hoverTextFields) {
|
|
27130
|
-
if(str.length > 0) str += "\n";
|
|
27131
|
-
if(f.hasOwnProperty(field)) {
|
|
27132
|
-
str += f[field];
|
|
27133
|
-
} else if(typeof f.getAttribute === "function") {
|
|
27134
|
-
str += f.getAttribute(field);
|
|
27135
|
-
}
|
|
27136
|
-
}
|
|
27137
|
-
}
|
|
27138
|
-
else if (typeof this.config.hoverText === 'function') {
|
|
27139
|
-
str += this.config.hoverText(f);
|
|
27140
|
-
} else if (typeof f.hoverText === 'function') {
|
|
27141
|
-
str += f.hoverText();
|
|
27142
|
-
} else {
|
|
27143
|
-
str += this.hoverText(f);
|
|
27144
|
-
}
|
|
27145
|
-
}
|
|
27146
|
-
return str
|
|
27147
|
-
}
|
|
27148
|
-
}
|
|
27149
|
-
|
|
27150
|
-
/**
|
|
27151
|
-
* Default hoverText function. Can be overridden in track configuration or subclasses
|
|
27152
|
-
*
|
|
27153
|
-
* @param f - feature hovered over
|
|
27154
|
-
*/
|
|
27155
|
-
hoverText(f) {
|
|
27156
|
-
let str = "";
|
|
27157
|
-
if (f.name) {
|
|
27158
|
-
str += f.name;
|
|
27159
|
-
if (f.value) str += ": ";
|
|
27160
|
-
}
|
|
27161
|
-
if (f.value) str += f.value; // TODO format value if number
|
|
27162
|
-
return str;
|
|
27163
|
-
}
|
|
27164
27161
|
|
|
27165
27162
|
/**
|
|
27166
27163
|
* Default track description -- displayed on click of track label. This can be overriden in the track
|
|
@@ -27233,6 +27230,38 @@ class TrackBase {
|
|
|
27233
27230
|
}
|
|
27234
27231
|
}
|
|
27235
27232
|
|
|
27233
|
+
function hoverText(clickState) {
|
|
27234
|
+
|
|
27235
|
+
if (!this.hoverTextFields) return
|
|
27236
|
+
|
|
27237
|
+
const features = this.clickedFeatures(clickState);
|
|
27238
|
+
|
|
27239
|
+
if (features && features.length > 0) {
|
|
27240
|
+
let str = "";
|
|
27241
|
+
for (let i = 0; i < features.length; i++) {
|
|
27242
|
+
if (i === 10) {
|
|
27243
|
+
str += "; ...";
|
|
27244
|
+
break
|
|
27245
|
+
}
|
|
27246
|
+
if (!features[i]) continue
|
|
27247
|
+
|
|
27248
|
+
const f = features[i]._f || features[i];
|
|
27249
|
+
if (str.length > 0) str += "\n";
|
|
27250
|
+
|
|
27251
|
+
str = "";
|
|
27252
|
+
for (let field of this.hoverTextFields) {
|
|
27253
|
+
if (str.length > 0) str += "\n";
|
|
27254
|
+
if (f.hasOwnProperty(field)) {
|
|
27255
|
+
str += f[field];
|
|
27256
|
+
} else if (typeof f.getAttribute === "function") {
|
|
27257
|
+
str += f.getAttribute(field);
|
|
27258
|
+
}
|
|
27259
|
+
}
|
|
27260
|
+
|
|
27261
|
+
}
|
|
27262
|
+
return str
|
|
27263
|
+
}
|
|
27264
|
+
}
|
|
27236
27265
|
|
|
27237
27266
|
/**
|
|
27238
27267
|
* Map UCSC track line "type" setting to file format. In igv.js "type" refers to the track type, not the input file format
|
|
@@ -27431,12 +27460,6 @@ class SegFeature {
|
|
|
27431
27460
|
return pd
|
|
27432
27461
|
}
|
|
27433
27462
|
|
|
27434
|
-
hoverText() {
|
|
27435
|
-
|
|
27436
|
-
return `${this.sample}: ${this.value}`
|
|
27437
|
-
}
|
|
27438
|
-
|
|
27439
|
-
|
|
27440
27463
|
extractCravatLink(genomeId) {
|
|
27441
27464
|
|
|
27442
27465
|
let ref, alt;
|
|
@@ -27720,10 +27743,6 @@ class Variant {
|
|
|
27720
27743
|
return fields
|
|
27721
27744
|
}
|
|
27722
27745
|
|
|
27723
|
-
hoverText() {
|
|
27724
|
-
return `${this.names} ${this.referenceBases}->${this.alternateBases}`
|
|
27725
|
-
}
|
|
27726
|
-
|
|
27727
27746
|
getInfo(tag) {
|
|
27728
27747
|
return this.info ? this.info[tag] : undefined;
|
|
27729
27748
|
}
|
|
@@ -28942,10 +28961,9 @@ class CSIIndex {
|
|
|
28942
28961
|
for (let bin = binRange[0]; bin <= binRange[1]; bin++) {
|
|
28943
28962
|
if (ba.binIndex[bin]) {
|
|
28944
28963
|
const binChunks = ba.binIndex[bin];
|
|
28945
|
-
|
|
28946
|
-
|
|
28947
|
-
const
|
|
28948
|
-
const ce = binChunks[c][1];
|
|
28964
|
+
for (let c of binChunks) {
|
|
28965
|
+
const cs = c[0];
|
|
28966
|
+
const ce = c[1];
|
|
28949
28967
|
chunks.push({minv: cs, maxv: ce, bin: bin});
|
|
28950
28968
|
}
|
|
28951
28969
|
}
|
|
@@ -28963,7 +28981,7 @@ class CSIIndex {
|
|
|
28963
28981
|
reg2bins(beg, end) {
|
|
28964
28982
|
beg -= 1; // < convert to 1-based closed
|
|
28965
28983
|
if (beg < 1) beg = 1;
|
|
28966
|
-
if (end > 2 **
|
|
28984
|
+
if (end > 2 ** 34) end = 2 ** 34; // 17 GiB ought to be enough for anybody
|
|
28967
28985
|
end -= 1;
|
|
28968
28986
|
let l = 0;
|
|
28969
28987
|
let t = 0;
|
|
@@ -28972,25 +28990,18 @@ class CSIIndex {
|
|
|
28972
28990
|
for (; l <= this.depth; s -= 3, t += (1 << l * 3), l += 1) {
|
|
28973
28991
|
const b = t + (beg >> s);
|
|
28974
28992
|
const e = t + (end >> s);
|
|
28975
|
-
|
|
28976
|
-
|
|
28977
|
-
|
|
28978
|
-
|
|
28979
|
-
//for (
|
|
28993
|
+
//
|
|
28994
|
+
// ITS NOT CLEAR WHERE THIS TEST CAME FROM, but maxBinNumber is never set, and its not clear what it represents.
|
|
28995
|
+
// if (e - b + bins.length > this.maxBinNumber)
|
|
28996
|
+
// throw new Error(
|
|
28997
|
+
// `query ${beg}-${end} is too large for current binning scheme (shift ${this.minShift}, depth ${this.depth}), try a smaller query or a coarser index binning scheme`,
|
|
28998
|
+
// )
|
|
28999
|
+
//
|
|
28980
29000
|
bins.push([b, e]);
|
|
28981
29001
|
}
|
|
28982
29002
|
return bins
|
|
28983
29003
|
}
|
|
28984
29004
|
|
|
28985
|
-
// function reg2bins(beg, end, min_shift, depth) {
|
|
28986
|
-
// let l, t, n, s = min_shift + depth * 3;
|
|
28987
|
-
// const bins = [];
|
|
28988
|
-
// for (--end, l = n = t = 0; l <= depth; s -= 3, t += 1 << l * 3, ++l) {
|
|
28989
|
-
// let b = t + (beg >> s), e = t + (end >> s), i;
|
|
28990
|
-
// for (i = b; i <= e; ++i) bins[n++] = i;
|
|
28991
|
-
// }
|
|
28992
|
-
// return bins;
|
|
28993
|
-
// }
|
|
28994
29005
|
|
|
28995
29006
|
bin_limit() {
|
|
28996
29007
|
return ((1 << (this.depth + 1) * 3) - 1) / 7
|
|
@@ -29193,11 +29204,10 @@ class BamIndex {
|
|
|
29193
29204
|
for (let binRange of overlappingBins) {
|
|
29194
29205
|
for (let bin = binRange[0]; bin <= binRange[1]; bin++) {
|
|
29195
29206
|
if (ba.binIndex[bin]) {
|
|
29196
|
-
const binChunks = ba.binIndex[bin]
|
|
29197
|
-
|
|
29198
|
-
|
|
29199
|
-
const
|
|
29200
|
-
const ce = binChunks[c][1];
|
|
29207
|
+
const binChunks = ba.binIndex[bin];
|
|
29208
|
+
for (let c of binChunks) {
|
|
29209
|
+
const cs = c[0];
|
|
29210
|
+
const ce = c[1];
|
|
29201
29211
|
chunks.push({minv: cs, maxv: ce, bin: bin});
|
|
29202
29212
|
}
|
|
29203
29213
|
}
|
|
@@ -29209,7 +29219,7 @@ class BamIndex {
|
|
|
29209
29219
|
let lowest = null;
|
|
29210
29220
|
const minLin = Math.min(min >> 14, nintv - 1);
|
|
29211
29221
|
const maxLin = Math.min(max >> 14, nintv - 1);
|
|
29212
|
-
for (let i = minLin; i
|
|
29222
|
+
for (let i = minLin; i < maxLin; i++) {
|
|
29213
29223
|
const vp = ba.linearIndex[i];
|
|
29214
29224
|
if (vp) {
|
|
29215
29225
|
// todo -- I think, but am not sure, that the values in the linear index have to be in increasing order. So the first non-null should be minimum
|
|
@@ -35129,10 +35139,6 @@ class BamAlignment {
|
|
|
35129
35139
|
return (genomicLocation >= s && genomicLocation <= (s + l))
|
|
35130
35140
|
}
|
|
35131
35141
|
|
|
35132
|
-
hoverText() {
|
|
35133
|
-
return this.readName;
|
|
35134
|
-
}
|
|
35135
|
-
|
|
35136
35142
|
popupData(genomicLocation) {
|
|
35137
35143
|
|
|
35138
35144
|
// if the user clicks on a base next to an insertion, show just the
|
|
@@ -39984,6 +39990,14 @@ class BAMTrack extends TrackBase {
|
|
|
39984
39990
|
return clickedObject ? [clickedObject] : undefined
|
|
39985
39991
|
}
|
|
39986
39992
|
|
|
39993
|
+
hoverText(clickState) {
|
|
39994
|
+
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrack.height) {
|
|
39995
|
+
const clickedObject = this.coverageTrack.getClickedObject(clickState);
|
|
39996
|
+
return clickedObject.hoverText()
|
|
39997
|
+
}
|
|
39998
|
+
|
|
39999
|
+
}
|
|
40000
|
+
|
|
39987
40001
|
menuItemList() {
|
|
39988
40002
|
|
|
39989
40003
|
|
|
@@ -41401,6 +41415,10 @@ class RulerViewport extends TrackViewport {
|
|
|
41401
41415
|
super(trackView, $viewportColumn, referenceFrame, width);
|
|
41402
41416
|
}
|
|
41403
41417
|
|
|
41418
|
+
get contentDiv() {
|
|
41419
|
+
return this.$viewport.get(0)
|
|
41420
|
+
}
|
|
41421
|
+
|
|
41404
41422
|
initializationHelper() {
|
|
41405
41423
|
|
|
41406
41424
|
this.$multiLocusCloseButton = $$1('<div>', {class: 'igv-multi-locus-close-button'});
|
|
@@ -41628,7 +41646,8 @@ class IdeogramViewport extends TrackViewport {
|
|
|
41628
41646
|
|
|
41629
41647
|
this.canvas = document.createElement('canvas');
|
|
41630
41648
|
this.canvas.className = 'igv-ideogram-canvas';
|
|
41631
|
-
this.$content.append(
|
|
41649
|
+
//this.$content.append($(this.canvas))
|
|
41650
|
+
this.$viewport.append($$1(this.canvas));
|
|
41632
41651
|
this.ideogram_ctx = this.canvas.getContext('2d');
|
|
41633
41652
|
|
|
41634
41653
|
this.addMouseHandlers();
|
|
@@ -42202,7 +42221,7 @@ const hideAllMenuPopups = () => {
|
|
|
42202
42221
|
* THE SOFTWARE.
|
|
42203
42222
|
*/
|
|
42204
42223
|
|
|
42205
|
-
const scrollbarExclusionTypes = new Set(['ruler', '
|
|
42224
|
+
const scrollbarExclusionTypes = new Set(['ruler', 'ideogram']);
|
|
42206
42225
|
const colorPickerExclusionTypes = new Set(['ruler', 'sequence', 'ideogram']);
|
|
42207
42226
|
|
|
42208
42227
|
class TrackView {
|
|
@@ -42582,17 +42601,18 @@ class TrackView {
|
|
|
42582
42601
|
}
|
|
42583
42602
|
|
|
42584
42603
|
if (this.track.autoscale) {
|
|
42585
|
-
let allFeatures
|
|
42604
|
+
let allFeatures;
|
|
42586
42605
|
for (let visibleViewport of visibleViewports) {
|
|
42587
42606
|
const referenceFrame = visibleViewport.referenceFrame;
|
|
42588
42607
|
const start = referenceFrame.start;
|
|
42589
|
-
const end = start + referenceFrame.toBP(
|
|
42608
|
+
const end = start + referenceFrame.toBP(visibleViewport.getWidth());
|
|
42590
42609
|
if (visibleViewport.featureCache && visibleViewport.featureCache.features) {
|
|
42610
|
+
// If the "features" object has a getMax function use it. Currently only alignmentContainer implements this, for coverage.
|
|
42591
42611
|
if (typeof visibleViewport.featureCache.features.getMax === 'function') {
|
|
42592
42612
|
const max = visibleViewport.featureCache.features.getMax(start, end);
|
|
42593
|
-
allFeatures
|
|
42613
|
+
allFeatures = [{value: max}];
|
|
42594
42614
|
} else {
|
|
42595
|
-
allFeatures =
|
|
42615
|
+
allFeatures = FeatureUtils.findOverlapping(visibleViewport.featureCache.features, start, end);
|
|
42596
42616
|
}
|
|
42597
42617
|
}
|
|
42598
42618
|
}
|
|
@@ -42657,7 +42677,7 @@ class TrackView {
|
|
|
42657
42677
|
|
|
42658
42678
|
const referenceFrame = vp.referenceFrame;
|
|
42659
42679
|
const {chr, start, bpPerPixel} = vp.referenceFrame;
|
|
42660
|
-
const end = start + referenceFrame.toBP(
|
|
42680
|
+
const end = start + referenceFrame.toBP(vp.getWidth());
|
|
42661
42681
|
const needsReload = !vp.featureCache || !vp.featureCache.containsRange(chr, start, end, bpPerPixel);
|
|
42662
42682
|
|
|
42663
42683
|
if (needsReload) {
|
|
@@ -43549,7 +43569,7 @@ class FeatureTrack extends TrackBase {
|
|
|
43549
43569
|
|
|
43550
43570
|
if (typeof this.featureSource.getHeader === "function") {
|
|
43551
43571
|
this.header = await this.featureSource.getHeader();
|
|
43552
|
-
if(this.disposed) return
|
|
43572
|
+
if (this.disposed) return // This track was removed during async load
|
|
43553
43573
|
}
|
|
43554
43574
|
|
|
43555
43575
|
// Set properties from track line
|
|
@@ -43642,7 +43662,7 @@ class FeatureTrack extends TrackBase {
|
|
|
43642
43662
|
options.rowLastLabelX[row] = -Number.MAX_SAFE_INTEGER;
|
|
43643
43663
|
}
|
|
43644
43664
|
}
|
|
43645
|
-
const maxFeatureCount = Math.max(1,
|
|
43665
|
+
const maxFeatureCount = Math.max(1, Math.max(...rowFeatureCount));
|
|
43646
43666
|
const pixelsPerFeature = pixelWidth / maxFeatureCount;
|
|
43647
43667
|
|
|
43648
43668
|
let lastPxEnd = [];
|
|
@@ -43673,10 +43693,10 @@ class FeatureTrack extends TrackBase {
|
|
|
43673
43693
|
|
|
43674
43694
|
};
|
|
43675
43695
|
|
|
43676
|
-
clickedFeatures(clickState
|
|
43696
|
+
clickedFeatures(clickState) {
|
|
43677
43697
|
|
|
43678
43698
|
const y = clickState.y - this.margin;
|
|
43679
|
-
const allFeatures = super.clickedFeatures(clickState
|
|
43699
|
+
const allFeatures = super.clickedFeatures(clickState);
|
|
43680
43700
|
|
|
43681
43701
|
let row;
|
|
43682
43702
|
switch (this.displayMode) {
|
|
@@ -43700,9 +43720,8 @@ class FeatureTrack extends TrackBase {
|
|
|
43700
43720
|
*/
|
|
43701
43721
|
popupData(clickState, features) {
|
|
43702
43722
|
|
|
43703
|
-
features = this.clickedFeatures(clickState
|
|
43723
|
+
if (features === undefined) features = this.clickedFeatures(clickState);
|
|
43704
43724
|
const genomicLocation = clickState.genomicLocation;
|
|
43705
|
-
|
|
43706
43725
|
const data = [];
|
|
43707
43726
|
for (let feature of features) {
|
|
43708
43727
|
|
|
@@ -43827,8 +43846,7 @@ class FeatureTrack extends TrackBase {
|
|
|
43827
43846
|
let seq = await this.browser.genome.getSequence(f.chr, f.start, f.end);
|
|
43828
43847
|
if (!seq) {
|
|
43829
43848
|
seq = "Unknown sequence";
|
|
43830
|
-
}
|
|
43831
|
-
else if (f.strand === '-') {
|
|
43849
|
+
} else if (f.strand === '-') {
|
|
43832
43850
|
seq = reverseComplementSequence(seq);
|
|
43833
43851
|
}
|
|
43834
43852
|
this.browser.alert.present(seq);
|
|
@@ -43844,8 +43862,7 @@ class FeatureTrack extends TrackBase {
|
|
|
43844
43862
|
let seq = await this.browser.genome.getSequence(f.chr, f.start, f.end);
|
|
43845
43863
|
if (!seq) {
|
|
43846
43864
|
seq = "Unknown sequence";
|
|
43847
|
-
}
|
|
43848
|
-
else if (f.strand === '-') {
|
|
43865
|
+
} else if (f.strand === '-') {
|
|
43849
43866
|
seq = reverseComplementSequence(seq);
|
|
43850
43867
|
}
|
|
43851
43868
|
try {
|
|
@@ -44162,10 +44179,7 @@ class WigTrack extends TrackBase {
|
|
|
44162
44179
|
|
|
44163
44180
|
popupData(clickState, features) {
|
|
44164
44181
|
|
|
44165
|
-
|
|
44166
|
-
// feature is not already loaded this won't work, but the user wouldn't be mousing over it either.
|
|
44167
|
-
|
|
44168
|
-
features = this.clickedFeatures(clickState, features);
|
|
44182
|
+
if(features === undefined) features = this.clickedFeatures(clickState);
|
|
44169
44183
|
|
|
44170
44184
|
if (features && features.length > 0) {
|
|
44171
44185
|
|
|
@@ -44483,7 +44497,7 @@ class SegTrack extends TrackBase {
|
|
|
44483
44497
|
|
|
44484
44498
|
draw({context, renderSVG, pixelTop, pixelWidth, pixelHeight, features, bpPerPixel, bpStart}) {
|
|
44485
44499
|
|
|
44486
|
-
IGVGraphics.fillRect(context, 0,
|
|
44500
|
+
IGVGraphics.fillRect(context, 0, pixelTop, pixelWidth, pixelHeight, {'fillStyle': "rgb(255, 255, 255)"});
|
|
44487
44501
|
|
|
44488
44502
|
if (features && features.length > 0) {
|
|
44489
44503
|
|
|
@@ -44707,9 +44721,9 @@ class SegTrack extends TrackBase {
|
|
|
44707
44721
|
|
|
44708
44722
|
}
|
|
44709
44723
|
|
|
44710
|
-
clickedFeatures(clickState
|
|
44724
|
+
clickedFeatures(clickState) {
|
|
44711
44725
|
|
|
44712
|
-
const allFeatures = super.clickedFeatures(clickState
|
|
44726
|
+
const allFeatures = super.clickedFeatures(clickState);
|
|
44713
44727
|
const y = clickState.y;
|
|
44714
44728
|
return allFeatures.filter(function (feature) {
|
|
44715
44729
|
const rect = feature.pixelRect;
|
|
@@ -44718,13 +44732,16 @@ class SegTrack extends TrackBase {
|
|
|
44718
44732
|
|
|
44719
44733
|
}
|
|
44720
44734
|
|
|
44721
|
-
hoverText(
|
|
44722
|
-
|
|
44735
|
+
hoverText(clickState) {
|
|
44736
|
+
const features = this.clickedFeatures(clickState);
|
|
44737
|
+
if(features && features.length > 0) {
|
|
44738
|
+
return `${features[0].sample}: ${features[0].value}`
|
|
44739
|
+
}
|
|
44723
44740
|
}
|
|
44724
44741
|
|
|
44725
44742
|
popupData(clickState, featureList) {
|
|
44726
44743
|
|
|
44727
|
-
featureList = this.clickedFeatures(clickState);
|
|
44744
|
+
if(featureList === undefined) featureList = this.clickedFeatures(clickState);
|
|
44728
44745
|
|
|
44729
44746
|
const items = [];
|
|
44730
44747
|
|
|
@@ -44880,6 +44897,7 @@ const MUT_COLORS = {
|
|
|
44880
44897
|
* THE SOFTWARE.
|
|
44881
44898
|
*/
|
|
44882
44899
|
|
|
44900
|
+
|
|
44883
44901
|
/**
|
|
44884
44902
|
* Represents 2 or more wig tracks overlaid on a common viewport.
|
|
44885
44903
|
*/
|
|
@@ -44970,70 +44988,111 @@ class MergedTrack extends TrackBase {
|
|
|
44970
44988
|
return items
|
|
44971
44989
|
}
|
|
44972
44990
|
|
|
44991
|
+
/**
|
|
44992
|
+
* Returns a MergedFeatureCollection containing an array of features for the specified range, 1 for each track.
|
|
44993
|
+
*/
|
|
44973
44994
|
async getFeatures(chr, bpStart, bpEnd, bpPerPixel) {
|
|
44974
44995
|
|
|
44975
44996
|
const promises = this.tracks.map((t) => t.getFeatures(chr, bpStart, bpEnd, bpPerPixel));
|
|
44976
|
-
|
|
44997
|
+
const featureArrays = await Promise.all(promises);
|
|
44998
|
+
return new MergedFeatureCollection(featureArrays)
|
|
44977
44999
|
}
|
|
44978
45000
|
|
|
44979
45001
|
draw(options) {
|
|
44980
45002
|
|
|
44981
|
-
const mergedFeatures = options.features; //
|
|
44982
|
-
|
|
44983
|
-
if (this.autoscale) {
|
|
44984
|
-
this.dataRange = autoscale(options.referenceFrame.chr, mergedFeatures);
|
|
44985
|
-
}
|
|
45003
|
+
const mergedFeatures = options.features; // A MergedFeatureCollection
|
|
44986
45004
|
|
|
44987
45005
|
for (let i = 0, len = this.tracks.length; i < len; i++) {
|
|
44988
45006
|
const trackOptions = Object.assign({}, options);
|
|
44989
|
-
trackOptions.features = mergedFeatures[i];
|
|
45007
|
+
trackOptions.features = mergedFeatures.featureArrays[i];
|
|
44990
45008
|
this.tracks[i].dataRange = this.dataRange;
|
|
44991
45009
|
this.tracks[i].flipAxis = this.flipAxis;
|
|
44992
45010
|
this.tracks[i].logScale = this.logScale;
|
|
44993
|
-
if(this.graphType){
|
|
45011
|
+
if (this.graphType) {
|
|
44994
45012
|
this.tracks[i].graphType = this.graphType;
|
|
44995
45013
|
}
|
|
44996
45014
|
this.tracks[i].draw(trackOptions);
|
|
44997
45015
|
}
|
|
44998
45016
|
}
|
|
44999
45017
|
|
|
45000
|
-
popupData(clickState
|
|
45018
|
+
popupData(clickState) {
|
|
45001
45019
|
|
|
45002
|
-
|
|
45020
|
+
if(clickState.viewport && clickState.viewport.cachedFeatures) {
|
|
45003
45021
|
|
|
45004
|
-
|
|
45005
|
-
|
|
45006
|
-
|
|
45007
|
-
|
|
45008
|
-
|
|
45009
|
-
|
|
45010
|
-
|
|
45011
|
-
|
|
45022
|
+
const featuresArray = clickState.viewport.cachedFeatures.featureArrays;
|
|
45023
|
+
|
|
45024
|
+
if (featuresArray && featuresArray.length === this.tracks.length) {
|
|
45025
|
+
// Array of feature arrays, 1 for each track
|
|
45026
|
+
const popupData = [];
|
|
45027
|
+
for (let i = 0; i < this.tracks.length; i++) {
|
|
45028
|
+
if (i > 0) popupData.push('<hr/>');
|
|
45029
|
+
popupData.push(`<div style=background-color:rgb(245,245,245);border-bottom-style:dashed;border-bottom-width:1px;padding-bottom:5px;padding-top:10px;font-weight:bold;font-size:larger >${this.tracks[i].name}</div>`);
|
|
45030
|
+
const trackPopupData = this.tracks[i].popupData(clickState, featuresArray[i]);
|
|
45031
|
+
popupData.push(...trackPopupData);
|
|
45012
45032
|
|
|
45033
|
+
}
|
|
45034
|
+
return popupData
|
|
45013
45035
|
}
|
|
45014
|
-
return popupData
|
|
45015
45036
|
}
|
|
45016
45037
|
}
|
|
45017
45038
|
|
|
45039
|
+
clickedFeatures(clickState) {
|
|
45040
|
+
|
|
45041
|
+
|
|
45042
|
+
// We use the cached features rather than method to avoid async load. If the
|
|
45043
|
+
// feature is not already loaded this won't work, but the user wouldn't be mousing over it either.
|
|
45044
|
+
const mergedFeaturesCollection = clickState.viewport.cachedFeatures;
|
|
45045
|
+
|
|
45046
|
+
if(!mergedFeaturesCollection) {
|
|
45047
|
+
return [];
|
|
45048
|
+
}
|
|
45049
|
+
|
|
45050
|
+
const genomicLocation = clickState.genomicLocation;
|
|
45051
|
+
const clickedFeatures = [];
|
|
45052
|
+
for(let features of mergedFeaturesCollection.featureArrays) {
|
|
45053
|
+
// When zoomed out we need some tolerance around genomicLocation
|
|
45054
|
+
const tolerance = (clickState.referenceFrame.bpPerPixel > 0.2) ? 3 * clickState.referenceFrame.bpPerPixel : 0.2;
|
|
45055
|
+
const ss = genomicLocation - tolerance;
|
|
45056
|
+
const ee = genomicLocation + tolerance;
|
|
45057
|
+
const tmp = (FeatureUtils.findOverlapping(features, ss, ee));
|
|
45058
|
+
for(let f of tmp) {
|
|
45059
|
+
clickedFeatures.push(f);
|
|
45060
|
+
}
|
|
45061
|
+
}
|
|
45062
|
+
return clickedFeatures;
|
|
45063
|
+
}
|
|
45064
|
+
|
|
45018
45065
|
|
|
45019
45066
|
get supportsWholeGenome() {
|
|
45020
45067
|
return this.tracks.every(track => track.supportsWholeGenome)
|
|
45021
45068
|
}
|
|
45022
45069
|
}
|
|
45023
45070
|
|
|
45024
|
-
function autoscale(chr, featureArrays) {
|
|
45025
45071
|
|
|
45026
|
-
|
|
45027
|
-
|
|
45028
|
-
|
|
45029
|
-
|
|
45030
|
-
|
|
45031
|
-
|
|
45032
|
-
|
|
45072
|
+
class MergedFeatureCollection {
|
|
45073
|
+
|
|
45074
|
+
constructor(featureArrays) {
|
|
45075
|
+
this.featureArrays = featureArrays;
|
|
45076
|
+
}
|
|
45077
|
+
|
|
45078
|
+
getMax(start, end) {
|
|
45079
|
+
let max = -Number.MAX_VALUE;
|
|
45080
|
+
for (let a of this.featureArrays) {
|
|
45081
|
+
for (let f of a) {
|
|
45082
|
+
if (typeof f.value !== 'undefined' && !Number.isNaN(f.value)) {
|
|
45083
|
+
if (f.end < start) {
|
|
45084
|
+
continue
|
|
45085
|
+
}
|
|
45086
|
+
if (f.start > end) {
|
|
45087
|
+
break
|
|
45088
|
+
}
|
|
45089
|
+
max = Math.max(max, f.value);
|
|
45090
|
+
}
|
|
45033
45091
|
}
|
|
45034
45092
|
}
|
|
45093
|
+
return max
|
|
45035
45094
|
}
|
|
45036
|
-
|
|
45095
|
+
|
|
45037
45096
|
}
|
|
45038
45097
|
|
|
45039
45098
|
/*
|
|
@@ -45616,7 +45675,7 @@ class InteractionTrack extends TrackBase {
|
|
|
45616
45675
|
|
|
45617
45676
|
popupData(clickState, features) {
|
|
45618
45677
|
|
|
45619
|
-
features = this.clickedFeatures(clickState);
|
|
45678
|
+
if(features === undefined) features = this.clickedFeatures(clickState);
|
|
45620
45679
|
|
|
45621
45680
|
const data = [];
|
|
45622
45681
|
for (let feature of features) {
|
|
@@ -45658,11 +45717,11 @@ class InteractionTrack extends TrackBase {
|
|
|
45658
45717
|
return data
|
|
45659
45718
|
}
|
|
45660
45719
|
|
|
45661
|
-
clickedFeatures(clickState
|
|
45720
|
+
clickedFeatures(clickState) {
|
|
45662
45721
|
|
|
45663
45722
|
// We use the cached features rather than method to avoid async load. If the
|
|
45664
45723
|
// feature is not already loaded this won't work, but the user wouldn't be mousing over it either.
|
|
45665
|
-
const featureList =
|
|
45724
|
+
const featureList = clickState.viewport.cachedFeatures;
|
|
45666
45725
|
const candidates = [];
|
|
45667
45726
|
if (featureList) {
|
|
45668
45727
|
const proportional = (this.arcType === "proportional" || this.arcType === "inView" || this.arcType === "partialInView");
|
|
@@ -46252,9 +46311,9 @@ class VariantTrack extends TrackBase {
|
|
|
46252
46311
|
}
|
|
46253
46312
|
}
|
|
46254
46313
|
|
|
46255
|
-
clickedFeatures(clickState
|
|
46314
|
+
clickedFeatures(clickState) {
|
|
46256
46315
|
|
|
46257
|
-
let featureList = super.clickedFeatures(clickState
|
|
46316
|
+
let featureList = super.clickedFeatures(clickState);
|
|
46258
46317
|
|
|
46259
46318
|
const vGap = (this.displayMode === 'EXPANDED') ? this.expandedVGap : this.squishedVGap;
|
|
46260
46319
|
const callHeight = vGap + ("SQUISHED" === this.displayMode ? this.squishedCallHeight : this.expandedCallHeight);
|
|
@@ -46290,9 +46349,9 @@ class VariantTrack extends TrackBase {
|
|
|
46290
46349
|
/**
|
|
46291
46350
|
* Return "popup data" for feature @ genomic location. Data is an array of key-value pairs
|
|
46292
46351
|
*/
|
|
46293
|
-
popupData(clickState,
|
|
46352
|
+
popupData(clickState, featureList) {
|
|
46294
46353
|
|
|
46295
|
-
|
|
46354
|
+
if(featureList === undefined) featureList = this.clickedFeatures(clickState);
|
|
46296
46355
|
const genomicLocation = clickState.genomicLocation;
|
|
46297
46356
|
const genomeID = this.browser.genome.id;
|
|
46298
46357
|
const sampleInformation = this.browser.sampleInformation;
|
|
@@ -46820,9 +46879,9 @@ class EqtlTrack extends TrackBase {
|
|
|
46820
46879
|
/**
|
|
46821
46880
|
* Return "popup data" for feature @ genomic location. Data is an array of key-value pairs
|
|
46822
46881
|
*/
|
|
46823
|
-
popupData(clickState) {
|
|
46882
|
+
popupData(clickState, features) {
|
|
46824
46883
|
|
|
46825
|
-
|
|
46884
|
+
if(features === undefined) features = clickState.viewport.cachedFeatures;
|
|
46826
46885
|
if (!features || features.length === 0) return []
|
|
46827
46886
|
|
|
46828
46887
|
const tolerance = 3;
|
|
@@ -47149,11 +47208,12 @@ class GWASTrack extends TrackBase {
|
|
|
47149
47208
|
}
|
|
47150
47209
|
}
|
|
47151
47210
|
|
|
47152
|
-
popupData(clickState) {
|
|
47211
|
+
popupData(clickState, features) {
|
|
47212
|
+
|
|
47213
|
+
if(features === undefined) features = clickState.viewport.cachedFeatures;
|
|
47153
47214
|
|
|
47154
47215
|
let data = [];
|
|
47155
47216
|
const track = clickState.viewport.trackView.track;
|
|
47156
|
-
const features = clickState.viewport.cachedFeatures;
|
|
47157
47217
|
|
|
47158
47218
|
if (features) {
|
|
47159
47219
|
let count = 0;
|
|
@@ -47541,12 +47601,12 @@ class GCNVTrack extends TrackBase {
|
|
|
47541
47601
|
return []
|
|
47542
47602
|
}
|
|
47543
47603
|
|
|
47544
|
-
popupData(clickState,
|
|
47604
|
+
popupData(clickState, features) {
|
|
47545
47605
|
|
|
47546
|
-
|
|
47606
|
+
if(features === undefined) features = this.clickedFeatures(clickState);
|
|
47547
47607
|
|
|
47548
47608
|
const items = [];
|
|
47549
|
-
|
|
47609
|
+
features.forEach(function (f) {
|
|
47550
47610
|
for (let property of Object.keys(f)) {
|
|
47551
47611
|
if (isSimpleType(f[property])) {
|
|
47552
47612
|
items.push({name: property, value: f[property]});
|
|
@@ -47732,9 +47792,9 @@ class RnaStructTrack extends TrackBase {
|
|
|
47732
47792
|
}
|
|
47733
47793
|
}
|
|
47734
47794
|
|
|
47735
|
-
clickedFeatures(clickState
|
|
47795
|
+
clickedFeatures(clickState) {
|
|
47736
47796
|
|
|
47737
|
-
features = super.clickedFeatures(clickState
|
|
47797
|
+
const features = super.clickedFeatures(clickState);
|
|
47738
47798
|
|
|
47739
47799
|
const clicked = [];
|
|
47740
47800
|
|
|
@@ -47776,10 +47836,7 @@ class RnaStructTrack extends TrackBase {
|
|
|
47776
47836
|
|
|
47777
47837
|
popupData(clickState, features) {
|
|
47778
47838
|
|
|
47779
|
-
|
|
47780
|
-
// feature is not already loaded this won't work, but the user wouldn't be mousing over it either.
|
|
47781
|
-
|
|
47782
|
-
features = this.clickedFeatures(clickState, features);
|
|
47839
|
+
if(features === undefined) features = this.clickedFeatures(clickState);
|
|
47783
47840
|
|
|
47784
47841
|
if (features && features.length > 0) {
|
|
47785
47842
|
|
|
@@ -48207,7 +48264,7 @@ class SpliceJunctionTrack extends TrackBase {
|
|
|
48207
48264
|
|
|
48208
48265
|
if (typeof this.featureSource.getHeader === "function") {
|
|
48209
48266
|
this.header = await this.featureSource.getHeader();
|
|
48210
|
-
if(this.disposed) return
|
|
48267
|
+
if (this.disposed) return // This track was removed during async load
|
|
48211
48268
|
}
|
|
48212
48269
|
|
|
48213
48270
|
// Set properties from track line
|
|
@@ -48264,7 +48321,8 @@ class SpliceJunctionTrack extends TrackBase {
|
|
|
48264
48321
|
|
|
48265
48322
|
junctionRenderingContext.referenceFrame = options.viewport.referenceFrame;
|
|
48266
48323
|
junctionRenderingContext.referenceFrameStart = junctionRenderingContext.referenceFrame.start;
|
|
48267
|
-
junctionRenderingContext.referenceFrameEnd = junctionRenderingContext.referenceFrameStart +
|
|
48324
|
+
junctionRenderingContext.referenceFrameEnd = junctionRenderingContext.referenceFrameStart +
|
|
48325
|
+
junctionRenderingContext.referenceFrame.toBP(options.viewport.getWidth());
|
|
48268
48326
|
|
|
48269
48327
|
// For a given viewport, records where features that are < 2px in width have been rendered already.
|
|
48270
48328
|
// This prevents wasteful rendering of multiple such features onto the same pixels.
|
|
@@ -48512,9 +48570,9 @@ class SpliceJunctionTrack extends TrackBase {
|
|
|
48512
48570
|
ctx.fillText(label, junctionMiddlePx - ctx.measureText(label).width / 2, (7 * topY + cy) / 8);
|
|
48513
48571
|
}
|
|
48514
48572
|
|
|
48515
|
-
clickedFeatures(clickState
|
|
48573
|
+
clickedFeatures(clickState) {
|
|
48516
48574
|
|
|
48517
|
-
const allFeatures = super.clickedFeatures(clickState
|
|
48575
|
+
const allFeatures = super.clickedFeatures(clickState);
|
|
48518
48576
|
|
|
48519
48577
|
return allFeatures.filter(function (feature) {
|
|
48520
48578
|
return (feature.isVisible && feature.attributes)
|
|
@@ -48526,7 +48584,7 @@ class SpliceJunctionTrack extends TrackBase {
|
|
|
48526
48584
|
*/
|
|
48527
48585
|
popupData(clickState, features) {
|
|
48528
48586
|
|
|
48529
|
-
features = this.clickedFeatures(clickState
|
|
48587
|
+
if (features === undefined) features = this.clickedFeatures(clickState);
|
|
48530
48588
|
const genomicLocation = clickState.genomicLocation;
|
|
48531
48589
|
|
|
48532
48590
|
const data = [];
|
|
@@ -51970,11 +52028,11 @@ class Browser {
|
|
|
51970
52028
|
*/
|
|
51971
52029
|
toSVG() {
|
|
51972
52030
|
|
|
51973
|
-
|
|
52031
|
+
const {y, width, height} = this.columnContainer.getBoundingClientRect();
|
|
51974
52032
|
|
|
51975
52033
|
const h_render = 8000;
|
|
51976
52034
|
|
|
51977
|
-
|
|
52035
|
+
const config =
|
|
51978
52036
|
{
|
|
51979
52037
|
|
|
51980
52038
|
width,
|
|
@@ -51992,13 +52050,14 @@ class Browser {
|
|
|
51992
52050
|
height: h_render
|
|
51993
52051
|
}
|
|
51994
52052
|
|
|
51995
|
-
}
|
|
52053
|
+
};
|
|
52054
|
+
|
|
52055
|
+
const context = new ctx(config);
|
|
51996
52056
|
|
|
51997
52057
|
// tracks -> SVG
|
|
51998
52058
|
for (let trackView of this.trackViews) {
|
|
51999
52059
|
trackView.renderSVGContext(context, {deltaX: 0, deltaY: -y});
|
|
52000
52060
|
}
|
|
52001
|
-
|
|
52002
52061
|
// reset height to trim away unneeded svg canvas real estate. Yes, a bit of a hack.
|
|
52003
52062
|
context.setHeight(height);
|
|
52004
52063
|
|
|
@@ -53983,7 +54042,7 @@ async function createTrack(config, browser) {
|
|
|
53983
54042
|
|
|
53984
54043
|
function embedCSS() {
|
|
53985
54044
|
|
|
53986
|
-
var css = '.igv-navbar {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n color: #444;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n line-height: 32px;\n padding-left: 8px;\n padding-right: 8px;\n margin-top: 2px;\n margin-bottom: 6px;\n height: 32px;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: #f3f3f3;\n}\n.igv-navbar .igv-navbar-left-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-left-container .igv-logo {\n width: 34px;\n height: 32px;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-left-container .igv-current-genome {\n height: 32px;\n margin-left: 4px;\n margin-right: 4px;\n user-select: none;\n line-height: 32px;\n vertical-align: middle;\n text-align: center;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container {\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n height: 100%;\n width: 125px;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container select {\n display: block;\n cursor: pointer;\n width: 100px;\n height: 75%;\n outline: none;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n margin-left: 8px;\n height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 210px;\n height: 22px;\n line-height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container input.igv-search-input {\n cursor: text;\n width: 85%;\n height: 22px;\n line-height: 22px;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n text-align: left;\n padding-left: 8px;\n margin-right: 8px;\n outline: none;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: white;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container .igv-search-icon-container {\n cursor: pointer;\n height: 16px;\n width: 16px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-windowsize-panel-container {\n margin-left: 4px;\n user-select: none;\n}\n.igv-navbar .igv-navbar-right-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div {\n margin-left: 0;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div:last-child {\n margin-left: 0;\n margin-right: 0;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container-750 {\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:nth-child(even) {\n display: block;\n height: fit-content;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget input {\n display: block;\n width: 125px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:nth-child(even) {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 input {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-hidden {\n display: none;\n}\n\n.igv-navbar-button {\n display: block;\n box-sizing: unset;\n padding-left: 6px;\n padding-right: 6px;\n height: 18px;\n text-transform: capitalize;\n user-select: none;\n line-height: 18px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 11px;\n font-weight: 200;\n color: #737373;\n background-color: #f3f3f3;\n border-color: #737373;\n border-style: solid;\n border-width: thin;\n border-radius: 6px;\n}\n\n.igv-navbar-button-clicked {\n color: white;\n background-color: #737373;\n}\n\n.igv-navbar-button:hover {\n cursor: pointer;\n}\n\n.igv-zoom-in-notice-container {\n z-index: 1024;\n position: absolute;\n top: 8px;\n left: 50%;\n transform: translate(-50%, 0%);\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n background-color: white;\n}\n.igv-zoom-in-notice-container > div {\n padding-left: 4px;\n padding-right: 4px;\n padding-top: 2px;\n padding-bottom: 2px;\n width: 100%;\n height: 100%;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: #3f3f3f;\n}\n\n.igv-zoom-in-notice {\n position: absolute;\n top: 10px;\n left: 50%;\n}\n.igv-zoom-in-notice div {\n position: relative;\n left: -50%;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #3f3f3f;\n background-color: rgba(255, 255, 255, 0.51);\n z-index: 64;\n}\n\n.igv-container-spinner {\n position: absolute;\n top: 90%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1024;\n width: 24px;\n height: 24px;\n pointer-events: none;\n color: #737373;\n}\n\n.igv-multi-locus-close-button {\n position: absolute;\n top: 2px;\n right: 0;\n padding-left: 2px;\n padding-right: 2px;\n width: 18px;\n height: 18px;\n color: #666666;\n background-color: white;\n z-index: 1000;\n}\n.igv-multi-locus-close-button > svg {\n vertical-align: top;\n}\n\n.igv-multi-locus-close-button:hover {\n cursor: pointer;\n color: #434343;\n}\n\n.igv-multi-locus-ruler-label {\n z-index: 64;\n position: absolute;\n top: 2px;\n left: 0;\n width: 100%;\n height: 14px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-multi-locus-ruler-label div {\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n background-color: white;\n}\n\n.igv-multi-locus-ruler-label-square-dot {\n z-index: 64;\n position: absolute;\n left: 50%;\n top: 5%;\n transform: translate(-50%, 0%);\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-multi-locus-ruler-label-square-dot > div:first-child {\n width: 14px;\n height: 14px;\n}\n.igv-multi-locus-ruler-label-square-dot > div:last-child {\n margin-left: 16px;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n}\n\n.igv-multi-locus-ruler-label:hover {\n cursor: pointer;\n}\n\n.igv-ruler-sweeper {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 26px;\n bottom: 0;\n left: 0;\n width: 0;\n z-index: 99999;\n background-color: rgba(68, 134, 247, 0.25);\n}\n\n.igv-ruler-tooltip {\n pointer-events: none;\n z-index: 128;\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n height: 32px;\n background-color: transparent;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-ruler-tooltip > div {\n pointer-events: none;\n width: 128px;\n height: auto;\n padding: 1px;\n color: #373737;\n font-size: 10px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n background-color: white;\n border-style: solid;\n border-width: thin;\n border-color: #373737;\n}\n\n.igv-track-label {\n position: absolute;\n left: 8px;\n top: 8px;\n width: auto;\n height: auto;\n max-width: 200px;\n padding-left: 4px;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n text-align: center;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-color: #444;\n border-radius: 2px;\n border-style: solid;\n border-width: thin;\n background-color: white;\n z-index: 128;\n cursor: pointer;\n}\n\n.igv-track-label:hover,\n.igv-track-label:focus,\n.igv-track-label:active {\n background-color: #e8e8e8;\n}\n\n.igv-track-label-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-top: 4px;\n}\n\n.igv-center-line {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n z-index: 8;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-left-style: dashed;\n border-left-width: thin;\n border-right-style: dashed;\n border-right-width: thin;\n}\n\n.igv-center-line-wide {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(127, 127, 127, 0.51);\n}\n\n.igv-center-line-thin {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(0, 0, 0, 0);\n}\n\n.igv-cursor-guide-horizontal {\n display: none;\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n left: 0;\n right: 0;\n top: 50%;\n height: 1px;\n z-index: 1;\n margin-left: 50px;\n margin-right: 54px;\n border-top-style: dotted;\n border-top-width: thin;\n border-top-color: rgba(127, 127, 127, 0.76);\n}\n\n.igv-cursor-guide-vertical {\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n width: 1px;\n z-index: 1;\n border-left-style: dotted;\n border-left-width: thin;\n border-left-color: rgba(127, 127, 127, 0.76);\n display: none;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-generic-dialog-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 300px;\n height: 200px;\n border-color: #7F7F7F;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n z-index: 2048;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-generic-dialog-container .igv-generic-dialog-one-liner {\n color: #373737;\n width: 95%;\n height: 24px;\n line-height: 24px;\n text-align: left;\n margin-top: 8px;\n padding-left: 8px;\n overflow-wrap: break-word;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input {\n margin-top: 8px;\n width: 95%;\n height: 24px;\n color: #373737;\n line-height: 24px;\n padding-left: 8px;\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input div {\n width: 30%;\n height: 100%;\n font-size: 16px;\n text-align: right;\n padding-right: 8px;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n width: 50%;\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input {\n margin-top: 8px;\n width: calc(100% - 16px);\n height: 24px;\n color: #373737;\n line-height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel {\n width: 100%;\n height: 28px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div {\n margin-top: 32px;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n width: 75px;\n height: 28px;\n line-height: 28px;\n text-align: center;\n border-color: transparent;\n border-style: solid;\n border-width: thin;\n border-radius: 2px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child {\n margin-left: 32px;\n margin-right: 0;\n background-color: #5ea4e0;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child {\n margin-left: 0;\n margin-right: 32px;\n background-color: #c4c4c4;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child:hover {\n cursor: pointer;\n background-color: #3b5c7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child:hover {\n cursor: pointer;\n background-color: #7f7f7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok {\n width: 100%;\n height: 36px;\n margin-top: 32px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div {\n width: 98px;\n height: 36px;\n line-height: 36px;\n text-align: center;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n border-color: white;\n border-style: solid;\n border-width: thin;\n border-radius: 4px;\n background-color: #2B81AF;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div:hover {\n cursor: pointer;\n background-color: #25597f;\n}\n\n.igv-generic-container {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 2048;\n background-color: white;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-container div:first-child {\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n height: 24px;\n width: 100%;\n background-color: #dddddd;\n}\n.igv-generic-container div:first-child i {\n display: block;\n color: #5f5f5f;\n cursor: pointer;\n width: 14px;\n height: 14px;\n margin-right: 8px;\n margin-bottom: 4px;\n}\n\n.igv-menu-popup {\n position: absolute;\n top: 0;\n left: 0;\n width: max-content;\n z-index: 4096;\n cursor: pointer;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background: white;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-end;\n text-align: left;\n}\n.igv-menu-popup > div:not(:first-child) {\n width: 100%;\n}\n.igv-menu-popup > div:not(:first-child) > div {\n background: white;\n}\n.igv-menu-popup > div:not(:first-child) > div.context-menu {\n padding-left: 4px;\n padding-right: 4px;\n}\n.igv-menu-popup > div:not(:first-child) > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-menu-popup > div:not(:first-child) > div:hover {\n background: #efefef;\n}\n\n.igv-menu-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-bottom: 1px;\n padding-top: 1px;\n}\n\n.igv-menu-popup-header {\n position: relative;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-menu-popup-header div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-menu-popup-header div:hover {\n cursor: pointer;\n color: #444;\n}\n\n.igv-menu-popup-check-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 100%;\n height: 20px;\n margin-right: 4px;\n background-color: transparent;\n}\n.igv-menu-popup-check-container div {\n padding-top: 2px;\n padding-left: 8px;\n}\n.igv-menu-popup-check-container div:first-child {\n position: relative;\n width: 12px;\n height: 12px;\n}\n.igv-menu-popup-check-container div:first-child svg {\n position: absolute;\n width: 12px;\n height: 12px;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-loading-spinner-container {\n z-index: 1024;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 32px;\n height: 32px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-loading-spinner-container > div {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n border: 4px solid rgba(128, 128, 128, 0.5);\n border-top-color: rgb(255, 255, 255);\n animation: spin 1s ease-in-out infinite;\n -webkit-animation: spin 1s ease-in-out infinite;\n}\n\n@keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n@-webkit-keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n.igv-roi-menu-next-gen {\n position: absolute;\n z-index: 512;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background-color: white;\n width: 192px;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu-next-gen > div:first-child {\n height: 24px;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-roi-menu-next-gen > div:first-child > div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-roi-menu-next-gen > div:first-child > div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-menu-next-gen > div:last-child {\n background-color: white;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n text-align: start;\n vertical-align: middle;\n cursor: pointer;\n}\n.igv-roi-menu-next-gen > div:last-child > div {\n height: 24px;\n padding-left: 4px;\n border-bottom-style: solid;\n border-bottom-width: thin;\n border-bottom-color: #7f7f7f;\n}\n.igv-roi-menu-next-gen > div:last-child > div:not(:first-child):hover {\n background-color: rgba(127, 127, 127, 0.1);\n}\n.igv-roi-menu-next-gen > div:last-child div:first-child {\n cursor: default;\n font-style: italic;\n text-align: center;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-menu-next-gen > div:last-child > div:last-child {\n border-bottom-width: 0;\n border-bottom-color: transparent;\n}\n\n.igv-roi-placeholder {\n font-style: normal;\n color: rgba(75, 75, 75, 0.6);\n}\n\n.igv-roi-table {\n position: absolute;\n z-index: 1024;\n width: fit-content;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table > div:first-child > div:first-child {\n text-align: center;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(1) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(2) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(3) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(4) {\n width: 30%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(5) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-row-container {\n resize: both;\n overflow: scroll;\n min-width: 512px;\n min-height: 72px;\n height: 144px;\n max-height: 480px;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(1) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(2) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(3) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(4) {\n width: 30%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(5) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-four-column {\n position: absolute;\n z-index: 1024;\n width: fit-content;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table-four-column > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table-four-column > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table-four-column > div:first-child > div:first-child {\n text-align: center;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table-four-column > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table-four-column > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table-four-column > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(1) {\n width: 25%;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(2) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(3) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(4) {\n width: 35%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container {\n resize: both;\n overflow: scroll;\n min-width: 512px;\n min-height: 72px;\n height: 144px;\n max-height: 480px;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(1) {\n width: 25%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(2) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(3) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(4) {\n width: 35%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table-four-column > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-row-selected {\n background-color: rgba(0, 0, 0, 0.125);\n}\n\n.igv-roi-table-button {\n height: 20px;\n user-select: none;\n line-height: 20px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 13px;\n font-weight: 400;\n color: black;\n padding-left: 6px;\n padding-right: 6px;\n background-color: rgb(239, 239, 239);\n border-color: black;\n border-style: solid;\n border-width: thin;\n border-radius: 3px;\n}\n\n.igv-roi-table-button:hover {\n cursor: pointer;\n font-weight: 400;\n background-color: rgba(0, 0, 0, 0.13);\n}\n\n.igv-roi-region {\n z-index: 64;\n position: absolute;\n top: 0;\n bottom: 0;\n pointer-events: none;\n overflow: visible;\n margin-top: 44px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-region > div {\n position: relative;\n width: 100%;\n height: 8px;\n cursor: pointer;\n pointer-events: auto;\n}\n\n.igv-roi-menu {\n position: absolute;\n z-index: 1024;\n width: 144px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu > div:not(:last-child) {\n border-bottom-color: rgba(128, 128, 128, 0.5);\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-menu > div:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-color: transparent;\n border-top-style: solid;\n border-top-width: 0;\n}\n.igv-roi-menu > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n}\n\n.igv-roi-menu-row {\n height: 24px;\n padding-left: 8px;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n background-color: white;\n}\n\n.igv-roi-menu-row-edit-description {\n width: -webkit-fill-available;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n background-color: white;\n padding-left: 4px;\n padding-right: 4px;\n padding-bottom: 4px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-menu-row-edit-description > label {\n margin-left: 2px;\n margin-bottom: 0;\n display: block;\n width: -webkit-fill-available;\n}\n.igv-roi-menu-row-edit-description > input {\n display: block;\n margin-left: 2px;\n margin-right: 2px;\n margin-bottom: 1px;\n width: -webkit-fill-available;\n}\n\n.igv-container {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n padding-top: 4px;\n user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n}\n\n.igv-viewport {\n position: relative;\n margin-top: 5px;\n overflow-x: hidden;\n overflow-y: hidden;\n}\n\n.igv-viewport-content {\n position: relative;\n width: 100%;\n}\n.igv-viewport-content > canvas {\n position: relative;\n display: block;\n}\n\n.igv-column-container {\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n width: 100%;\n}\n\n.igv-column-shim {\n width: 1px;\n margin-left: 2px;\n margin-right: 2px;\n background-color: #545453;\n}\n\n.igv-column {\n position: relative;\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-axis-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 50px;\n}\n.igv-axis-column > div {\n margin-top: 5px;\n width: 100%;\n}\n\n.igv-sample-name-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-scrollbar-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 14px;\n}\n.igv-scrollbar-column > div {\n position: relative;\n margin-top: 5px;\n width: 14px;\n}\n.igv-scrollbar-column > div > div {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 2px;\n width: 8px;\n border-width: 1px;\n border-style: solid;\n border-color: #c4c4c4;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.igv-scrollbar-column > div > div:hover {\n background-color: #c4c4c4;\n}\n\n.igv-track-drag-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 12px;\n background-color: white;\n}\n.igv-track-drag-column > .igv-track-drag-handle {\n z-index: 512;\n position: relative;\n cursor: pointer;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n background-color: #c4c4c4;\n}\n.igv-track-drag-column .igv-track-drag-handle-hover {\n background-color: #787878;\n}\n.igv-track-drag-column > .igv-track-drag-shim {\n position: relative;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n}\n\n.igv-gear-menu-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 28px;\n}\n.igv-gear-menu-column > div {\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n margin-top: 5px;\n width: 100%;\n background: white;\n}\n.igv-gear-menu-column > div > div {\n position: relative;\n margin-top: 4px;\n width: 16px;\n height: 16px;\n color: #7F7F7F;\n}\n.igv-gear-menu-column > div > div:hover {\n cursor: pointer;\n color: #444;\n}\n\n/*# sourceMappingURL=dom.css.map */\n';
|
|
54045
|
+
var css = '.igv-navbar {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n color: #444;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n line-height: 32px;\n padding-left: 8px;\n padding-right: 8px;\n margin-top: 2px;\n margin-bottom: 6px;\n height: 32px;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: #f3f3f3;\n}\n.igv-navbar .igv-navbar-left-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-left-container .igv-logo {\n width: 34px;\n height: 32px;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-left-container .igv-current-genome {\n height: 32px;\n margin-left: 4px;\n margin-right: 4px;\n user-select: none;\n line-height: 32px;\n vertical-align: middle;\n text-align: center;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container {\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n height: 100%;\n width: 125px;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container select {\n display: block;\n cursor: pointer;\n width: 100px;\n height: 75%;\n outline: none;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n margin-left: 8px;\n height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 210px;\n height: 22px;\n line-height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container input.igv-search-input {\n cursor: text;\n width: 85%;\n height: 22px;\n line-height: 22px;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n text-align: left;\n padding-left: 8px;\n margin-right: 8px;\n outline: none;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: white;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container .igv-search-icon-container {\n cursor: pointer;\n height: 16px;\n width: 16px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-windowsize-panel-container {\n margin-left: 4px;\n user-select: none;\n}\n.igv-navbar .igv-navbar-right-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div {\n margin-left: 0;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div:last-child {\n margin-left: 0;\n margin-right: 0;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container-750 {\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:nth-child(even) {\n display: block;\n height: fit-content;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget input {\n display: block;\n width: 125px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:nth-child(even) {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 input {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-hidden {\n display: none;\n}\n\n.igv-navbar-button {\n display: block;\n box-sizing: unset;\n padding-left: 6px;\n padding-right: 6px;\n height: 18px;\n text-transform: capitalize;\n user-select: none;\n line-height: 18px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 11px;\n font-weight: 200;\n color: #737373;\n background-color: #f3f3f3;\n border-color: #737373;\n border-style: solid;\n border-width: thin;\n border-radius: 6px;\n}\n\n.igv-navbar-button-clicked {\n color: white;\n background-color: #737373;\n}\n\n.igv-navbar-button:hover {\n cursor: pointer;\n}\n\n.igv-zoom-in-notice-container {\n z-index: 1024;\n position: absolute;\n top: 8px;\n left: 50%;\n transform: translate(-50%, 0%);\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n background-color: white;\n}\n.igv-zoom-in-notice-container > div {\n padding-left: 4px;\n padding-right: 4px;\n padding-top: 2px;\n padding-bottom: 2px;\n width: 100%;\n height: 100%;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: #3f3f3f;\n}\n\n.igv-zoom-in-notice {\n position: absolute;\n top: 10px;\n left: 50%;\n}\n.igv-zoom-in-notice div {\n position: relative;\n left: -50%;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #3f3f3f;\n background-color: rgba(255, 255, 255, 0.51);\n z-index: 64;\n}\n\n.igv-container-spinner {\n position: absolute;\n top: 90%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1024;\n width: 24px;\n height: 24px;\n pointer-events: none;\n color: #737373;\n}\n\n.igv-multi-locus-close-button {\n position: absolute;\n top: 2px;\n right: 0;\n padding-left: 2px;\n padding-right: 2px;\n width: 18px;\n height: 18px;\n color: #666666;\n background-color: white;\n z-index: 1000;\n}\n.igv-multi-locus-close-button > svg {\n vertical-align: top;\n}\n\n.igv-multi-locus-close-button:hover {\n cursor: pointer;\n color: #434343;\n}\n\n.igv-multi-locus-ruler-label {\n z-index: 64;\n position: absolute;\n top: 2px;\n left: 0;\n width: 100%;\n height: 14px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-multi-locus-ruler-label div {\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n background-color: white;\n}\n\n.igv-multi-locus-ruler-label-square-dot {\n z-index: 64;\n position: absolute;\n left: 50%;\n top: 5%;\n transform: translate(-50%, 0%);\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-multi-locus-ruler-label-square-dot > div:first-child {\n width: 14px;\n height: 14px;\n}\n.igv-multi-locus-ruler-label-square-dot > div:last-child {\n margin-left: 16px;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n}\n\n.igv-multi-locus-ruler-label:hover {\n cursor: pointer;\n}\n\n.igv-ruler-sweeper {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 26px;\n bottom: 0;\n left: 0;\n width: 0;\n z-index: 99999;\n background-color: rgba(68, 134, 247, 0.25);\n}\n\n.igv-ruler-tooltip {\n pointer-events: none;\n z-index: 128;\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n height: 32px;\n background-color: transparent;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-ruler-tooltip > div {\n pointer-events: none;\n width: 128px;\n height: auto;\n padding: 1px;\n color: #373737;\n font-size: 10px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n background-color: white;\n border-style: solid;\n border-width: thin;\n border-color: #373737;\n}\n\n.igv-track-label {\n position: absolute;\n left: 8px;\n top: 8px;\n width: auto;\n height: auto;\n max-width: 200px;\n padding-left: 4px;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n text-align: center;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-color: #444;\n border-radius: 2px;\n border-style: solid;\n border-width: thin;\n background-color: white;\n z-index: 128;\n cursor: pointer;\n}\n\n.igv-track-label:hover,\n.igv-track-label:focus,\n.igv-track-label:active {\n background-color: #e8e8e8;\n}\n\n.igv-track-label-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-top: 4px;\n}\n\n.igv-center-line {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n z-index: 8;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-left-style: dashed;\n border-left-width: thin;\n border-right-style: dashed;\n border-right-width: thin;\n}\n\n.igv-center-line-wide {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(127, 127, 127, 0.51);\n}\n\n.igv-center-line-thin {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(0, 0, 0, 0);\n}\n\n.igv-cursor-guide-horizontal {\n display: none;\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n left: 0;\n right: 0;\n top: 50%;\n height: 1px;\n z-index: 1;\n margin-left: 50px;\n margin-right: 54px;\n border-top-style: dotted;\n border-top-width: thin;\n border-top-color: rgba(127, 127, 127, 0.76);\n}\n\n.igv-cursor-guide-vertical {\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n width: 1px;\n z-index: 1;\n border-left-style: dotted;\n border-left-width: thin;\n border-left-color: rgba(127, 127, 127, 0.76);\n display: none;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-generic-dialog-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 300px;\n height: 200px;\n border-color: #7F7F7F;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n z-index: 2048;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-generic-dialog-container .igv-generic-dialog-one-liner {\n color: #373737;\n width: 95%;\n height: 24px;\n line-height: 24px;\n text-align: left;\n margin-top: 8px;\n padding-left: 8px;\n overflow-wrap: break-word;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input {\n margin-top: 8px;\n width: 95%;\n height: 24px;\n color: #373737;\n line-height: 24px;\n padding-left: 8px;\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input div {\n width: 30%;\n height: 100%;\n font-size: 16px;\n text-align: right;\n padding-right: 8px;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n width: 50%;\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input {\n margin-top: 8px;\n width: calc(100% - 16px);\n height: 24px;\n color: #373737;\n line-height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel {\n width: 100%;\n height: 28px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div {\n margin-top: 32px;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n width: 75px;\n height: 28px;\n line-height: 28px;\n text-align: center;\n border-color: transparent;\n border-style: solid;\n border-width: thin;\n border-radius: 2px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child {\n margin-left: 32px;\n margin-right: 0;\n background-color: #5ea4e0;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child {\n margin-left: 0;\n margin-right: 32px;\n background-color: #c4c4c4;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child:hover {\n cursor: pointer;\n background-color: #3b5c7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child:hover {\n cursor: pointer;\n background-color: #7f7f7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok {\n width: 100%;\n height: 36px;\n margin-top: 32px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div {\n width: 98px;\n height: 36px;\n line-height: 36px;\n text-align: center;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n border-color: white;\n border-style: solid;\n border-width: thin;\n border-radius: 4px;\n background-color: #2B81AF;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div:hover {\n cursor: pointer;\n background-color: #25597f;\n}\n\n.igv-generic-container {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 2048;\n background-color: white;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-container div:first-child {\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n height: 24px;\n width: 100%;\n background-color: #dddddd;\n}\n.igv-generic-container div:first-child i {\n display: block;\n color: #5f5f5f;\n cursor: pointer;\n width: 14px;\n height: 14px;\n margin-right: 8px;\n margin-bottom: 4px;\n}\n\n.igv-menu-popup {\n position: absolute;\n top: 0;\n left: 0;\n width: max-content;\n z-index: 4096;\n cursor: pointer;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background: white;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-end;\n text-align: left;\n}\n.igv-menu-popup > div:not(:first-child) {\n width: 100%;\n}\n.igv-menu-popup > div:not(:first-child) > div {\n background: white;\n}\n.igv-menu-popup > div:not(:first-child) > div.context-menu {\n padding-left: 4px;\n padding-right: 4px;\n}\n.igv-menu-popup > div:not(:first-child) > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-menu-popup > div:not(:first-child) > div:hover {\n background: #efefef;\n}\n\n.igv-menu-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-bottom: 1px;\n padding-top: 1px;\n}\n\n.igv-menu-popup-header {\n position: relative;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-menu-popup-header div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-menu-popup-header div:hover {\n cursor: pointer;\n color: #444;\n}\n\n.igv-menu-popup-check-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 100%;\n height: 20px;\n margin-right: 4px;\n background-color: transparent;\n}\n.igv-menu-popup-check-container div {\n padding-top: 2px;\n padding-left: 8px;\n}\n.igv-menu-popup-check-container div:first-child {\n position: relative;\n width: 12px;\n height: 12px;\n}\n.igv-menu-popup-check-container div:first-child svg {\n position: absolute;\n width: 12px;\n height: 12px;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-loading-spinner-container {\n z-index: 1024;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 32px;\n height: 32px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-loading-spinner-container > div {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n border: 4px solid rgba(128, 128, 128, 0.5);\n border-top-color: rgb(255, 255, 255);\n animation: spin 1s ease-in-out infinite;\n -webkit-animation: spin 1s ease-in-out infinite;\n}\n\n@keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n@-webkit-keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n.igv-roi-menu-next-gen {\n position: absolute;\n z-index: 512;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background-color: white;\n width: 192px;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu-next-gen > div:first-child {\n height: 24px;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-roi-menu-next-gen > div:first-child > div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-roi-menu-next-gen > div:first-child > div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-menu-next-gen > div:last-child {\n background-color: white;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n text-align: start;\n vertical-align: middle;\n cursor: pointer;\n}\n.igv-roi-menu-next-gen > div:last-child > div {\n height: 24px;\n padding-left: 4px;\n border-bottom-style: solid;\n border-bottom-width: thin;\n border-bottom-color: #7f7f7f;\n}\n.igv-roi-menu-next-gen > div:last-child > div:not(:first-child):hover {\n background-color: rgba(127, 127, 127, 0.1);\n}\n.igv-roi-menu-next-gen > div:last-child div:first-child {\n cursor: default;\n font-style: italic;\n text-align: center;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-menu-next-gen > div:last-child > div:last-child {\n border-bottom-width: 0;\n border-bottom-color: transparent;\n}\n\n.igv-roi-placeholder {\n font-style: normal;\n color: rgba(75, 75, 75, 0.6);\n}\n\n.igv-roi-table {\n position: absolute;\n z-index: 1024;\n width: fit-content;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table > div:first-child > div:first-child {\n text-align: center;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(1) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(2) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(3) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(4) {\n width: 30%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(5) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-row-container {\n resize: both;\n overflow: scroll;\n min-width: 512px;\n min-height: 72px;\n height: 144px;\n max-height: 480px;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(1) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(2) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(3) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(4) {\n width: 30%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(5) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-four-column {\n position: absolute;\n z-index: 1024;\n width: fit-content;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table-four-column > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table-four-column > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table-four-column > div:first-child > div:first-child {\n text-align: center;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table-four-column > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table-four-column > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table-four-column > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(1) {\n width: 25%;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(2) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(3) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(4) {\n width: 35%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container {\n resize: both;\n overflow: scroll;\n min-width: 512px;\n min-height: 72px;\n height: 144px;\n max-height: 480px;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(1) {\n width: 25%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(2) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(3) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(4) {\n width: 35%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table-four-column > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-row-selected {\n background-color: rgba(0, 0, 0, 0.125);\n}\n\n.igv-roi-table-button {\n height: 20px;\n user-select: none;\n line-height: 20px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 13px;\n font-weight: 400;\n color: black;\n padding-left: 6px;\n padding-right: 6px;\n background-color: rgb(239, 239, 239);\n border-color: black;\n border-style: solid;\n border-width: thin;\n border-radius: 3px;\n}\n\n.igv-roi-table-button:hover {\n cursor: pointer;\n font-weight: 400;\n background-color: rgba(0, 0, 0, 0.13);\n}\n\n.igv-roi-region {\n z-index: 64;\n position: absolute;\n top: 0;\n bottom: 0;\n pointer-events: none;\n overflow: visible;\n margin-top: 44px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-region > div {\n position: relative;\n width: 100%;\n height: 8px;\n cursor: pointer;\n pointer-events: auto;\n}\n\n.igv-roi-menu {\n position: absolute;\n z-index: 1024;\n width: 144px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu > div:not(:last-child) {\n border-bottom-color: rgba(128, 128, 128, 0.5);\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-menu > div:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-color: transparent;\n border-top-style: solid;\n border-top-width: 0;\n}\n.igv-roi-menu > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n}\n\n.igv-roi-menu-row {\n height: 24px;\n padding-left: 8px;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n background-color: white;\n}\n\n.igv-roi-menu-row-edit-description {\n width: -webkit-fill-available;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n background-color: white;\n padding-left: 4px;\n padding-right: 4px;\n padding-bottom: 4px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-menu-row-edit-description > label {\n margin-left: 2px;\n margin-bottom: 0;\n display: block;\n width: -webkit-fill-available;\n}\n.igv-roi-menu-row-edit-description > input {\n display: block;\n margin-left: 2px;\n margin-right: 2px;\n margin-bottom: 1px;\n width: -webkit-fill-available;\n}\n\n.igv-container {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n padding-top: 4px;\n user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n}\n\n.igv-viewport {\n position: relative;\n margin-top: 5px;\n line-height: 1;\n overflow-x: hidden;\n overflow-y: hidden;\n}\n\n.igv-viewport-content {\n position: relative;\n width: 100%;\n}\n.igv-viewport-content > canvas {\n position: relative;\n display: block;\n}\n\n.igv-column-container {\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n width: 100%;\n}\n\n.igv-column-shim {\n width: 1px;\n margin-left: 2px;\n margin-right: 2px;\n background-color: #545453;\n}\n\n.igv-column {\n position: relative;\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-axis-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 50px;\n}\n.igv-axis-column > div {\n margin-top: 5px;\n width: 100%;\n}\n\n.igv-sample-name-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-scrollbar-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 14px;\n}\n.igv-scrollbar-column > div {\n position: relative;\n margin-top: 5px;\n width: 14px;\n}\n.igv-scrollbar-column > div > div {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 2px;\n width: 8px;\n border-width: 1px;\n border-style: solid;\n border-color: #c4c4c4;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.igv-scrollbar-column > div > div:hover {\n background-color: #c4c4c4;\n}\n\n.igv-track-drag-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 12px;\n background-color: white;\n}\n.igv-track-drag-column > .igv-track-drag-handle {\n z-index: 512;\n position: relative;\n cursor: pointer;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n background-color: #c4c4c4;\n}\n.igv-track-drag-column .igv-track-drag-handle-hover {\n background-color: #787878;\n}\n.igv-track-drag-column > .igv-track-drag-shim {\n position: relative;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n}\n\n.igv-gear-menu-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 28px;\n}\n.igv-gear-menu-column > div {\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n margin-top: 5px;\n width: 100%;\n background: white;\n}\n.igv-gear-menu-column > div > div {\n position: relative;\n margin-top: 4px;\n width: 16px;\n height: 16px;\n color: #7F7F7F;\n}\n.igv-gear-menu-column > div > div:hover {\n cursor: pointer;\n color: #444;\n}\n\n/*# sourceMappingURL=dom.css.map */\n';
|
|
53987
54046
|
|
|
53988
54047
|
var style = document.createElement('style');
|
|
53989
54048
|
style.setAttribute('type', 'text/css');
|