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.esm.js
CHANGED
|
@@ -18578,6 +18578,7 @@ class IGVXhr {
|
|
|
18578
18578
|
});
|
|
18579
18579
|
this.RANGE_WARNING_GIVEN = false;
|
|
18580
18580
|
this.oauth = new Oauth();
|
|
18581
|
+
this.contentLengthMap = new Map();
|
|
18581
18582
|
}
|
|
18582
18583
|
|
|
18583
18584
|
setApiKey(key) {
|
|
@@ -18655,6 +18656,18 @@ class IGVXhr {
|
|
|
18655
18656
|
}
|
|
18656
18657
|
}
|
|
18657
18658
|
|
|
18659
|
+
async getContentLength(url, options) {
|
|
18660
|
+
if (!this.contentLengthMap.has(url)) {
|
|
18661
|
+
options = options || {};
|
|
18662
|
+
options.method = 'HEAD';
|
|
18663
|
+
options.GET_CONTENT_LENGTH = true;
|
|
18664
|
+
const contentLengthString = await this._loadURL(url, options);
|
|
18665
|
+
const contentLength = contentLengthString ? Number.parseInt(contentLengthString) : -1;
|
|
18666
|
+
this.contentLengthMap.set(url, contentLength);
|
|
18667
|
+
}
|
|
18668
|
+
return this.contentLengthMap.get(url)
|
|
18669
|
+
}
|
|
18670
|
+
|
|
18658
18671
|
async _loadURL(url, options) {
|
|
18659
18672
|
|
|
18660
18673
|
const self = this;
|
|
@@ -18669,6 +18682,11 @@ class IGVXhr {
|
|
|
18669
18682
|
oauthToken = await (typeof oauthToken === 'function' ? oauthToken() : oauthToken);
|
|
18670
18683
|
}
|
|
18671
18684
|
|
|
18685
|
+
let contentLength = -1;
|
|
18686
|
+
if (options.range && !isAmazonV4Signed(url) && !isGoogleStorageSigned(url)) {
|
|
18687
|
+
contentLength = await this.getContentLength(url);
|
|
18688
|
+
}
|
|
18689
|
+
|
|
18672
18690
|
return new Promise(function (resolve, reject) {
|
|
18673
18691
|
|
|
18674
18692
|
// Various Google tansformations
|
|
@@ -18694,13 +18712,6 @@ class IGVXhr {
|
|
|
18694
18712
|
}
|
|
18695
18713
|
const range = options.range;
|
|
18696
18714
|
|
|
18697
|
-
// const isChrome = navigator.userAgent.indexOf('Chrome') > -1
|
|
18698
|
-
// const isSafari = navigator.vendor.indexOf("Apple") === 0 && /\sSafari\//.test(navigator.userAgent)
|
|
18699
|
-
// if (range && isChrome && !isAmazonV4Signed(url) && !isGoogleStorageSigned(url)) {
|
|
18700
|
-
// // Hack to prevent caching for byte-ranges. Attempt to fix net:err-cache errors in Chrome
|
|
18701
|
-
// url += url.includes("?") ? "&" : "?"
|
|
18702
|
-
// url += "someRandomSeed=" + Math.random().toString(36)
|
|
18703
|
-
// }
|
|
18704
18715
|
|
|
18705
18716
|
const xhr = new XMLHttpRequest();
|
|
18706
18717
|
const sendData = options.sendData || options.body;
|
|
@@ -18716,7 +18727,13 @@ class IGVXhr {
|
|
|
18716
18727
|
}
|
|
18717
18728
|
|
|
18718
18729
|
if (range) {
|
|
18719
|
-
|
|
18730
|
+
let rangeEnd = "";
|
|
18731
|
+
if (range.size) {
|
|
18732
|
+
rangeEnd = range.start + range.size - 1;
|
|
18733
|
+
if (contentLength > 0) {
|
|
18734
|
+
rangeEnd = Math.min(rangeEnd, contentLength - 1);
|
|
18735
|
+
}
|
|
18736
|
+
}
|
|
18720
18737
|
xhr.setRequestHeader("Range", "bytes=" + range.start + "-" + rangeEnd);
|
|
18721
18738
|
// xhr.setRequestHeader("Cache-Control", "no-cache"); <= This can cause CORS issues, disabled for now
|
|
18722
18739
|
}
|
|
@@ -18742,6 +18759,11 @@ class IGVXhr {
|
|
|
18742
18759
|
}
|
|
18743
18760
|
|
|
18744
18761
|
xhr.onload = async function (event) {
|
|
18762
|
+
|
|
18763
|
+
if (options.GET_CONTENT_LENGTH) {
|
|
18764
|
+
resolve(xhr.getResponseHeader('content-length'));
|
|
18765
|
+
}
|
|
18766
|
+
|
|
18745
18767
|
// when the url points to a local file, the status is 0 but that is not an error
|
|
18746
18768
|
if (xhr.status === 0 || (xhr.status >= 200 && xhr.status <= 300)) {
|
|
18747
18769
|
if (range && xhr.status !== 206 && range.start !== 0) {
|
|
@@ -18774,6 +18796,7 @@ class IGVXhr {
|
|
|
18774
18796
|
}
|
|
18775
18797
|
};
|
|
18776
18798
|
|
|
18799
|
+
|
|
18777
18800
|
xhr.onerror = function (event) {
|
|
18778
18801
|
if (isGoogleURL(url) && !options.retries) {
|
|
18779
18802
|
tryGoogleAuth();
|
|
@@ -18905,7 +18928,6 @@ function isGoogleStorageSigned(url) {
|
|
|
18905
18928
|
}
|
|
18906
18929
|
|
|
18907
18930
|
|
|
18908
|
-
|
|
18909
18931
|
/**
|
|
18910
18932
|
* Return a Google oAuth token, triggering a sign in if required. This method should not be called until we know
|
|
18911
18933
|
* a token is required, that is until we've tried the url and received a 401, 403, or 404.
|
|
@@ -19064,6 +19086,11 @@ function getGlobalObject() {
|
|
|
19064
19086
|
}
|
|
19065
19087
|
}
|
|
19066
19088
|
|
|
19089
|
+
function isAmazonV4Signed(url) {
|
|
19090
|
+
return url.indexOf("X-Amz-Signature") > -1
|
|
19091
|
+
}
|
|
19092
|
+
|
|
19093
|
+
|
|
19067
19094
|
const igvxhr = new IGVXhr();
|
|
19068
19095
|
|
|
19069
19096
|
/*
|
|
@@ -23944,7 +23971,7 @@ const Cytoband = function (start, end, name, typestain) {
|
|
|
23944
23971
|
}
|
|
23945
23972
|
};
|
|
23946
23973
|
|
|
23947
|
-
const _version = "2.15.
|
|
23974
|
+
const _version = "2.15.5";
|
|
23948
23975
|
function version() {
|
|
23949
23976
|
return _version
|
|
23950
23977
|
}
|
|
@@ -23996,7 +24023,7 @@ const GenomeUtils = {
|
|
|
23996
24023
|
|
|
23997
24024
|
// Delay loading cytbands untils after genome initialization to use chromosome aliases (1 vs chr1, etc).
|
|
23998
24025
|
if (cytobandUrl) {
|
|
23999
|
-
genome.cytobands
|
|
24026
|
+
genome.cytobands = await loadCytobands(cytobandUrl, sequence.config, genome);
|
|
24000
24027
|
}
|
|
24001
24028
|
|
|
24002
24029
|
return genome
|
|
@@ -24098,7 +24125,7 @@ class Genome {
|
|
|
24098
24125
|
this.sequence = sequence;
|
|
24099
24126
|
this.chromosomeNames = sequence.chromosomeNames;
|
|
24100
24127
|
this.chromosomes = sequence.chromosomes; // An object (functions as a dictionary)
|
|
24101
|
-
this.featureDB =
|
|
24128
|
+
this.featureDB = new Map(); // Hash of name -> feature, used for search function.
|
|
24102
24129
|
|
|
24103
24130
|
this.wholeGenomeView = config.wholeGenomeView === undefined || config.wholeGenomeView;
|
|
24104
24131
|
if (this.wholeGenomeView && Object.keys(sequence.chromosomes).length > 1) {
|
|
@@ -24302,6 +24329,40 @@ class Genome {
|
|
|
24302
24329
|
chr = this.getChromosomeName(chr);
|
|
24303
24330
|
return this.sequence.getSequence(chr, start, end)
|
|
24304
24331
|
}
|
|
24332
|
+
|
|
24333
|
+
addFeaturesToDB(featureList, config) {
|
|
24334
|
+
|
|
24335
|
+
const insertFeature = (name, feature) => {
|
|
24336
|
+
const current = this.featureDB.get(name);
|
|
24337
|
+
if (current) {
|
|
24338
|
+
feature = (feature.end - feature.start) > (current.end - current.start) ? feature : current;
|
|
24339
|
+
|
|
24340
|
+
}
|
|
24341
|
+
this.featureDB.set(name, feature);
|
|
24342
|
+
};
|
|
24343
|
+
|
|
24344
|
+
for (let feature of featureList) {
|
|
24345
|
+
if (feature.name) {
|
|
24346
|
+
insertFeature(feature.name.toUpperCase(), feature);
|
|
24347
|
+
}
|
|
24348
|
+
if (feature.gene && feature.gene.name) {
|
|
24349
|
+
insertFeature(feature.gene.name.toUpperCase(), feature);
|
|
24350
|
+
}
|
|
24351
|
+
|
|
24352
|
+
if (config.searchableFields) {
|
|
24353
|
+
for (let f of config.searchableFields) {
|
|
24354
|
+
const value = feature.getAttributeValue(f);
|
|
24355
|
+
if (value) {
|
|
24356
|
+
if (value.indexOf(" ") > 0) {
|
|
24357
|
+
insertFeature(value.replaceAll(" ", "+").toUpperCase(), feature);
|
|
24358
|
+
} else {
|
|
24359
|
+
insertFeature(value.toUpperCase(), feature);
|
|
24360
|
+
}
|
|
24361
|
+
}
|
|
24362
|
+
}
|
|
24363
|
+
}
|
|
24364
|
+
}
|
|
24365
|
+
}
|
|
24305
24366
|
}
|
|
24306
24367
|
|
|
24307
24368
|
async function loadCytobands(cytobandUrl, config, genome) {
|
|
@@ -27029,8 +27090,6 @@ function parseVariableStep(line) {
|
|
|
27029
27090
|
* THE SOFTWARE.
|
|
27030
27091
|
*/
|
|
27031
27092
|
|
|
27032
|
-
const DEFAULT_COLOR$1 = 'rgb(150,150,150)';
|
|
27033
|
-
|
|
27034
27093
|
const fixColor = (colorString) => {
|
|
27035
27094
|
if (isString$2(colorString)) {
|
|
27036
27095
|
return (colorString.indexOf(",") > 0 && !(colorString.startsWith("rgb(") || colorString.startsWith("rgba("))) ?
|
|
@@ -27049,6 +27108,15 @@ const fixColor = (colorString) => {
|
|
|
27049
27108
|
*/
|
|
27050
27109
|
class TrackBase {
|
|
27051
27110
|
|
|
27111
|
+
static defaults = {
|
|
27112
|
+
height: 50,
|
|
27113
|
+
color: 'rgb(0, 0, 150)',
|
|
27114
|
+
altColor: 'rgb(0, 0, 150)',
|
|
27115
|
+
autoHeight: false,
|
|
27116
|
+
visibilityWindow: undefined,
|
|
27117
|
+
supportHiDPI: true
|
|
27118
|
+
}
|
|
27119
|
+
|
|
27052
27120
|
constructor(config, browser) {
|
|
27053
27121
|
this.browser = browser;
|
|
27054
27122
|
this.init(config);
|
|
@@ -27062,15 +27130,25 @@ class TrackBase {
|
|
|
27062
27130
|
*/
|
|
27063
27131
|
init(config) {
|
|
27064
27132
|
|
|
27133
|
+
this.config = config;
|
|
27134
|
+
|
|
27065
27135
|
if (config.displayMode) {
|
|
27066
27136
|
config.displayMode = config.displayMode.toUpperCase();
|
|
27067
27137
|
}
|
|
27068
27138
|
|
|
27069
|
-
|
|
27070
|
-
|
|
27071
|
-
this.
|
|
27072
|
-
|
|
27073
|
-
|
|
27139
|
+
// Set default properties
|
|
27140
|
+
const defaults = Object.assign({}, TrackBase.defaults);
|
|
27141
|
+
if(this.constructor.defaults) {
|
|
27142
|
+
for(let key of Object.keys(this.constructor.defaults)) {
|
|
27143
|
+
defaults[key] = this.constructor.defaults[key];
|
|
27144
|
+
}
|
|
27145
|
+
}
|
|
27146
|
+
for(let key of Object.keys(defaults)) {
|
|
27147
|
+
this[key] = config.hasOwnProperty(key) ? config[key] : defaults[key];
|
|
27148
|
+
if(key === 'color' || key === 'altColor') {
|
|
27149
|
+
this[key] = fixColor(this[key]);
|
|
27150
|
+
}
|
|
27151
|
+
}
|
|
27074
27152
|
|
|
27075
27153
|
if (config.name || config.label) {
|
|
27076
27154
|
this.name = config.name || config.label;
|
|
@@ -27080,29 +27158,15 @@ class TrackBase {
|
|
|
27080
27158
|
this.name = getFilename$2(config.url);
|
|
27081
27159
|
}
|
|
27082
27160
|
|
|
27161
|
+
this.url = config.url;
|
|
27162
|
+
if(this.config.type) this.type = this.config.type;
|
|
27083
27163
|
this.id = this.config.id === undefined ? this.name : this.config.id;
|
|
27084
|
-
|
|
27085
27164
|
this.order = config.order;
|
|
27086
|
-
|
|
27087
|
-
if (config.color) this.color = fixColor(config.color);
|
|
27088
|
-
if (config.altColor) this.altColor = fixColor(config.altColor);
|
|
27089
|
-
if ("civic-ws" === config.sourceType) { // Ugly proxy for specialized track type
|
|
27090
|
-
this.defaultColor = "rgb(155,20,20)";
|
|
27091
|
-
} else {
|
|
27092
|
-
this.defaultColor = "rgb(0,0,150)";
|
|
27093
|
-
}
|
|
27094
|
-
|
|
27095
27165
|
this.autoscaleGroup = config.autoscaleGroup;
|
|
27096
|
-
|
|
27097
27166
|
this.removable = config.removable === undefined ? true : config.removable; // Defaults to true
|
|
27098
|
-
|
|
27099
|
-
this.height = config.height || 100;
|
|
27100
|
-
this.autoHeight = config.autoHeight;
|
|
27101
27167
|
this.minHeight = config.minHeight || Math.min(25, this.height);
|
|
27102
27168
|
this.maxHeight = config.maxHeight || Math.max(1000, this.height);
|
|
27103
27169
|
|
|
27104
|
-
this.visibilityWindow = config.visibilityWindow;
|
|
27105
|
-
|
|
27106
27170
|
if (config.onclick) {
|
|
27107
27171
|
this.onclick = config.onclick;
|
|
27108
27172
|
config.onclick = undefined; // functions cannot be saved in sessions, clear it here.
|
|
@@ -27159,17 +27223,18 @@ class TrackBase {
|
|
|
27159
27223
|
}
|
|
27160
27224
|
|
|
27161
27225
|
/**
|
|
27162
|
-
*
|
|
27163
|
-
*
|
|
27164
|
-
* current state. Only simple properties (string, number, boolean) are updated.
|
|
27226
|
+
* Used to create session object for bookmarking, sharing. Only simple property values (string, number, boolean)
|
|
27227
|
+
* are saved.
|
|
27165
27228
|
*/
|
|
27166
27229
|
getState() {
|
|
27167
27230
|
|
|
27231
|
+
const jsonable = (v) => !(v === undefined || typeof v === 'function' || v instanceof File || v instanceof Promise);
|
|
27232
|
+
|
|
27168
27233
|
// Create copy of config, minus transient properties (convention is name starts with '_'). Also, all
|
|
27169
27234
|
// function properties are transient as they cannot be saved in json
|
|
27170
27235
|
const state = {};
|
|
27171
27236
|
for (let key of Object.keys(this.config)) {
|
|
27172
|
-
if (!key.startsWith("_") &&
|
|
27237
|
+
if (!key.startsWith("_") && jsonable(this.config[key])) {
|
|
27173
27238
|
state[key] = this.config[key];
|
|
27174
27239
|
}
|
|
27175
27240
|
}
|
|
@@ -27183,8 +27248,18 @@ class TrackBase {
|
|
|
27183
27248
|
}
|
|
27184
27249
|
}
|
|
27185
27250
|
|
|
27186
|
-
|
|
27187
|
-
|
|
27251
|
+
// If user has changed other properties from defaults update state.
|
|
27252
|
+
const defs = TrackBase.defaults;
|
|
27253
|
+
if (this.constructor.defaults) {
|
|
27254
|
+
for (let key of Object.keys(this.constructor.defaults)) {
|
|
27255
|
+
defs[key] = this.constructor.defaults[key];
|
|
27256
|
+
}
|
|
27257
|
+
}
|
|
27258
|
+
for (let key of Object.keys(defs)) {
|
|
27259
|
+
if (undefined !== this[key] && defs[key] !== this[key]) {
|
|
27260
|
+
state[key] = this[key];
|
|
27261
|
+
}
|
|
27262
|
+
}
|
|
27188
27263
|
|
|
27189
27264
|
// Flatten dataRange if present
|
|
27190
27265
|
if (!this.autoscale && this.dataRange) {
|
|
@@ -27192,22 +27267,6 @@ class TrackBase {
|
|
|
27192
27267
|
state.max = this.dataRange.max;
|
|
27193
27268
|
}
|
|
27194
27269
|
|
|
27195
|
-
|
|
27196
|
-
// Check for non-json-if-yable properties. Perhaps we should test what can be saved.
|
|
27197
|
-
for (let key of Object.keys(state)) {
|
|
27198
|
-
const value = state[key];
|
|
27199
|
-
if (typeof value === 'function') {
|
|
27200
|
-
throw Error(`Property '${key}' of track '${this.name} is a function. Functions cannot be saved in sessions.`)
|
|
27201
|
-
}
|
|
27202
|
-
if (value instanceof File) { // Test specifically for File. Other types of File-like objects might be savable
|
|
27203
|
-
const str = `Track ${this.name} is a local file. Sessions cannot be saved with local file references.`;
|
|
27204
|
-
throw Error(str)
|
|
27205
|
-
}
|
|
27206
|
-
if (value instanceof Promise) {
|
|
27207
|
-
throw Error(`Property '${key}' of track '${this.name} is a Promise. Promises cannot be saved in sessions.`)
|
|
27208
|
-
}
|
|
27209
|
-
}
|
|
27210
|
-
|
|
27211
27270
|
return state
|
|
27212
27271
|
}
|
|
27213
27272
|
|
|
@@ -27503,7 +27562,7 @@ class TrackBase {
|
|
|
27503
27562
|
* @returns {*|string|string}
|
|
27504
27563
|
*/
|
|
27505
27564
|
getColorForFeature(f) {
|
|
27506
|
-
|
|
27565
|
+
return (typeof this.color === "function") ? this.color(feature) : this.color
|
|
27507
27566
|
}
|
|
27508
27567
|
|
|
27509
27568
|
/**
|
|
@@ -30247,7 +30306,8 @@ class FeatureFileReader {
|
|
|
30247
30306
|
this.config = config || {};
|
|
30248
30307
|
this.genome = genome;
|
|
30249
30308
|
this.indexURL = config.indexURL;
|
|
30250
|
-
this.indexed = config.indexed;
|
|
30309
|
+
this.indexed = config.indexed || this.indexURL !== undefined;
|
|
30310
|
+
this.queryable = this.indexed;
|
|
30251
30311
|
|
|
30252
30312
|
if (isFile(this.config.url)) {
|
|
30253
30313
|
this.filename = this.config.url.name;
|
|
@@ -31907,6 +31967,7 @@ class TextFeatureSource {
|
|
|
31907
31967
|
|
|
31908
31968
|
const queryableFormats = new Set(["bigwig", "bw", "bigbed", "bb", "biginteract", "biggenepred", "bignarrowpeak", "tdf"]);
|
|
31909
31969
|
|
|
31970
|
+
this.queryable = config.indexURL || config.queryable === true; // False by default, unless explicitly set
|
|
31910
31971
|
if (config.reader) {
|
|
31911
31972
|
// Explicit reader implementation
|
|
31912
31973
|
this.reader = config.reader;
|
|
@@ -31940,6 +32001,11 @@ class TextFeatureSource {
|
|
|
31940
32001
|
this.queryable = true;
|
|
31941
32002
|
} else ;
|
|
31942
32003
|
}
|
|
32004
|
+
|
|
32005
|
+
// Set searchable unless explicitly turned off, or track uses in indexed or otherwise queryable
|
|
32006
|
+
// feature source. queryable => features loaded on demand (by query)
|
|
32007
|
+
this.searchable = config.searchable === true || config.searchableFields || (config.searchable !== false && !this.queryable);
|
|
32008
|
+
|
|
31943
32009
|
}
|
|
31944
32010
|
|
|
31945
32011
|
async defaultVisibilityWindow() {
|
|
@@ -31999,6 +32065,7 @@ class TextFeatureSource {
|
|
|
31999
32065
|
// * view is "whole genome" but no features are loaded
|
|
32000
32066
|
// * cache is disabled
|
|
32001
32067
|
// * cache does not contain requested range
|
|
32068
|
+
// const containsRange = this.featureCache.containsRange(new GenomicInterval(queryChr, start, end))
|
|
32002
32069
|
if ((isWholeGenome && !this.wgFeatures && this.supportsWholeGenome()) ||
|
|
32003
32070
|
this.config.disableCache ||
|
|
32004
32071
|
!this.featureCache ||
|
|
@@ -32080,39 +32147,13 @@ class TextFeatureSource {
|
|
|
32080
32147
|
this.featureCache = new FeatureCache$1(features, this.genome, genomicInterval);
|
|
32081
32148
|
|
|
32082
32149
|
// If track is marked "searchable"< cache features by name -- use this with caution, memory intensive
|
|
32083
|
-
if (this.
|
|
32084
|
-
this.addFeaturesToDB(features);
|
|
32150
|
+
if (this.searchable) {
|
|
32151
|
+
this.genome.addFeaturesToDB(features, this.config);
|
|
32085
32152
|
}
|
|
32086
32153
|
} else {
|
|
32087
32154
|
this.featureCache = new FeatureCache$1([], genomicInterval); // Empty cache
|
|
32088
32155
|
}
|
|
32089
32156
|
}
|
|
32090
|
-
|
|
32091
|
-
addFeaturesToDB(featureList) {
|
|
32092
|
-
for (let feature of featureList) {
|
|
32093
|
-
if (feature.name) {
|
|
32094
|
-
this.genome.featureDB[feature.name.toUpperCase()] = feature;
|
|
32095
|
-
}
|
|
32096
|
-
if (feature.gene && feature.gene.name) {
|
|
32097
|
-
this.genome.featureDB[feature.gene.name.toUpperCase()] = feature;
|
|
32098
|
-
}
|
|
32099
|
-
|
|
32100
|
-
if (this.config.searchableFields) {
|
|
32101
|
-
for (let f of this.config.searchableFields) {
|
|
32102
|
-
const value = feature.getAttributeValue(f);
|
|
32103
|
-
if (value) {
|
|
32104
|
-
if (value.indexOf(" ") > 0) {
|
|
32105
|
-
this.genome.featureDB[value.replaceAll(" ", "+").toUpperCase()] = feature;
|
|
32106
|
-
this.genome.featureDB[value.replaceAll(" ", "%20").toUpperCase()] = feature;
|
|
32107
|
-
} else {
|
|
32108
|
-
this.genome.featureDB[value.toUpperCase()] = feature;
|
|
32109
|
-
}
|
|
32110
|
-
}
|
|
32111
|
-
}
|
|
32112
|
-
}
|
|
32113
|
-
}
|
|
32114
|
-
}
|
|
32115
|
-
|
|
32116
32157
|
}
|
|
32117
32158
|
|
|
32118
32159
|
/*
|
|
@@ -32928,7 +32969,8 @@ function decodeWigData(data, chrIdx1, bpStart, chrIdx2, bpEnd, featureArray, chr
|
|
|
32928
32969
|
|
|
32929
32970
|
const binaryParser = new BinaryParser(data);
|
|
32930
32971
|
const chromId = binaryParser.getInt();
|
|
32931
|
-
|
|
32972
|
+
const blockStart = binaryParser.getInt();
|
|
32973
|
+
let chromStart = blockStart;
|
|
32932
32974
|
let chromEnd = binaryParser.getInt();
|
|
32933
32975
|
const itemStep = binaryParser.getInt();
|
|
32934
32976
|
const itemSpan = binaryParser.getInt();
|
|
@@ -32938,6 +32980,7 @@ function decodeWigData(data, chrIdx1, bpStart, chrIdx2, bpEnd, featureArray, chr
|
|
|
32938
32980
|
|
|
32939
32981
|
if (chromId >= chrIdx1 && chromId <= chrIdx2) {
|
|
32940
32982
|
|
|
32983
|
+
let idx = 0;
|
|
32941
32984
|
while (itemCount-- > 0) {
|
|
32942
32985
|
let value;
|
|
32943
32986
|
switch (type) {
|
|
@@ -32953,8 +32996,9 @@ function decodeWigData(data, chrIdx1, bpStart, chrIdx2, bpEnd, featureArray, chr
|
|
|
32953
32996
|
break
|
|
32954
32997
|
case 3: // Fixed step
|
|
32955
32998
|
value = binaryParser.getFloat();
|
|
32999
|
+
chromStart = blockStart + idx * itemStep;
|
|
32956
33000
|
chromEnd = chromStart + itemSpan;
|
|
32957
|
-
|
|
33001
|
+
idx++;
|
|
32958
33002
|
break
|
|
32959
33003
|
}
|
|
32960
33004
|
|
|
@@ -32964,8 +33008,8 @@ function decodeWigData(data, chrIdx1, bpStart, chrIdx2, bpEnd, featureArray, chr
|
|
|
32964
33008
|
if (Number.isFinite(value)) {
|
|
32965
33009
|
const chr = chrDict[chromId];
|
|
32966
33010
|
featureArray.push({chr: chr, start: chromStart, end: chromEnd, value: value});
|
|
32967
|
-
|
|
32968
33011
|
}
|
|
33012
|
+
|
|
32969
33013
|
}
|
|
32970
33014
|
}
|
|
32971
33015
|
}
|
|
@@ -33101,6 +33145,7 @@ class BWSource {
|
|
|
33101
33145
|
this.genome = genome;
|
|
33102
33146
|
this.format = config.format || "bigwig";
|
|
33103
33147
|
this.wgValues = {};
|
|
33148
|
+
this.queryable = true;
|
|
33104
33149
|
}
|
|
33105
33150
|
|
|
33106
33151
|
async getFeatures({chr, start, end, bpPerPixel, windowFunction}) {
|
|
@@ -33642,6 +33687,7 @@ class TDFSource {
|
|
|
33642
33687
|
this.genome = genome;
|
|
33643
33688
|
this.windowFunction = config.windowFunction || "mean";
|
|
33644
33689
|
this.reader = new TDFReader(config, genome);
|
|
33690
|
+
this.queryable = true;
|
|
33645
33691
|
}
|
|
33646
33692
|
|
|
33647
33693
|
async getFeatures({chr, start, end, bpPerPixel}) {
|
|
@@ -33851,8 +33897,8 @@ class StaticFeatureSource {
|
|
|
33851
33897
|
this.config = config;
|
|
33852
33898
|
this.genome = genome;
|
|
33853
33899
|
this.queryable = false;
|
|
33900
|
+
this.searchable = config.searchable !== false; // searchable by default
|
|
33854
33901
|
this.updateFeatures(config.features);
|
|
33855
|
-
|
|
33856
33902
|
}
|
|
33857
33903
|
|
|
33858
33904
|
updateFeatures(features) {
|
|
@@ -33862,6 +33908,10 @@ class StaticFeatureSource {
|
|
|
33862
33908
|
mapProperties(features, this.config.mappings);
|
|
33863
33909
|
}
|
|
33864
33910
|
this.featureCache = new FeatureCache$1(features, this.genome);
|
|
33911
|
+
|
|
33912
|
+
if (this.searchable || this.config.searchableFields) {
|
|
33913
|
+
this.genome.addFeaturesToDB(features, this.config);
|
|
33914
|
+
}
|
|
33865
33915
|
}
|
|
33866
33916
|
|
|
33867
33917
|
/**
|
|
@@ -40055,8 +40105,8 @@ function renderFeature(feature, bpStart, xScale, pixelHeight, ctx, options) {
|
|
|
40055
40105
|
|
|
40056
40106
|
// Set ctx color to a known valid color. If getColorForFeature returns an invalid color string it is ignored, and
|
|
40057
40107
|
// this default will be used.
|
|
40058
|
-
ctx.fillStyle = this.
|
|
40059
|
-
ctx.strokeStyle = this.
|
|
40108
|
+
ctx.fillStyle = this.color;
|
|
40109
|
+
ctx.strokeStyle = this.color;
|
|
40060
40110
|
|
|
40061
40111
|
const color = this.getColorForFeature(feature);
|
|
40062
40112
|
ctx.fillStyle = color;
|
|
@@ -40380,6 +40430,17 @@ function renderFusionJuncSpan(feature, bpStart, xScale, pixelHeight, ctx) {
|
|
|
40380
40430
|
|
|
40381
40431
|
class FeatureTrack extends TrackBase {
|
|
40382
40432
|
|
|
40433
|
+
static defaults = {
|
|
40434
|
+
type: "annotation",
|
|
40435
|
+
maxRows: 1000, // protects against pathological feature packing cases (# of rows of overlapping feaures)
|
|
40436
|
+
displayMode: "EXPANDED", // COLLAPSED | EXPANDED | SQUISHED
|
|
40437
|
+
margin: 10,
|
|
40438
|
+
featureHeight: 14,
|
|
40439
|
+
autoHeight: false,
|
|
40440
|
+
useScore: false
|
|
40441
|
+
}
|
|
40442
|
+
|
|
40443
|
+
|
|
40383
40444
|
constructor(config, browser) {
|
|
40384
40445
|
super(config, browser);
|
|
40385
40446
|
}
|
|
@@ -40387,12 +40448,8 @@ class FeatureTrack extends TrackBase {
|
|
|
40387
40448
|
init(config) {
|
|
40388
40449
|
super.init(config);
|
|
40389
40450
|
|
|
40390
|
-
this.type = config.type || "annotation";
|
|
40391
40451
|
|
|
40392
|
-
//
|
|
40393
|
-
this.maxRows = config.maxRows === undefined ? 1000 : config.maxRows;
|
|
40394
|
-
|
|
40395
|
-
this.displayMode = config.displayMode || "EXPANDED"; // COLLAPSED | EXPANDED | SQUISHED
|
|
40452
|
+
// Obscure option, not common or supoorted, included for backward compatibility
|
|
40396
40453
|
this.labelDisplayMode = config.labelDisplayMode;
|
|
40397
40454
|
|
|
40398
40455
|
if (config._featureSource) {
|
|
@@ -40404,12 +40461,6 @@ class FeatureTrack extends TrackBase {
|
|
|
40404
40461
|
FeatureSource(config, this.browser.genome);
|
|
40405
40462
|
}
|
|
40406
40463
|
|
|
40407
|
-
// Set default heights
|
|
40408
|
-
this.autoHeight = config.autoHeight;
|
|
40409
|
-
this.margin = config.margin === undefined ? 10 : config.margin;
|
|
40410
|
-
|
|
40411
|
-
this.featureHeight = config.featureHeight || 14;
|
|
40412
|
-
|
|
40413
40464
|
if ("FusionJuncSpan" === config.type) {
|
|
40414
40465
|
this.render = config.render || renderFusionJuncSpan;
|
|
40415
40466
|
this.squishedRowHeight = config.squishedRowHeight || 50;
|
|
@@ -40446,9 +40497,6 @@ class FeatureTrack extends TrackBase {
|
|
|
40446
40497
|
}
|
|
40447
40498
|
}
|
|
40448
40499
|
}
|
|
40449
|
-
|
|
40450
|
-
//UCSC useScore option
|
|
40451
|
-
this.useScore = config.useScore;
|
|
40452
40500
|
}
|
|
40453
40501
|
|
|
40454
40502
|
async postInit() {
|
|
@@ -40812,7 +40860,7 @@ class FeatureTrack extends TrackBase {
|
|
|
40812
40860
|
} else if (feature.color) {
|
|
40813
40861
|
color = feature.color; // Explicit color for feature
|
|
40814
40862
|
} else {
|
|
40815
|
-
color = this.
|
|
40863
|
+
color = this.color; // Track default
|
|
40816
40864
|
}
|
|
40817
40865
|
|
|
40818
40866
|
if (feature.alpha && feature.alpha !== 1) {
|
|
@@ -40858,7 +40906,7 @@ function monitorTrackDrag(track) {
|
|
|
40858
40906
|
|
|
40859
40907
|
function onDragEnd() {
|
|
40860
40908
|
if (track.trackView && track.displayMode !== "SQUISHED") {
|
|
40861
|
-
track.trackView.
|
|
40909
|
+
track.trackView.updateViews(); // TODO -- refine this to the viewport that was dragged after DOM refactor
|
|
40862
40910
|
}
|
|
40863
40911
|
}
|
|
40864
40912
|
|
|
@@ -40878,38 +40926,40 @@ class RegionTableBase {
|
|
|
40878
40926
|
|
|
40879
40927
|
this.browser = config.browser;
|
|
40880
40928
|
|
|
40881
|
-
this.
|
|
40882
|
-
if(config.width) {
|
|
40883
|
-
this.container.style.width = config.width;
|
|
40929
|
+
this.columnFormat = config.columnFormat;
|
|
40884
40930
|
|
|
40885
|
-
|
|
40931
|
+
this.tableRowSelectionList = [];
|
|
40886
40932
|
|
|
40887
|
-
|
|
40933
|
+
this.tableDOM = domUtils.div({ class: 'igv-roi-table' });
|
|
40934
|
+
// if(config.width) {
|
|
40935
|
+
// let [ w ] = config.width.split('px')
|
|
40936
|
+
// w = parseInt(w, 10)
|
|
40937
|
+
// this.tableDOM.style.width = `${Math.min(w, 1600)}px`
|
|
40938
|
+
//
|
|
40939
|
+
// }
|
|
40940
|
+
|
|
40941
|
+
config.parent.appendChild(this.tableDOM);
|
|
40888
40942
|
|
|
40889
40943
|
this.headerDOM = config;
|
|
40890
40944
|
|
|
40891
|
-
this.
|
|
40945
|
+
this.tableColumnTitles = this.tableDOM;
|
|
40892
40946
|
|
|
40893
|
-
this.
|
|
40947
|
+
this.tableRowContainer = this.tableDOM;
|
|
40894
40948
|
|
|
40895
40949
|
this.footerDOM = config.gotoButtonHandler;
|
|
40896
40950
|
|
|
40897
|
-
this.columnFormat = config.columnFormat;
|
|
40898
|
-
|
|
40899
|
-
this.tableRowSelectionList = [];
|
|
40900
|
-
|
|
40901
40951
|
}
|
|
40902
40952
|
|
|
40903
40953
|
set headerDOM({ browser, parent, headerTitle, dismissHandler }) {
|
|
40904
40954
|
|
|
40905
40955
|
// header
|
|
40906
40956
|
const dom = domUtils.div();
|
|
40907
|
-
this.
|
|
40957
|
+
this.tableDOM.appendChild(dom);
|
|
40908
40958
|
|
|
40909
40959
|
// header title
|
|
40910
40960
|
const div = domUtils.div();
|
|
40911
40961
|
dom.appendChild(div);
|
|
40912
|
-
div.
|
|
40962
|
+
div.innerHTML = headerTitle;
|
|
40913
40963
|
|
|
40914
40964
|
// table dismiss button
|
|
40915
40965
|
const dismiss = domUtils.div();
|
|
@@ -40928,46 +40978,51 @@ class RegionTableBase {
|
|
|
40928
40978
|
const { y:y_root } = browser.root.getBoundingClientRect();
|
|
40929
40979
|
const { y:y_parent } = parent.getBoundingClientRect();
|
|
40930
40980
|
const constraint = -(y_parent - y_root);
|
|
40931
|
-
makeDraggable(this.
|
|
40981
|
+
makeDraggable(this.tableDOM, dom, { minX:0, minY:constraint });
|
|
40932
40982
|
|
|
40933
|
-
this.
|
|
40983
|
+
this.tableDOM.style.display = 'none';
|
|
40934
40984
|
|
|
40935
40985
|
this._headerDOM = dom;
|
|
40936
40986
|
|
|
40937
40987
|
}
|
|
40938
40988
|
|
|
40939
|
-
set
|
|
40989
|
+
set tableColumnTitles(tableDOM) {
|
|
40940
40990
|
|
|
40941
|
-
const
|
|
40942
|
-
|
|
40991
|
+
const tblColumnTitles = domUtils.div({ class: 'igv-roi-table-column-titles' });
|
|
40992
|
+
tableDOM.appendChild(tblColumnTitles);
|
|
40943
40993
|
|
|
40944
|
-
for (const { label, width } of columnFormat) {
|
|
40994
|
+
for (const { label, width } of this.columnFormat) {
|
|
40945
40995
|
const col = domUtils.div();
|
|
40946
|
-
|
|
40996
|
+
tblColumnTitles.appendChild(col);
|
|
40947
40997
|
col.style.width = width;
|
|
40948
40998
|
col.innerText = label;
|
|
40949
40999
|
}
|
|
40950
41000
|
|
|
41001
|
+
this._tableColumnTitlesDOM = tblColumnTitles;
|
|
41002
|
+
|
|
41003
|
+
}
|
|
41004
|
+
|
|
41005
|
+
get tableColumnTitles() {
|
|
41006
|
+
return this._tableColumnTitlesDOM
|
|
40951
41007
|
}
|
|
40952
41008
|
|
|
40953
|
-
set
|
|
41009
|
+
set tableRowContainer(container) {
|
|
40954
41010
|
|
|
40955
|
-
const
|
|
40956
|
-
container.appendChild(
|
|
41011
|
+
const tblRowContainer = domUtils.div({ class: 'igv-roi-table-row-container' });
|
|
41012
|
+
container.appendChild(tblRowContainer);
|
|
40957
41013
|
|
|
40958
|
-
|
|
41014
|
+
this._tableRowContainerDOM = tblRowContainer;
|
|
40959
41015
|
|
|
40960
|
-
this._rowContainerDOM = dom;
|
|
40961
41016
|
}
|
|
40962
41017
|
|
|
40963
|
-
get
|
|
40964
|
-
return this.
|
|
41018
|
+
get tableRowContainer() {
|
|
41019
|
+
return this._tableRowContainerDOM
|
|
40965
41020
|
}
|
|
40966
41021
|
|
|
40967
41022
|
set footerDOM(gotoButtonHandler) {
|
|
40968
41023
|
|
|
40969
41024
|
const dom = domUtils.div();
|
|
40970
|
-
this.
|
|
41025
|
+
this.tableDOM.appendChild(dom);
|
|
40971
41026
|
|
|
40972
41027
|
// Go To Button
|
|
40973
41028
|
const gotoButton = domUtils.div({class: 'igv-roi-table-button'});
|
|
@@ -41009,7 +41064,7 @@ class RegionTableBase {
|
|
|
41009
41064
|
}
|
|
41010
41065
|
|
|
41011
41066
|
clearTable() {
|
|
41012
|
-
const elements = this.
|
|
41067
|
+
const elements = this.tableRowContainer.querySelectorAll('.igv-roi-table-row');
|
|
41013
41068
|
for (let el of elements) {
|
|
41014
41069
|
el.remove();
|
|
41015
41070
|
}
|
|
@@ -41021,23 +41076,23 @@ class RegionTableBase {
|
|
|
41021
41076
|
}
|
|
41022
41077
|
|
|
41023
41078
|
present() {
|
|
41024
|
-
this.
|
|
41079
|
+
this.tableDOM.style.left = `${ 0 }px`;
|
|
41025
41080
|
|
|
41026
41081
|
const { y:y_root } = this.browser.root.getBoundingClientRect();
|
|
41027
41082
|
const { y:y_parent } = this.config.parent.getBoundingClientRect();
|
|
41028
41083
|
|
|
41029
|
-
this.
|
|
41030
|
-
this.
|
|
41084
|
+
this.tableDOM.style.top = `${ y_root - y_parent }px`;
|
|
41085
|
+
this.tableDOM.style.display = 'flex';
|
|
41031
41086
|
}
|
|
41032
41087
|
|
|
41033
41088
|
dismiss() {
|
|
41034
|
-
this.
|
|
41089
|
+
this.tableDOM.style.display = 'none';
|
|
41035
41090
|
}
|
|
41036
41091
|
|
|
41037
41092
|
dispose() {
|
|
41038
41093
|
|
|
41039
|
-
this.
|
|
41040
|
-
this.
|
|
41094
|
+
this.tableDOM.innerHTML = '';
|
|
41095
|
+
this.tableDOM.remove();
|
|
41041
41096
|
|
|
41042
41097
|
for (const key of Object.keys(this)) {
|
|
41043
41098
|
this[key] = undefined;
|
|
@@ -41053,45 +41108,35 @@ class BlatTable extends RegionTableBase {
|
|
|
41053
41108
|
|
|
41054
41109
|
constructor(config) {
|
|
41055
41110
|
|
|
41056
|
-
const cooked = Object.assign({ 'width':'
|
|
41111
|
+
const cooked = Object.assign({ 'width':'1024px' }, config);
|
|
41057
41112
|
super(cooked);
|
|
41058
41113
|
|
|
41059
41114
|
this.descriptionDOM = config;
|
|
41060
41115
|
|
|
41061
41116
|
}
|
|
41062
41117
|
|
|
41063
|
-
|
|
41064
|
-
set columnTitleDOM(columnFormat) {
|
|
41065
|
-
|
|
41066
|
-
const dom = domUtils.div({ class: 'igv-roi-table-column-titles' });
|
|
41067
|
-
this.columnTitlesDiv = dom;
|
|
41068
|
-
this.container.appendChild(dom);
|
|
41069
|
-
|
|
41070
|
-
for (const format of columnFormat) {
|
|
41071
|
-
const col = domUtils.div();
|
|
41072
|
-
dom.appendChild(col);
|
|
41073
|
-
col.style.width = format.width || 'fit-content';
|
|
41074
|
-
col.innerText = format.label;
|
|
41075
|
-
}
|
|
41076
|
-
|
|
41077
|
-
}
|
|
41078
|
-
|
|
41079
41118
|
set descriptionDOM(config) {
|
|
41080
41119
|
|
|
41081
41120
|
if (config.description) {
|
|
41082
41121
|
|
|
41083
41122
|
let dom;
|
|
41084
41123
|
|
|
41124
|
+
// BLAT result for query sequence
|
|
41085
41125
|
dom = domUtils.div({ class: 'igv-roi-table-description' });
|
|
41086
|
-
this.
|
|
41126
|
+
this.tableDOM.insertBefore(dom, this.tableColumnTitles);
|
|
41127
|
+
dom.style.height = 'auto';
|
|
41087
41128
|
dom.innerHTML = `BLAT result for query sequence:`;
|
|
41088
41129
|
|
|
41130
|
+
// CTAATCAtctacactggtttctactg ...
|
|
41089
41131
|
dom = domUtils.div({ class: 'igv-roi-table-description' });
|
|
41090
|
-
this.
|
|
41132
|
+
this.tableDOM.insertBefore(dom, this.tableColumnTitles);
|
|
41133
|
+
dom.style.height = 'auto';
|
|
41134
|
+
dom.style.maxHeight = '128px';
|
|
41091
41135
|
dom.innerHTML = config.description;
|
|
41092
41136
|
|
|
41137
|
+
// Select one or more rows ...
|
|
41093
41138
|
dom = domUtils.div({ class: 'igv-roi-table-goto-explainer' });
|
|
41094
|
-
this.
|
|
41139
|
+
this.tableDOM.insertBefore(dom, this.tableColumnTitles);
|
|
41095
41140
|
dom.innerHTML = `Select one or more rows and click Go To to view the regions`;
|
|
41096
41141
|
|
|
41097
41142
|
}
|
|
@@ -41121,13 +41166,13 @@ class BlatTable extends RegionTableBase {
|
|
|
41121
41166
|
|
|
41122
41167
|
renderTable(records) {
|
|
41123
41168
|
|
|
41124
|
-
Array.from(this.
|
|
41169
|
+
Array.from(this.tableRowContainer.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
|
|
41125
41170
|
|
|
41126
41171
|
if (records.length > 0) {
|
|
41127
41172
|
|
|
41128
41173
|
for (let record of records) {
|
|
41129
41174
|
const row = this.tableRowDOM(record);
|
|
41130
|
-
this.
|
|
41175
|
+
this.tableRowContainer.appendChild(row);
|
|
41131
41176
|
}
|
|
41132
41177
|
|
|
41133
41178
|
}
|
|
@@ -41175,7 +41220,7 @@ class BlatTable extends RegionTableBase {
|
|
|
41175
41220
|
|
|
41176
41221
|
event.stopPropagation();
|
|
41177
41222
|
|
|
41178
|
-
const selectedRows = this.
|
|
41223
|
+
const selectedRows = this.tableDOM.querySelectorAll('.igv-roi-table-row-selected');
|
|
41179
41224
|
|
|
41180
41225
|
const loci = [];
|
|
41181
41226
|
for (const row of selectedRows) {
|
|
@@ -41187,7 +41232,7 @@ class BlatTable extends RegionTableBase {
|
|
|
41187
41232
|
loci.push(`${ chr }:${ start }-${ end }`);
|
|
41188
41233
|
}
|
|
41189
41234
|
|
|
41190
|
-
for (const el of this.
|
|
41235
|
+
for (const el of this.tableDOM.querySelectorAll('.igv-roi-table-row')) {
|
|
41191
41236
|
el.classList.remove('igv-roi-table-row-selected');
|
|
41192
41237
|
}
|
|
41193
41238
|
|
|
@@ -41382,8 +41427,6 @@ async function createBlatTrack({sequence, browser, name, title}) {
|
|
|
41382
41427
|
|
|
41383
41428
|
const alignmentStartGap = 5;
|
|
41384
41429
|
const downsampleRowHeight = 5;
|
|
41385
|
-
const DEFAULT_COVERAGE_TRACK_HEIGHT = 50;
|
|
41386
|
-
const DEFAULT_TRACK_HEIGHT$1 = 300;
|
|
41387
41430
|
const DEFAULT_ALIGNMENT_COLOR = "rgb(185, 185, 185)";
|
|
41388
41431
|
const DEFAULT_COVERAGE_COLOR = "rgb(150, 150, 150)";
|
|
41389
41432
|
const DEFAULT_CONNECTOR_COLOR = "rgb(200, 200, 200)";
|
|
@@ -41391,35 +41434,37 @@ const MINIMUM_BLAT_LENGTH = 20;
|
|
|
41391
41434
|
|
|
41392
41435
|
class BAMTrack extends TrackBase {
|
|
41393
41436
|
|
|
41437
|
+
static defaults = {
|
|
41438
|
+
alleleFreqThreshold: 0.2,
|
|
41439
|
+
visibilityWindow: 30000,
|
|
41440
|
+
showCoverage: true,
|
|
41441
|
+
showAlignments: true,
|
|
41442
|
+
viewAsPairs: false,
|
|
41443
|
+
pairsSupported: true,
|
|
41444
|
+
showSoftClips: false,
|
|
41445
|
+
showAllBases: false,
|
|
41446
|
+
showInsertions: true,
|
|
41447
|
+
showMismatches: true,
|
|
41448
|
+
color: DEFAULT_ALIGNMENT_COLOR,
|
|
41449
|
+
coverageColor: DEFAULT_COVERAGE_COLOR,
|
|
41450
|
+
height: 300,
|
|
41451
|
+
coverageTrackHeight: 50
|
|
41452
|
+
}
|
|
41453
|
+
|
|
41394
41454
|
constructor(config, browser) {
|
|
41395
41455
|
super(config, browser);
|
|
41396
41456
|
}
|
|
41397
41457
|
|
|
41398
41458
|
init(config) {
|
|
41399
|
-
super.init(config);
|
|
41400
|
-
this.type = "alignment";
|
|
41401
|
-
|
|
41402
|
-
if (config.alleleFreqThreshold === undefined) {
|
|
41403
|
-
config.alleleFreqThreshold = 0.2;
|
|
41404
|
-
}
|
|
41405
41459
|
|
|
41460
|
+
this.type = "alignment";
|
|
41406
41461
|
this.featureSource = new BamSource(config, this.browser);
|
|
41407
|
-
|
|
41408
|
-
this.showCoverage = config.showCoverage === undefined ? true : config.showCoverage;
|
|
41409
|
-
this.showAlignments = config.showAlignments === undefined ? true : config.showAlignments;
|
|
41410
|
-
|
|
41411
41462
|
this.coverageTrack = new CoverageTrack(config, this);
|
|
41412
41463
|
this.alignmentTrack = new AlignmentTrack(config, this);
|
|
41464
|
+
|
|
41465
|
+
super.init(config);
|
|
41466
|
+
|
|
41413
41467
|
this.alignmentTrack.setTop(this.coverageTrack, this.showCoverage);
|
|
41414
|
-
this.visibilityWindow = config.visibilityWindow || 30000;
|
|
41415
|
-
this.viewAsPairs = config.viewAsPairs;
|
|
41416
|
-
this.pairsSupported = config.pairsSupported !== false;
|
|
41417
|
-
this.showSoftClips = config.showSoftClips;
|
|
41418
|
-
this.showAllBases = config.showAllBases;
|
|
41419
|
-
this.showInsertions = false !== config.showInsertions;
|
|
41420
|
-
this.showMismatches = false !== config.showMismatches;
|
|
41421
|
-
this.color = config.color;
|
|
41422
|
-
this.coverageColor = config.coverageColor;
|
|
41423
41468
|
|
|
41424
41469
|
// The sort object can be an array in the case of multi-locus view, however if multiple sort positions
|
|
41425
41470
|
// are present for a given reference frame the last one will take precedence
|
|
@@ -41432,14 +41477,12 @@ class BAMTrack extends TrackBase {
|
|
|
41432
41477
|
}
|
|
41433
41478
|
}
|
|
41434
41479
|
|
|
41435
|
-
// Invoke height setter last to allocated to coverage and alignment tracks
|
|
41436
|
-
this.height = (config.height !== undefined ? config.height : DEFAULT_TRACK_HEIGHT$1);
|
|
41437
41480
|
}
|
|
41438
41481
|
|
|
41439
41482
|
set height(h) {
|
|
41440
41483
|
this._height = h;
|
|
41441
|
-
if (this.
|
|
41442
|
-
this.alignmentTrack.height = this.showCoverage ? h - this.
|
|
41484
|
+
if (this.showAlignments) {
|
|
41485
|
+
this.alignmentTrack.height = this.showCoverage ? h - this.coverageTrackHeight : h;
|
|
41443
41486
|
}
|
|
41444
41487
|
}
|
|
41445
41488
|
|
|
@@ -41526,16 +41569,15 @@ class BAMTrack extends TrackBase {
|
|
|
41526
41569
|
* @returns {number}
|
|
41527
41570
|
*/
|
|
41528
41571
|
computePixelHeight(alignmentContainer) {
|
|
41529
|
-
return (this.showCoverage ? this.
|
|
41530
|
-
(this.showAlignments ? this.alignmentTrack.computePixelHeight(alignmentContainer) : 0)
|
|
41531
|
-
15
|
|
41572
|
+
return (this.showCoverage ? this.coverageTrackHeight : 0) +
|
|
41573
|
+
(this.showAlignments ? this.alignmentTrack.computePixelHeight(alignmentContainer) : 0)
|
|
41532
41574
|
}
|
|
41533
41575
|
|
|
41534
41576
|
draw(options) {
|
|
41535
41577
|
|
|
41536
41578
|
IGVGraphics.fillRect(options.context, 0, options.pixelTop, options.pixelWidth, options.pixelHeight, {'fillStyle': "rgb(255, 255, 255)"});
|
|
41537
41579
|
|
|
41538
|
-
if (true === this.showCoverage && this.
|
|
41580
|
+
if (true === this.showCoverage && this.coverageTrackHeight > 0) {
|
|
41539
41581
|
this.trackView.axisCanvas.style.display = 'block';
|
|
41540
41582
|
this.coverageTrack.draw(options);
|
|
41541
41583
|
} else {
|
|
@@ -41550,12 +41592,12 @@ class BAMTrack extends TrackBase {
|
|
|
41550
41592
|
|
|
41551
41593
|
paintAxis(ctx, pixelWidth, pixelHeight) {
|
|
41552
41594
|
|
|
41553
|
-
this.coverageTrack.paintAxis(ctx, pixelWidth, this.
|
|
41595
|
+
this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrackHeight);
|
|
41554
41596
|
|
|
41555
41597
|
// if (this.browser.isMultiLocusMode()) {
|
|
41556
41598
|
// ctx.clearRect(0, 0, pixelWidth, pixelHeight);
|
|
41557
41599
|
// } else {
|
|
41558
|
-
// this.coverageTrack.paintAxis(ctx, pixelWidth, this.
|
|
41600
|
+
// this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrackHeight);
|
|
41559
41601
|
// }
|
|
41560
41602
|
}
|
|
41561
41603
|
|
|
@@ -41564,7 +41606,7 @@ class BAMTrack extends TrackBase {
|
|
|
41564
41606
|
}
|
|
41565
41607
|
|
|
41566
41608
|
popupData(clickState) {
|
|
41567
|
-
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.
|
|
41609
|
+
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
|
|
41568
41610
|
return this.coverageTrack.popupData(clickState)
|
|
41569
41611
|
} else {
|
|
41570
41612
|
return this.alignmentTrack.popupData(clickState)
|
|
@@ -41579,7 +41621,7 @@ class BAMTrack extends TrackBase {
|
|
|
41579
41621
|
clickedFeatures(clickState) {
|
|
41580
41622
|
|
|
41581
41623
|
let clickedObject;
|
|
41582
|
-
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.
|
|
41624
|
+
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
|
|
41583
41625
|
clickedObject = this.coverageTrack.getClickedObject(clickState);
|
|
41584
41626
|
} else {
|
|
41585
41627
|
clickedObject = this.alignmentTrack.getClickedObject(clickState);
|
|
@@ -41588,7 +41630,7 @@ class BAMTrack extends TrackBase {
|
|
|
41588
41630
|
}
|
|
41589
41631
|
|
|
41590
41632
|
hoverText(clickState) {
|
|
41591
|
-
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.
|
|
41633
|
+
if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
|
|
41592
41634
|
const clickedObject = this.coverageTrack.getClickedObject(clickState);
|
|
41593
41635
|
if (clickedObject) {
|
|
41594
41636
|
return clickedObject.hoverText()
|
|
@@ -41628,8 +41670,8 @@ class BAMTrack extends TrackBase {
|
|
|
41628
41670
|
// Show coverage / alignment options
|
|
41629
41671
|
const adjustTrackHeight = () => {
|
|
41630
41672
|
if (!this.autoHeight) {
|
|
41631
|
-
const h =
|
|
41632
|
-
(this.showCoverage ? this.
|
|
41673
|
+
const h =
|
|
41674
|
+
(this.showCoverage ? this.coverageTrackHeight : 0) +
|
|
41633
41675
|
(this.showAlignments ? this.alignmentTrack.height : 0);
|
|
41634
41676
|
this.trackView.setTrackHeight(h);
|
|
41635
41677
|
}
|
|
@@ -41943,7 +41985,6 @@ class CoverageTrack {
|
|
|
41943
41985
|
constructor(config, parent) {
|
|
41944
41986
|
this.parent = parent;
|
|
41945
41987
|
this.featureSource = parent.featureSource;
|
|
41946
|
-
this.height = config.coverageTrackHeight !== undefined ? config.coverageTrackHeight : DEFAULT_COVERAGE_TRACK_HEIGHT;
|
|
41947
41988
|
|
|
41948
41989
|
this.paintAxis = paintAxis;
|
|
41949
41990
|
this.top = 0;
|
|
@@ -41958,6 +41999,10 @@ class CoverageTrack {
|
|
|
41958
41999
|
|
|
41959
42000
|
}
|
|
41960
42001
|
|
|
42002
|
+
get height() {
|
|
42003
|
+
return this.parent.coverageTrackHeight
|
|
42004
|
+
}
|
|
42005
|
+
|
|
41961
42006
|
draw(options) {
|
|
41962
42007
|
|
|
41963
42008
|
const pixelTop = options.pixelTop;
|
|
@@ -42705,7 +42750,7 @@ class AlignmentTrack {
|
|
|
42705
42750
|
const seqstring = clickedAlignment.seq;
|
|
42706
42751
|
if (seqstring && "*" != seqstring) {
|
|
42707
42752
|
|
|
42708
|
-
if(seqstring.length < maxSequenceSize) {
|
|
42753
|
+
if (seqstring.length < maxSequenceSize) {
|
|
42709
42754
|
list.push({
|
|
42710
42755
|
label: 'BLAT read sequence',
|
|
42711
42756
|
click: () => {
|
|
@@ -44652,25 +44697,34 @@ function renderSVGAxis(context, track, axisCanvas, deltaX, deltaY) {
|
|
|
44652
44697
|
* THE SOFTWARE.
|
|
44653
44698
|
*/
|
|
44654
44699
|
|
|
44655
|
-
const DEFAULT_COLOR = "rgb(150,150,150)";
|
|
44656
|
-
|
|
44657
44700
|
class WigTrack extends TrackBase {
|
|
44658
44701
|
|
|
44702
|
+
static defaults = {
|
|
44703
|
+
height: 50,
|
|
44704
|
+
color: 'rgb(150, 150, 150)',
|
|
44705
|
+
altColor: 'rgb(150, 150, 150)',
|
|
44706
|
+
flipAxis: false,
|
|
44707
|
+
logScale: false,
|
|
44708
|
+
windowFunction: 'mean',
|
|
44709
|
+
graphType: 'bar',
|
|
44710
|
+
autoscale: true,
|
|
44711
|
+
normalize: undefined,
|
|
44712
|
+
scaleFactor: undefined
|
|
44713
|
+
}
|
|
44714
|
+
|
|
44659
44715
|
constructor(config, browser) {
|
|
44660
44716
|
super(config, browser);
|
|
44661
44717
|
}
|
|
44662
44718
|
|
|
44663
44719
|
init(config) {
|
|
44720
|
+
|
|
44664
44721
|
super.init(config);
|
|
44665
44722
|
|
|
44666
44723
|
this.type = "wig";
|
|
44667
|
-
this.height = config.height || 50;
|
|
44668
44724
|
this.featureType = 'numeric';
|
|
44669
44725
|
this.paintAxis = paintAxis;
|
|
44670
44726
|
|
|
44671
44727
|
const format = config.format ? config.format.toLowerCase() : config.format;
|
|
44672
|
-
this.flipAxis = config.flipAxis ? config.flipAxis : false;
|
|
44673
|
-
this.logScale = config.logScale ? config.logScale : false;
|
|
44674
44728
|
if (config.featureSource) {
|
|
44675
44729
|
this.featureSource = config.featureSource;
|
|
44676
44730
|
delete config.featureSource;
|
|
@@ -44682,18 +44736,16 @@ class WigTrack extends TrackBase {
|
|
|
44682
44736
|
this.featureSource = FeatureSource(config, this.browser.genome);
|
|
44683
44737
|
}
|
|
44684
44738
|
|
|
44685
|
-
|
|
44686
|
-
|
|
44739
|
+
|
|
44740
|
+
// Override autoscale default
|
|
44741
|
+
if(config.max === undefined || config.autoscale === true) {
|
|
44742
|
+
this.autoscale = true;
|
|
44743
|
+
} else {
|
|
44687
44744
|
this.dataRange = {
|
|
44688
44745
|
min: config.min || 0,
|
|
44689
44746
|
max: config.max
|
|
44690
44747
|
};
|
|
44691
44748
|
}
|
|
44692
|
-
|
|
44693
|
-
this.windowFunction = config.windowFunction || "mean";
|
|
44694
|
-
this.graphType = config.graphType || "bar";
|
|
44695
|
-
this.normalize = config.normalize; // boolean, for use with "TDF" files
|
|
44696
|
-
this.scaleFactor = config.scaleFactor; // optional scale factor, ignored if normalize === true;
|
|
44697
44749
|
}
|
|
44698
44750
|
|
|
44699
44751
|
async postInit() {
|
|
@@ -44783,7 +44835,7 @@ class WigTrack extends TrackBase {
|
|
|
44783
44835
|
const pixelWidth = options.pixelWidth;
|
|
44784
44836
|
options.pixelHeight;
|
|
44785
44837
|
const bpEnd = bpStart + pixelWidth * bpPerPixel + 1;
|
|
44786
|
-
const posColor = this.color ||
|
|
44838
|
+
const posColor = this.color || WigTrack.defaults.color;
|
|
44787
44839
|
|
|
44788
44840
|
let baselineColor;
|
|
44789
44841
|
if (typeof posColor === "string" && posColor.startsWith("rgb(")) {
|
|
@@ -44927,7 +44979,7 @@ class WigTrack extends TrackBase {
|
|
|
44927
44979
|
*/
|
|
44928
44980
|
|
|
44929
44981
|
getColorForFeature(f) {
|
|
44930
|
-
let c = (f.value < 0 && this.altColor) ? this.altColor : this.color ||
|
|
44982
|
+
let c = (f.value < 0 && this.altColor) ? this.altColor : this.color || WigTrack.defaults.color;
|
|
44931
44983
|
return (typeof c === "function") ? c(f.value) : c
|
|
44932
44984
|
}
|
|
44933
44985
|
|
|
@@ -44938,20 +44990,6 @@ class WigTrack extends TrackBase {
|
|
|
44938
44990
|
this.trackView = undefined;
|
|
44939
44991
|
}
|
|
44940
44992
|
|
|
44941
|
-
/**
|
|
44942
|
-
* Return the current state of the track. Used to create sessions and bookmarks.
|
|
44943
|
-
*
|
|
44944
|
-
* @returns {*|{}}
|
|
44945
|
-
*/
|
|
44946
|
-
getState() {
|
|
44947
|
-
|
|
44948
|
-
const config = super.getState();
|
|
44949
|
-
|
|
44950
|
-
if (this.flipAxis !== undefined) config.flipAxis = this.flipAxis;
|
|
44951
|
-
if (this.logScale !== undefined) config.logScale = this.logScale;
|
|
44952
|
-
|
|
44953
|
-
return config
|
|
44954
|
-
}
|
|
44955
44993
|
}
|
|
44956
44994
|
|
|
44957
44995
|
/**
|
|
@@ -45839,6 +45877,17 @@ const DEFAULT_ARC_COLOR = "rgb(180,25,137)";
|
|
|
45839
45877
|
|
|
45840
45878
|
class InteractionTrack extends TrackBase {
|
|
45841
45879
|
|
|
45880
|
+
static defaults = {
|
|
45881
|
+
height: 250,
|
|
45882
|
+
theta: Math.PI / 4,
|
|
45883
|
+
arcOrientation: true,
|
|
45884
|
+
showBlocks: true,
|
|
45885
|
+
blockHeight: 3,
|
|
45886
|
+
thickness: 1,
|
|
45887
|
+
alpha: 0.02,
|
|
45888
|
+
logScale: true,
|
|
45889
|
+
}
|
|
45890
|
+
|
|
45842
45891
|
constructor(config, browser) {
|
|
45843
45892
|
super(config, browser);
|
|
45844
45893
|
}
|
|
@@ -45846,16 +45895,10 @@ class InteractionTrack extends TrackBase {
|
|
|
45846
45895
|
init(config) {
|
|
45847
45896
|
|
|
45848
45897
|
super.init(config);
|
|
45849
|
-
|
|
45898
|
+
|
|
45850
45899
|
this.sinTheta = Math.sin(this.theta);
|
|
45851
45900
|
this.cosTheta = Math.cos(this.theta);
|
|
45852
|
-
this.height = config.height || 250;
|
|
45853
45901
|
this.arcType = getArcType(config); // nested | proportional | inView | partialInView
|
|
45854
|
-
this.arcOrientation = (config.arcOrientation === undefined ? true : config.arcOrientation); // true for up, false for down
|
|
45855
|
-
this.showBlocks = config.showBlocks === undefined ? true : config.showBlocks;
|
|
45856
|
-
this.blockHeight = config.blockHeight || 3;
|
|
45857
|
-
this.thickness = config.thickness || 1;
|
|
45858
|
-
this.color = config.color;
|
|
45859
45902
|
this.alpha = config.alpha || 0.02; // was: 0.15
|
|
45860
45903
|
this.painter = {flipAxis: !this.arcOrientation, dataRange: this.dataRange, paintAxis: paintAxis};
|
|
45861
45904
|
|
|
@@ -45867,7 +45910,6 @@ class InteractionTrack extends TrackBase {
|
|
|
45867
45910
|
this.valueColumn = "score";
|
|
45868
45911
|
}
|
|
45869
45912
|
|
|
45870
|
-
this.logScale = config.logScale !== false; // i.e. defaul to true (undefined => true)
|
|
45871
45913
|
if (config.max) {
|
|
45872
45914
|
this.dataRange = {
|
|
45873
45915
|
min: config.min || 0,
|
|
@@ -45892,7 +45934,7 @@ class InteractionTrack extends TrackBase {
|
|
|
45892
45934
|
|
|
45893
45935
|
if (typeof this.featureSource.getHeader === "function") {
|
|
45894
45936
|
this.header = await this.featureSource.getHeader();
|
|
45895
|
-
if(this.disposed) return; // This track was removed during async load
|
|
45937
|
+
if (this.disposed) return; // This track was removed during async load
|
|
45896
45938
|
}
|
|
45897
45939
|
|
|
45898
45940
|
// Set properties from track line
|
|
@@ -45965,7 +46007,7 @@ class InteractionTrack extends TrackBase {
|
|
|
45965
46007
|
feature.drawState = undefined;
|
|
45966
46008
|
|
|
45967
46009
|
let color;
|
|
45968
|
-
if(typeof this.color === 'function') {
|
|
46010
|
+
if (typeof this.color === 'function') {
|
|
45969
46011
|
color = this.color(feature);
|
|
45970
46012
|
} else {
|
|
45971
46013
|
color = this.color || feature.color || DEFAULT_ARC_COLOR;
|
|
@@ -46310,7 +46352,7 @@ class InteractionTrack extends TrackBase {
|
|
|
46310
46352
|
contextMenuItemList(clickState) {
|
|
46311
46353
|
|
|
46312
46354
|
// Experimental JBrowse feature
|
|
46313
|
-
if (this.browser.circularView
|
|
46355
|
+
if (this.browser.circularView) {
|
|
46314
46356
|
const viewport = clickState.viewport;
|
|
46315
46357
|
const list = [];
|
|
46316
46358
|
|
|
@@ -46339,7 +46381,7 @@ class InteractionTrack extends TrackBase {
|
|
|
46339
46381
|
|
|
46340
46382
|
// inView features are simply features that have been drawn, i.e. have a drawState
|
|
46341
46383
|
const inView = cachedFeatures.filter(f => f.drawState);
|
|
46342
|
-
if(inView.length === 0) return;
|
|
46384
|
+
if (inView.length === 0) return;
|
|
46343
46385
|
|
|
46344
46386
|
const chords = makeBedPEChords(inView);
|
|
46345
46387
|
sendChords(chords, this, refFrame, 0.5);
|
|
@@ -46375,7 +46417,7 @@ class InteractionTrack extends TrackBase {
|
|
|
46375
46417
|
|
|
46376
46418
|
popupData(clickState, features) {
|
|
46377
46419
|
|
|
46378
|
-
if(features === undefined) features = this.clickedFeatures(clickState);
|
|
46420
|
+
if (features === undefined) features = this.clickedFeatures(clickState);
|
|
46379
46421
|
|
|
46380
46422
|
const data = [];
|
|
46381
46423
|
for (let feature of features) {
|
|
@@ -46399,7 +46441,7 @@ class InteractionTrack extends TrackBase {
|
|
|
46399
46441
|
const columnNames = this.header.columnNames;
|
|
46400
46442
|
const stdColumns = this.header.hiccups ? 6 : 10;
|
|
46401
46443
|
for (let i = stdColumns; i < columnNames.length; i++) {
|
|
46402
|
-
if(this.header.colorColumn === i) continue;
|
|
46444
|
+
if (this.header.colorColumn === i) continue;
|
|
46403
46445
|
if (columnNames[i] === 'info') {
|
|
46404
46446
|
extractInfoColumn(data, f.extras[i - stdColumns]);
|
|
46405
46447
|
} else {
|
|
@@ -46421,7 +46463,7 @@ class InteractionTrack extends TrackBase {
|
|
|
46421
46463
|
|
|
46422
46464
|
// We use the cached features rather than method to avoid async load. If the
|
|
46423
46465
|
// feature is not already loaded this won't work, but the user wouldn't be mousing over it either.
|
|
46424
|
-
const featureList =
|
|
46466
|
+
const featureList = clickState.viewport.cachedFeatures;
|
|
46425
46467
|
const candidates = [];
|
|
46426
46468
|
if (featureList) {
|
|
46427
46469
|
const proportional = (this.arcType === "proportional" || this.arcType === "inView" || this.arcType === "partialInView");
|
|
@@ -46467,26 +46509,6 @@ class InteractionTrack extends TrackBase {
|
|
|
46467
46509
|
}
|
|
46468
46510
|
return candidates.map((c) => c.feature)
|
|
46469
46511
|
}
|
|
46470
|
-
|
|
46471
|
-
/**
|
|
46472
|
-
* Return the current state of the track. Used to create sessions and bookmarks.
|
|
46473
|
-
*
|
|
46474
|
-
* @returns {*|{}}
|
|
46475
|
-
*/
|
|
46476
|
-
getState() {
|
|
46477
|
-
|
|
46478
|
-
const config = super.getState();
|
|
46479
|
-
|
|
46480
|
-
// if (this.height !== undefined) config.height = this.height;
|
|
46481
|
-
if (this.arcType !== undefined) config.arcType = this.arcType;
|
|
46482
|
-
if (this.arcOrientation !== undefined) config.arcOrientation = this.arcOrientation;
|
|
46483
|
-
if (this.showBlocks !== undefined) config.showBlocks = this.showBlocks;
|
|
46484
|
-
if (this.blockHeight !== undefined) config.blockHeight = this.blockHeight;
|
|
46485
|
-
if (this.thickness !== undefined) config.thickness = this.thickness;
|
|
46486
|
-
if (this.alpha !== undefined) config.alpha = this.alpha;
|
|
46487
|
-
|
|
46488
|
-
return config
|
|
46489
|
-
}
|
|
46490
46512
|
}
|
|
46491
46513
|
|
|
46492
46514
|
function getMidpoints(feature, genome) {
|
|
@@ -46693,6 +46715,31 @@ const STANDARD_FIELDS = new Map([["REF", "referenceBases"], ["ALT", "alternateBa
|
|
|
46693
46715
|
|
|
46694
46716
|
class VariantTrack extends TrackBase {
|
|
46695
46717
|
|
|
46718
|
+
static defaults = {
|
|
46719
|
+
displayMode: "EXPANDED",
|
|
46720
|
+
sortDirection: "ASC",
|
|
46721
|
+
showGenotypes: true,
|
|
46722
|
+
squishedVariantHeight: 2,
|
|
46723
|
+
squishedCallHeight: 1,
|
|
46724
|
+
expandedCallHeight: 10,
|
|
46725
|
+
expandedVGap: 2,
|
|
46726
|
+
squishedVGap: 1,
|
|
46727
|
+
expandedGroupGap: 10,
|
|
46728
|
+
squishedGroupGap: 5,
|
|
46729
|
+
featureHeight: 14,
|
|
46730
|
+
noGenotypeColor: "rgb(200,180,180)",
|
|
46731
|
+
noCallColor: "rgb(225, 225, 225)",
|
|
46732
|
+
nonRefColor: "rgb(200, 200, 215)",
|
|
46733
|
+
mixedColor: "rgb(200, 220, 200)",
|
|
46734
|
+
homrefColor: "rgb(200, 200, 200)",
|
|
46735
|
+
homvarColor: "rgb(17,248,254)",
|
|
46736
|
+
hetvarColor: "rgb(34,12,253)",
|
|
46737
|
+
colorBy: undefined,
|
|
46738
|
+
visibilityWindow: undefined,
|
|
46739
|
+
labelDisplayMode: undefined,
|
|
46740
|
+
type: "variant"
|
|
46741
|
+
}
|
|
46742
|
+
|
|
46696
46743
|
constructor(config, browser) {
|
|
46697
46744
|
super(config, browser);
|
|
46698
46745
|
}
|
|
@@ -46701,41 +46748,18 @@ class VariantTrack extends TrackBase {
|
|
|
46701
46748
|
|
|
46702
46749
|
super.init(config);
|
|
46703
46750
|
|
|
46704
|
-
this.visibilityWindow = config.visibilityWindow;
|
|
46705
|
-
this.displayMode = config.displayMode || "EXPANDED"; // COLLAPSED | EXPANDED | SQUISHED
|
|
46706
|
-
this.labelDisplayMode = config.labelDisplayMode;
|
|
46707
46751
|
this.expandedVariantHeight = config.expandedVariantHeight || config.variantHeight || 10;
|
|
46708
|
-
|
|
46709
|
-
this.squishedCallHeight = config.squishedCallHeight || 1;
|
|
46710
|
-
this.expandedCallHeight = config.expandedCallHeight || 10;
|
|
46711
|
-
this.expandedVGap = config.expandedVGap !== undefined ? config.expandedVGap : 2;
|
|
46712
|
-
this.squishedVGap = config.squishedVGap !== undefined ? config.squishedVGap : 1;
|
|
46713
|
-
this.expandedGroupGap = config.expandedGroupGap || 10;
|
|
46714
|
-
this.squishedGroupGap = config.squishedGroupGap || 5;
|
|
46715
|
-
this.featureHeight = config.featureHeight || 14;
|
|
46716
|
-
this.visibilityWindow = config.visibilityWindow;
|
|
46752
|
+
|
|
46717
46753
|
this.featureSource = FeatureSource(config, this.browser.genome);
|
|
46718
|
-
|
|
46719
|
-
this.noCallColor = config.noCallColor || "rgb(225, 225, 225)";
|
|
46720
|
-
this.nonRefColor = config.nonRefColor || "rgb(200, 200, 215)";
|
|
46721
|
-
this.mixedColor = config.mixedColor || "rgb(200, 220, 200)";
|
|
46722
|
-
this.homrefColor = config.homrefColor || "rgb(200, 200, 200)";
|
|
46723
|
-
this.homvarColor = config.homvarColor || "rgb(17,248,254)";
|
|
46724
|
-
this.hetvarColor = config.hetvarColor || "rgb(34,12,253)";
|
|
46725
|
-
this.sortDirection = "ASC";
|
|
46726
|
-
this.type = config.type || "variant";
|
|
46727
|
-
|
|
46728
|
-
this.colorBy = config.colorBy; // Can be undefined => default
|
|
46754
|
+
|
|
46729
46755
|
this._initColorBy = config.colorBy;
|
|
46730
46756
|
if (config.colorTable) {
|
|
46731
46757
|
this.colorTables = new Map();
|
|
46732
46758
|
this.colorTables.set(config.colorBy, new ColorTable(config.colorTable));
|
|
46733
46759
|
}
|
|
46734
|
-
|
|
46735
46760
|
this._strokecolor = config.strokecolor;
|
|
46736
46761
|
this._context_hook = config.context_hook;
|
|
46737
46762
|
|
|
46738
|
-
this.showGenotypes = config.showGenotypes === undefined ? true : config.showGenotypes;
|
|
46739
46763
|
|
|
46740
46764
|
// The number of variant rows are computed dynamically, but start with "1" by default
|
|
46741
46765
|
this.variantRowCount(1);
|
|
@@ -46745,7 +46769,7 @@ class VariantTrack extends TrackBase {
|
|
|
46745
46769
|
async postInit() {
|
|
46746
46770
|
|
|
46747
46771
|
this.header = await this.getHeader(); // cricital, don't remove'
|
|
46748
|
-
if(this.disposed) return
|
|
46772
|
+
if (this.disposed) return // This track was removed during async load
|
|
46749
46773
|
if (undefined === this.visibilityWindow && this.config.indexed !== false) {
|
|
46750
46774
|
const fn = isFile(this.config.url) ? this.config.url.name : this.config.url;
|
|
46751
46775
|
if (isString(fn) && fn.toLowerCase().includes("gnomad")) {
|
|
@@ -46848,7 +46872,7 @@ class VariantTrack extends TrackBase {
|
|
|
46848
46872
|
this.variantBandHeight = TOP_MARGIN + rowCount * (variantHeight + vGap);
|
|
46849
46873
|
|
|
46850
46874
|
let callSets = this.callSets;
|
|
46851
|
-
if(!callSets && this._f) {
|
|
46875
|
+
if (!callSets && this._f) {
|
|
46852
46876
|
callSets = this._f.callSets; // "Complementary" variant for structural variants
|
|
46853
46877
|
}
|
|
46854
46878
|
const nCalls = this.getCallsetsLength();
|
|
@@ -46888,9 +46912,9 @@ class VariantTrack extends TrackBase {
|
|
|
46888
46912
|
|
|
46889
46913
|
//only paint stroke if a color is defined
|
|
46890
46914
|
let strokecolor = this.getVariantStrokecolor(variant);
|
|
46891
|
-
if (strokecolor){
|
|
46892
|
-
|
|
46893
|
-
|
|
46915
|
+
if (strokecolor) {
|
|
46916
|
+
context.strokeStyle = strokecolor;
|
|
46917
|
+
context.strokeRect(x, y, w, h);
|
|
46894
46918
|
}
|
|
46895
46919
|
|
|
46896
46920
|
// call hook if _context_hook fn is defined
|
|
@@ -46906,7 +46930,7 @@ class VariantTrack extends TrackBase {
|
|
|
46906
46930
|
this.sampleHeight = nVariantRows * (callHeight + vGap); // For each sample, there is a call for each variant at this position
|
|
46907
46931
|
|
|
46908
46932
|
let sampleNumber = 0;
|
|
46909
|
-
if(callSets && variant.calls) {
|
|
46933
|
+
if (callSets && variant.calls) {
|
|
46910
46934
|
for (let callSet of callSets) {
|
|
46911
46935
|
const call = variant.calls[callSet.id];
|
|
46912
46936
|
if (call) {
|
|
@@ -46982,13 +47006,12 @@ class VariantTrack extends TrackBase {
|
|
|
46982
47006
|
} else if ("MIXED" === v.type) {
|
|
46983
47007
|
variantColor = this.mixedColor;
|
|
46984
47008
|
} else {
|
|
46985
|
-
variantColor = this.
|
|
47009
|
+
variantColor = this.color;
|
|
46986
47010
|
}
|
|
46987
47011
|
return variantColor
|
|
46988
47012
|
}
|
|
46989
47013
|
|
|
46990
47014
|
|
|
46991
|
-
|
|
46992
47015
|
getVariantStrokecolor(variant) {
|
|
46993
47016
|
|
|
46994
47017
|
const v = variant._f || variant;
|
|
@@ -47004,13 +47027,13 @@ class VariantTrack extends TrackBase {
|
|
|
47004
47027
|
|
|
47005
47028
|
callContextHook(variant, context, x, y, w, h) {
|
|
47006
47029
|
if (this._context_hook) {
|
|
47007
|
-
|
|
47008
|
-
|
|
47030
|
+
if (typeof this._context_hook === "function") {
|
|
47031
|
+
const v = variant._f || variant;
|
|
47009
47032
|
|
|
47010
|
-
|
|
47011
|
-
|
|
47012
|
-
|
|
47013
|
-
|
|
47033
|
+
context.save();
|
|
47034
|
+
this._context_hook(v, context, x, y, w, h);
|
|
47035
|
+
context.restore();
|
|
47036
|
+
}
|
|
47014
47037
|
}
|
|
47015
47038
|
}
|
|
47016
47039
|
|
|
@@ -47054,7 +47077,7 @@ class VariantTrack extends TrackBase {
|
|
|
47054
47077
|
*/
|
|
47055
47078
|
popupData(clickState, featureList) {
|
|
47056
47079
|
|
|
47057
|
-
if(featureList === undefined) featureList = this.clickedFeatures(clickState);
|
|
47080
|
+
if (featureList === undefined) featureList = this.clickedFeatures(clickState);
|
|
47058
47081
|
const genomicLocation = clickState.genomicLocation;
|
|
47059
47082
|
const genomeID = this.browser.genome.id;
|
|
47060
47083
|
const sampleInformation = this.browser.sampleInformation;
|
|
@@ -47282,12 +47305,12 @@ class VariantTrack extends TrackBase {
|
|
|
47282
47305
|
sendChordsForViewport(viewport) {
|
|
47283
47306
|
const refFrame = viewport.referenceFrame;
|
|
47284
47307
|
let inView;
|
|
47285
|
-
if("all" === refFrame.chr) {
|
|
47308
|
+
if ("all" === refFrame.chr) {
|
|
47286
47309
|
const all = this.featureSource.getAllFeatures();
|
|
47287
47310
|
const arrays = Object.keys(all).map(k => all[k]);
|
|
47288
47311
|
inView = [].concat(...arrays);
|
|
47289
47312
|
} else {
|
|
47290
|
-
|
|
47313
|
+
inView = this.featureSource.featureCache.queryFeatures(refFrame.chr, refFrame.start, refFrame.end);
|
|
47291
47314
|
|
|
47292
47315
|
}
|
|
47293
47316
|
|
|
@@ -57525,7 +57548,7 @@ async function search(browser, string) {
|
|
|
57525
57548
|
let locusObject = parseLocusString(browser, locus);
|
|
57526
57549
|
|
|
57527
57550
|
if (!locusObject) {
|
|
57528
|
-
const feature = browser.genome.featureDB
|
|
57551
|
+
const feature = browser.genome.featureDB.get(locus.toUpperCase());
|
|
57529
57552
|
if (feature) {
|
|
57530
57553
|
locusObject = {
|
|
57531
57554
|
chr: feature.chr,
|
|
@@ -59378,7 +59401,7 @@ class ROITable extends RegionTableBase {
|
|
|
59378
59401
|
|
|
59379
59402
|
renderTable(records) {
|
|
59380
59403
|
|
|
59381
|
-
Array.from(this.
|
|
59404
|
+
Array.from(this.tableRowContainer.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
|
|
59382
59405
|
|
|
59383
59406
|
if (records.length > 0) {
|
|
59384
59407
|
|
|
@@ -59386,7 +59409,7 @@ class ROITable extends RegionTableBase {
|
|
|
59386
59409
|
|
|
59387
59410
|
for (let record of sortedRecords) {
|
|
59388
59411
|
const row = this.tableRowDOM(record);
|
|
59389
|
-
this.
|
|
59412
|
+
this.tableRowContainer.appendChild(row);
|
|
59390
59413
|
}
|
|
59391
59414
|
|
|
59392
59415
|
}
|
|
@@ -59426,14 +59449,14 @@ class ROITable extends RegionTableBase {
|
|
|
59426
59449
|
|
|
59427
59450
|
event.stopPropagation();
|
|
59428
59451
|
|
|
59429
|
-
const selected = this.
|
|
59452
|
+
const selected = this.tableDOM.querySelectorAll('.igv-roi-table-row-selected');
|
|
59430
59453
|
const loci = [];
|
|
59431
59454
|
for (let el of selected) {
|
|
59432
59455
|
const { locus } = parseRegionKey(el.dataset.region);
|
|
59433
59456
|
loci.push(locus);
|
|
59434
59457
|
}
|
|
59435
59458
|
|
|
59436
|
-
for (let el of this.
|
|
59459
|
+
for (let el of this.tableDOM.querySelectorAll('.igv-roi-table-row')) {
|
|
59437
59460
|
el.classList.remove('igv-roi-table-row-selected');
|
|
59438
59461
|
}
|
|
59439
59462
|
|
|
@@ -62066,7 +62089,7 @@ async function createTrack(config, browser) {
|
|
|
62066
62089
|
|
|
62067
62090
|
function embedCSS() {
|
|
62068
62091
|
|
|
62069
|
-
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';
|
|
62092
|
+
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';
|
|
62070
62093
|
|
|
62071
62094
|
var style = document.createElement('style');
|
|
62072
62095
|
style.setAttribute('type', 'text/css');
|