igv 2.15.3 → 2.15.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 +340 -317
- package/dist/igv.esm.min.js +6 -6
- package/dist/igv.esm.min.js.map +1 -1
- package/dist/igv.js +340 -317
- package/dist/igv.min.js +6 -6
- package/dist/igv.min.js.map +1 -1
- package/package.json +3 -3
package/dist/igv.js
CHANGED
|
@@ -18584,6 +18584,7 @@
|
|
|
18584
18584
|
});
|
|
18585
18585
|
this.RANGE_WARNING_GIVEN = false;
|
|
18586
18586
|
this.oauth = new Oauth();
|
|
18587
|
+
this.contentLengthMap = new Map();
|
|
18587
18588
|
}
|
|
18588
18589
|
|
|
18589
18590
|
setApiKey(key) {
|
|
@@ -18661,6 +18662,18 @@
|
|
|
18661
18662
|
}
|
|
18662
18663
|
}
|
|
18663
18664
|
|
|
18665
|
+
async getContentLength(url, options) {
|
|
18666
|
+
if (!this.contentLengthMap.has(url)) {
|
|
18667
|
+
options = options || {};
|
|
18668
|
+
options.method = 'HEAD';
|
|
18669
|
+
options.GET_CONTENT_LENGTH = true;
|
|
18670
|
+
const contentLengthString = await this._loadURL(url, options);
|
|
18671
|
+
const contentLength = contentLengthString ? Number.parseInt(contentLengthString) : -1;
|
|
18672
|
+
this.contentLengthMap.set(url, contentLength);
|
|
18673
|
+
}
|
|
18674
|
+
return this.contentLengthMap.get(url)
|
|
18675
|
+
}
|
|
18676
|
+
|
|
18664
18677
|
async _loadURL(url, options) {
|
|
18665
18678
|
|
|
18666
18679
|
const self = this;
|
|
@@ -18675,6 +18688,11 @@
|
|
|
18675
18688
|
oauthToken = await (typeof oauthToken === 'function' ? oauthToken() : oauthToken);
|
|
18676
18689
|
}
|
|
18677
18690
|
|
|
18691
|
+
let contentLength = -1;
|
|
18692
|
+
if (options.range && !isAmazonV4Signed(url) && !isGoogleStorageSigned(url)) {
|
|
18693
|
+
contentLength = await this.getContentLength(url);
|
|
18694
|
+
}
|
|
18695
|
+
|
|
18678
18696
|
return new Promise(function (resolve, reject) {
|
|
18679
18697
|
|
|
18680
18698
|
// Various Google tansformations
|
|
@@ -18700,13 +18718,6 @@
|
|
|
18700
18718
|
}
|
|
18701
18719
|
const range = options.range;
|
|
18702
18720
|
|
|
18703
|
-
// const isChrome = navigator.userAgent.indexOf('Chrome') > -1
|
|
18704
|
-
// const isSafari = navigator.vendor.indexOf("Apple") === 0 && /\sSafari\//.test(navigator.userAgent)
|
|
18705
|
-
// if (range && isChrome && !isAmazonV4Signed(url) && !isGoogleStorageSigned(url)) {
|
|
18706
|
-
// // Hack to prevent caching for byte-ranges. Attempt to fix net:err-cache errors in Chrome
|
|
18707
|
-
// url += url.includes("?") ? "&" : "?"
|
|
18708
|
-
// url += "someRandomSeed=" + Math.random().toString(36)
|
|
18709
|
-
// }
|
|
18710
18721
|
|
|
18711
18722
|
const xhr = new XMLHttpRequest();
|
|
18712
18723
|
const sendData = options.sendData || options.body;
|
|
@@ -18722,7 +18733,13 @@
|
|
|
18722
18733
|
}
|
|
18723
18734
|
|
|
18724
18735
|
if (range) {
|
|
18725
|
-
|
|
18736
|
+
let rangeEnd = "";
|
|
18737
|
+
if (range.size) {
|
|
18738
|
+
rangeEnd = range.start + range.size - 1;
|
|
18739
|
+
if (contentLength > 0) {
|
|
18740
|
+
rangeEnd = Math.min(rangeEnd, contentLength - 1);
|
|
18741
|
+
}
|
|
18742
|
+
}
|
|
18726
18743
|
xhr.setRequestHeader("Range", "bytes=" + range.start + "-" + rangeEnd);
|
|
18727
18744
|
// xhr.setRequestHeader("Cache-Control", "no-cache"); <= This can cause CORS issues, disabled for now
|
|
18728
18745
|
}
|
|
@@ -18748,6 +18765,11 @@
|
|
|
18748
18765
|
}
|
|
18749
18766
|
|
|
18750
18767
|
xhr.onload = async function (event) {
|
|
18768
|
+
|
|
18769
|
+
if (options.GET_CONTENT_LENGTH) {
|
|
18770
|
+
resolve(xhr.getResponseHeader('content-length'));
|
|
18771
|
+
}
|
|
18772
|
+
|
|
18751
18773
|
// when the url points to a local file, the status is 0 but that is not an error
|
|
18752
18774
|
if (xhr.status === 0 || (xhr.status >= 200 && xhr.status <= 300)) {
|
|
18753
18775
|
if (range && xhr.status !== 206 && range.start !== 0) {
|
|
@@ -18780,6 +18802,7 @@
|
|
|
18780
18802
|
}
|
|
18781
18803
|
};
|
|
18782
18804
|
|
|
18805
|
+
|
|
18783
18806
|
xhr.onerror = function (event) {
|
|
18784
18807
|
if (isGoogleURL(url) && !options.retries) {
|
|
18785
18808
|
tryGoogleAuth();
|
|
@@ -18911,7 +18934,6 @@
|
|
|
18911
18934
|
}
|
|
18912
18935
|
|
|
18913
18936
|
|
|
18914
|
-
|
|
18915
18937
|
/**
|
|
18916
18938
|
* Return a Google oAuth token, triggering a sign in if required. This method should not be called until we know
|
|
18917
18939
|
* a token is required, that is until we've tried the url and received a 401, 403, or 404.
|
|
@@ -19070,6 +19092,11 @@
|
|
|
19070
19092
|
}
|
|
19071
19093
|
}
|
|
19072
19094
|
|
|
19095
|
+
function isAmazonV4Signed(url) {
|
|
19096
|
+
return url.indexOf("X-Amz-Signature") > -1
|
|
19097
|
+
}
|
|
19098
|
+
|
|
19099
|
+
|
|
19073
19100
|
const igvxhr = new IGVXhr();
|
|
19074
19101
|
|
|
19075
19102
|
/*
|
|
@@ -23950,7 +23977,7 @@
|
|
|
23950
23977
|
}
|
|
23951
23978
|
};
|
|
23952
23979
|
|
|
23953
|
-
const _version = "2.15.
|
|
23980
|
+
const _version = "2.15.5";
|
|
23954
23981
|
function version() {
|
|
23955
23982
|
return _version
|
|
23956
23983
|
}
|
|
@@ -24002,7 +24029,7 @@
|
|
|
24002
24029
|
|
|
24003
24030
|
// Delay loading cytbands untils after genome initialization to use chromosome aliases (1 vs chr1, etc).
|
|
24004
24031
|
if (cytobandUrl) {
|
|
24005
|
-
genome.cytobands
|
|
24032
|
+
genome.cytobands = await loadCytobands(cytobandUrl, sequence.config, genome);
|
|
24006
24033
|
}
|
|
24007
24034
|
|
|
24008
24035
|
return genome
|
|
@@ -24104,7 +24131,7 @@
|
|
|
24104
24131
|
this.sequence = sequence;
|
|
24105
24132
|
this.chromosomeNames = sequence.chromosomeNames;
|
|
24106
24133
|
this.chromosomes = sequence.chromosomes; // An object (functions as a dictionary)
|
|
24107
|
-
this.featureDB =
|
|
24134
|
+
this.featureDB = new Map(); // Hash of name -> feature, used for search function.
|
|
24108
24135
|
|
|
24109
24136
|
this.wholeGenomeView = config.wholeGenomeView === undefined || config.wholeGenomeView;
|
|
24110
24137
|
if (this.wholeGenomeView && Object.keys(sequence.chromosomes).length > 1) {
|
|
@@ -24308,6 +24335,40 @@
|
|
|
24308
24335
|
chr = this.getChromosomeName(chr);
|
|
24309
24336
|
return this.sequence.getSequence(chr, start, end)
|
|
24310
24337
|
}
|
|
24338
|
+
|
|
24339
|
+
addFeaturesToDB(featureList, config) {
|
|
24340
|
+
|
|
24341
|
+
const insertFeature = (name, feature) => {
|
|
24342
|
+
const current = this.featureDB.get(name);
|
|
24343
|
+
if (current) {
|
|
24344
|
+
feature = (feature.end - feature.start) > (current.end - current.start) ? feature : current;
|
|
24345
|
+
|
|
24346
|
+
}
|
|
24347
|
+
this.featureDB.set(name, feature);
|
|
24348
|
+
};
|
|
24349
|
+
|
|
24350
|
+
for (let feature of featureList) {
|
|
24351
|
+
if (feature.name) {
|
|
24352
|
+
insertFeature(feature.name.toUpperCase(), feature);
|
|
24353
|
+
}
|
|
24354
|
+
if (feature.gene && feature.gene.name) {
|
|
24355
|
+
insertFeature(feature.gene.name.toUpperCase(), feature);
|
|
24356
|
+
}
|
|
24357
|
+
|
|
24358
|
+
if (config.searchableFields) {
|
|
24359
|
+
for (let f of config.searchableFields) {
|
|
24360
|
+
const value = feature.getAttributeValue(f);
|
|
24361
|
+
if (value) {
|
|
24362
|
+
if (value.indexOf(" ") > 0) {
|
|
24363
|
+
insertFeature(value.replaceAll(" ", "+").toUpperCase(), feature);
|
|
24364
|
+
} else {
|
|
24365
|
+
insertFeature(value.toUpperCase(), feature);
|
|
24366
|
+
}
|
|
24367
|
+
}
|
|
24368
|
+
}
|
|
24369
|
+
}
|
|
24370
|
+
}
|
|
24371
|
+
}
|
|
24311
24372
|
}
|
|
24312
24373
|
|
|
24313
24374
|
async function loadCytobands(cytobandUrl, config, genome) {
|
|
@@ -27035,8 +27096,6 @@
|
|
|
27035
27096
|
* THE SOFTWARE.
|
|
27036
27097
|
*/
|
|
27037
27098
|
|
|
27038
|
-
const DEFAULT_COLOR$1 = 'rgb(150,150,150)';
|
|
27039
|
-
|
|
27040
27099
|
const fixColor = (colorString) => {
|
|
27041
27100
|
if (isString$2(colorString)) {
|
|
27042
27101
|
return (colorString.indexOf(",") > 0 && !(colorString.startsWith("rgb(") || colorString.startsWith("rgba("))) ?
|
|
@@ -27055,6 +27114,15 @@
|
|
|
27055
27114
|
*/
|
|
27056
27115
|
class TrackBase {
|
|
27057
27116
|
|
|
27117
|
+
static defaults = {
|
|
27118
|
+
height: 50,
|
|
27119
|
+
color: 'rgb(0, 0, 150)',
|
|
27120
|
+
altColor: 'rgb(0, 0, 150)',
|
|
27121
|
+
autoHeight: false,
|
|
27122
|
+
visibilityWindow: undefined,
|
|
27123
|
+
supportHiDPI: true
|
|
27124
|
+
}
|
|
27125
|
+
|
|
27058
27126
|
constructor(config, browser) {
|
|
27059
27127
|
this.browser = browser;
|
|
27060
27128
|
this.init(config);
|
|
@@ -27068,15 +27136,25 @@
|
|
|
27068
27136
|
*/
|
|
27069
27137
|
init(config) {
|
|
27070
27138
|
|
|
27139
|
+
this.config = config;
|
|
27140
|
+
|
|
27071
27141
|
if (config.displayMode) {
|
|
27072
27142
|
config.displayMode = config.displayMode.toUpperCase();
|
|
27073
27143
|
}
|
|
27074
27144
|
|
|
27075
|
-
|
|
27076
|
-
|
|
27077
|
-
this.
|
|
27078
|
-
|
|
27079
|
-
|
|
27145
|
+
// Set default properties
|
|
27146
|
+
const defaults = Object.assign({}, TrackBase.defaults);
|
|
27147
|
+
if(this.constructor.defaults) {
|
|
27148
|
+
for(let key of Object.keys(this.constructor.defaults)) {
|
|
27149
|
+
defaults[key] = this.constructor.defaults[key];
|
|
27150
|
+
}
|
|
27151
|
+
}
|
|
27152
|
+
for(let key of Object.keys(defaults)) {
|
|
27153
|
+
this[key] = config.hasOwnProperty(key) ? config[key] : defaults[key];
|
|
27154
|
+
if(key === 'color' || key === 'altColor') {
|
|
27155
|
+
this[key] = fixColor(this[key]);
|
|
27156
|
+
}
|
|
27157
|
+
}
|
|
27080
27158
|
|
|
27081
27159
|
if (config.name || config.label) {
|
|
27082
27160
|
this.name = config.name || config.label;
|
|
@@ -27086,29 +27164,15 @@
|
|
|
27086
27164
|
this.name = getFilename$2(config.url);
|
|
27087
27165
|
}
|
|
27088
27166
|
|
|
27167
|
+
this.url = config.url;
|
|
27168
|
+
if(this.config.type) this.type = this.config.type;
|
|
27089
27169
|
this.id = this.config.id === undefined ? this.name : this.config.id;
|
|
27090
|
-
|
|
27091
27170
|
this.order = config.order;
|
|
27092
|
-
|
|
27093
|
-
if (config.color) this.color = fixColor(config.color);
|
|
27094
|
-
if (config.altColor) this.altColor = fixColor(config.altColor);
|
|
27095
|
-
if ("civic-ws" === config.sourceType) { // Ugly proxy for specialized track type
|
|
27096
|
-
this.defaultColor = "rgb(155,20,20)";
|
|
27097
|
-
} else {
|
|
27098
|
-
this.defaultColor = "rgb(0,0,150)";
|
|
27099
|
-
}
|
|
27100
|
-
|
|
27101
27171
|
this.autoscaleGroup = config.autoscaleGroup;
|
|
27102
|
-
|
|
27103
27172
|
this.removable = config.removable === undefined ? true : config.removable; // Defaults to true
|
|
27104
|
-
|
|
27105
|
-
this.height = config.height || 100;
|
|
27106
|
-
this.autoHeight = config.autoHeight;
|
|
27107
27173
|
this.minHeight = config.minHeight || Math.min(25, this.height);
|
|
27108
27174
|
this.maxHeight = config.maxHeight || Math.max(1000, this.height);
|
|
27109
27175
|
|
|
27110
|
-
this.visibilityWindow = config.visibilityWindow;
|
|
27111
|
-
|
|
27112
27176
|
if (config.onclick) {
|
|
27113
27177
|
this.onclick = config.onclick;
|
|
27114
27178
|
config.onclick = undefined; // functions cannot be saved in sessions, clear it here.
|
|
@@ -27165,17 +27229,18 @@
|
|
|
27165
27229
|
}
|
|
27166
27230
|
|
|
27167
27231
|
/**
|
|
27168
|
-
*
|
|
27169
|
-
*
|
|
27170
|
-
* current state. Only simple properties (string, number, boolean) are updated.
|
|
27232
|
+
* Used to create session object for bookmarking, sharing. Only simple property values (string, number, boolean)
|
|
27233
|
+
* are saved.
|
|
27171
27234
|
*/
|
|
27172
27235
|
getState() {
|
|
27173
27236
|
|
|
27237
|
+
const jsonable = (v) => !(v === undefined || typeof v === 'function' || v instanceof File || v instanceof Promise);
|
|
27238
|
+
|
|
27174
27239
|
// Create copy of config, minus transient properties (convention is name starts with '_'). Also, all
|
|
27175
27240
|
// function properties are transient as they cannot be saved in json
|
|
27176
27241
|
const state = {};
|
|
27177
27242
|
for (let key of Object.keys(this.config)) {
|
|
27178
|
-
if (!key.startsWith("_") &&
|
|
27243
|
+
if (!key.startsWith("_") && jsonable(this.config[key])) {
|
|
27179
27244
|
state[key] = this.config[key];
|
|
27180
27245
|
}
|
|
27181
27246
|
}
|
|
@@ -27189,8 +27254,18 @@
|
|
|
27189
27254
|
}
|
|
27190
27255
|
}
|
|
27191
27256
|
|
|
27192
|
-
|
|
27193
|
-
|
|
27257
|
+
// If user has changed other properties from defaults update state.
|
|
27258
|
+
const defs = TrackBase.defaults;
|
|
27259
|
+
if (this.constructor.defaults) {
|
|
27260
|
+
for (let key of Object.keys(this.constructor.defaults)) {
|
|
27261
|
+
defs[key] = this.constructor.defaults[key];
|
|
27262
|
+
}
|
|
27263
|
+
}
|
|
27264
|
+
for (let key of Object.keys(defs)) {
|
|
27265
|
+
if (undefined !== this[key] && defs[key] !== this[key]) {
|
|
27266
|
+
state[key] = this[key];
|
|
27267
|
+
}
|
|
27268
|
+
}
|
|
27194
27269
|
|
|
27195
27270
|
// Flatten dataRange if present
|
|
27196
27271
|
if (!this.autoscale && this.dataRange) {
|
|
@@ -27198,22 +27273,6 @@
|
|
|
27198
27273
|
state.max = this.dataRange.max;
|
|
27199
27274
|
}
|
|
27200
27275
|
|
|
27201
|
-
|
|
27202
|
-
// Check for non-json-if-yable properties. Perhaps we should test what can be saved.
|
|
27203
|
-
for (let key of Object.keys(state)) {
|
|
27204
|
-
const value = state[key];
|
|
27205
|
-
if (typeof value === 'function') {
|
|
27206
|
-
throw Error(`Property '${key}' of track '${this.name} is a function. Functions cannot be saved in sessions.`)
|
|
27207
|
-
}
|
|
27208
|
-
if (value instanceof File) { // Test specifically for File. Other types of File-like objects might be savable
|
|
27209
|
-
const str = `Track ${this.name} is a local file. Sessions cannot be saved with local file references.`;
|
|
27210
|
-
throw Error(str)
|
|
27211
|
-
}
|
|
27212
|
-
if (value instanceof Promise) {
|
|
27213
|
-
throw Error(`Property '${key}' of track '${this.name} is a Promise. Promises cannot be saved in sessions.`)
|
|
27214
|
-
}
|
|
27215
|
-
}
|
|
27216
|
-
|
|
27217
27276
|
return state
|
|
27218
27277
|
}
|
|
27219
27278
|
|
|
@@ -27509,7 +27568,7 @@
|
|
|
27509
27568
|
* @returns {*|string|string}
|
|
27510
27569
|
*/
|
|
27511
27570
|
getColorForFeature(f) {
|
|
27512
|
-
|
|
27571
|
+
return (typeof this.color === "function") ? this.color(feature) : this.color
|
|
27513
27572
|
}
|
|
27514
27573
|
|
|
27515
27574
|
/**
|
|
@@ -30253,7 +30312,8 @@
|
|
|
30253
30312
|
this.config = config || {};
|
|
30254
30313
|
this.genome = genome;
|
|
30255
30314
|
this.indexURL = config.indexURL;
|
|
30256
|
-
this.indexed = config.indexed;
|
|
30315
|
+
this.indexed = config.indexed || this.indexURL !== undefined;
|
|
30316
|
+
this.queryable = this.indexed;
|
|
30257
30317
|
|
|
30258
30318
|
if (isFile(this.config.url)) {
|
|
30259
30319
|
this.filename = this.config.url.name;
|
|
@@ -31913,6 +31973,7 @@
|
|
|
31913
31973
|
|
|
31914
31974
|
const queryableFormats = new Set(["bigwig", "bw", "bigbed", "bb", "biginteract", "biggenepred", "bignarrowpeak", "tdf"]);
|
|
31915
31975
|
|
|
31976
|
+
this.queryable = config.indexURL || config.queryable === true; // False by default, unless explicitly set
|
|
31916
31977
|
if (config.reader) {
|
|
31917
31978
|
// Explicit reader implementation
|
|
31918
31979
|
this.reader = config.reader;
|
|
@@ -31946,6 +32007,11 @@
|
|
|
31946
32007
|
this.queryable = true;
|
|
31947
32008
|
} else ;
|
|
31948
32009
|
}
|
|
32010
|
+
|
|
32011
|
+
// Set searchable unless explicitly turned off, or track uses in indexed or otherwise queryable
|
|
32012
|
+
// feature source. queryable => features loaded on demand (by query)
|
|
32013
|
+
this.searchable = config.searchable === true || config.searchableFields || (config.searchable !== false && !this.queryable);
|
|
32014
|
+
|
|
31949
32015
|
}
|
|
31950
32016
|
|
|
31951
32017
|
async defaultVisibilityWindow() {
|
|
@@ -32005,6 +32071,7 @@
|
|
|
32005
32071
|
// * view is "whole genome" but no features are loaded
|
|
32006
32072
|
// * cache is disabled
|
|
32007
32073
|
// * cache does not contain requested range
|
|
32074
|
+
// const containsRange = this.featureCache.containsRange(new GenomicInterval(queryChr, start, end))
|
|
32008
32075
|
if ((isWholeGenome && !this.wgFeatures && this.supportsWholeGenome()) ||
|
|
32009
32076
|
this.config.disableCache ||
|
|
32010
32077
|
!this.featureCache ||
|
|
@@ -32086,39 +32153,13 @@
|
|
|
32086
32153
|
this.featureCache = new FeatureCache$1(features, this.genome, genomicInterval);
|
|
32087
32154
|
|
|
32088
32155
|
// If track is marked "searchable"< cache features by name -- use this with caution, memory intensive
|
|
32089
|
-
if (this.
|
|
32090
|
-
this.addFeaturesToDB(features);
|
|
32156
|
+
if (this.searchable) {
|
|
32157
|
+
this.genome.addFeaturesToDB(features, this.config);
|
|
32091
32158
|
}
|
|
32092
32159
|
} else {
|
|
32093
32160
|
this.featureCache = new FeatureCache$1([], genomicInterval); // Empty cache
|
|
32094
32161
|
}
|
|
32095
32162
|
}
|
|
32096
|
-
|
|
32097
|
-
addFeaturesToDB(featureList) {
|
|
32098
|
-
for (let feature of featureList) {
|
|
32099
|
-
if (feature.name) {
|
|
32100
|
-
this.genome.featureDB[feature.name.toUpperCase()] = feature;
|
|
32101
|
-
}
|
|
32102
|
-
if (feature.gene && feature.gene.name) {
|
|
32103
|
-
this.genome.featureDB[feature.gene.name.toUpperCase()] = feature;
|
|
32104
|
-
}
|
|
32105
|
-
|
|
32106
|
-
if (this.config.searchableFields) {
|
|
32107
|
-
for (let f of this.config.searchableFields) {
|
|
32108
|
-
const value = feature.getAttributeValue(f);
|
|
32109
|
-
if (value) {
|
|
32110
|
-
if (value.indexOf(" ") > 0) {
|
|
32111
|
-
this.genome.featureDB[value.replaceAll(" ", "+").toUpperCase()] = feature;
|
|
32112
|
-
this.genome.featureDB[value.replaceAll(" ", "%20").toUpperCase()] = feature;
|
|
32113
|
-
} else {
|
|
32114
|
-
this.genome.featureDB[value.toUpperCase()] = feature;
|
|
32115
|
-
}
|
|
32116
|
-
}
|
|
32117
|
-
}
|
|
32118
|
-
}
|
|
32119
|
-
}
|
|
32120
|
-
}
|
|
32121
|
-
|
|
32122
32163
|
}
|
|
32123
32164
|
|
|
32124
32165
|
/*
|
|
@@ -32934,7 +32975,8 @@
|
|
|
32934
32975
|
|
|
32935
32976
|
const binaryParser = new BinaryParser(data);
|
|
32936
32977
|
const chromId = binaryParser.getInt();
|
|
32937
|
-
|
|
32978
|
+
const blockStart = binaryParser.getInt();
|
|
32979
|
+
let chromStart = blockStart;
|
|
32938
32980
|
let chromEnd = binaryParser.getInt();
|
|
32939
32981
|
const itemStep = binaryParser.getInt();
|
|
32940
32982
|
const itemSpan = binaryParser.getInt();
|
|
@@ -32944,6 +32986,7 @@
|
|
|
32944
32986
|
|
|
32945
32987
|
if (chromId >= chrIdx1 && chromId <= chrIdx2) {
|
|
32946
32988
|
|
|
32989
|
+
let idx = 0;
|
|
32947
32990
|
while (itemCount-- > 0) {
|
|
32948
32991
|
let value;
|
|
32949
32992
|
switch (type) {
|
|
@@ -32959,8 +33002,9 @@
|
|
|
32959
33002
|
break
|
|
32960
33003
|
case 3: // Fixed step
|
|
32961
33004
|
value = binaryParser.getFloat();
|
|
33005
|
+
chromStart = blockStart + idx * itemStep;
|
|
32962
33006
|
chromEnd = chromStart + itemSpan;
|
|
32963
|
-
|
|
33007
|
+
idx++;
|
|
32964
33008
|
break
|
|
32965
33009
|
}
|
|
32966
33010
|
|
|
@@ -32970,8 +33014,8 @@
|
|
|
32970
33014
|
if (Number.isFinite(value)) {
|
|
32971
33015
|
const chr = chrDict[chromId];
|
|
32972
33016
|
featureArray.push({chr: chr, start: chromStart, end: chromEnd, value: value});
|
|
32973
|
-
|
|
32974
33017
|
}
|
|
33018
|
+
|
|
32975
33019
|
}
|
|
32976
33020
|
}
|
|
32977
33021
|
}
|
|
@@ -33107,6 +33151,7 @@
|
|
|
33107
33151
|
this.genome = genome;
|
|
33108
33152
|
this.format = config.format || "bigwig";
|
|
33109
33153
|
this.wgValues = {};
|
|
33154
|
+
this.queryable = true;
|
|
33110
33155
|
}
|
|
33111
33156
|
|
|
33112
33157
|
async getFeatures({chr, start, end, bpPerPixel, windowFunction}) {
|
|
@@ -33648,6 +33693,7 @@
|
|
|
33648
33693
|
this.genome = genome;
|
|
33649
33694
|
this.windowFunction = config.windowFunction || "mean";
|
|
33650
33695
|
this.reader = new TDFReader(config, genome);
|
|
33696
|
+
this.queryable = true;
|
|
33651
33697
|
}
|
|
33652
33698
|
|
|
33653
33699
|
async getFeatures({chr, start, end, bpPerPixel}) {
|
|
@@ -33857,8 +33903,8 @@
|
|
|
33857
33903
|
this.config = config;
|
|
33858
33904
|
this.genome = genome;
|
|
33859
33905
|
this.queryable = false;
|
|
33906
|
+
this.searchable = config.searchable !== false; // searchable by default
|
|
33860
33907
|
this.updateFeatures(config.features);
|
|
33861
|
-
|
|
33862
33908
|
}
|
|
33863
33909
|
|
|
33864
33910
|
updateFeatures(features) {
|
|
@@ -33868,6 +33914,10 @@
|
|
|
33868
33914
|
mapProperties(features, this.config.mappings);
|
|
33869
33915
|
}
|
|
33870
33916
|
this.featureCache = new FeatureCache$1(features, this.genome);
|
|
33917
|
+
|
|
33918
|
+
if (this.searchable || this.config.searchableFields) {
|
|
33919
|
+
this.genome.addFeaturesToDB(features, this.config);
|
|
33920
|
+
}
|
|
33871
33921
|
}
|
|
33872
33922
|
|
|
33873
33923
|
/**
|
|
@@ -40061,8 +40111,8 @@
|
|
|
40061
40111
|
|
|
40062
40112
|
// Set ctx color to a known valid color. If getColorForFeature returns an invalid color string it is ignored, and
|
|
40063
40113
|
// this default will be used.
|
|
40064
|
-
ctx.fillStyle = this.
|
|
40065
|
-
ctx.strokeStyle = this.
|
|
40114
|
+
ctx.fillStyle = this.color;
|
|
40115
|
+
ctx.strokeStyle = this.color;
|
|
40066
40116
|
|
|
40067
40117
|
const color = this.getColorForFeature(feature);
|
|
40068
40118
|
ctx.fillStyle = color;
|
|
@@ -40386,6 +40436,17 @@
|
|
|
40386
40436
|
|
|
40387
40437
|
class FeatureTrack extends TrackBase {
|
|
40388
40438
|
|
|
40439
|
+
static defaults = {
|
|
40440
|
+
type: "annotation",
|
|
40441
|
+
maxRows: 1000, // protects against pathological feature packing cases (# of rows of overlapping feaures)
|
|
40442
|
+
displayMode: "EXPANDED", // COLLAPSED | EXPANDED | SQUISHED
|
|
40443
|
+
margin: 10,
|
|
40444
|
+
featureHeight: 14,
|
|
40445
|
+
autoHeight: false,
|
|
40446
|
+
useScore: false
|
|
40447
|
+
}
|
|
40448
|
+
|
|
40449
|
+
|
|
40389
40450
|
constructor(config, browser) {
|
|
40390
40451
|
super(config, browser);
|
|
40391
40452
|
}
|
|
@@ -40393,12 +40454,8 @@
|
|
|
40393
40454
|
init(config) {
|
|
40394
40455
|
super.init(config);
|
|
40395
40456
|
|
|
40396
|
-
this.type = config.type || "annotation";
|
|
40397
40457
|
|
|
40398
|
-
//
|
|
40399
|
-
this.maxRows = config.maxRows === undefined ? 1000 : config.maxRows;
|
|
40400
|
-
|
|
40401
|
-
this.displayMode = config.displayMode || "EXPANDED"; // COLLAPSED | EXPANDED | SQUISHED
|
|
40458
|
+
// Obscure option, not common or supoorted, included for backward compatibility
|
|
40402
40459
|
this.labelDisplayMode = config.labelDisplayMode;
|
|
40403
40460
|
|
|
40404
40461
|
if (config._featureSource) {
|
|
@@ -40410,12 +40467,6 @@
|
|
|
40410
40467
|
FeatureSource(config, this.browser.genome);
|
|
40411
40468
|
}
|
|
40412
40469
|
|
|
40413
|
-
// Set default heights
|
|
40414
|
-
this.autoHeight = config.autoHeight;
|
|
40415
|
-
this.margin = config.margin === undefined ? 10 : config.margin;
|
|
40416
|
-
|
|
40417
|
-
this.featureHeight = config.featureHeight || 14;
|
|
40418
|
-
|
|
40419
40470
|
if ("FusionJuncSpan" === config.type) {
|
|
40420
40471
|
this.render = config.render || renderFusionJuncSpan;
|
|
40421
40472
|
this.squishedRowHeight = config.squishedRowHeight || 50;
|
|
@@ -40452,9 +40503,6 @@
|
|
|
40452
40503
|
}
|
|
40453
40504
|
}
|
|
40454
40505
|
}
|
|
40455
|
-
|
|
40456
|
-
//UCSC useScore option
|
|
40457
|
-
this.useScore = config.useScore;
|
|
40458
40506
|
}
|
|
40459
40507
|
|
|
40460
40508
|
async postInit() {
|
|
@@ -40818,7 +40866,7 @@
|
|
|
40818
40866
|
} else if (feature.color) {
|
|
40819
40867
|
color = feature.color; // Explicit color for feature
|
|
40820
40868
|
} else {
|
|
40821
|
-
color = this.
|
|
40869
|
+
color = this.color; // Track default
|
|
40822
40870
|
}
|
|
40823
40871
|
|
|
40824
40872
|
if (feature.alpha && feature.alpha !== 1) {
|
|
@@ -40864,7 +40912,7 @@
|
|
|
40864
40912
|
|
|
40865
40913
|
function onDragEnd() {
|
|
40866
40914
|
if (track.trackView && track.displayMode !== "SQUISHED") {
|
|
40867
|
-
track.trackView.
|
|
40915
|
+
track.trackView.updateViews(); // TODO -- refine this to the viewport that was dragged after DOM refactor
|
|
40868
40916
|
}
|
|
40869
40917
|
}
|
|
40870
40918
|
|
|
@@ -40884,38 +40932,40 @@
|
|
|
40884
40932
|
|
|
40885
40933
|
this.browser = config.browser;
|
|
40886
40934
|
|
|
40887
|
-
this.
|
|
40888
|
-
if(config.width) {
|
|
40889
|
-
this.container.style.width = config.width;
|
|
40935
|
+
this.columnFormat = config.columnFormat;
|
|
40890
40936
|
|
|
40891
|
-
|
|
40937
|
+
this.tableRowSelectionList = [];
|
|
40892
40938
|
|
|
40893
|
-
|
|
40939
|
+
this.tableDOM = domUtils.div({ class: 'igv-roi-table' });
|
|
40940
|
+
// if(config.width) {
|
|
40941
|
+
// let [ w ] = config.width.split('px')
|
|
40942
|
+
// w = parseInt(w, 10)
|
|
40943
|
+
// this.tableDOM.style.width = `${Math.min(w, 1600)}px`
|
|
40944
|
+
//
|
|
40945
|
+
// }
|
|
40946
|
+
|
|
40947
|
+
config.parent.appendChild(this.tableDOM);
|
|
40894
40948
|
|
|
40895
40949
|
this.headerDOM = config;
|
|
40896
40950
|
|
|
40897
|
-
this.
|
|
40951
|
+
this.tableColumnTitles = this.tableDOM;
|
|
40898
40952
|
|
|
40899
|
-
this.
|
|
40953
|
+
this.tableRowContainer = this.tableDOM;
|
|
40900
40954
|
|
|
40901
40955
|
this.footerDOM = config.gotoButtonHandler;
|
|
40902
40956
|
|
|
40903
|
-
this.columnFormat = config.columnFormat;
|
|
40904
|
-
|
|
40905
|
-
this.tableRowSelectionList = [];
|
|
40906
|
-
|
|
40907
40957
|
}
|
|
40908
40958
|
|
|
40909
40959
|
set headerDOM({ browser, parent, headerTitle, dismissHandler }) {
|
|
40910
40960
|
|
|
40911
40961
|
// header
|
|
40912
40962
|
const dom = domUtils.div();
|
|
40913
|
-
this.
|
|
40963
|
+
this.tableDOM.appendChild(dom);
|
|
40914
40964
|
|
|
40915
40965
|
// header title
|
|
40916
40966
|
const div = domUtils.div();
|
|
40917
40967
|
dom.appendChild(div);
|
|
40918
|
-
div.
|
|
40968
|
+
div.innerHTML = headerTitle;
|
|
40919
40969
|
|
|
40920
40970
|
// table dismiss button
|
|
40921
40971
|
const dismiss = domUtils.div();
|
|
@@ -40934,46 +40984,51 @@
|
|
|
40934
40984
|
const { y:y_root } = browser.root.getBoundingClientRect();
|
|
40935
40985
|
const { y:y_parent } = parent.getBoundingClientRect();
|
|
40936
40986
|
const constraint = -(y_parent - y_root);
|
|
40937
|
-
makeDraggable(this.
|
|
40987
|
+
makeDraggable(this.tableDOM, dom, { minX:0, minY:constraint });
|
|
40938
40988
|
|
|
40939
|
-
this.
|
|
40989
|
+
this.tableDOM.style.display = 'none';
|
|
40940
40990
|
|
|
40941
40991
|
this._headerDOM = dom;
|
|
40942
40992
|
|
|
40943
40993
|
}
|
|
40944
40994
|
|
|
40945
|
-
set
|
|
40995
|
+
set tableColumnTitles(tableDOM) {
|
|
40946
40996
|
|
|
40947
|
-
const
|
|
40948
|
-
|
|
40997
|
+
const tblColumnTitles = domUtils.div({ class: 'igv-roi-table-column-titles' });
|
|
40998
|
+
tableDOM.appendChild(tblColumnTitles);
|
|
40949
40999
|
|
|
40950
|
-
for (const { label, width } of columnFormat) {
|
|
41000
|
+
for (const { label, width } of this.columnFormat) {
|
|
40951
41001
|
const col = domUtils.div();
|
|
40952
|
-
|
|
41002
|
+
tblColumnTitles.appendChild(col);
|
|
40953
41003
|
col.style.width = width;
|
|
40954
41004
|
col.innerText = label;
|
|
40955
41005
|
}
|
|
40956
41006
|
|
|
41007
|
+
this._tableColumnTitlesDOM = tblColumnTitles;
|
|
41008
|
+
|
|
41009
|
+
}
|
|
41010
|
+
|
|
41011
|
+
get tableColumnTitles() {
|
|
41012
|
+
return this._tableColumnTitlesDOM
|
|
40957
41013
|
}
|
|
40958
41014
|
|
|
40959
|
-
set
|
|
41015
|
+
set tableRowContainer(container) {
|
|
40960
41016
|
|
|
40961
|
-
const
|
|
40962
|
-
container.appendChild(
|
|
41017
|
+
const tblRowContainer = domUtils.div({ class: 'igv-roi-table-row-container' });
|
|
41018
|
+
container.appendChild(tblRowContainer);
|
|
40963
41019
|
|
|
40964
|
-
|
|
41020
|
+
this._tableRowContainerDOM = tblRowContainer;
|
|
40965
41021
|
|
|
40966
|
-
this._rowContainerDOM = dom;
|
|
40967
41022
|
}
|
|
40968
41023
|
|
|
40969
|
-
get
|
|
40970
|
-
return this.
|
|
41024
|
+
get tableRowContainer() {
|
|
41025
|
+
return this._tableRowContainerDOM
|
|
40971
41026
|
}
|
|
40972
41027
|
|
|
40973
41028
|
set footerDOM(gotoButtonHandler) {
|
|
40974
41029
|
|
|
40975
41030
|
const dom = domUtils.div();
|
|
40976
|
-
this.
|
|
41031
|
+
this.tableDOM.appendChild(dom);
|
|
40977
41032
|
|
|
40978
41033
|
// Go To Button
|
|
40979
41034
|
const gotoButton = domUtils.div({class: 'igv-roi-table-button'});
|
|
@@ -41015,7 +41070,7 @@
|
|
|
41015
41070
|
}
|
|
41016
41071
|
|
|
41017
41072
|
clearTable() {
|
|
41018
|
-
const elements = this.
|
|
41073
|
+
const elements = this.tableRowContainer.querySelectorAll('.igv-roi-table-row');
|
|
41019
41074
|
for (let el of elements) {
|
|
41020
41075
|
el.remove();
|
|
41021
41076
|
}
|
|
@@ -41027,23 +41082,23 @@
|
|
|
41027
41082
|
}
|
|
41028
41083
|
|
|
41029
41084
|
present() {
|
|
41030
|
-
this.
|
|
41085
|
+
this.tableDOM.style.left = `${ 0 }px`;
|
|
41031
41086
|
|
|
41032
41087
|
const { y:y_root } = this.browser.root.getBoundingClientRect();
|
|
41033
41088
|
const { y:y_parent } = this.config.parent.getBoundingClientRect();
|
|
41034
41089
|
|
|
41035
|
-
this.
|
|
41036
|
-
this.
|
|
41090
|
+
this.tableDOM.style.top = `${ y_root - y_parent }px`;
|
|
41091
|
+
this.tableDOM.style.display = 'flex';
|
|
41037
41092
|
}
|
|
41038
41093
|
|
|
41039
41094
|
dismiss() {
|
|
41040
|
-
this.
|
|
41095
|
+
this.tableDOM.style.display = 'none';
|
|
41041
41096
|
}
|
|
41042
41097
|
|
|
41043
41098
|
dispose() {
|
|
41044
41099
|
|
|
41045
|
-
this.
|
|
41046
|
-
this.
|
|
41100
|
+
this.tableDOM.innerHTML = '';
|
|
41101
|
+
this.tableDOM.remove();
|
|
41047
41102
|
|
|
41048
41103
|
for (const key of Object.keys(this)) {
|
|
41049
41104
|
this[key] = undefined;
|
|
@@ -41059,45 +41114,35 @@
|
|
|
41059
41114
|
|
|
41060
41115
|
constructor(config) {
|
|
41061
41116
|
|
|
41062
|
-
const cooked = Object.assign({ 'width':'
|
|
41117
|
+
const cooked = Object.assign({ 'width':'1024px' }, config);
|
|
41063
41118
|
super(cooked);
|
|
41064
41119
|
|
|
41065
41120
|
this.descriptionDOM = config;
|
|
41066
41121
|
|
|
41067
41122
|
}
|
|
41068
41123
|
|
|
41069
|
-
|
|
41070
|
-
set columnTitleDOM(columnFormat) {
|
|
41071
|
-
|
|
41072
|
-
const dom = domUtils.div({ class: 'igv-roi-table-column-titles' });
|
|
41073
|
-
this.columnTitlesDiv = dom;
|
|
41074
|
-
this.container.appendChild(dom);
|
|
41075
|
-
|
|
41076
|
-
for (const format of columnFormat) {
|
|
41077
|
-
const col = domUtils.div();
|
|
41078
|
-
dom.appendChild(col);
|
|
41079
|
-
col.style.width = format.width || 'fit-content';
|
|
41080
|
-
col.innerText = format.label;
|
|
41081
|
-
}
|
|
41082
|
-
|
|
41083
|
-
}
|
|
41084
|
-
|
|
41085
41124
|
set descriptionDOM(config) {
|
|
41086
41125
|
|
|
41087
41126
|
if (config.description) {
|
|
41088
41127
|
|
|
41089
41128
|
let dom;
|
|
41090
41129
|
|
|
41130
|
+
// BLAT result for query sequence
|
|
41091
41131
|
dom = domUtils.div({ class: 'igv-roi-table-description' });
|
|
41092
|
-
this.
|
|
41132
|
+
this.tableDOM.insertBefore(dom, this.tableColumnTitles);
|
|
41133
|
+
dom.style.height = 'auto';
|
|
41093
41134
|
dom.innerHTML = `BLAT result for query sequence:`;
|
|
41094
41135
|
|
|
41136
|
+
// CTAATCAtctacactggtttctactg ...
|
|
41095
41137
|
dom = domUtils.div({ class: 'igv-roi-table-description' });
|
|
41096
|
-
this.
|
|
41138
|
+
this.tableDOM.insertBefore(dom, this.tableColumnTitles);
|
|
41139
|
+
dom.style.height = 'auto';
|
|
41140
|
+
dom.style.maxHeight = '128px';
|
|
41097
41141
|
dom.innerHTML = config.description;
|
|
41098
41142
|
|
|
41143
|
+
// Select one or more rows ...
|
|
41099
41144
|
dom = domUtils.div({ class: 'igv-roi-table-goto-explainer' });
|
|
41100
|
-
this.
|
|
41145
|
+
this.tableDOM.insertBefore(dom, this.tableColumnTitles);
|
|
41101
41146
|
dom.innerHTML = `Select one or more rows and click Go To to view the regions`;
|
|
41102
41147
|
|
|
41103
41148
|
}
|
|
@@ -41127,13 +41172,13 @@
|
|
|
41127
41172
|
|
|
41128
41173
|
renderTable(records) {
|
|
41129
41174
|
|
|
41130
|
-
Array.from(this.
|
|
41175
|
+
Array.from(this.tableRowContainer.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
|
|
41131
41176
|
|
|
41132
41177
|
if (records.length > 0) {
|
|
41133
41178
|
|
|
41134
41179
|
for (let record of records) {
|
|
41135
41180
|
const row = this.tableRowDOM(record);
|
|
41136
|
-
this.
|
|
41181
|
+
this.tableRowContainer.appendChild(row);
|
|
41137
41182
|
}
|
|
41138
41183
|
|
|
41139
41184
|
}
|
|
@@ -41181,7 +41226,7 @@
|
|
|
41181
41226
|
|
|
41182
41227
|
event.stopPropagation();
|
|
41183
41228
|
|
|
41184
|
-
const selectedRows = this.
|
|
41229
|
+
const selectedRows = this.tableDOM.querySelectorAll('.igv-roi-table-row-selected');
|
|
41185
41230
|
|
|
41186
41231
|
const loci = [];
|
|
41187
41232
|
for (const row of selectedRows) {
|
|
@@ -41193,7 +41238,7 @@
|
|
|
41193
41238
|
loci.push(`${ chr }:${ start }-${ end }`);
|
|
41194
41239
|
}
|
|
41195
41240
|
|
|
41196
|
-
for (const el of this.
|
|
41241
|
+
for (const el of this.tableDOM.querySelectorAll('.igv-roi-table-row')) {
|
|
41197
41242
|
el.classList.remove('igv-roi-table-row-selected');
|
|
41198
41243
|
}
|
|
41199
41244
|
|
|
@@ -41388,8 +41433,6 @@
|
|
|
41388
41433
|
|
|
41389
41434
|
const alignmentStartGap = 5;
|
|
41390
41435
|
const downsampleRowHeight = 5;
|
|
41391
|
-
const DEFAULT_COVERAGE_TRACK_HEIGHT = 50;
|
|
41392
|
-
const DEFAULT_TRACK_HEIGHT$1 = 300;
|
|
41393
41436
|
const DEFAULT_ALIGNMENT_COLOR = "rgb(185, 185, 185)";
|
|
41394
41437
|
const DEFAULT_COVERAGE_COLOR = "rgb(150, 150, 150)";
|
|
41395
41438
|
const DEFAULT_CONNECTOR_COLOR = "rgb(200, 200, 200)";
|
|
@@ -41397,35 +41440,37 @@
|
|
|
41397
41440
|
|
|
41398
41441
|
class BAMTrack extends TrackBase {
|
|
41399
41442
|
|
|
41443
|
+
static defaults = {
|
|
41444
|
+
alleleFreqThreshold: 0.2,
|
|
41445
|
+
visibilityWindow: 30000,
|
|
41446
|
+
showCoverage: true,
|
|
41447
|
+
showAlignments: true,
|
|
41448
|
+
viewAsPairs: false,
|
|
41449
|
+
pairsSupported: true,
|
|
41450
|
+
showSoftClips: false,
|
|
41451
|
+
showAllBases: false,
|
|
41452
|
+
showInsertions: true,
|
|
41453
|
+
showMismatches: true,
|
|
41454
|
+
color: DEFAULT_ALIGNMENT_COLOR,
|
|
41455
|
+
coverageColor: DEFAULT_COVERAGE_COLOR,
|
|
41456
|
+
height: 300,
|
|
41457
|
+
coverageTrackHeight: 50
|
|
41458
|
+
}
|
|
41459
|
+
|
|
41400
41460
|
constructor(config, browser) {
|
|
41401
41461
|
super(config, browser);
|
|
41402
41462
|
}
|
|
41403
41463
|
|
|
41404
41464
|
init(config) {
|
|
41405
|
-
super.init(config);
|
|
41406
|
-
this.type = "alignment";
|
|
41407
|
-
|
|
41408
|
-
if (config.alleleFreqThreshold === undefined) {
|
|
41409
|
-
config.alleleFreqThreshold = 0.2;
|
|
41410
|
-
}
|
|
41411
41465
|
|
|
41466
|
+
this.type = "alignment";
|
|
41412
41467
|
this.featureSource = new BamSource(config, this.browser);
|
|
41413
|
-
|
|
41414
|
-
this.showCoverage = config.showCoverage === undefined ? true : config.showCoverage;
|
|
41415
|
-
this.showAlignments = config.showAlignments === undefined ? true : config.showAlignments;
|
|
41416
|
-
|
|
41417
41468
|
this.coverageTrack = new CoverageTrack(config, this);
|
|
41418
41469
|
this.alignmentTrack = new AlignmentTrack(config, this);
|
|
41470
|
+
|
|
41471
|
+
super.init(config);
|
|
41472
|
+
|
|
41419
41473
|
this.alignmentTrack.setTop(this.coverageTrack, this.showCoverage);
|
|
41420
|
-
this.visibilityWindow = config.visibilityWindow || 30000;
|
|
41421
|
-
this.viewAsPairs = config.viewAsPairs;
|
|
41422
|
-
this.pairsSupported = config.pairsSupported !== false;
|
|
41423
|
-
this.showSoftClips = config.showSoftClips;
|
|
41424
|
-
this.showAllBases = config.showAllBases;
|
|
41425
|
-
this.showInsertions = false !== config.showInsertions;
|
|
41426
|
-
this.showMismatches = false !== config.showMismatches;
|
|
41427
|
-
this.color = config.color;
|
|
41428
|
-
this.coverageColor = config.coverageColor;
|
|
41429
41474
|
|
|
41430
41475
|
// The sort object can be an array in the case of multi-locus view, however if multiple sort positions
|
|
41431
41476
|
// are present for a given reference frame the last one will take precedence
|
|
@@ -41438,14 +41483,12 @@
|
|
|
41438
41483
|
}
|
|
41439
41484
|
}
|
|
41440
41485
|
|
|
41441
|
-
// Invoke height setter last to allocated to coverage and alignment tracks
|
|
41442
|
-
this.height = (config.height !== undefined ? config.height : DEFAULT_TRACK_HEIGHT$1);
|
|
41443
41486
|
}
|
|
41444
41487
|
|
|
41445
41488
|
set height(h) {
|
|
41446
41489
|
this._height = h;
|
|
41447
|
-
if (this.
|
|
41448
|
-
this.alignmentTrack.height = this.showCoverage ? h - this.
|
|
41490
|
+
if (this.showAlignments) {
|
|
41491
|
+
this.alignmentTrack.height = this.showCoverage ? h - this.coverageTrackHeight : h;
|
|
41449
41492
|
}
|
|
41450
41493
|
}
|
|
41451
41494
|
|
|
@@ -41532,16 +41575,15 @@
|
|
|
41532
41575
|
* @returns {number}
|
|
41533
41576
|
*/
|
|
41534
41577
|
computePixelHeight(alignmentContainer) {
|
|
41535
|
-
return (this.showCoverage ? this.
|
|
41536
|
-
(this.showAlignments ? this.alignmentTrack.computePixelHeight(alignmentContainer) : 0)
|
|
41537
|
-
15
|
|
41578
|
+
return (this.showCoverage ? this.coverageTrackHeight : 0) +
|
|
41579
|
+
(this.showAlignments ? this.alignmentTrack.computePixelHeight(alignmentContainer) : 0)
|
|
41538
41580
|
}
|
|
41539
41581
|
|
|
41540
41582
|
draw(options) {
|
|
41541
41583
|
|
|
41542
41584
|
IGVGraphics.fillRect(options.context, 0, options.pixelTop, options.pixelWidth, options.pixelHeight, {'fillStyle': "rgb(255, 255, 255)"});
|
|
41543
41585
|
|
|
41544
|
-
if (true === this.showCoverage && this.
|
|
41586
|
+
if (true === this.showCoverage && this.coverageTrackHeight > 0) {
|
|
41545
41587
|
this.trackView.axisCanvas.style.display = 'block';
|
|
41546
41588
|
this.coverageTrack.draw(options);
|
|
41547
41589
|
} else {
|
|
@@ -41556,12 +41598,12 @@
|
|
|
41556
41598
|
|
|
41557
41599
|
paintAxis(ctx, pixelWidth, pixelHeight) {
|
|
41558
41600
|
|
|
41559
|
-
this.coverageTrack.paintAxis(ctx, pixelWidth, this.
|
|
41601
|
+
this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrackHeight);
|
|
41560
41602
|
|
|
41561
41603
|
// if (this.browser.isMultiLocusMode()) {
|
|
41562
41604
|
// ctx.clearRect(0, 0, pixelWidth, pixelHeight);
|
|
41563
41605
|
// } else {
|
|
41564
|
-
// this.coverageTrack.paintAxis(ctx, pixelWidth, this.
|
|
41606
|
+
// this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrackHeight);
|
|
41565
41607
|
// }
|
|
41566
41608
|
}
|
|
41567
41609
|
|
|
@@ -41570,7 +41612,7 @@
|
|
|
41570
41612
|
}
|
|
41571
41613
|
|
|
41572
41614
|
popupData(clickState) {
|
|
41573
|
-
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.
|
|
41615
|
+
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
|
|
41574
41616
|
return this.coverageTrack.popupData(clickState)
|
|
41575
41617
|
} else {
|
|
41576
41618
|
return this.alignmentTrack.popupData(clickState)
|
|
@@ -41585,7 +41627,7 @@
|
|
|
41585
41627
|
clickedFeatures(clickState) {
|
|
41586
41628
|
|
|
41587
41629
|
let clickedObject;
|
|
41588
|
-
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.
|
|
41630
|
+
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
|
|
41589
41631
|
clickedObject = this.coverageTrack.getClickedObject(clickState);
|
|
41590
41632
|
} else {
|
|
41591
41633
|
clickedObject = this.alignmentTrack.getClickedObject(clickState);
|
|
@@ -41594,7 +41636,7 @@
|
|
|
41594
41636
|
}
|
|
41595
41637
|
|
|
41596
41638
|
hoverText(clickState) {
|
|
41597
|
-
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.
|
|
41639
|
+
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
|
|
41598
41640
|
const clickedObject = this.coverageTrack.getClickedObject(clickState);
|
|
41599
41641
|
if (clickedObject) {
|
|
41600
41642
|
return clickedObject.hoverText()
|
|
@@ -41634,8 +41676,8 @@
|
|
|
41634
41676
|
// Show coverage / alignment options
|
|
41635
41677
|
const adjustTrackHeight = () => {
|
|
41636
41678
|
if (!this.autoHeight) {
|
|
41637
|
-
const h =
|
|
41638
|
-
(this.showCoverage ? this.
|
|
41679
|
+
const h =
|
|
41680
|
+
(this.showCoverage ? this.coverageTrackHeight : 0) +
|
|
41639
41681
|
(this.showAlignments ? this.alignmentTrack.height : 0);
|
|
41640
41682
|
this.trackView.setTrackHeight(h);
|
|
41641
41683
|
}
|
|
@@ -41949,7 +41991,6 @@
|
|
|
41949
41991
|
constructor(config, parent) {
|
|
41950
41992
|
this.parent = parent;
|
|
41951
41993
|
this.featureSource = parent.featureSource;
|
|
41952
|
-
this.height = config.coverageTrackHeight !== undefined ? config.coverageTrackHeight : DEFAULT_COVERAGE_TRACK_HEIGHT;
|
|
41953
41994
|
|
|
41954
41995
|
this.paintAxis = paintAxis;
|
|
41955
41996
|
this.top = 0;
|
|
@@ -41964,6 +42005,10 @@
|
|
|
41964
42005
|
|
|
41965
42006
|
}
|
|
41966
42007
|
|
|
42008
|
+
get height() {
|
|
42009
|
+
return this.parent.coverageTrackHeight
|
|
42010
|
+
}
|
|
42011
|
+
|
|
41967
42012
|
draw(options) {
|
|
41968
42013
|
|
|
41969
42014
|
const pixelTop = options.pixelTop;
|
|
@@ -42711,7 +42756,7 @@
|
|
|
42711
42756
|
const seqstring = clickedAlignment.seq;
|
|
42712
42757
|
if (seqstring && "*" != seqstring) {
|
|
42713
42758
|
|
|
42714
|
-
if(seqstring.length < maxSequenceSize) {
|
|
42759
|
+
if (seqstring.length < maxSequenceSize) {
|
|
42715
42760
|
list.push({
|
|
42716
42761
|
label: 'BLAT read sequence',
|
|
42717
42762
|
click: () => {
|
|
@@ -44658,25 +44703,34 @@
|
|
|
44658
44703
|
* THE SOFTWARE.
|
|
44659
44704
|
*/
|
|
44660
44705
|
|
|
44661
|
-
const DEFAULT_COLOR = "rgb(150,150,150)";
|
|
44662
|
-
|
|
44663
44706
|
class WigTrack extends TrackBase {
|
|
44664
44707
|
|
|
44708
|
+
static defaults = {
|
|
44709
|
+
height: 50,
|
|
44710
|
+
color: 'rgb(150, 150, 150)',
|
|
44711
|
+
altColor: 'rgb(150, 150, 150)',
|
|
44712
|
+
flipAxis: false,
|
|
44713
|
+
logScale: false,
|
|
44714
|
+
windowFunction: 'mean',
|
|
44715
|
+
graphType: 'bar',
|
|
44716
|
+
autoscale: true,
|
|
44717
|
+
normalize: undefined,
|
|
44718
|
+
scaleFactor: undefined
|
|
44719
|
+
}
|
|
44720
|
+
|
|
44665
44721
|
constructor(config, browser) {
|
|
44666
44722
|
super(config, browser);
|
|
44667
44723
|
}
|
|
44668
44724
|
|
|
44669
44725
|
init(config) {
|
|
44726
|
+
|
|
44670
44727
|
super.init(config);
|
|
44671
44728
|
|
|
44672
44729
|
this.type = "wig";
|
|
44673
|
-
this.height = config.height || 50;
|
|
44674
44730
|
this.featureType = 'numeric';
|
|
44675
44731
|
this.paintAxis = paintAxis;
|
|
44676
44732
|
|
|
44677
44733
|
const format = config.format ? config.format.toLowerCase() : config.format;
|
|
44678
|
-
this.flipAxis = config.flipAxis ? config.flipAxis : false;
|
|
44679
|
-
this.logScale = config.logScale ? config.logScale : false;
|
|
44680
44734
|
if (config.featureSource) {
|
|
44681
44735
|
this.featureSource = config.featureSource;
|
|
44682
44736
|
delete config.featureSource;
|
|
@@ -44688,18 +44742,16 @@
|
|
|
44688
44742
|
this.featureSource = FeatureSource(config, this.browser.genome);
|
|
44689
44743
|
}
|
|
44690
44744
|
|
|
44691
|
-
|
|
44692
|
-
|
|
44745
|
+
|
|
44746
|
+
// Override autoscale default
|
|
44747
|
+
if(config.max === undefined || config.autoscale === true) {
|
|
44748
|
+
this.autoscale = true;
|
|
44749
|
+
} else {
|
|
44693
44750
|
this.dataRange = {
|
|
44694
44751
|
min: config.min || 0,
|
|
44695
44752
|
max: config.max
|
|
44696
44753
|
};
|
|
44697
44754
|
}
|
|
44698
|
-
|
|
44699
|
-
this.windowFunction = config.windowFunction || "mean";
|
|
44700
|
-
this.graphType = config.graphType || "bar";
|
|
44701
|
-
this.normalize = config.normalize; // boolean, for use with "TDF" files
|
|
44702
|
-
this.scaleFactor = config.scaleFactor; // optional scale factor, ignored if normalize === true;
|
|
44703
44755
|
}
|
|
44704
44756
|
|
|
44705
44757
|
async postInit() {
|
|
@@ -44789,7 +44841,7 @@
|
|
|
44789
44841
|
const pixelWidth = options.pixelWidth;
|
|
44790
44842
|
options.pixelHeight;
|
|
44791
44843
|
const bpEnd = bpStart + pixelWidth * bpPerPixel + 1;
|
|
44792
|
-
const posColor = this.color ||
|
|
44844
|
+
const posColor = this.color || WigTrack.defaults.color;
|
|
44793
44845
|
|
|
44794
44846
|
let baselineColor;
|
|
44795
44847
|
if (typeof posColor === "string" && posColor.startsWith("rgb(")) {
|
|
@@ -44933,7 +44985,7 @@
|
|
|
44933
44985
|
*/
|
|
44934
44986
|
|
|
44935
44987
|
getColorForFeature(f) {
|
|
44936
|
-
let c = (f.value < 0 && this.altColor) ? this.altColor : this.color ||
|
|
44988
|
+
let c = (f.value < 0 && this.altColor) ? this.altColor : this.color || WigTrack.defaults.color;
|
|
44937
44989
|
return (typeof c === "function") ? c(f.value) : c
|
|
44938
44990
|
}
|
|
44939
44991
|
|
|
@@ -44944,20 +44996,6 @@
|
|
|
44944
44996
|
this.trackView = undefined;
|
|
44945
44997
|
}
|
|
44946
44998
|
|
|
44947
|
-
/**
|
|
44948
|
-
* Return the current state of the track. Used to create sessions and bookmarks.
|
|
44949
|
-
*
|
|
44950
|
-
* @returns {*|{}}
|
|
44951
|
-
*/
|
|
44952
|
-
getState() {
|
|
44953
|
-
|
|
44954
|
-
const config = super.getState();
|
|
44955
|
-
|
|
44956
|
-
if (this.flipAxis !== undefined) config.flipAxis = this.flipAxis;
|
|
44957
|
-
if (this.logScale !== undefined) config.logScale = this.logScale;
|
|
44958
|
-
|
|
44959
|
-
return config
|
|
44960
|
-
}
|
|
44961
44999
|
}
|
|
44962
45000
|
|
|
44963
45001
|
/**
|
|
@@ -45845,6 +45883,17 @@
|
|
|
45845
45883
|
|
|
45846
45884
|
class InteractionTrack extends TrackBase {
|
|
45847
45885
|
|
|
45886
|
+
static defaults = {
|
|
45887
|
+
height: 250,
|
|
45888
|
+
theta: Math.PI / 4,
|
|
45889
|
+
arcOrientation: true,
|
|
45890
|
+
showBlocks: true,
|
|
45891
|
+
blockHeight: 3,
|
|
45892
|
+
thickness: 1,
|
|
45893
|
+
alpha: 0.02,
|
|
45894
|
+
logScale: true,
|
|
45895
|
+
}
|
|
45896
|
+
|
|
45848
45897
|
constructor(config, browser) {
|
|
45849
45898
|
super(config, browser);
|
|
45850
45899
|
}
|
|
@@ -45852,16 +45901,10 @@
|
|
|
45852
45901
|
init(config) {
|
|
45853
45902
|
|
|
45854
45903
|
super.init(config);
|
|
45855
|
-
|
|
45904
|
+
|
|
45856
45905
|
this.sinTheta = Math.sin(this.theta);
|
|
45857
45906
|
this.cosTheta = Math.cos(this.theta);
|
|
45858
|
-
this.height = config.height || 250;
|
|
45859
45907
|
this.arcType = getArcType(config); // nested | proportional | inView | partialInView
|
|
45860
|
-
this.arcOrientation = (config.arcOrientation === undefined ? true : config.arcOrientation); // true for up, false for down
|
|
45861
|
-
this.showBlocks = config.showBlocks === undefined ? true : config.showBlocks;
|
|
45862
|
-
this.blockHeight = config.blockHeight || 3;
|
|
45863
|
-
this.thickness = config.thickness || 1;
|
|
45864
|
-
this.color = config.color;
|
|
45865
45908
|
this.alpha = config.alpha || 0.02; // was: 0.15
|
|
45866
45909
|
this.painter = {flipAxis: !this.arcOrientation, dataRange: this.dataRange, paintAxis: paintAxis};
|
|
45867
45910
|
|
|
@@ -45873,7 +45916,6 @@
|
|
|
45873
45916
|
this.valueColumn = "score";
|
|
45874
45917
|
}
|
|
45875
45918
|
|
|
45876
|
-
this.logScale = config.logScale !== false; // i.e. defaul to true (undefined => true)
|
|
45877
45919
|
if (config.max) {
|
|
45878
45920
|
this.dataRange = {
|
|
45879
45921
|
min: config.min || 0,
|
|
@@ -45898,7 +45940,7 @@
|
|
|
45898
45940
|
|
|
45899
45941
|
if (typeof this.featureSource.getHeader === "function") {
|
|
45900
45942
|
this.header = await this.featureSource.getHeader();
|
|
45901
|
-
if(this.disposed) return; // This track was removed during async load
|
|
45943
|
+
if (this.disposed) return; // This track was removed during async load
|
|
45902
45944
|
}
|
|
45903
45945
|
|
|
45904
45946
|
// Set properties from track line
|
|
@@ -45971,7 +46013,7 @@
|
|
|
45971
46013
|
feature.drawState = undefined;
|
|
45972
46014
|
|
|
45973
46015
|
let color;
|
|
45974
|
-
if(typeof this.color === 'function') {
|
|
46016
|
+
if (typeof this.color === 'function') {
|
|
45975
46017
|
color = this.color(feature);
|
|
45976
46018
|
} else {
|
|
45977
46019
|
color = this.color || feature.color || DEFAULT_ARC_COLOR;
|
|
@@ -46316,7 +46358,7 @@
|
|
|
46316
46358
|
contextMenuItemList(clickState) {
|
|
46317
46359
|
|
|
46318
46360
|
// Experimental JBrowse feature
|
|
46319
|
-
if (this.browser.circularView
|
|
46361
|
+
if (this.browser.circularView) {
|
|
46320
46362
|
const viewport = clickState.viewport;
|
|
46321
46363
|
const list = [];
|
|
46322
46364
|
|
|
@@ -46345,7 +46387,7 @@
|
|
|
46345
46387
|
|
|
46346
46388
|
// inView features are simply features that have been drawn, i.e. have a drawState
|
|
46347
46389
|
const inView = cachedFeatures.filter(f => f.drawState);
|
|
46348
|
-
if(inView.length === 0) return;
|
|
46390
|
+
if (inView.length === 0) return;
|
|
46349
46391
|
|
|
46350
46392
|
const chords = makeBedPEChords(inView);
|
|
46351
46393
|
sendChords(chords, this, refFrame, 0.5);
|
|
@@ -46381,7 +46423,7 @@
|
|
|
46381
46423
|
|
|
46382
46424
|
popupData(clickState, features) {
|
|
46383
46425
|
|
|
46384
|
-
if(features === undefined) features = this.clickedFeatures(clickState);
|
|
46426
|
+
if (features === undefined) features = this.clickedFeatures(clickState);
|
|
46385
46427
|
|
|
46386
46428
|
const data = [];
|
|
46387
46429
|
for (let feature of features) {
|
|
@@ -46405,7 +46447,7 @@
|
|
|
46405
46447
|
const columnNames = this.header.columnNames;
|
|
46406
46448
|
const stdColumns = this.header.hiccups ? 6 : 10;
|
|
46407
46449
|
for (let i = stdColumns; i < columnNames.length; i++) {
|
|
46408
|
-
if(this.header.colorColumn === i) continue;
|
|
46450
|
+
if (this.header.colorColumn === i) continue;
|
|
46409
46451
|
if (columnNames[i] === 'info') {
|
|
46410
46452
|
extractInfoColumn(data, f.extras[i - stdColumns]);
|
|
46411
46453
|
} else {
|
|
@@ -46427,7 +46469,7 @@
|
|
|
46427
46469
|
|
|
46428
46470
|
// We use the cached features rather than method to avoid async load. If the
|
|
46429
46471
|
// feature is not already loaded this won't work, but the user wouldn't be mousing over it either.
|
|
46430
|
-
const featureList =
|
|
46472
|
+
const featureList = clickState.viewport.cachedFeatures;
|
|
46431
46473
|
const candidates = [];
|
|
46432
46474
|
if (featureList) {
|
|
46433
46475
|
const proportional = (this.arcType === "proportional" || this.arcType === "inView" || this.arcType === "partialInView");
|
|
@@ -46473,26 +46515,6 @@
|
|
|
46473
46515
|
}
|
|
46474
46516
|
return candidates.map((c) => c.feature)
|
|
46475
46517
|
}
|
|
46476
|
-
|
|
46477
|
-
/**
|
|
46478
|
-
* Return the current state of the track. Used to create sessions and bookmarks.
|
|
46479
|
-
*
|
|
46480
|
-
* @returns {*|{}}
|
|
46481
|
-
*/
|
|
46482
|
-
getState() {
|
|
46483
|
-
|
|
46484
|
-
const config = super.getState();
|
|
46485
|
-
|
|
46486
|
-
// if (this.height !== undefined) config.height = this.height;
|
|
46487
|
-
if (this.arcType !== undefined) config.arcType = this.arcType;
|
|
46488
|
-
if (this.arcOrientation !== undefined) config.arcOrientation = this.arcOrientation;
|
|
46489
|
-
if (this.showBlocks !== undefined) config.showBlocks = this.showBlocks;
|
|
46490
|
-
if (this.blockHeight !== undefined) config.blockHeight = this.blockHeight;
|
|
46491
|
-
if (this.thickness !== undefined) config.thickness = this.thickness;
|
|
46492
|
-
if (this.alpha !== undefined) config.alpha = this.alpha;
|
|
46493
|
-
|
|
46494
|
-
return config
|
|
46495
|
-
}
|
|
46496
46518
|
}
|
|
46497
46519
|
|
|
46498
46520
|
function getMidpoints(feature, genome) {
|
|
@@ -46699,6 +46721,31 @@
|
|
|
46699
46721
|
|
|
46700
46722
|
class VariantTrack extends TrackBase {
|
|
46701
46723
|
|
|
46724
|
+
static defaults = {
|
|
46725
|
+
displayMode: "EXPANDED",
|
|
46726
|
+
sortDirection: "ASC",
|
|
46727
|
+
showGenotypes: true,
|
|
46728
|
+
squishedVariantHeight: 2,
|
|
46729
|
+
squishedCallHeight: 1,
|
|
46730
|
+
expandedCallHeight: 10,
|
|
46731
|
+
expandedVGap: 2,
|
|
46732
|
+
squishedVGap: 1,
|
|
46733
|
+
expandedGroupGap: 10,
|
|
46734
|
+
squishedGroupGap: 5,
|
|
46735
|
+
featureHeight: 14,
|
|
46736
|
+
noGenotypeColor: "rgb(200,180,180)",
|
|
46737
|
+
noCallColor: "rgb(225, 225, 225)",
|
|
46738
|
+
nonRefColor: "rgb(200, 200, 215)",
|
|
46739
|
+
mixedColor: "rgb(200, 220, 200)",
|
|
46740
|
+
homrefColor: "rgb(200, 200, 200)",
|
|
46741
|
+
homvarColor: "rgb(17,248,254)",
|
|
46742
|
+
hetvarColor: "rgb(34,12,253)",
|
|
46743
|
+
colorBy: undefined,
|
|
46744
|
+
visibilityWindow: undefined,
|
|
46745
|
+
labelDisplayMode: undefined,
|
|
46746
|
+
type: "variant"
|
|
46747
|
+
}
|
|
46748
|
+
|
|
46702
46749
|
constructor(config, browser) {
|
|
46703
46750
|
super(config, browser);
|
|
46704
46751
|
}
|
|
@@ -46707,41 +46754,18 @@
|
|
|
46707
46754
|
|
|
46708
46755
|
super.init(config);
|
|
46709
46756
|
|
|
46710
|
-
this.visibilityWindow = config.visibilityWindow;
|
|
46711
|
-
this.displayMode = config.displayMode || "EXPANDED"; // COLLAPSED | EXPANDED | SQUISHED
|
|
46712
|
-
this.labelDisplayMode = config.labelDisplayMode;
|
|
46713
46757
|
this.expandedVariantHeight = config.expandedVariantHeight || config.variantHeight || 10;
|
|
46714
|
-
|
|
46715
|
-
this.squishedCallHeight = config.squishedCallHeight || 1;
|
|
46716
|
-
this.expandedCallHeight = config.expandedCallHeight || 10;
|
|
46717
|
-
this.expandedVGap = config.expandedVGap !== undefined ? config.expandedVGap : 2;
|
|
46718
|
-
this.squishedVGap = config.squishedVGap !== undefined ? config.squishedVGap : 1;
|
|
46719
|
-
this.expandedGroupGap = config.expandedGroupGap || 10;
|
|
46720
|
-
this.squishedGroupGap = config.squishedGroupGap || 5;
|
|
46721
|
-
this.featureHeight = config.featureHeight || 14;
|
|
46722
|
-
this.visibilityWindow = config.visibilityWindow;
|
|
46758
|
+
|
|
46723
46759
|
this.featureSource = FeatureSource(config, this.browser.genome);
|
|
46724
|
-
|
|
46725
|
-
this.noCallColor = config.noCallColor || "rgb(225, 225, 225)";
|
|
46726
|
-
this.nonRefColor = config.nonRefColor || "rgb(200, 200, 215)";
|
|
46727
|
-
this.mixedColor = config.mixedColor || "rgb(200, 220, 200)";
|
|
46728
|
-
this.homrefColor = config.homrefColor || "rgb(200, 200, 200)";
|
|
46729
|
-
this.homvarColor = config.homvarColor || "rgb(17,248,254)";
|
|
46730
|
-
this.hetvarColor = config.hetvarColor || "rgb(34,12,253)";
|
|
46731
|
-
this.sortDirection = "ASC";
|
|
46732
|
-
this.type = config.type || "variant";
|
|
46733
|
-
|
|
46734
|
-
this.colorBy = config.colorBy; // Can be undefined => default
|
|
46760
|
+
|
|
46735
46761
|
this._initColorBy = config.colorBy;
|
|
46736
46762
|
if (config.colorTable) {
|
|
46737
46763
|
this.colorTables = new Map();
|
|
46738
46764
|
this.colorTables.set(config.colorBy, new ColorTable(config.colorTable));
|
|
46739
46765
|
}
|
|
46740
|
-
|
|
46741
46766
|
this._strokecolor = config.strokecolor;
|
|
46742
46767
|
this._context_hook = config.context_hook;
|
|
46743
46768
|
|
|
46744
|
-
this.showGenotypes = config.showGenotypes === undefined ? true : config.showGenotypes;
|
|
46745
46769
|
|
|
46746
46770
|
// The number of variant rows are computed dynamically, but start with "1" by default
|
|
46747
46771
|
this.variantRowCount(1);
|
|
@@ -46751,7 +46775,7 @@
|
|
|
46751
46775
|
async postInit() {
|
|
46752
46776
|
|
|
46753
46777
|
this.header = await this.getHeader(); // cricital, don't remove'
|
|
46754
|
-
if(this.disposed) return
|
|
46778
|
+
if (this.disposed) return // This track was removed during async load
|
|
46755
46779
|
if (undefined === this.visibilityWindow && this.config.indexed !== false) {
|
|
46756
46780
|
const fn = isFile(this.config.url) ? this.config.url.name : this.config.url;
|
|
46757
46781
|
if (isString(fn) && fn.toLowerCase().includes("gnomad")) {
|
|
@@ -46854,7 +46878,7 @@
|
|
|
46854
46878
|
this.variantBandHeight = TOP_MARGIN + rowCount * (variantHeight + vGap);
|
|
46855
46879
|
|
|
46856
46880
|
let callSets = this.callSets;
|
|
46857
|
-
if(!callSets && this._f) {
|
|
46881
|
+
if (!callSets && this._f) {
|
|
46858
46882
|
callSets = this._f.callSets; // "Complementary" variant for structural variants
|
|
46859
46883
|
}
|
|
46860
46884
|
const nCalls = this.getCallsetsLength();
|
|
@@ -46894,9 +46918,9 @@
|
|
|
46894
46918
|
|
|
46895
46919
|
//only paint stroke if a color is defined
|
|
46896
46920
|
let strokecolor = this.getVariantStrokecolor(variant);
|
|
46897
|
-
if (strokecolor){
|
|
46898
|
-
|
|
46899
|
-
|
|
46921
|
+
if (strokecolor) {
|
|
46922
|
+
context.strokeStyle = strokecolor;
|
|
46923
|
+
context.strokeRect(x, y, w, h);
|
|
46900
46924
|
}
|
|
46901
46925
|
|
|
46902
46926
|
// call hook if _context_hook fn is defined
|
|
@@ -46912,7 +46936,7 @@
|
|
|
46912
46936
|
this.sampleHeight = nVariantRows * (callHeight + vGap); // For each sample, there is a call for each variant at this position
|
|
46913
46937
|
|
|
46914
46938
|
let sampleNumber = 0;
|
|
46915
|
-
if(callSets && variant.calls) {
|
|
46939
|
+
if (callSets && variant.calls) {
|
|
46916
46940
|
for (let callSet of callSets) {
|
|
46917
46941
|
const call = variant.calls[callSet.id];
|
|
46918
46942
|
if (call) {
|
|
@@ -46988,13 +47012,12 @@
|
|
|
46988
47012
|
} else if ("MIXED" === v.type) {
|
|
46989
47013
|
variantColor = this.mixedColor;
|
|
46990
47014
|
} else {
|
|
46991
|
-
variantColor = this.
|
|
47015
|
+
variantColor = this.color;
|
|
46992
47016
|
}
|
|
46993
47017
|
return variantColor
|
|
46994
47018
|
}
|
|
46995
47019
|
|
|
46996
47020
|
|
|
46997
|
-
|
|
46998
47021
|
getVariantStrokecolor(variant) {
|
|
46999
47022
|
|
|
47000
47023
|
const v = variant._f || variant;
|
|
@@ -47010,13 +47033,13 @@
|
|
|
47010
47033
|
|
|
47011
47034
|
callContextHook(variant, context, x, y, w, h) {
|
|
47012
47035
|
if (this._context_hook) {
|
|
47013
|
-
|
|
47014
|
-
|
|
47036
|
+
if (typeof this._context_hook === "function") {
|
|
47037
|
+
const v = variant._f || variant;
|
|
47015
47038
|
|
|
47016
|
-
|
|
47017
|
-
|
|
47018
|
-
|
|
47019
|
-
|
|
47039
|
+
context.save();
|
|
47040
|
+
this._context_hook(v, context, x, y, w, h);
|
|
47041
|
+
context.restore();
|
|
47042
|
+
}
|
|
47020
47043
|
}
|
|
47021
47044
|
}
|
|
47022
47045
|
|
|
@@ -47060,7 +47083,7 @@
|
|
|
47060
47083
|
*/
|
|
47061
47084
|
popupData(clickState, featureList) {
|
|
47062
47085
|
|
|
47063
|
-
if(featureList === undefined) featureList = this.clickedFeatures(clickState);
|
|
47086
|
+
if (featureList === undefined) featureList = this.clickedFeatures(clickState);
|
|
47064
47087
|
const genomicLocation = clickState.genomicLocation;
|
|
47065
47088
|
const genomeID = this.browser.genome.id;
|
|
47066
47089
|
const sampleInformation = this.browser.sampleInformation;
|
|
@@ -47288,12 +47311,12 @@
|
|
|
47288
47311
|
sendChordsForViewport(viewport) {
|
|
47289
47312
|
const refFrame = viewport.referenceFrame;
|
|
47290
47313
|
let inView;
|
|
47291
|
-
if("all" === refFrame.chr) {
|
|
47314
|
+
if ("all" === refFrame.chr) {
|
|
47292
47315
|
const all = this.featureSource.getAllFeatures();
|
|
47293
47316
|
const arrays = Object.keys(all).map(k => all[k]);
|
|
47294
47317
|
inView = [].concat(...arrays);
|
|
47295
47318
|
} else {
|
|
47296
|
-
|
|
47319
|
+
inView = this.featureSource.featureCache.queryFeatures(refFrame.chr, refFrame.start, refFrame.end);
|
|
47297
47320
|
|
|
47298
47321
|
}
|
|
47299
47322
|
|
|
@@ -57531,7 +57554,7 @@
|
|
|
57531
57554
|
let locusObject = parseLocusString(browser, locus);
|
|
57532
57555
|
|
|
57533
57556
|
if (!locusObject) {
|
|
57534
|
-
const feature = browser.genome.featureDB
|
|
57557
|
+
const feature = browser.genome.featureDB.get(locus.toUpperCase());
|
|
57535
57558
|
if (feature) {
|
|
57536
57559
|
locusObject = {
|
|
57537
57560
|
chr: feature.chr,
|
|
@@ -59384,7 +59407,7 @@
|
|
|
59384
59407
|
|
|
59385
59408
|
renderTable(records) {
|
|
59386
59409
|
|
|
59387
|
-
Array.from(this.
|
|
59410
|
+
Array.from(this.tableRowContainer.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
|
|
59388
59411
|
|
|
59389
59412
|
if (records.length > 0) {
|
|
59390
59413
|
|
|
@@ -59392,7 +59415,7 @@
|
|
|
59392
59415
|
|
|
59393
59416
|
for (let record of sortedRecords) {
|
|
59394
59417
|
const row = this.tableRowDOM(record);
|
|
59395
|
-
this.
|
|
59418
|
+
this.tableRowContainer.appendChild(row);
|
|
59396
59419
|
}
|
|
59397
59420
|
|
|
59398
59421
|
}
|
|
@@ -59432,14 +59455,14 @@
|
|
|
59432
59455
|
|
|
59433
59456
|
event.stopPropagation();
|
|
59434
59457
|
|
|
59435
|
-
const selected = this.
|
|
59458
|
+
const selected = this.tableDOM.querySelectorAll('.igv-roi-table-row-selected');
|
|
59436
59459
|
const loci = [];
|
|
59437
59460
|
for (let el of selected) {
|
|
59438
59461
|
const { locus } = parseRegionKey(el.dataset.region);
|
|
59439
59462
|
loci.push(locus);
|
|
59440
59463
|
}
|
|
59441
59464
|
|
|
59442
|
-
for (let el of this.
|
|
59465
|
+
for (let el of this.tableDOM.querySelectorAll('.igv-roi-table-row')) {
|
|
59443
59466
|
el.classList.remove('igv-roi-table-row-selected');
|
|
59444
59467
|
}
|
|
59445
59468
|
|
|
@@ -62072,7 +62095,7 @@
|
|
|
62072
62095
|
|
|
62073
62096
|
function embedCSS() {
|
|
62074
62097
|
|
|
62075
|
-
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: 12px;\n height: 12px;\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: 12px;\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: 12px;\n color: rgb(16, 16, 16);\n background-color: white;\n}\n.igv-multi-locus-ruler-label > div {\n cursor: pointer;\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-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: 50%;\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}\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 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 cursor: default;\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-description {\n height: fit-content;\n padding: 4px;\n margin-left: 4px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n word-break: break-all;\n max-height: 300px;\n overflow-y: auto;\n}\n.igv-roi-table > .igv-roi-table-goto-explainer {\n margin-left: 4px;\n color: #7F7F7F;\n font-style: italic;\n border-top: solid lightgray;\n margin-top: 5px;\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-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\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: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: #7f7f7f;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container {\n overflow: scroll;\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: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: transparent;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:last-child {\n border-right: unset;\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 background-color: #eee;\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 cursor: pointer;\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 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 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';
|
|
62098
|
+
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: 12px;\n height: 12px;\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: 12px;\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: 12px;\n color: rgb(16, 16, 16);\n background-color: white;\n}\n.igv-multi-locus-ruler-label > div {\n cursor: pointer;\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-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: 50%;\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}\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 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: min-content;\n max-width: 1600px;\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 cursor: default;\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 white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n margin-left: 4px;\n margin-right: 4px;\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-description {\n padding: 4px;\n margin-left: 4px;\n word-break: break-all;\n overflow-y: auto;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n background-color: transparent;\n}\n.igv-roi-table > .igv-roi-table-goto-explainer {\n margin-top: 5px;\n margin-left: 4px;\n color: #7F7F7F;\n font-style: italic;\n height: 24px;\n border-top: solid lightgray;\n background-color: transparent;\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-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\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: left;\n margin-left: 4px;\n height: 24px;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: #7f7f7f;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container {\n overflow: auto;\n resize: both;\n max-width: 1600px;\n height: 360px;\n background-color: transparent;\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: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: transparent;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:last-child {\n border-right: unset;\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 background-color: #eee;\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 cursor: pointer;\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 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 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';
|
|
62076
62099
|
|
|
62077
62100
|
var style = document.createElement('style');
|
|
62078
62101
|
style.setAttribute('type', 'text/css');
|