igv 2.15.3 → 2.15.4

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/dist/igv.esm.js CHANGED
@@ -23944,7 +23944,7 @@ const Cytoband = function (start, end, name, typestain) {
23944
23944
  }
23945
23945
  };
23946
23946
 
23947
- const _version = "2.15.3";
23947
+ const _version = "2.15.4";
23948
23948
  function version() {
23949
23949
  return _version
23950
23950
  }
@@ -23996,7 +23996,7 @@ const GenomeUtils = {
23996
23996
 
23997
23997
  // Delay loading cytbands untils after genome initialization to use chromosome aliases (1 vs chr1, etc).
23998
23998
  if (cytobandUrl) {
23999
- genome.cytobands = await loadCytobands(cytobandUrl, sequence.config, genome);
23999
+ genome.cytobands = await loadCytobands(cytobandUrl, sequence.config, genome);
24000
24000
  }
24001
24001
 
24002
24002
  return genome
@@ -24098,7 +24098,7 @@ class Genome {
24098
24098
  this.sequence = sequence;
24099
24099
  this.chromosomeNames = sequence.chromosomeNames;
24100
24100
  this.chromosomes = sequence.chromosomes; // An object (functions as a dictionary)
24101
- this.featureDB = {}; // Hash of name -> feature, used for search function.
24101
+ this.featureDB = new Map(); // Hash of name -> feature, used for search function.
24102
24102
 
24103
24103
  this.wholeGenomeView = config.wholeGenomeView === undefined || config.wholeGenomeView;
24104
24104
  if (this.wholeGenomeView && Object.keys(sequence.chromosomes).length > 1) {
@@ -24302,6 +24302,40 @@ class Genome {
24302
24302
  chr = this.getChromosomeName(chr);
24303
24303
  return this.sequence.getSequence(chr, start, end)
24304
24304
  }
24305
+
24306
+ addFeaturesToDB(featureList, config) {
24307
+
24308
+ const insertFeature = (name, feature) => {
24309
+ const current = this.featureDB.get(name);
24310
+ if (current) {
24311
+ feature = (feature.end - feature.start) > (current.end - current.start) ? feature : current;
24312
+
24313
+ }
24314
+ this.featureDB.set(name, feature);
24315
+ };
24316
+
24317
+ for (let feature of featureList) {
24318
+ if (feature.name) {
24319
+ insertFeature(feature.name.toUpperCase(), feature);
24320
+ }
24321
+ if (feature.gene && feature.gene.name) {
24322
+ insertFeature(feature.gene.name.toUpperCase(), feature);
24323
+ }
24324
+
24325
+ if (config.searchableFields) {
24326
+ for (let f of config.searchableFields) {
24327
+ const value = feature.getAttributeValue(f);
24328
+ if (value) {
24329
+ if (value.indexOf(" ") > 0) {
24330
+ insertFeature(value.replaceAll(" ", "+").toUpperCase(), feature);
24331
+ } else {
24332
+ insertFeature(value.toUpperCase(), feature);
24333
+ }
24334
+ }
24335
+ }
24336
+ }
24337
+ }
24338
+ }
24305
24339
  }
24306
24340
 
24307
24341
  async function loadCytobands(cytobandUrl, config, genome) {
@@ -27029,8 +27063,6 @@ function parseVariableStep(line) {
27029
27063
  * THE SOFTWARE.
27030
27064
  */
27031
27065
 
27032
- const DEFAULT_COLOR$1 = 'rgb(150,150,150)';
27033
-
27034
27066
  const fixColor = (colorString) => {
27035
27067
  if (isString$2(colorString)) {
27036
27068
  return (colorString.indexOf(",") > 0 && !(colorString.startsWith("rgb(") || colorString.startsWith("rgba("))) ?
@@ -27049,6 +27081,15 @@ const fixColor = (colorString) => {
27049
27081
  */
27050
27082
  class TrackBase {
27051
27083
 
27084
+ static defaults = {
27085
+ height: 50,
27086
+ color: 'rgb(0, 0, 150)',
27087
+ altColor: 'rgb(0, 0, 150)',
27088
+ autoHeight: false,
27089
+ visibilityWindow: undefined,
27090
+ supportHiDPI: true
27091
+ }
27092
+
27052
27093
  constructor(config, browser) {
27053
27094
  this.browser = browser;
27054
27095
  this.init(config);
@@ -27062,15 +27103,25 @@ class TrackBase {
27062
27103
  */
27063
27104
  init(config) {
27064
27105
 
27106
+ this.config = config;
27107
+
27065
27108
  if (config.displayMode) {
27066
27109
  config.displayMode = config.displayMode.toUpperCase();
27067
27110
  }
27068
27111
 
27069
- this.config = config;
27070
- this.url = config.url;
27071
- this.type = config.type;
27072
-
27073
- this.supportHiDPI = config.supportHiDPI === undefined ? true : config.supportHiDPI;
27112
+ // Set default properties
27113
+ const defaults = Object.assign({}, TrackBase.defaults);
27114
+ if(this.constructor.defaults) {
27115
+ for(let key of Object.keys(this.constructor.defaults)) {
27116
+ defaults[key] = this.constructor.defaults[key];
27117
+ }
27118
+ }
27119
+ for(let key of Object.keys(defaults)) {
27120
+ this[key] = config.hasOwnProperty(key) ? config[key] : defaults[key];
27121
+ if(key === 'color' || key === 'altColor') {
27122
+ this[key] = fixColor(this[key]);
27123
+ }
27124
+ }
27074
27125
 
27075
27126
  if (config.name || config.label) {
27076
27127
  this.name = config.name || config.label;
@@ -27080,29 +27131,15 @@ class TrackBase {
27080
27131
  this.name = getFilename$2(config.url);
27081
27132
  }
27082
27133
 
27134
+ this.url = config.url;
27135
+ if(this.config.type) this.type = this.config.type;
27083
27136
  this.id = this.config.id === undefined ? this.name : this.config.id;
27084
-
27085
27137
  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
27138
  this.autoscaleGroup = config.autoscaleGroup;
27096
-
27097
27139
  this.removable = config.removable === undefined ? true : config.removable; // Defaults to true
27098
-
27099
- this.height = config.height || 100;
27100
- this.autoHeight = config.autoHeight;
27101
27140
  this.minHeight = config.minHeight || Math.min(25, this.height);
27102
27141
  this.maxHeight = config.maxHeight || Math.max(1000, this.height);
27103
27142
 
27104
- this.visibilityWindow = config.visibilityWindow;
27105
-
27106
27143
  if (config.onclick) {
27107
27144
  this.onclick = config.onclick;
27108
27145
  config.onclick = undefined; // functions cannot be saved in sessions, clear it here.
@@ -27159,17 +27196,18 @@ class TrackBase {
27159
27196
  }
27160
27197
 
27161
27198
  /**
27162
- * Default implementation -- update config with current values.
27163
- * to create session object for bookmarking, sharing. Updates the track "config" object to reflect the
27164
- * current state. Only simple properties (string, number, boolean) are updated.
27199
+ * Used to create session object for bookmarking, sharing. Only simple property values (string, number, boolean)
27200
+ * are saved.
27165
27201
  */
27166
27202
  getState() {
27167
27203
 
27204
+ const jsonable = (v) => !(v === undefined || typeof v === 'function' || v instanceof File || v instanceof Promise);
27205
+
27168
27206
  // Create copy of config, minus transient properties (convention is name starts with '_'). Also, all
27169
27207
  // function properties are transient as they cannot be saved in json
27170
27208
  const state = {};
27171
27209
  for (let key of Object.keys(this.config)) {
27172
- if (!key.startsWith("_") && typeof this.config[key] !== "function" && this.config[key] !== undefined) {
27210
+ if (!key.startsWith("_") && jsonable(this.config[key])) {
27173
27211
  state[key] = this.config[key];
27174
27212
  }
27175
27213
  }
@@ -27183,8 +27221,18 @@ class TrackBase {
27183
27221
  }
27184
27222
  }
27185
27223
 
27186
- if (this.color) state.color = this.color;
27187
- if (this.altColor) state.altColor = this.altColor;
27224
+ // If user has changed other properties from defaults update state.
27225
+ const defs = TrackBase.defaults;
27226
+ if (this.constructor.defaults) {
27227
+ for (let key of Object.keys(this.constructor.defaults)) {
27228
+ defs[key] = this.constructor.defaults[key];
27229
+ }
27230
+ }
27231
+ for (let key of Object.keys(defs)) {
27232
+ if (undefined !== this[key] && defs[key] !== this[key]) {
27233
+ state[key] = this[key];
27234
+ }
27235
+ }
27188
27236
 
27189
27237
  // Flatten dataRange if present
27190
27238
  if (!this.autoscale && this.dataRange) {
@@ -27192,22 +27240,6 @@ class TrackBase {
27192
27240
  state.max = this.dataRange.max;
27193
27241
  }
27194
27242
 
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
27243
  return state
27212
27244
  }
27213
27245
 
@@ -27503,7 +27535,7 @@ class TrackBase {
27503
27535
  * @returns {*|string|string}
27504
27536
  */
27505
27537
  getColorForFeature(f) {
27506
- return (typeof this.color === "function") ? this.color(feature) : this.color || DEFAULT_COLOR$1
27538
+ return (typeof this.color === "function") ? this.color(feature) : this.color
27507
27539
  }
27508
27540
 
27509
27541
  /**
@@ -31907,6 +31939,7 @@ class TextFeatureSource {
31907
31939
 
31908
31940
  const queryableFormats = new Set(["bigwig", "bw", "bigbed", "bb", "biginteract", "biggenepred", "bignarrowpeak", "tdf"]);
31909
31941
 
31942
+ this.queryable = config.queryable === true; // False by default, unless explicitly set
31910
31943
  if (config.reader) {
31911
31944
  // Explicit reader implementation
31912
31945
  this.reader = config.reader;
@@ -31940,6 +31973,11 @@ class TextFeatureSource {
31940
31973
  this.queryable = true;
31941
31974
  } else ;
31942
31975
  }
31976
+
31977
+ // Set searchable unless explicitly turned off, or track uses in indexed or otherwise queryable
31978
+ // feature source. queryable => features loaded on demand (by query)
31979
+ this.searchable = config.searchable === true || config.searchableFields || (config.searchable !== false && !this.queryable);
31980
+
31943
31981
  }
31944
31982
 
31945
31983
  async defaultVisibilityWindow() {
@@ -32080,39 +32118,13 @@ class TextFeatureSource {
32080
32118
  this.featureCache = new FeatureCache$1(features, this.genome, genomicInterval);
32081
32119
 
32082
32120
  // If track is marked "searchable"< cache features by name -- use this with caution, memory intensive
32083
- if (this.config.searchable || this.config.searchableFields) {
32084
- this.addFeaturesToDB(features);
32121
+ if (this.searchable) {
32122
+ this.genome.addFeaturesToDB(features, this.config);
32085
32123
  }
32086
32124
  } else {
32087
32125
  this.featureCache = new FeatureCache$1([], genomicInterval); // Empty cache
32088
32126
  }
32089
32127
  }
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
32128
  }
32117
32129
 
32118
32130
  /*
@@ -32928,7 +32940,8 @@ function decodeWigData(data, chrIdx1, bpStart, chrIdx2, bpEnd, featureArray, chr
32928
32940
 
32929
32941
  const binaryParser = new BinaryParser(data);
32930
32942
  const chromId = binaryParser.getInt();
32931
- let chromStart = binaryParser.getInt();
32943
+ const blockStart = binaryParser.getInt();
32944
+ let chromStart = blockStart;
32932
32945
  let chromEnd = binaryParser.getInt();
32933
32946
  const itemStep = binaryParser.getInt();
32934
32947
  const itemSpan = binaryParser.getInt();
@@ -32938,6 +32951,7 @@ function decodeWigData(data, chrIdx1, bpStart, chrIdx2, bpEnd, featureArray, chr
32938
32951
 
32939
32952
  if (chromId >= chrIdx1 && chromId <= chrIdx2) {
32940
32953
 
32954
+ let idx = 0;
32941
32955
  while (itemCount-- > 0) {
32942
32956
  let value;
32943
32957
  switch (type) {
@@ -32953,8 +32967,9 @@ function decodeWigData(data, chrIdx1, bpStart, chrIdx2, bpEnd, featureArray, chr
32953
32967
  break
32954
32968
  case 3: // Fixed step
32955
32969
  value = binaryParser.getFloat();
32970
+ chromStart = blockStart + idx * itemStep;
32956
32971
  chromEnd = chromStart + itemSpan;
32957
- chromStart += itemStep;
32972
+ idx++;
32958
32973
  break
32959
32974
  }
32960
32975
 
@@ -32964,8 +32979,8 @@ function decodeWigData(data, chrIdx1, bpStart, chrIdx2, bpEnd, featureArray, chr
32964
32979
  if (Number.isFinite(value)) {
32965
32980
  const chr = chrDict[chromId];
32966
32981
  featureArray.push({chr: chr, start: chromStart, end: chromEnd, value: value});
32967
-
32968
32982
  }
32983
+
32969
32984
  }
32970
32985
  }
32971
32986
  }
@@ -33101,6 +33116,7 @@ class BWSource {
33101
33116
  this.genome = genome;
33102
33117
  this.format = config.format || "bigwig";
33103
33118
  this.wgValues = {};
33119
+ this.queryable = true;
33104
33120
  }
33105
33121
 
33106
33122
  async getFeatures({chr, start, end, bpPerPixel, windowFunction}) {
@@ -33642,6 +33658,7 @@ class TDFSource {
33642
33658
  this.genome = genome;
33643
33659
  this.windowFunction = config.windowFunction || "mean";
33644
33660
  this.reader = new TDFReader(config, genome);
33661
+ this.queryable = true;
33645
33662
  }
33646
33663
 
33647
33664
  async getFeatures({chr, start, end, bpPerPixel}) {
@@ -33851,8 +33868,8 @@ class StaticFeatureSource {
33851
33868
  this.config = config;
33852
33869
  this.genome = genome;
33853
33870
  this.queryable = false;
33871
+ this.searchable = config.searchable !== false; // searchable by default
33854
33872
  this.updateFeatures(config.features);
33855
-
33856
33873
  }
33857
33874
 
33858
33875
  updateFeatures(features) {
@@ -33862,6 +33879,10 @@ class StaticFeatureSource {
33862
33879
  mapProperties(features, this.config.mappings);
33863
33880
  }
33864
33881
  this.featureCache = new FeatureCache$1(features, this.genome);
33882
+
33883
+ if (this.searchable || this.config.searchableFields) {
33884
+ this.genome.addFeaturesToDB(features, this.config);
33885
+ }
33865
33886
  }
33866
33887
 
33867
33888
  /**
@@ -40055,8 +40076,8 @@ function renderFeature(feature, bpStart, xScale, pixelHeight, ctx, options) {
40055
40076
 
40056
40077
  // Set ctx color to a known valid color. If getColorForFeature returns an invalid color string it is ignored, and
40057
40078
  // this default will be used.
40058
- ctx.fillStyle = this.defaultColor;
40059
- ctx.strokeStyle = this.defaultColor;
40079
+ ctx.fillStyle = this.color;
40080
+ ctx.strokeStyle = this.color;
40060
40081
 
40061
40082
  const color = this.getColorForFeature(feature);
40062
40083
  ctx.fillStyle = color;
@@ -40380,6 +40401,17 @@ function renderFusionJuncSpan(feature, bpStart, xScale, pixelHeight, ctx) {
40380
40401
 
40381
40402
  class FeatureTrack extends TrackBase {
40382
40403
 
40404
+ static defaults = {
40405
+ type: "annotation",
40406
+ maxRows: 1000, // protects against pathological feature packing cases (# of rows of overlapping feaures)
40407
+ displayMode: "EXPANDED", // COLLAPSED | EXPANDED | SQUISHED
40408
+ margin: 10,
40409
+ featureHeight: 14,
40410
+ autoHeight: false,
40411
+ useScore: false
40412
+ }
40413
+
40414
+
40383
40415
  constructor(config, browser) {
40384
40416
  super(config, browser);
40385
40417
  }
@@ -40387,12 +40419,8 @@ class FeatureTrack extends TrackBase {
40387
40419
  init(config) {
40388
40420
  super.init(config);
40389
40421
 
40390
- this.type = config.type || "annotation";
40391
40422
 
40392
- // Set maxRows -- protects against pathological feature packing cases (# of rows of overlapping feaures)
40393
- this.maxRows = config.maxRows === undefined ? 1000 : config.maxRows;
40394
-
40395
- this.displayMode = config.displayMode || "EXPANDED"; // COLLAPSED | EXPANDED | SQUISHED
40423
+ // Obscure option, not common or supoorted, included for backward compatibility
40396
40424
  this.labelDisplayMode = config.labelDisplayMode;
40397
40425
 
40398
40426
  if (config._featureSource) {
@@ -40404,12 +40432,6 @@ class FeatureTrack extends TrackBase {
40404
40432
  FeatureSource(config, this.browser.genome);
40405
40433
  }
40406
40434
 
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
40435
  if ("FusionJuncSpan" === config.type) {
40414
40436
  this.render = config.render || renderFusionJuncSpan;
40415
40437
  this.squishedRowHeight = config.squishedRowHeight || 50;
@@ -40446,9 +40468,6 @@ class FeatureTrack extends TrackBase {
40446
40468
  }
40447
40469
  }
40448
40470
  }
40449
-
40450
- //UCSC useScore option
40451
- this.useScore = config.useScore;
40452
40471
  }
40453
40472
 
40454
40473
  async postInit() {
@@ -40812,7 +40831,7 @@ class FeatureTrack extends TrackBase {
40812
40831
  } else if (feature.color) {
40813
40832
  color = feature.color; // Explicit color for feature
40814
40833
  } else {
40815
- color = this.defaultColor; // Track default
40834
+ color = this.color; // Track default
40816
40835
  }
40817
40836
 
40818
40837
  if (feature.alpha && feature.alpha !== 1) {
@@ -40878,38 +40897,40 @@ class RegionTableBase {
40878
40897
 
40879
40898
  this.browser = config.browser;
40880
40899
 
40881
- this.container = domUtils.div({ class: 'igv-roi-table' });
40882
- if(config.width) {
40883
- this.container.style.width = config.width;
40900
+ this.columnFormat = config.columnFormat;
40884
40901
 
40885
- }
40902
+ this.tableRowSelectionList = [];
40903
+
40904
+ this.tableDOM = domUtils.div({ class: 'igv-roi-table' });
40905
+ // if(config.width) {
40906
+ // let [ w ] = config.width.split('px')
40907
+ // w = parseInt(w, 10)
40908
+ // this.tableDOM.style.width = `${Math.min(w, 1600)}px`
40909
+ //
40910
+ // }
40886
40911
 
40887
- config.parent.appendChild(this.container);
40912
+ config.parent.appendChild(this.tableDOM);
40888
40913
 
40889
40914
  this.headerDOM = config;
40890
40915
 
40891
- this.columnTitleDOM = config.columnFormat;
40916
+ this.tableColumnTitles = this.tableDOM;
40892
40917
 
40893
- this.rowContainerDOM = this.container;
40918
+ this.tableRowContainer = this.tableDOM;
40894
40919
 
40895
40920
  this.footerDOM = config.gotoButtonHandler;
40896
40921
 
40897
- this.columnFormat = config.columnFormat;
40898
-
40899
- this.tableRowSelectionList = [];
40900
-
40901
40922
  }
40902
40923
 
40903
40924
  set headerDOM({ browser, parent, headerTitle, dismissHandler }) {
40904
40925
 
40905
40926
  // header
40906
40927
  const dom = domUtils.div();
40907
- this.container.appendChild(dom);
40928
+ this.tableDOM.appendChild(dom);
40908
40929
 
40909
40930
  // header title
40910
40931
  const div = domUtils.div();
40911
40932
  dom.appendChild(div);
40912
- div.innerText = headerTitle;
40933
+ div.innerHTML = headerTitle;
40913
40934
 
40914
40935
  // table dismiss button
40915
40936
  const dismiss = domUtils.div();
@@ -40928,46 +40949,51 @@ class RegionTableBase {
40928
40949
  const { y:y_root } = browser.root.getBoundingClientRect();
40929
40950
  const { y:y_parent } = parent.getBoundingClientRect();
40930
40951
  const constraint = -(y_parent - y_root);
40931
- makeDraggable(this.container, dom, { minX:0, minY:constraint });
40952
+ makeDraggable(this.tableDOM, dom, { minX:0, minY:constraint });
40932
40953
 
40933
- this.container.style.display = 'none';
40954
+ this.tableDOM.style.display = 'none';
40934
40955
 
40935
40956
  this._headerDOM = dom;
40936
40957
 
40937
40958
  }
40938
40959
 
40939
- set columnTitleDOM(columnFormat) {
40960
+ set tableColumnTitles(tableDOM) {
40940
40961
 
40941
- const dom = domUtils.div({ class: 'igv-roi-table-column-titles' });
40942
- this.container.appendChild(dom);
40962
+ const tblColumnTitles = domUtils.div({ class: 'igv-roi-table-column-titles' });
40963
+ tableDOM.appendChild(tblColumnTitles);
40943
40964
 
40944
- for (const { label, width } of columnFormat) {
40965
+ for (const { label, width } of this.columnFormat) {
40945
40966
  const col = domUtils.div();
40946
- dom.appendChild(col);
40967
+ tblColumnTitles.appendChild(col);
40947
40968
  col.style.width = width;
40948
40969
  col.innerText = label;
40949
40970
  }
40950
40971
 
40972
+ this._tableColumnTitlesDOM = tblColumnTitles;
40973
+
40951
40974
  }
40952
40975
 
40953
- set rowContainerDOM(container) {
40976
+ get tableColumnTitles() {
40977
+ return this._tableColumnTitlesDOM
40978
+ }
40979
+
40980
+ set tableRowContainer(container) {
40954
40981
 
40955
- const dom = domUtils.div({ class: 'igv-roi-table-row-container' });
40956
- container.appendChild(dom);
40982
+ const tblRowContainer = domUtils.div({ class: 'igv-roi-table-row-container' });
40983
+ container.appendChild(tblRowContainer);
40957
40984
 
40958
- dom.style.minWidth = this.config.width;
40985
+ this._tableRowContainerDOM = tblRowContainer;
40959
40986
 
40960
- this._rowContainerDOM = dom;
40961
40987
  }
40962
40988
 
40963
- get rowContainerDOM() {
40964
- return this._rowContainerDOM
40989
+ get tableRowContainer() {
40990
+ return this._tableRowContainerDOM
40965
40991
  }
40966
40992
 
40967
40993
  set footerDOM(gotoButtonHandler) {
40968
40994
 
40969
40995
  const dom = domUtils.div();
40970
- this.container.appendChild(dom);
40996
+ this.tableDOM.appendChild(dom);
40971
40997
 
40972
40998
  // Go To Button
40973
40999
  const gotoButton = domUtils.div({class: 'igv-roi-table-button'});
@@ -41009,7 +41035,7 @@ class RegionTableBase {
41009
41035
  }
41010
41036
 
41011
41037
  clearTable() {
41012
- const elements = this.rowContainerDOM.querySelectorAll('.igv-roi-table-row');
41038
+ const elements = this.tableRowContainer.querySelectorAll('.igv-roi-table-row');
41013
41039
  for (let el of elements) {
41014
41040
  el.remove();
41015
41041
  }
@@ -41021,23 +41047,23 @@ class RegionTableBase {
41021
41047
  }
41022
41048
 
41023
41049
  present() {
41024
- this.container.style.left = `${ 0 }px`;
41050
+ this.tableDOM.style.left = `${ 0 }px`;
41025
41051
 
41026
41052
  const { y:y_root } = this.browser.root.getBoundingClientRect();
41027
41053
  const { y:y_parent } = this.config.parent.getBoundingClientRect();
41028
41054
 
41029
- this.container.style.top = `${ y_root - y_parent }px`;
41030
- this.container.style.display = 'flex';
41055
+ this.tableDOM.style.top = `${ y_root - y_parent }px`;
41056
+ this.tableDOM.style.display = 'flex';
41031
41057
  }
41032
41058
 
41033
41059
  dismiss() {
41034
- this.container.style.display = 'none';
41060
+ this.tableDOM.style.display = 'none';
41035
41061
  }
41036
41062
 
41037
41063
  dispose() {
41038
41064
 
41039
- this.container.innerHTML = '';
41040
- this.container.remove();
41065
+ this.tableDOM.innerHTML = '';
41066
+ this.tableDOM.remove();
41041
41067
 
41042
41068
  for (const key of Object.keys(this)) {
41043
41069
  this[key] = undefined;
@@ -41053,45 +41079,35 @@ class BlatTable extends RegionTableBase {
41053
41079
 
41054
41080
  constructor(config) {
41055
41081
 
41056
- const cooked = Object.assign({ 'width':'1040px' }, config);
41082
+ const cooked = Object.assign({ 'width':'1024px' }, config);
41057
41083
  super(cooked);
41058
41084
 
41059
41085
  this.descriptionDOM = config;
41060
41086
 
41061
41087
  }
41062
41088
 
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
41089
  set descriptionDOM(config) {
41080
41090
 
41081
41091
  if (config.description) {
41082
41092
 
41083
41093
  let dom;
41084
41094
 
41095
+ // BLAT result for query sequence
41085
41096
  dom = domUtils.div({ class: 'igv-roi-table-description' });
41086
- this.container.insertBefore(dom, this.columnTitlesDiv);
41097
+ this.tableDOM.insertBefore(dom, this.tableColumnTitles);
41098
+ dom.style.height = 'auto';
41087
41099
  dom.innerHTML = `BLAT result for query sequence:`;
41088
41100
 
41101
+ // CTAATCAtctacactggtttctactg ...
41089
41102
  dom = domUtils.div({ class: 'igv-roi-table-description' });
41090
- this.container.insertBefore(dom, this.columnTitlesDiv);
41103
+ this.tableDOM.insertBefore(dom, this.tableColumnTitles);
41104
+ dom.style.height = 'auto';
41105
+ dom.style.maxHeight = '128px';
41091
41106
  dom.innerHTML = config.description;
41092
41107
 
41108
+ // Select one or more rows ...
41093
41109
  dom = domUtils.div({ class: 'igv-roi-table-goto-explainer' });
41094
- this.container.insertBefore(dom, this.columnTitlesDiv);
41110
+ this.tableDOM.insertBefore(dom, this.tableColumnTitles);
41095
41111
  dom.innerHTML = `Select one or more rows and click Go To to view the regions`;
41096
41112
 
41097
41113
  }
@@ -41121,13 +41137,13 @@ class BlatTable extends RegionTableBase {
41121
41137
 
41122
41138
  renderTable(records) {
41123
41139
 
41124
- Array.from(this.rowContainerDOM.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
41140
+ Array.from(this.tableRowContainer.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
41125
41141
 
41126
41142
  if (records.length > 0) {
41127
41143
 
41128
41144
  for (let record of records) {
41129
41145
  const row = this.tableRowDOM(record);
41130
- this.rowContainerDOM.appendChild(row);
41146
+ this.tableRowContainer.appendChild(row);
41131
41147
  }
41132
41148
 
41133
41149
  }
@@ -41175,7 +41191,7 @@ class BlatTable extends RegionTableBase {
41175
41191
 
41176
41192
  event.stopPropagation();
41177
41193
 
41178
- const selectedRows = this.container.querySelectorAll('.igv-roi-table-row-selected');
41194
+ const selectedRows = this.tableDOM.querySelectorAll('.igv-roi-table-row-selected');
41179
41195
 
41180
41196
  const loci = [];
41181
41197
  for (const row of selectedRows) {
@@ -41187,7 +41203,7 @@ class BlatTable extends RegionTableBase {
41187
41203
  loci.push(`${ chr }:${ start }-${ end }`);
41188
41204
  }
41189
41205
 
41190
- for (const el of this.container.querySelectorAll('.igv-roi-table-row')) {
41206
+ for (const el of this.tableDOM.querySelectorAll('.igv-roi-table-row')) {
41191
41207
  el.classList.remove('igv-roi-table-row-selected');
41192
41208
  }
41193
41209
 
@@ -41382,8 +41398,6 @@ async function createBlatTrack({sequence, browser, name, title}) {
41382
41398
 
41383
41399
  const alignmentStartGap = 5;
41384
41400
  const downsampleRowHeight = 5;
41385
- const DEFAULT_COVERAGE_TRACK_HEIGHT = 50;
41386
- const DEFAULT_TRACK_HEIGHT$1 = 300;
41387
41401
  const DEFAULT_ALIGNMENT_COLOR = "rgb(185, 185, 185)";
41388
41402
  const DEFAULT_COVERAGE_COLOR = "rgb(150, 150, 150)";
41389
41403
  const DEFAULT_CONNECTOR_COLOR = "rgb(200, 200, 200)";
@@ -41391,35 +41405,37 @@ const MINIMUM_BLAT_LENGTH = 20;
41391
41405
 
41392
41406
  class BAMTrack extends TrackBase {
41393
41407
 
41408
+ static defaults = {
41409
+ alleleFreqThreshold: 0.2,
41410
+ visibilityWindow: 30000,
41411
+ showCoverage: true,
41412
+ showAlignments: true,
41413
+ viewAsPairs: false,
41414
+ pairsSupported: true,
41415
+ showSoftClips: false,
41416
+ showAllBases: false,
41417
+ showInsertions: true,
41418
+ showMismatches: true,
41419
+ color: DEFAULT_ALIGNMENT_COLOR,
41420
+ coverageColor: DEFAULT_COVERAGE_COLOR,
41421
+ height: 300,
41422
+ coverageTrackHeight: 50
41423
+ }
41424
+
41394
41425
  constructor(config, browser) {
41395
41426
  super(config, browser);
41396
41427
  }
41397
41428
 
41398
41429
  init(config) {
41399
- super.init(config);
41400
- this.type = "alignment";
41401
-
41402
- if (config.alleleFreqThreshold === undefined) {
41403
- config.alleleFreqThreshold = 0.2;
41404
- }
41405
41430
 
41431
+ this.type = "alignment";
41406
41432
  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
41433
  this.coverageTrack = new CoverageTrack(config, this);
41412
41434
  this.alignmentTrack = new AlignmentTrack(config, this);
41435
+
41436
+ super.init(config);
41437
+
41413
41438
  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
41439
 
41424
41440
  // The sort object can be an array in the case of multi-locus view, however if multiple sort positions
41425
41441
  // are present for a given reference frame the last one will take precedence
@@ -41432,14 +41448,12 @@ class BAMTrack extends TrackBase {
41432
41448
  }
41433
41449
  }
41434
41450
 
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
41451
  }
41438
41452
 
41439
41453
  set height(h) {
41440
41454
  this._height = h;
41441
- if (this.coverageTrack && this.showAlignments) {
41442
- this.alignmentTrack.height = this.showCoverage ? h - this.coverageTrack.height : h;
41455
+ if (this.showAlignments) {
41456
+ this.alignmentTrack.height = this.showCoverage ? h - this.coverageTrackHeight : h;
41443
41457
  }
41444
41458
  }
41445
41459
 
@@ -41526,16 +41540,15 @@ class BAMTrack extends TrackBase {
41526
41540
  * @returns {number}
41527
41541
  */
41528
41542
  computePixelHeight(alignmentContainer) {
41529
- return (this.showCoverage ? this.coverageTrack.height : 0) +
41530
- (this.showAlignments ? this.alignmentTrack.computePixelHeight(alignmentContainer) : 0) +
41531
- 15
41543
+ return (this.showCoverage ? this.coverageTrackHeight : 0) +
41544
+ (this.showAlignments ? this.alignmentTrack.computePixelHeight(alignmentContainer) : 0)
41532
41545
  }
41533
41546
 
41534
41547
  draw(options) {
41535
41548
 
41536
41549
  IGVGraphics.fillRect(options.context, 0, options.pixelTop, options.pixelWidth, options.pixelHeight, {'fillStyle': "rgb(255, 255, 255)"});
41537
41550
 
41538
- if (true === this.showCoverage && this.coverageTrack.height > 0) {
41551
+ if (true === this.showCoverage && this.coverageTrackHeight > 0) {
41539
41552
  this.trackView.axisCanvas.style.display = 'block';
41540
41553
  this.coverageTrack.draw(options);
41541
41554
  } else {
@@ -41550,12 +41563,12 @@ class BAMTrack extends TrackBase {
41550
41563
 
41551
41564
  paintAxis(ctx, pixelWidth, pixelHeight) {
41552
41565
 
41553
- this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrack.height);
41566
+ this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrackHeight);
41554
41567
 
41555
41568
  // if (this.browser.isMultiLocusMode()) {
41556
41569
  // ctx.clearRect(0, 0, pixelWidth, pixelHeight);
41557
41570
  // } else {
41558
- // this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrack.height);
41571
+ // this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrackHeight);
41559
41572
  // }
41560
41573
  }
41561
41574
 
@@ -41564,7 +41577,7 @@ class BAMTrack extends TrackBase {
41564
41577
  }
41565
41578
 
41566
41579
  popupData(clickState) {
41567
- if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrack.height) {
41580
+ if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
41568
41581
  return this.coverageTrack.popupData(clickState)
41569
41582
  } else {
41570
41583
  return this.alignmentTrack.popupData(clickState)
@@ -41579,7 +41592,7 @@ class BAMTrack extends TrackBase {
41579
41592
  clickedFeatures(clickState) {
41580
41593
 
41581
41594
  let clickedObject;
41582
- if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrack.height) {
41595
+ if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
41583
41596
  clickedObject = this.coverageTrack.getClickedObject(clickState);
41584
41597
  } else {
41585
41598
  clickedObject = this.alignmentTrack.getClickedObject(clickState);
@@ -41588,7 +41601,7 @@ class BAMTrack extends TrackBase {
41588
41601
  }
41589
41602
 
41590
41603
  hoverText(clickState) {
41591
- if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrack.height) {
41604
+ if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
41592
41605
  const clickedObject = this.coverageTrack.getClickedObject(clickState);
41593
41606
  if (clickedObject) {
41594
41607
  return clickedObject.hoverText()
@@ -41628,8 +41641,8 @@ class BAMTrack extends TrackBase {
41628
41641
  // Show coverage / alignment options
41629
41642
  const adjustTrackHeight = () => {
41630
41643
  if (!this.autoHeight) {
41631
- const h = 15 +
41632
- (this.showCoverage ? this.coverageTrack.height : 0) +
41644
+ const h =
41645
+ (this.showCoverage ? this.coverageTrackHeight : 0) +
41633
41646
  (this.showAlignments ? this.alignmentTrack.height : 0);
41634
41647
  this.trackView.setTrackHeight(h);
41635
41648
  }
@@ -41943,7 +41956,6 @@ class CoverageTrack {
41943
41956
  constructor(config, parent) {
41944
41957
  this.parent = parent;
41945
41958
  this.featureSource = parent.featureSource;
41946
- this.height = config.coverageTrackHeight !== undefined ? config.coverageTrackHeight : DEFAULT_COVERAGE_TRACK_HEIGHT;
41947
41959
 
41948
41960
  this.paintAxis = paintAxis;
41949
41961
  this.top = 0;
@@ -41958,6 +41970,10 @@ class CoverageTrack {
41958
41970
 
41959
41971
  }
41960
41972
 
41973
+ get height() {
41974
+ return this.parent.coverageTrackHeight
41975
+ }
41976
+
41961
41977
  draw(options) {
41962
41978
 
41963
41979
  const pixelTop = options.pixelTop;
@@ -42705,7 +42721,7 @@ class AlignmentTrack {
42705
42721
  const seqstring = clickedAlignment.seq;
42706
42722
  if (seqstring && "*" != seqstring) {
42707
42723
 
42708
- if(seqstring.length < maxSequenceSize) {
42724
+ if (seqstring.length < maxSequenceSize) {
42709
42725
  list.push({
42710
42726
  label: 'BLAT read sequence',
42711
42727
  click: () => {
@@ -44652,25 +44668,34 @@ function renderSVGAxis(context, track, axisCanvas, deltaX, deltaY) {
44652
44668
  * THE SOFTWARE.
44653
44669
  */
44654
44670
 
44655
- const DEFAULT_COLOR = "rgb(150,150,150)";
44656
-
44657
44671
  class WigTrack extends TrackBase {
44658
44672
 
44673
+ static defaults = {
44674
+ height: 50,
44675
+ color: 'rgb(150, 150, 150)',
44676
+ altColor: 'rgb(150, 150, 150)',
44677
+ flipAxis: false,
44678
+ logScale: false,
44679
+ windowFunction: 'mean',
44680
+ graphType: 'bar',
44681
+ autoscale: true,
44682
+ normalize: undefined,
44683
+ scaleFactor: undefined
44684
+ }
44685
+
44659
44686
  constructor(config, browser) {
44660
44687
  super(config, browser);
44661
44688
  }
44662
44689
 
44663
44690
  init(config) {
44691
+
44664
44692
  super.init(config);
44665
44693
 
44666
44694
  this.type = "wig";
44667
- this.height = config.height || 50;
44668
44695
  this.featureType = 'numeric';
44669
44696
  this.paintAxis = paintAxis;
44670
44697
 
44671
44698
  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
44699
  if (config.featureSource) {
44675
44700
  this.featureSource = config.featureSource;
44676
44701
  delete config.featureSource;
@@ -44682,18 +44707,16 @@ class WigTrack extends TrackBase {
44682
44707
  this.featureSource = FeatureSource(config, this.browser.genome);
44683
44708
  }
44684
44709
 
44685
- this.autoscale = config.autoscale || config.max === undefined;
44686
- if (!this.autoscale) {
44710
+
44711
+ // Override autoscale default
44712
+ if(config.max === undefined || config.autoscale === true) {
44713
+ this.autoscale = true;
44714
+ } else {
44687
44715
  this.dataRange = {
44688
44716
  min: config.min || 0,
44689
44717
  max: config.max
44690
44718
  };
44691
44719
  }
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
44720
  }
44698
44721
 
44699
44722
  async postInit() {
@@ -44783,7 +44806,7 @@ class WigTrack extends TrackBase {
44783
44806
  const pixelWidth = options.pixelWidth;
44784
44807
  options.pixelHeight;
44785
44808
  const bpEnd = bpStart + pixelWidth * bpPerPixel + 1;
44786
- const posColor = this.color || DEFAULT_COLOR;
44809
+ const posColor = this.color || WigTrack.defaults.color;
44787
44810
 
44788
44811
  let baselineColor;
44789
44812
  if (typeof posColor === "string" && posColor.startsWith("rgb(")) {
@@ -44927,7 +44950,7 @@ class WigTrack extends TrackBase {
44927
44950
  */
44928
44951
 
44929
44952
  getColorForFeature(f) {
44930
- let c = (f.value < 0 && this.altColor) ? this.altColor : this.color || DEFAULT_COLOR;
44953
+ let c = (f.value < 0 && this.altColor) ? this.altColor : this.color || WigTrack.defaults.color;
44931
44954
  return (typeof c === "function") ? c(f.value) : c
44932
44955
  }
44933
44956
 
@@ -44938,20 +44961,6 @@ class WigTrack extends TrackBase {
44938
44961
  this.trackView = undefined;
44939
44962
  }
44940
44963
 
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
44964
  }
44956
44965
 
44957
44966
  /**
@@ -45839,6 +45848,17 @@ const DEFAULT_ARC_COLOR = "rgb(180,25,137)";
45839
45848
 
45840
45849
  class InteractionTrack extends TrackBase {
45841
45850
 
45851
+ static defaults = {
45852
+ height: 250,
45853
+ theta: Math.PI / 4,
45854
+ arcOrientation: true,
45855
+ showBlocks: true,
45856
+ blockHeight: 3,
45857
+ thickness: 1,
45858
+ alpha: 0.02,
45859
+ logScale: true,
45860
+ }
45861
+
45842
45862
  constructor(config, browser) {
45843
45863
  super(config, browser);
45844
45864
  }
@@ -45846,16 +45866,10 @@ class InteractionTrack extends TrackBase {
45846
45866
  init(config) {
45847
45867
 
45848
45868
  super.init(config);
45849
- this.theta = config.theta || Math.PI / 4;
45869
+
45850
45870
  this.sinTheta = Math.sin(this.theta);
45851
45871
  this.cosTheta = Math.cos(this.theta);
45852
- this.height = config.height || 250;
45853
45872
  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
45873
  this.alpha = config.alpha || 0.02; // was: 0.15
45860
45874
  this.painter = {flipAxis: !this.arcOrientation, dataRange: this.dataRange, paintAxis: paintAxis};
45861
45875
 
@@ -45867,7 +45881,6 @@ class InteractionTrack extends TrackBase {
45867
45881
  this.valueColumn = "score";
45868
45882
  }
45869
45883
 
45870
- this.logScale = config.logScale !== false; // i.e. defaul to true (undefined => true)
45871
45884
  if (config.max) {
45872
45885
  this.dataRange = {
45873
45886
  min: config.min || 0,
@@ -45892,7 +45905,7 @@ class InteractionTrack extends TrackBase {
45892
45905
 
45893
45906
  if (typeof this.featureSource.getHeader === "function") {
45894
45907
  this.header = await this.featureSource.getHeader();
45895
- if(this.disposed) return; // This track was removed during async load
45908
+ if (this.disposed) return; // This track was removed during async load
45896
45909
  }
45897
45910
 
45898
45911
  // Set properties from track line
@@ -45965,7 +45978,7 @@ class InteractionTrack extends TrackBase {
45965
45978
  feature.drawState = undefined;
45966
45979
 
45967
45980
  let color;
45968
- if(typeof this.color === 'function') {
45981
+ if (typeof this.color === 'function') {
45969
45982
  color = this.color(feature);
45970
45983
  } else {
45971
45984
  color = this.color || feature.color || DEFAULT_ARC_COLOR;
@@ -46310,7 +46323,7 @@ class InteractionTrack extends TrackBase {
46310
46323
  contextMenuItemList(clickState) {
46311
46324
 
46312
46325
  // Experimental JBrowse feature
46313
- if (this.browser.circularView ) {
46326
+ if (this.browser.circularView) {
46314
46327
  const viewport = clickState.viewport;
46315
46328
  const list = [];
46316
46329
 
@@ -46339,7 +46352,7 @@ class InteractionTrack extends TrackBase {
46339
46352
 
46340
46353
  // inView features are simply features that have been drawn, i.e. have a drawState
46341
46354
  const inView = cachedFeatures.filter(f => f.drawState);
46342
- if(inView.length === 0) return;
46355
+ if (inView.length === 0) return;
46343
46356
 
46344
46357
  const chords = makeBedPEChords(inView);
46345
46358
  sendChords(chords, this, refFrame, 0.5);
@@ -46375,7 +46388,7 @@ class InteractionTrack extends TrackBase {
46375
46388
 
46376
46389
  popupData(clickState, features) {
46377
46390
 
46378
- if(features === undefined) features = this.clickedFeatures(clickState);
46391
+ if (features === undefined) features = this.clickedFeatures(clickState);
46379
46392
 
46380
46393
  const data = [];
46381
46394
  for (let feature of features) {
@@ -46399,7 +46412,7 @@ class InteractionTrack extends TrackBase {
46399
46412
  const columnNames = this.header.columnNames;
46400
46413
  const stdColumns = this.header.hiccups ? 6 : 10;
46401
46414
  for (let i = stdColumns; i < columnNames.length; i++) {
46402
- if(this.header.colorColumn === i) continue;
46415
+ if (this.header.colorColumn === i) continue;
46403
46416
  if (columnNames[i] === 'info') {
46404
46417
  extractInfoColumn(data, f.extras[i - stdColumns]);
46405
46418
  } else {
@@ -46421,7 +46434,7 @@ class InteractionTrack extends TrackBase {
46421
46434
 
46422
46435
  // We use the cached features rather than method to avoid async load. If the
46423
46436
  // feature is not already loaded this won't work, but the user wouldn't be mousing over it either.
46424
- const featureList = clickState.viewport.cachedFeatures;
46437
+ const featureList = clickState.viewport.cachedFeatures;
46425
46438
  const candidates = [];
46426
46439
  if (featureList) {
46427
46440
  const proportional = (this.arcType === "proportional" || this.arcType === "inView" || this.arcType === "partialInView");
@@ -46467,26 +46480,6 @@ class InteractionTrack extends TrackBase {
46467
46480
  }
46468
46481
  return candidates.map((c) => c.feature)
46469
46482
  }
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
46483
  }
46491
46484
 
46492
46485
  function getMidpoints(feature, genome) {
@@ -46693,6 +46686,31 @@ const STANDARD_FIELDS = new Map([["REF", "referenceBases"], ["ALT", "alternateBa
46693
46686
 
46694
46687
  class VariantTrack extends TrackBase {
46695
46688
 
46689
+ static defaults = {
46690
+ displayMode: "EXPANDED",
46691
+ sortDirection: "ASC",
46692
+ showGenotypes: true,
46693
+ squishedVariantHeight: 2,
46694
+ squishedCallHeight: 1,
46695
+ expandedCallHeight: 10,
46696
+ expandedVGap: 2,
46697
+ squishedVGap: 1,
46698
+ expandedGroupGap: 10,
46699
+ squishedGroupGap: 5,
46700
+ featureHeight: 14,
46701
+ noGenotypeColor: "rgb(200,180,180)",
46702
+ noCallColor: "rgb(225, 225, 225)",
46703
+ nonRefColor: "rgb(200, 200, 215)",
46704
+ mixedColor: "rgb(200, 220, 200)",
46705
+ homrefColor: "rgb(200, 200, 200)",
46706
+ homvarColor: "rgb(17,248,254)",
46707
+ hetvarColor: "rgb(34,12,253)",
46708
+ colorBy: undefined,
46709
+ visibilityWindow: undefined,
46710
+ labelDisplayMode: undefined,
46711
+ type: "variant"
46712
+ }
46713
+
46696
46714
  constructor(config, browser) {
46697
46715
  super(config, browser);
46698
46716
  }
@@ -46701,41 +46719,18 @@ class VariantTrack extends TrackBase {
46701
46719
 
46702
46720
  super.init(config);
46703
46721
 
46704
- this.visibilityWindow = config.visibilityWindow;
46705
- this.displayMode = config.displayMode || "EXPANDED"; // COLLAPSED | EXPANDED | SQUISHED
46706
- this.labelDisplayMode = config.labelDisplayMode;
46707
46722
  this.expandedVariantHeight = config.expandedVariantHeight || config.variantHeight || 10;
46708
- this.squishedVariantHeight = config.squishedVariantHeight || 2;
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;
46723
+
46717
46724
  this.featureSource = FeatureSource(config, this.browser.genome);
46718
- this.noGenotypeColor = config.noGenotypeColor || "rgb(200,180,180)";
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
46725
+
46729
46726
  this._initColorBy = config.colorBy;
46730
46727
  if (config.colorTable) {
46731
46728
  this.colorTables = new Map();
46732
46729
  this.colorTables.set(config.colorBy, new ColorTable(config.colorTable));
46733
46730
  }
46734
-
46735
46731
  this._strokecolor = config.strokecolor;
46736
46732
  this._context_hook = config.context_hook;
46737
46733
 
46738
- this.showGenotypes = config.showGenotypes === undefined ? true : config.showGenotypes;
46739
46734
 
46740
46735
  // The number of variant rows are computed dynamically, but start with "1" by default
46741
46736
  this.variantRowCount(1);
@@ -46745,7 +46740,7 @@ class VariantTrack extends TrackBase {
46745
46740
  async postInit() {
46746
46741
 
46747
46742
  this.header = await this.getHeader(); // cricital, don't remove'
46748
- if(this.disposed) return; // This track was removed during async load
46743
+ if (this.disposed) return // This track was removed during async load
46749
46744
  if (undefined === this.visibilityWindow && this.config.indexed !== false) {
46750
46745
  const fn = isFile(this.config.url) ? this.config.url.name : this.config.url;
46751
46746
  if (isString(fn) && fn.toLowerCase().includes("gnomad")) {
@@ -46848,7 +46843,7 @@ class VariantTrack extends TrackBase {
46848
46843
  this.variantBandHeight = TOP_MARGIN + rowCount * (variantHeight + vGap);
46849
46844
 
46850
46845
  let callSets = this.callSets;
46851
- if(!callSets && this._f) {
46846
+ if (!callSets && this._f) {
46852
46847
  callSets = this._f.callSets; // "Complementary" variant for structural variants
46853
46848
  }
46854
46849
  const nCalls = this.getCallsetsLength();
@@ -46888,9 +46883,9 @@ class VariantTrack extends TrackBase {
46888
46883
 
46889
46884
  //only paint stroke if a color is defined
46890
46885
  let strokecolor = this.getVariantStrokecolor(variant);
46891
- if (strokecolor){
46892
- context.strokeStyle = strokecolor;
46893
- context.strokeRect(x, y, w, h);
46886
+ if (strokecolor) {
46887
+ context.strokeStyle = strokecolor;
46888
+ context.strokeRect(x, y, w, h);
46894
46889
  }
46895
46890
 
46896
46891
  // call hook if _context_hook fn is defined
@@ -46906,7 +46901,7 @@ class VariantTrack extends TrackBase {
46906
46901
  this.sampleHeight = nVariantRows * (callHeight + vGap); // For each sample, there is a call for each variant at this position
46907
46902
 
46908
46903
  let sampleNumber = 0;
46909
- if(callSets && variant.calls) {
46904
+ if (callSets && variant.calls) {
46910
46905
  for (let callSet of callSets) {
46911
46906
  const call = variant.calls[callSet.id];
46912
46907
  if (call) {
@@ -46982,13 +46977,12 @@ class VariantTrack extends TrackBase {
46982
46977
  } else if ("MIXED" === v.type) {
46983
46978
  variantColor = this.mixedColor;
46984
46979
  } else {
46985
- variantColor = this.defaultColor;
46980
+ variantColor = this.color;
46986
46981
  }
46987
46982
  return variantColor
46988
46983
  }
46989
46984
 
46990
46985
 
46991
-
46992
46986
  getVariantStrokecolor(variant) {
46993
46987
 
46994
46988
  const v = variant._f || variant;
@@ -47004,13 +46998,13 @@ class VariantTrack extends TrackBase {
47004
46998
 
47005
46999
  callContextHook(variant, context, x, y, w, h) {
47006
47000
  if (this._context_hook) {
47007
- if (typeof this._context_hook === "function") {
47008
- const v = variant._f || variant;
47001
+ if (typeof this._context_hook === "function") {
47002
+ const v = variant._f || variant;
47009
47003
 
47010
- context.save();
47011
- this._context_hook(v, context, x, y, w, h);
47012
- context.restore();
47013
- }
47004
+ context.save();
47005
+ this._context_hook(v, context, x, y, w, h);
47006
+ context.restore();
47007
+ }
47014
47008
  }
47015
47009
  }
47016
47010
 
@@ -47054,7 +47048,7 @@ class VariantTrack extends TrackBase {
47054
47048
  */
47055
47049
  popupData(clickState, featureList) {
47056
47050
 
47057
- if(featureList === undefined) featureList = this.clickedFeatures(clickState);
47051
+ if (featureList === undefined) featureList = this.clickedFeatures(clickState);
47058
47052
  const genomicLocation = clickState.genomicLocation;
47059
47053
  const genomeID = this.browser.genome.id;
47060
47054
  const sampleInformation = this.browser.sampleInformation;
@@ -47282,12 +47276,12 @@ class VariantTrack extends TrackBase {
47282
47276
  sendChordsForViewport(viewport) {
47283
47277
  const refFrame = viewport.referenceFrame;
47284
47278
  let inView;
47285
- if("all" === refFrame.chr) {
47279
+ if ("all" === refFrame.chr) {
47286
47280
  const all = this.featureSource.getAllFeatures();
47287
47281
  const arrays = Object.keys(all).map(k => all[k]);
47288
47282
  inView = [].concat(...arrays);
47289
47283
  } else {
47290
- inView = this.featureSource.featureCache.queryFeatures(refFrame.chr, refFrame.start, refFrame.end);
47284
+ inView = this.featureSource.featureCache.queryFeatures(refFrame.chr, refFrame.start, refFrame.end);
47291
47285
 
47292
47286
  }
47293
47287
 
@@ -57525,7 +57519,7 @@ async function search(browser, string) {
57525
57519
  let locusObject = parseLocusString(browser, locus);
57526
57520
 
57527
57521
  if (!locusObject) {
57528
- const feature = browser.genome.featureDB[locus.toUpperCase()];
57522
+ const feature = browser.genome.featureDB.get(locus.toUpperCase());
57529
57523
  if (feature) {
57530
57524
  locusObject = {
57531
57525
  chr: feature.chr,
@@ -59378,7 +59372,7 @@ class ROITable extends RegionTableBase {
59378
59372
 
59379
59373
  renderTable(records) {
59380
59374
 
59381
- Array.from(this.rowContainerDOM.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
59375
+ Array.from(this.tableRowContainer.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
59382
59376
 
59383
59377
  if (records.length > 0) {
59384
59378
 
@@ -59386,7 +59380,7 @@ class ROITable extends RegionTableBase {
59386
59380
 
59387
59381
  for (let record of sortedRecords) {
59388
59382
  const row = this.tableRowDOM(record);
59389
- this.rowContainerDOM.appendChild(row);
59383
+ this.tableRowContainer.appendChild(row);
59390
59384
  }
59391
59385
 
59392
59386
  }
@@ -59426,14 +59420,14 @@ class ROITable extends RegionTableBase {
59426
59420
 
59427
59421
  event.stopPropagation();
59428
59422
 
59429
- const selected = this.container.querySelectorAll('.igv-roi-table-row-selected');
59423
+ const selected = this.tableDOM.querySelectorAll('.igv-roi-table-row-selected');
59430
59424
  const loci = [];
59431
59425
  for (let el of selected) {
59432
59426
  const { locus } = parseRegionKey(el.dataset.region);
59433
59427
  loci.push(locus);
59434
59428
  }
59435
59429
 
59436
- for (let el of this.container.querySelectorAll('.igv-roi-table-row')) {
59430
+ for (let el of this.tableDOM.querySelectorAll('.igv-roi-table-row')) {
59437
59431
  el.classList.remove('igv-roi-table-row-selected');
59438
59432
  }
59439
59433
 
@@ -62066,7 +62060,7 @@ async function createTrack(config, browser) {
62066
62060
 
62067
62061
  function embedCSS() {
62068
62062
 
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';
62063
+ 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
62064
 
62071
62065
  var style = document.createElement('style');
62072
62066
  style.setAttribute('type', 'text/css');