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.js CHANGED
@@ -23950,7 +23950,7 @@
23950
23950
  }
23951
23951
  };
23952
23952
 
23953
- const _version = "2.15.3";
23953
+ const _version = "2.15.4";
23954
23954
  function version() {
23955
23955
  return _version
23956
23956
  }
@@ -24002,7 +24002,7 @@
24002
24002
 
24003
24003
  // Delay loading cytbands untils after genome initialization to use chromosome aliases (1 vs chr1, etc).
24004
24004
  if (cytobandUrl) {
24005
- genome.cytobands = await loadCytobands(cytobandUrl, sequence.config, genome);
24005
+ genome.cytobands = await loadCytobands(cytobandUrl, sequence.config, genome);
24006
24006
  }
24007
24007
 
24008
24008
  return genome
@@ -24104,7 +24104,7 @@
24104
24104
  this.sequence = sequence;
24105
24105
  this.chromosomeNames = sequence.chromosomeNames;
24106
24106
  this.chromosomes = sequence.chromosomes; // An object (functions as a dictionary)
24107
- this.featureDB = {}; // Hash of name -> feature, used for search function.
24107
+ this.featureDB = new Map(); // Hash of name -> feature, used for search function.
24108
24108
 
24109
24109
  this.wholeGenomeView = config.wholeGenomeView === undefined || config.wholeGenomeView;
24110
24110
  if (this.wholeGenomeView && Object.keys(sequence.chromosomes).length > 1) {
@@ -24308,6 +24308,40 @@
24308
24308
  chr = this.getChromosomeName(chr);
24309
24309
  return this.sequence.getSequence(chr, start, end)
24310
24310
  }
24311
+
24312
+ addFeaturesToDB(featureList, config) {
24313
+
24314
+ const insertFeature = (name, feature) => {
24315
+ const current = this.featureDB.get(name);
24316
+ if (current) {
24317
+ feature = (feature.end - feature.start) > (current.end - current.start) ? feature : current;
24318
+
24319
+ }
24320
+ this.featureDB.set(name, feature);
24321
+ };
24322
+
24323
+ for (let feature of featureList) {
24324
+ if (feature.name) {
24325
+ insertFeature(feature.name.toUpperCase(), feature);
24326
+ }
24327
+ if (feature.gene && feature.gene.name) {
24328
+ insertFeature(feature.gene.name.toUpperCase(), feature);
24329
+ }
24330
+
24331
+ if (config.searchableFields) {
24332
+ for (let f of config.searchableFields) {
24333
+ const value = feature.getAttributeValue(f);
24334
+ if (value) {
24335
+ if (value.indexOf(" ") > 0) {
24336
+ insertFeature(value.replaceAll(" ", "+").toUpperCase(), feature);
24337
+ } else {
24338
+ insertFeature(value.toUpperCase(), feature);
24339
+ }
24340
+ }
24341
+ }
24342
+ }
24343
+ }
24344
+ }
24311
24345
  }
24312
24346
 
24313
24347
  async function loadCytobands(cytobandUrl, config, genome) {
@@ -27035,8 +27069,6 @@
27035
27069
  * THE SOFTWARE.
27036
27070
  */
27037
27071
 
27038
- const DEFAULT_COLOR$1 = 'rgb(150,150,150)';
27039
-
27040
27072
  const fixColor = (colorString) => {
27041
27073
  if (isString$2(colorString)) {
27042
27074
  return (colorString.indexOf(",") > 0 && !(colorString.startsWith("rgb(") || colorString.startsWith("rgba("))) ?
@@ -27055,6 +27087,15 @@
27055
27087
  */
27056
27088
  class TrackBase {
27057
27089
 
27090
+ static defaults = {
27091
+ height: 50,
27092
+ color: 'rgb(0, 0, 150)',
27093
+ altColor: 'rgb(0, 0, 150)',
27094
+ autoHeight: false,
27095
+ visibilityWindow: undefined,
27096
+ supportHiDPI: true
27097
+ }
27098
+
27058
27099
  constructor(config, browser) {
27059
27100
  this.browser = browser;
27060
27101
  this.init(config);
@@ -27068,15 +27109,25 @@
27068
27109
  */
27069
27110
  init(config) {
27070
27111
 
27112
+ this.config = config;
27113
+
27071
27114
  if (config.displayMode) {
27072
27115
  config.displayMode = config.displayMode.toUpperCase();
27073
27116
  }
27074
27117
 
27075
- this.config = config;
27076
- this.url = config.url;
27077
- this.type = config.type;
27078
-
27079
- this.supportHiDPI = config.supportHiDPI === undefined ? true : config.supportHiDPI;
27118
+ // Set default properties
27119
+ const defaults = Object.assign({}, TrackBase.defaults);
27120
+ if(this.constructor.defaults) {
27121
+ for(let key of Object.keys(this.constructor.defaults)) {
27122
+ defaults[key] = this.constructor.defaults[key];
27123
+ }
27124
+ }
27125
+ for(let key of Object.keys(defaults)) {
27126
+ this[key] = config.hasOwnProperty(key) ? config[key] : defaults[key];
27127
+ if(key === 'color' || key === 'altColor') {
27128
+ this[key] = fixColor(this[key]);
27129
+ }
27130
+ }
27080
27131
 
27081
27132
  if (config.name || config.label) {
27082
27133
  this.name = config.name || config.label;
@@ -27086,29 +27137,15 @@
27086
27137
  this.name = getFilename$2(config.url);
27087
27138
  }
27088
27139
 
27140
+ this.url = config.url;
27141
+ if(this.config.type) this.type = this.config.type;
27089
27142
  this.id = this.config.id === undefined ? this.name : this.config.id;
27090
-
27091
27143
  this.order = config.order;
27092
-
27093
- if (config.color) this.color = fixColor(config.color);
27094
- if (config.altColor) this.altColor = fixColor(config.altColor);
27095
- if ("civic-ws" === config.sourceType) { // Ugly proxy for specialized track type
27096
- this.defaultColor = "rgb(155,20,20)";
27097
- } else {
27098
- this.defaultColor = "rgb(0,0,150)";
27099
- }
27100
-
27101
27144
  this.autoscaleGroup = config.autoscaleGroup;
27102
-
27103
27145
  this.removable = config.removable === undefined ? true : config.removable; // Defaults to true
27104
-
27105
- this.height = config.height || 100;
27106
- this.autoHeight = config.autoHeight;
27107
27146
  this.minHeight = config.minHeight || Math.min(25, this.height);
27108
27147
  this.maxHeight = config.maxHeight || Math.max(1000, this.height);
27109
27148
 
27110
- this.visibilityWindow = config.visibilityWindow;
27111
-
27112
27149
  if (config.onclick) {
27113
27150
  this.onclick = config.onclick;
27114
27151
  config.onclick = undefined; // functions cannot be saved in sessions, clear it here.
@@ -27165,17 +27202,18 @@
27165
27202
  }
27166
27203
 
27167
27204
  /**
27168
- * Default implementation -- update config with current values.
27169
- * to create session object for bookmarking, sharing. Updates the track "config" object to reflect the
27170
- * current state. Only simple properties (string, number, boolean) are updated.
27205
+ * Used to create session object for bookmarking, sharing. Only simple property values (string, number, boolean)
27206
+ * are saved.
27171
27207
  */
27172
27208
  getState() {
27173
27209
 
27210
+ const jsonable = (v) => !(v === undefined || typeof v === 'function' || v instanceof File || v instanceof Promise);
27211
+
27174
27212
  // Create copy of config, minus transient properties (convention is name starts with '_'). Also, all
27175
27213
  // function properties are transient as they cannot be saved in json
27176
27214
  const state = {};
27177
27215
  for (let key of Object.keys(this.config)) {
27178
- if (!key.startsWith("_") && typeof this.config[key] !== "function" && this.config[key] !== undefined) {
27216
+ if (!key.startsWith("_") && jsonable(this.config[key])) {
27179
27217
  state[key] = this.config[key];
27180
27218
  }
27181
27219
  }
@@ -27189,8 +27227,18 @@
27189
27227
  }
27190
27228
  }
27191
27229
 
27192
- if (this.color) state.color = this.color;
27193
- if (this.altColor) state.altColor = this.altColor;
27230
+ // If user has changed other properties from defaults update state.
27231
+ const defs = TrackBase.defaults;
27232
+ if (this.constructor.defaults) {
27233
+ for (let key of Object.keys(this.constructor.defaults)) {
27234
+ defs[key] = this.constructor.defaults[key];
27235
+ }
27236
+ }
27237
+ for (let key of Object.keys(defs)) {
27238
+ if (undefined !== this[key] && defs[key] !== this[key]) {
27239
+ state[key] = this[key];
27240
+ }
27241
+ }
27194
27242
 
27195
27243
  // Flatten dataRange if present
27196
27244
  if (!this.autoscale && this.dataRange) {
@@ -27198,22 +27246,6 @@
27198
27246
  state.max = this.dataRange.max;
27199
27247
  }
27200
27248
 
27201
-
27202
- // Check for non-json-if-yable properties. Perhaps we should test what can be saved.
27203
- for (let key of Object.keys(state)) {
27204
- const value = state[key];
27205
- if (typeof value === 'function') {
27206
- throw Error(`Property '${key}' of track '${this.name} is a function. Functions cannot be saved in sessions.`)
27207
- }
27208
- if (value instanceof File) { // Test specifically for File. Other types of File-like objects might be savable
27209
- const str = `Track ${this.name} is a local file. Sessions cannot be saved with local file references.`;
27210
- throw Error(str)
27211
- }
27212
- if (value instanceof Promise) {
27213
- throw Error(`Property '${key}' of track '${this.name} is a Promise. Promises cannot be saved in sessions.`)
27214
- }
27215
- }
27216
-
27217
27249
  return state
27218
27250
  }
27219
27251
 
@@ -27509,7 +27541,7 @@
27509
27541
  * @returns {*|string|string}
27510
27542
  */
27511
27543
  getColorForFeature(f) {
27512
- return (typeof this.color === "function") ? this.color(feature) : this.color || DEFAULT_COLOR$1
27544
+ return (typeof this.color === "function") ? this.color(feature) : this.color
27513
27545
  }
27514
27546
 
27515
27547
  /**
@@ -31913,6 +31945,7 @@
31913
31945
 
31914
31946
  const queryableFormats = new Set(["bigwig", "bw", "bigbed", "bb", "biginteract", "biggenepred", "bignarrowpeak", "tdf"]);
31915
31947
 
31948
+ this.queryable = config.queryable === true; // False by default, unless explicitly set
31916
31949
  if (config.reader) {
31917
31950
  // Explicit reader implementation
31918
31951
  this.reader = config.reader;
@@ -31946,6 +31979,11 @@
31946
31979
  this.queryable = true;
31947
31980
  } else ;
31948
31981
  }
31982
+
31983
+ // Set searchable unless explicitly turned off, or track uses in indexed or otherwise queryable
31984
+ // feature source. queryable => features loaded on demand (by query)
31985
+ this.searchable = config.searchable === true || config.searchableFields || (config.searchable !== false && !this.queryable);
31986
+
31949
31987
  }
31950
31988
 
31951
31989
  async defaultVisibilityWindow() {
@@ -32086,39 +32124,13 @@
32086
32124
  this.featureCache = new FeatureCache$1(features, this.genome, genomicInterval);
32087
32125
 
32088
32126
  // If track is marked "searchable"< cache features by name -- use this with caution, memory intensive
32089
- if (this.config.searchable || this.config.searchableFields) {
32090
- this.addFeaturesToDB(features);
32127
+ if (this.searchable) {
32128
+ this.genome.addFeaturesToDB(features, this.config);
32091
32129
  }
32092
32130
  } else {
32093
32131
  this.featureCache = new FeatureCache$1([], genomicInterval); // Empty cache
32094
32132
  }
32095
32133
  }
32096
-
32097
- addFeaturesToDB(featureList) {
32098
- for (let feature of featureList) {
32099
- if (feature.name) {
32100
- this.genome.featureDB[feature.name.toUpperCase()] = feature;
32101
- }
32102
- if (feature.gene && feature.gene.name) {
32103
- this.genome.featureDB[feature.gene.name.toUpperCase()] = feature;
32104
- }
32105
-
32106
- if (this.config.searchableFields) {
32107
- for (let f of this.config.searchableFields) {
32108
- const value = feature.getAttributeValue(f);
32109
- if (value) {
32110
- if (value.indexOf(" ") > 0) {
32111
- this.genome.featureDB[value.replaceAll(" ", "+").toUpperCase()] = feature;
32112
- this.genome.featureDB[value.replaceAll(" ", "%20").toUpperCase()] = feature;
32113
- } else {
32114
- this.genome.featureDB[value.toUpperCase()] = feature;
32115
- }
32116
- }
32117
- }
32118
- }
32119
- }
32120
- }
32121
-
32122
32134
  }
32123
32135
 
32124
32136
  /*
@@ -32934,7 +32946,8 @@
32934
32946
 
32935
32947
  const binaryParser = new BinaryParser(data);
32936
32948
  const chromId = binaryParser.getInt();
32937
- let chromStart = binaryParser.getInt();
32949
+ const blockStart = binaryParser.getInt();
32950
+ let chromStart = blockStart;
32938
32951
  let chromEnd = binaryParser.getInt();
32939
32952
  const itemStep = binaryParser.getInt();
32940
32953
  const itemSpan = binaryParser.getInt();
@@ -32944,6 +32957,7 @@
32944
32957
 
32945
32958
  if (chromId >= chrIdx1 && chromId <= chrIdx2) {
32946
32959
 
32960
+ let idx = 0;
32947
32961
  while (itemCount-- > 0) {
32948
32962
  let value;
32949
32963
  switch (type) {
@@ -32959,8 +32973,9 @@
32959
32973
  break
32960
32974
  case 3: // Fixed step
32961
32975
  value = binaryParser.getFloat();
32976
+ chromStart = blockStart + idx * itemStep;
32962
32977
  chromEnd = chromStart + itemSpan;
32963
- chromStart += itemStep;
32978
+ idx++;
32964
32979
  break
32965
32980
  }
32966
32981
 
@@ -32970,8 +32985,8 @@
32970
32985
  if (Number.isFinite(value)) {
32971
32986
  const chr = chrDict[chromId];
32972
32987
  featureArray.push({chr: chr, start: chromStart, end: chromEnd, value: value});
32973
-
32974
32988
  }
32989
+
32975
32990
  }
32976
32991
  }
32977
32992
  }
@@ -33107,6 +33122,7 @@
33107
33122
  this.genome = genome;
33108
33123
  this.format = config.format || "bigwig";
33109
33124
  this.wgValues = {};
33125
+ this.queryable = true;
33110
33126
  }
33111
33127
 
33112
33128
  async getFeatures({chr, start, end, bpPerPixel, windowFunction}) {
@@ -33648,6 +33664,7 @@
33648
33664
  this.genome = genome;
33649
33665
  this.windowFunction = config.windowFunction || "mean";
33650
33666
  this.reader = new TDFReader(config, genome);
33667
+ this.queryable = true;
33651
33668
  }
33652
33669
 
33653
33670
  async getFeatures({chr, start, end, bpPerPixel}) {
@@ -33857,8 +33874,8 @@
33857
33874
  this.config = config;
33858
33875
  this.genome = genome;
33859
33876
  this.queryable = false;
33877
+ this.searchable = config.searchable !== false; // searchable by default
33860
33878
  this.updateFeatures(config.features);
33861
-
33862
33879
  }
33863
33880
 
33864
33881
  updateFeatures(features) {
@@ -33868,6 +33885,10 @@
33868
33885
  mapProperties(features, this.config.mappings);
33869
33886
  }
33870
33887
  this.featureCache = new FeatureCache$1(features, this.genome);
33888
+
33889
+ if (this.searchable || this.config.searchableFields) {
33890
+ this.genome.addFeaturesToDB(features, this.config);
33891
+ }
33871
33892
  }
33872
33893
 
33873
33894
  /**
@@ -40061,8 +40082,8 @@
40061
40082
 
40062
40083
  // Set ctx color to a known valid color. If getColorForFeature returns an invalid color string it is ignored, and
40063
40084
  // this default will be used.
40064
- ctx.fillStyle = this.defaultColor;
40065
- ctx.strokeStyle = this.defaultColor;
40085
+ ctx.fillStyle = this.color;
40086
+ ctx.strokeStyle = this.color;
40066
40087
 
40067
40088
  const color = this.getColorForFeature(feature);
40068
40089
  ctx.fillStyle = color;
@@ -40386,6 +40407,17 @@
40386
40407
 
40387
40408
  class FeatureTrack extends TrackBase {
40388
40409
 
40410
+ static defaults = {
40411
+ type: "annotation",
40412
+ maxRows: 1000, // protects against pathological feature packing cases (# of rows of overlapping feaures)
40413
+ displayMode: "EXPANDED", // COLLAPSED | EXPANDED | SQUISHED
40414
+ margin: 10,
40415
+ featureHeight: 14,
40416
+ autoHeight: false,
40417
+ useScore: false
40418
+ }
40419
+
40420
+
40389
40421
  constructor(config, browser) {
40390
40422
  super(config, browser);
40391
40423
  }
@@ -40393,12 +40425,8 @@
40393
40425
  init(config) {
40394
40426
  super.init(config);
40395
40427
 
40396
- this.type = config.type || "annotation";
40397
40428
 
40398
- // Set maxRows -- protects against pathological feature packing cases (# of rows of overlapping feaures)
40399
- this.maxRows = config.maxRows === undefined ? 1000 : config.maxRows;
40400
-
40401
- this.displayMode = config.displayMode || "EXPANDED"; // COLLAPSED | EXPANDED | SQUISHED
40429
+ // Obscure option, not common or supoorted, included for backward compatibility
40402
40430
  this.labelDisplayMode = config.labelDisplayMode;
40403
40431
 
40404
40432
  if (config._featureSource) {
@@ -40410,12 +40438,6 @@
40410
40438
  FeatureSource(config, this.browser.genome);
40411
40439
  }
40412
40440
 
40413
- // Set default heights
40414
- this.autoHeight = config.autoHeight;
40415
- this.margin = config.margin === undefined ? 10 : config.margin;
40416
-
40417
- this.featureHeight = config.featureHeight || 14;
40418
-
40419
40441
  if ("FusionJuncSpan" === config.type) {
40420
40442
  this.render = config.render || renderFusionJuncSpan;
40421
40443
  this.squishedRowHeight = config.squishedRowHeight || 50;
@@ -40452,9 +40474,6 @@
40452
40474
  }
40453
40475
  }
40454
40476
  }
40455
-
40456
- //UCSC useScore option
40457
- this.useScore = config.useScore;
40458
40477
  }
40459
40478
 
40460
40479
  async postInit() {
@@ -40818,7 +40837,7 @@
40818
40837
  } else if (feature.color) {
40819
40838
  color = feature.color; // Explicit color for feature
40820
40839
  } else {
40821
- color = this.defaultColor; // Track default
40840
+ color = this.color; // Track default
40822
40841
  }
40823
40842
 
40824
40843
  if (feature.alpha && feature.alpha !== 1) {
@@ -40884,38 +40903,40 @@
40884
40903
 
40885
40904
  this.browser = config.browser;
40886
40905
 
40887
- this.container = domUtils.div({ class: 'igv-roi-table' });
40888
- if(config.width) {
40889
- this.container.style.width = config.width;
40906
+ this.columnFormat = config.columnFormat;
40890
40907
 
40891
- }
40908
+ this.tableRowSelectionList = [];
40909
+
40910
+ this.tableDOM = domUtils.div({ class: 'igv-roi-table' });
40911
+ // if(config.width) {
40912
+ // let [ w ] = config.width.split('px')
40913
+ // w = parseInt(w, 10)
40914
+ // this.tableDOM.style.width = `${Math.min(w, 1600)}px`
40915
+ //
40916
+ // }
40892
40917
 
40893
- config.parent.appendChild(this.container);
40918
+ config.parent.appendChild(this.tableDOM);
40894
40919
 
40895
40920
  this.headerDOM = config;
40896
40921
 
40897
- this.columnTitleDOM = config.columnFormat;
40922
+ this.tableColumnTitles = this.tableDOM;
40898
40923
 
40899
- this.rowContainerDOM = this.container;
40924
+ this.tableRowContainer = this.tableDOM;
40900
40925
 
40901
40926
  this.footerDOM = config.gotoButtonHandler;
40902
40927
 
40903
- this.columnFormat = config.columnFormat;
40904
-
40905
- this.tableRowSelectionList = [];
40906
-
40907
40928
  }
40908
40929
 
40909
40930
  set headerDOM({ browser, parent, headerTitle, dismissHandler }) {
40910
40931
 
40911
40932
  // header
40912
40933
  const dom = domUtils.div();
40913
- this.container.appendChild(dom);
40934
+ this.tableDOM.appendChild(dom);
40914
40935
 
40915
40936
  // header title
40916
40937
  const div = domUtils.div();
40917
40938
  dom.appendChild(div);
40918
- div.innerText = headerTitle;
40939
+ div.innerHTML = headerTitle;
40919
40940
 
40920
40941
  // table dismiss button
40921
40942
  const dismiss = domUtils.div();
@@ -40934,46 +40955,51 @@
40934
40955
  const { y:y_root } = browser.root.getBoundingClientRect();
40935
40956
  const { y:y_parent } = parent.getBoundingClientRect();
40936
40957
  const constraint = -(y_parent - y_root);
40937
- makeDraggable(this.container, dom, { minX:0, minY:constraint });
40958
+ makeDraggable(this.tableDOM, dom, { minX:0, minY:constraint });
40938
40959
 
40939
- this.container.style.display = 'none';
40960
+ this.tableDOM.style.display = 'none';
40940
40961
 
40941
40962
  this._headerDOM = dom;
40942
40963
 
40943
40964
  }
40944
40965
 
40945
- set columnTitleDOM(columnFormat) {
40966
+ set tableColumnTitles(tableDOM) {
40946
40967
 
40947
- const dom = domUtils.div({ class: 'igv-roi-table-column-titles' });
40948
- this.container.appendChild(dom);
40968
+ const tblColumnTitles = domUtils.div({ class: 'igv-roi-table-column-titles' });
40969
+ tableDOM.appendChild(tblColumnTitles);
40949
40970
 
40950
- for (const { label, width } of columnFormat) {
40971
+ for (const { label, width } of this.columnFormat) {
40951
40972
  const col = domUtils.div();
40952
- dom.appendChild(col);
40973
+ tblColumnTitles.appendChild(col);
40953
40974
  col.style.width = width;
40954
40975
  col.innerText = label;
40955
40976
  }
40956
40977
 
40978
+ this._tableColumnTitlesDOM = tblColumnTitles;
40979
+
40957
40980
  }
40958
40981
 
40959
- set rowContainerDOM(container) {
40982
+ get tableColumnTitles() {
40983
+ return this._tableColumnTitlesDOM
40984
+ }
40985
+
40986
+ set tableRowContainer(container) {
40960
40987
 
40961
- const dom = domUtils.div({ class: 'igv-roi-table-row-container' });
40962
- container.appendChild(dom);
40988
+ const tblRowContainer = domUtils.div({ class: 'igv-roi-table-row-container' });
40989
+ container.appendChild(tblRowContainer);
40963
40990
 
40964
- dom.style.minWidth = this.config.width;
40991
+ this._tableRowContainerDOM = tblRowContainer;
40965
40992
 
40966
- this._rowContainerDOM = dom;
40967
40993
  }
40968
40994
 
40969
- get rowContainerDOM() {
40970
- return this._rowContainerDOM
40995
+ get tableRowContainer() {
40996
+ return this._tableRowContainerDOM
40971
40997
  }
40972
40998
 
40973
40999
  set footerDOM(gotoButtonHandler) {
40974
41000
 
40975
41001
  const dom = domUtils.div();
40976
- this.container.appendChild(dom);
41002
+ this.tableDOM.appendChild(dom);
40977
41003
 
40978
41004
  // Go To Button
40979
41005
  const gotoButton = domUtils.div({class: 'igv-roi-table-button'});
@@ -41015,7 +41041,7 @@
41015
41041
  }
41016
41042
 
41017
41043
  clearTable() {
41018
- const elements = this.rowContainerDOM.querySelectorAll('.igv-roi-table-row');
41044
+ const elements = this.tableRowContainer.querySelectorAll('.igv-roi-table-row');
41019
41045
  for (let el of elements) {
41020
41046
  el.remove();
41021
41047
  }
@@ -41027,23 +41053,23 @@
41027
41053
  }
41028
41054
 
41029
41055
  present() {
41030
- this.container.style.left = `${ 0 }px`;
41056
+ this.tableDOM.style.left = `${ 0 }px`;
41031
41057
 
41032
41058
  const { y:y_root } = this.browser.root.getBoundingClientRect();
41033
41059
  const { y:y_parent } = this.config.parent.getBoundingClientRect();
41034
41060
 
41035
- this.container.style.top = `${ y_root - y_parent }px`;
41036
- this.container.style.display = 'flex';
41061
+ this.tableDOM.style.top = `${ y_root - y_parent }px`;
41062
+ this.tableDOM.style.display = 'flex';
41037
41063
  }
41038
41064
 
41039
41065
  dismiss() {
41040
- this.container.style.display = 'none';
41066
+ this.tableDOM.style.display = 'none';
41041
41067
  }
41042
41068
 
41043
41069
  dispose() {
41044
41070
 
41045
- this.container.innerHTML = '';
41046
- this.container.remove();
41071
+ this.tableDOM.innerHTML = '';
41072
+ this.tableDOM.remove();
41047
41073
 
41048
41074
  for (const key of Object.keys(this)) {
41049
41075
  this[key] = undefined;
@@ -41059,45 +41085,35 @@
41059
41085
 
41060
41086
  constructor(config) {
41061
41087
 
41062
- const cooked = Object.assign({ 'width':'1040px' }, config);
41088
+ const cooked = Object.assign({ 'width':'1024px' }, config);
41063
41089
  super(cooked);
41064
41090
 
41065
41091
  this.descriptionDOM = config;
41066
41092
 
41067
41093
  }
41068
41094
 
41069
-
41070
- set columnTitleDOM(columnFormat) {
41071
-
41072
- const dom = domUtils.div({ class: 'igv-roi-table-column-titles' });
41073
- this.columnTitlesDiv = dom;
41074
- this.container.appendChild(dom);
41075
-
41076
- for (const format of columnFormat) {
41077
- const col = domUtils.div();
41078
- dom.appendChild(col);
41079
- col.style.width = format.width || 'fit-content';
41080
- col.innerText = format.label;
41081
- }
41082
-
41083
- }
41084
-
41085
41095
  set descriptionDOM(config) {
41086
41096
 
41087
41097
  if (config.description) {
41088
41098
 
41089
41099
  let dom;
41090
41100
 
41101
+ // BLAT result for query sequence
41091
41102
  dom = domUtils.div({ class: 'igv-roi-table-description' });
41092
- this.container.insertBefore(dom, this.columnTitlesDiv);
41103
+ this.tableDOM.insertBefore(dom, this.tableColumnTitles);
41104
+ dom.style.height = 'auto';
41093
41105
  dom.innerHTML = `BLAT result for query sequence:`;
41094
41106
 
41107
+ // CTAATCAtctacactggtttctactg ...
41095
41108
  dom = domUtils.div({ class: 'igv-roi-table-description' });
41096
- this.container.insertBefore(dom, this.columnTitlesDiv);
41109
+ this.tableDOM.insertBefore(dom, this.tableColumnTitles);
41110
+ dom.style.height = 'auto';
41111
+ dom.style.maxHeight = '128px';
41097
41112
  dom.innerHTML = config.description;
41098
41113
 
41114
+ // Select one or more rows ...
41099
41115
  dom = domUtils.div({ class: 'igv-roi-table-goto-explainer' });
41100
- this.container.insertBefore(dom, this.columnTitlesDiv);
41116
+ this.tableDOM.insertBefore(dom, this.tableColumnTitles);
41101
41117
  dom.innerHTML = `Select one or more rows and click Go To to view the regions`;
41102
41118
 
41103
41119
  }
@@ -41127,13 +41143,13 @@
41127
41143
 
41128
41144
  renderTable(records) {
41129
41145
 
41130
- Array.from(this.rowContainerDOM.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
41146
+ Array.from(this.tableRowContainer.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
41131
41147
 
41132
41148
  if (records.length > 0) {
41133
41149
 
41134
41150
  for (let record of records) {
41135
41151
  const row = this.tableRowDOM(record);
41136
- this.rowContainerDOM.appendChild(row);
41152
+ this.tableRowContainer.appendChild(row);
41137
41153
  }
41138
41154
 
41139
41155
  }
@@ -41181,7 +41197,7 @@
41181
41197
 
41182
41198
  event.stopPropagation();
41183
41199
 
41184
- const selectedRows = this.container.querySelectorAll('.igv-roi-table-row-selected');
41200
+ const selectedRows = this.tableDOM.querySelectorAll('.igv-roi-table-row-selected');
41185
41201
 
41186
41202
  const loci = [];
41187
41203
  for (const row of selectedRows) {
@@ -41193,7 +41209,7 @@
41193
41209
  loci.push(`${ chr }:${ start }-${ end }`);
41194
41210
  }
41195
41211
 
41196
- for (const el of this.container.querySelectorAll('.igv-roi-table-row')) {
41212
+ for (const el of this.tableDOM.querySelectorAll('.igv-roi-table-row')) {
41197
41213
  el.classList.remove('igv-roi-table-row-selected');
41198
41214
  }
41199
41215
 
@@ -41388,8 +41404,6 @@
41388
41404
 
41389
41405
  const alignmentStartGap = 5;
41390
41406
  const downsampleRowHeight = 5;
41391
- const DEFAULT_COVERAGE_TRACK_HEIGHT = 50;
41392
- const DEFAULT_TRACK_HEIGHT$1 = 300;
41393
41407
  const DEFAULT_ALIGNMENT_COLOR = "rgb(185, 185, 185)";
41394
41408
  const DEFAULT_COVERAGE_COLOR = "rgb(150, 150, 150)";
41395
41409
  const DEFAULT_CONNECTOR_COLOR = "rgb(200, 200, 200)";
@@ -41397,35 +41411,37 @@
41397
41411
 
41398
41412
  class BAMTrack extends TrackBase {
41399
41413
 
41414
+ static defaults = {
41415
+ alleleFreqThreshold: 0.2,
41416
+ visibilityWindow: 30000,
41417
+ showCoverage: true,
41418
+ showAlignments: true,
41419
+ viewAsPairs: false,
41420
+ pairsSupported: true,
41421
+ showSoftClips: false,
41422
+ showAllBases: false,
41423
+ showInsertions: true,
41424
+ showMismatches: true,
41425
+ color: DEFAULT_ALIGNMENT_COLOR,
41426
+ coverageColor: DEFAULT_COVERAGE_COLOR,
41427
+ height: 300,
41428
+ coverageTrackHeight: 50
41429
+ }
41430
+
41400
41431
  constructor(config, browser) {
41401
41432
  super(config, browser);
41402
41433
  }
41403
41434
 
41404
41435
  init(config) {
41405
- super.init(config);
41406
- this.type = "alignment";
41407
-
41408
- if (config.alleleFreqThreshold === undefined) {
41409
- config.alleleFreqThreshold = 0.2;
41410
- }
41411
41436
 
41437
+ this.type = "alignment";
41412
41438
  this.featureSource = new BamSource(config, this.browser);
41413
-
41414
- this.showCoverage = config.showCoverage === undefined ? true : config.showCoverage;
41415
- this.showAlignments = config.showAlignments === undefined ? true : config.showAlignments;
41416
-
41417
41439
  this.coverageTrack = new CoverageTrack(config, this);
41418
41440
  this.alignmentTrack = new AlignmentTrack(config, this);
41441
+
41442
+ super.init(config);
41443
+
41419
41444
  this.alignmentTrack.setTop(this.coverageTrack, this.showCoverage);
41420
- this.visibilityWindow = config.visibilityWindow || 30000;
41421
- this.viewAsPairs = config.viewAsPairs;
41422
- this.pairsSupported = config.pairsSupported !== false;
41423
- this.showSoftClips = config.showSoftClips;
41424
- this.showAllBases = config.showAllBases;
41425
- this.showInsertions = false !== config.showInsertions;
41426
- this.showMismatches = false !== config.showMismatches;
41427
- this.color = config.color;
41428
- this.coverageColor = config.coverageColor;
41429
41445
 
41430
41446
  // The sort object can be an array in the case of multi-locus view, however if multiple sort positions
41431
41447
  // are present for a given reference frame the last one will take precedence
@@ -41438,14 +41454,12 @@
41438
41454
  }
41439
41455
  }
41440
41456
 
41441
- // Invoke height setter last to allocated to coverage and alignment tracks
41442
- this.height = (config.height !== undefined ? config.height : DEFAULT_TRACK_HEIGHT$1);
41443
41457
  }
41444
41458
 
41445
41459
  set height(h) {
41446
41460
  this._height = h;
41447
- if (this.coverageTrack && this.showAlignments) {
41448
- this.alignmentTrack.height = this.showCoverage ? h - this.coverageTrack.height : h;
41461
+ if (this.showAlignments) {
41462
+ this.alignmentTrack.height = this.showCoverage ? h - this.coverageTrackHeight : h;
41449
41463
  }
41450
41464
  }
41451
41465
 
@@ -41532,16 +41546,15 @@
41532
41546
  * @returns {number}
41533
41547
  */
41534
41548
  computePixelHeight(alignmentContainer) {
41535
- return (this.showCoverage ? this.coverageTrack.height : 0) +
41536
- (this.showAlignments ? this.alignmentTrack.computePixelHeight(alignmentContainer) : 0) +
41537
- 15
41549
+ return (this.showCoverage ? this.coverageTrackHeight : 0) +
41550
+ (this.showAlignments ? this.alignmentTrack.computePixelHeight(alignmentContainer) : 0)
41538
41551
  }
41539
41552
 
41540
41553
  draw(options) {
41541
41554
 
41542
41555
  IGVGraphics.fillRect(options.context, 0, options.pixelTop, options.pixelWidth, options.pixelHeight, {'fillStyle': "rgb(255, 255, 255)"});
41543
41556
 
41544
- if (true === this.showCoverage && this.coverageTrack.height > 0) {
41557
+ if (true === this.showCoverage && this.coverageTrackHeight > 0) {
41545
41558
  this.trackView.axisCanvas.style.display = 'block';
41546
41559
  this.coverageTrack.draw(options);
41547
41560
  } else {
@@ -41556,12 +41569,12 @@
41556
41569
 
41557
41570
  paintAxis(ctx, pixelWidth, pixelHeight) {
41558
41571
 
41559
- this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrack.height);
41572
+ this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrackHeight);
41560
41573
 
41561
41574
  // if (this.browser.isMultiLocusMode()) {
41562
41575
  // ctx.clearRect(0, 0, pixelWidth, pixelHeight);
41563
41576
  // } else {
41564
- // this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrack.height);
41577
+ // this.coverageTrack.paintAxis(ctx, pixelWidth, this.coverageTrackHeight);
41565
41578
  // }
41566
41579
  }
41567
41580
 
@@ -41570,7 +41583,7 @@
41570
41583
  }
41571
41584
 
41572
41585
  popupData(clickState) {
41573
- if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrack.height) {
41586
+ if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
41574
41587
  return this.coverageTrack.popupData(clickState)
41575
41588
  } else {
41576
41589
  return this.alignmentTrack.popupData(clickState)
@@ -41585,7 +41598,7 @@
41585
41598
  clickedFeatures(clickState) {
41586
41599
 
41587
41600
  let clickedObject;
41588
- if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrack.height) {
41601
+ if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
41589
41602
  clickedObject = this.coverageTrack.getClickedObject(clickState);
41590
41603
  } else {
41591
41604
  clickedObject = this.alignmentTrack.getClickedObject(clickState);
@@ -41594,7 +41607,7 @@
41594
41607
  }
41595
41608
 
41596
41609
  hoverText(clickState) {
41597
- if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrack.height) {
41610
+ if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrackHeight) {
41598
41611
  const clickedObject = this.coverageTrack.getClickedObject(clickState);
41599
41612
  if (clickedObject) {
41600
41613
  return clickedObject.hoverText()
@@ -41634,8 +41647,8 @@
41634
41647
  // Show coverage / alignment options
41635
41648
  const adjustTrackHeight = () => {
41636
41649
  if (!this.autoHeight) {
41637
- const h = 15 +
41638
- (this.showCoverage ? this.coverageTrack.height : 0) +
41650
+ const h =
41651
+ (this.showCoverage ? this.coverageTrackHeight : 0) +
41639
41652
  (this.showAlignments ? this.alignmentTrack.height : 0);
41640
41653
  this.trackView.setTrackHeight(h);
41641
41654
  }
@@ -41949,7 +41962,6 @@
41949
41962
  constructor(config, parent) {
41950
41963
  this.parent = parent;
41951
41964
  this.featureSource = parent.featureSource;
41952
- this.height = config.coverageTrackHeight !== undefined ? config.coverageTrackHeight : DEFAULT_COVERAGE_TRACK_HEIGHT;
41953
41965
 
41954
41966
  this.paintAxis = paintAxis;
41955
41967
  this.top = 0;
@@ -41964,6 +41976,10 @@
41964
41976
 
41965
41977
  }
41966
41978
 
41979
+ get height() {
41980
+ return this.parent.coverageTrackHeight
41981
+ }
41982
+
41967
41983
  draw(options) {
41968
41984
 
41969
41985
  const pixelTop = options.pixelTop;
@@ -42711,7 +42727,7 @@
42711
42727
  const seqstring = clickedAlignment.seq;
42712
42728
  if (seqstring && "*" != seqstring) {
42713
42729
 
42714
- if(seqstring.length < maxSequenceSize) {
42730
+ if (seqstring.length < maxSequenceSize) {
42715
42731
  list.push({
42716
42732
  label: 'BLAT read sequence',
42717
42733
  click: () => {
@@ -44658,25 +44674,34 @@
44658
44674
  * THE SOFTWARE.
44659
44675
  */
44660
44676
 
44661
- const DEFAULT_COLOR = "rgb(150,150,150)";
44662
-
44663
44677
  class WigTrack extends TrackBase {
44664
44678
 
44679
+ static defaults = {
44680
+ height: 50,
44681
+ color: 'rgb(150, 150, 150)',
44682
+ altColor: 'rgb(150, 150, 150)',
44683
+ flipAxis: false,
44684
+ logScale: false,
44685
+ windowFunction: 'mean',
44686
+ graphType: 'bar',
44687
+ autoscale: true,
44688
+ normalize: undefined,
44689
+ scaleFactor: undefined
44690
+ }
44691
+
44665
44692
  constructor(config, browser) {
44666
44693
  super(config, browser);
44667
44694
  }
44668
44695
 
44669
44696
  init(config) {
44697
+
44670
44698
  super.init(config);
44671
44699
 
44672
44700
  this.type = "wig";
44673
- this.height = config.height || 50;
44674
44701
  this.featureType = 'numeric';
44675
44702
  this.paintAxis = paintAxis;
44676
44703
 
44677
44704
  const format = config.format ? config.format.toLowerCase() : config.format;
44678
- this.flipAxis = config.flipAxis ? config.flipAxis : false;
44679
- this.logScale = config.logScale ? config.logScale : false;
44680
44705
  if (config.featureSource) {
44681
44706
  this.featureSource = config.featureSource;
44682
44707
  delete config.featureSource;
@@ -44688,18 +44713,16 @@
44688
44713
  this.featureSource = FeatureSource(config, this.browser.genome);
44689
44714
  }
44690
44715
 
44691
- this.autoscale = config.autoscale || config.max === undefined;
44692
- if (!this.autoscale) {
44716
+
44717
+ // Override autoscale default
44718
+ if(config.max === undefined || config.autoscale === true) {
44719
+ this.autoscale = true;
44720
+ } else {
44693
44721
  this.dataRange = {
44694
44722
  min: config.min || 0,
44695
44723
  max: config.max
44696
44724
  };
44697
44725
  }
44698
-
44699
- this.windowFunction = config.windowFunction || "mean";
44700
- this.graphType = config.graphType || "bar";
44701
- this.normalize = config.normalize; // boolean, for use with "TDF" files
44702
- this.scaleFactor = config.scaleFactor; // optional scale factor, ignored if normalize === true;
44703
44726
  }
44704
44727
 
44705
44728
  async postInit() {
@@ -44789,7 +44812,7 @@
44789
44812
  const pixelWidth = options.pixelWidth;
44790
44813
  options.pixelHeight;
44791
44814
  const bpEnd = bpStart + pixelWidth * bpPerPixel + 1;
44792
- const posColor = this.color || DEFAULT_COLOR;
44815
+ const posColor = this.color || WigTrack.defaults.color;
44793
44816
 
44794
44817
  let baselineColor;
44795
44818
  if (typeof posColor === "string" && posColor.startsWith("rgb(")) {
@@ -44933,7 +44956,7 @@
44933
44956
  */
44934
44957
 
44935
44958
  getColorForFeature(f) {
44936
- let c = (f.value < 0 && this.altColor) ? this.altColor : this.color || DEFAULT_COLOR;
44959
+ let c = (f.value < 0 && this.altColor) ? this.altColor : this.color || WigTrack.defaults.color;
44937
44960
  return (typeof c === "function") ? c(f.value) : c
44938
44961
  }
44939
44962
 
@@ -44944,20 +44967,6 @@
44944
44967
  this.trackView = undefined;
44945
44968
  }
44946
44969
 
44947
- /**
44948
- * Return the current state of the track. Used to create sessions and bookmarks.
44949
- *
44950
- * @returns {*|{}}
44951
- */
44952
- getState() {
44953
-
44954
- const config = super.getState();
44955
-
44956
- if (this.flipAxis !== undefined) config.flipAxis = this.flipAxis;
44957
- if (this.logScale !== undefined) config.logScale = this.logScale;
44958
-
44959
- return config
44960
- }
44961
44970
  }
44962
44971
 
44963
44972
  /**
@@ -45845,6 +45854,17 @@
45845
45854
 
45846
45855
  class InteractionTrack extends TrackBase {
45847
45856
 
45857
+ static defaults = {
45858
+ height: 250,
45859
+ theta: Math.PI / 4,
45860
+ arcOrientation: true,
45861
+ showBlocks: true,
45862
+ blockHeight: 3,
45863
+ thickness: 1,
45864
+ alpha: 0.02,
45865
+ logScale: true,
45866
+ }
45867
+
45848
45868
  constructor(config, browser) {
45849
45869
  super(config, browser);
45850
45870
  }
@@ -45852,16 +45872,10 @@
45852
45872
  init(config) {
45853
45873
 
45854
45874
  super.init(config);
45855
- this.theta = config.theta || Math.PI / 4;
45875
+
45856
45876
  this.sinTheta = Math.sin(this.theta);
45857
45877
  this.cosTheta = Math.cos(this.theta);
45858
- this.height = config.height || 250;
45859
45878
  this.arcType = getArcType(config); // nested | proportional | inView | partialInView
45860
- this.arcOrientation = (config.arcOrientation === undefined ? true : config.arcOrientation); // true for up, false for down
45861
- this.showBlocks = config.showBlocks === undefined ? true : config.showBlocks;
45862
- this.blockHeight = config.blockHeight || 3;
45863
- this.thickness = config.thickness || 1;
45864
- this.color = config.color;
45865
45879
  this.alpha = config.alpha || 0.02; // was: 0.15
45866
45880
  this.painter = {flipAxis: !this.arcOrientation, dataRange: this.dataRange, paintAxis: paintAxis};
45867
45881
 
@@ -45873,7 +45887,6 @@
45873
45887
  this.valueColumn = "score";
45874
45888
  }
45875
45889
 
45876
- this.logScale = config.logScale !== false; // i.e. defaul to true (undefined => true)
45877
45890
  if (config.max) {
45878
45891
  this.dataRange = {
45879
45892
  min: config.min || 0,
@@ -45898,7 +45911,7 @@
45898
45911
 
45899
45912
  if (typeof this.featureSource.getHeader === "function") {
45900
45913
  this.header = await this.featureSource.getHeader();
45901
- if(this.disposed) return; // This track was removed during async load
45914
+ if (this.disposed) return; // This track was removed during async load
45902
45915
  }
45903
45916
 
45904
45917
  // Set properties from track line
@@ -45971,7 +45984,7 @@
45971
45984
  feature.drawState = undefined;
45972
45985
 
45973
45986
  let color;
45974
- if(typeof this.color === 'function') {
45987
+ if (typeof this.color === 'function') {
45975
45988
  color = this.color(feature);
45976
45989
  } else {
45977
45990
  color = this.color || feature.color || DEFAULT_ARC_COLOR;
@@ -46316,7 +46329,7 @@
46316
46329
  contextMenuItemList(clickState) {
46317
46330
 
46318
46331
  // Experimental JBrowse feature
46319
- if (this.browser.circularView ) {
46332
+ if (this.browser.circularView) {
46320
46333
  const viewport = clickState.viewport;
46321
46334
  const list = [];
46322
46335
 
@@ -46345,7 +46358,7 @@
46345
46358
 
46346
46359
  // inView features are simply features that have been drawn, i.e. have a drawState
46347
46360
  const inView = cachedFeatures.filter(f => f.drawState);
46348
- if(inView.length === 0) return;
46361
+ if (inView.length === 0) return;
46349
46362
 
46350
46363
  const chords = makeBedPEChords(inView);
46351
46364
  sendChords(chords, this, refFrame, 0.5);
@@ -46381,7 +46394,7 @@
46381
46394
 
46382
46395
  popupData(clickState, features) {
46383
46396
 
46384
- if(features === undefined) features = this.clickedFeatures(clickState);
46397
+ if (features === undefined) features = this.clickedFeatures(clickState);
46385
46398
 
46386
46399
  const data = [];
46387
46400
  for (let feature of features) {
@@ -46405,7 +46418,7 @@
46405
46418
  const columnNames = this.header.columnNames;
46406
46419
  const stdColumns = this.header.hiccups ? 6 : 10;
46407
46420
  for (let i = stdColumns; i < columnNames.length; i++) {
46408
- if(this.header.colorColumn === i) continue;
46421
+ if (this.header.colorColumn === i) continue;
46409
46422
  if (columnNames[i] === 'info') {
46410
46423
  extractInfoColumn(data, f.extras[i - stdColumns]);
46411
46424
  } else {
@@ -46427,7 +46440,7 @@
46427
46440
 
46428
46441
  // We use the cached features rather than method to avoid async load. If the
46429
46442
  // feature is not already loaded this won't work, but the user wouldn't be mousing over it either.
46430
- const featureList = clickState.viewport.cachedFeatures;
46443
+ const featureList = clickState.viewport.cachedFeatures;
46431
46444
  const candidates = [];
46432
46445
  if (featureList) {
46433
46446
  const proportional = (this.arcType === "proportional" || this.arcType === "inView" || this.arcType === "partialInView");
@@ -46473,26 +46486,6 @@
46473
46486
  }
46474
46487
  return candidates.map((c) => c.feature)
46475
46488
  }
46476
-
46477
- /**
46478
- * Return the current state of the track. Used to create sessions and bookmarks.
46479
- *
46480
- * @returns {*|{}}
46481
- */
46482
- getState() {
46483
-
46484
- const config = super.getState();
46485
-
46486
- // if (this.height !== undefined) config.height = this.height;
46487
- if (this.arcType !== undefined) config.arcType = this.arcType;
46488
- if (this.arcOrientation !== undefined) config.arcOrientation = this.arcOrientation;
46489
- if (this.showBlocks !== undefined) config.showBlocks = this.showBlocks;
46490
- if (this.blockHeight !== undefined) config.blockHeight = this.blockHeight;
46491
- if (this.thickness !== undefined) config.thickness = this.thickness;
46492
- if (this.alpha !== undefined) config.alpha = this.alpha;
46493
-
46494
- return config
46495
- }
46496
46489
  }
46497
46490
 
46498
46491
  function getMidpoints(feature, genome) {
@@ -46699,6 +46692,31 @@
46699
46692
 
46700
46693
  class VariantTrack extends TrackBase {
46701
46694
 
46695
+ static defaults = {
46696
+ displayMode: "EXPANDED",
46697
+ sortDirection: "ASC",
46698
+ showGenotypes: true,
46699
+ squishedVariantHeight: 2,
46700
+ squishedCallHeight: 1,
46701
+ expandedCallHeight: 10,
46702
+ expandedVGap: 2,
46703
+ squishedVGap: 1,
46704
+ expandedGroupGap: 10,
46705
+ squishedGroupGap: 5,
46706
+ featureHeight: 14,
46707
+ noGenotypeColor: "rgb(200,180,180)",
46708
+ noCallColor: "rgb(225, 225, 225)",
46709
+ nonRefColor: "rgb(200, 200, 215)",
46710
+ mixedColor: "rgb(200, 220, 200)",
46711
+ homrefColor: "rgb(200, 200, 200)",
46712
+ homvarColor: "rgb(17,248,254)",
46713
+ hetvarColor: "rgb(34,12,253)",
46714
+ colorBy: undefined,
46715
+ visibilityWindow: undefined,
46716
+ labelDisplayMode: undefined,
46717
+ type: "variant"
46718
+ }
46719
+
46702
46720
  constructor(config, browser) {
46703
46721
  super(config, browser);
46704
46722
  }
@@ -46707,41 +46725,18 @@
46707
46725
 
46708
46726
  super.init(config);
46709
46727
 
46710
- this.visibilityWindow = config.visibilityWindow;
46711
- this.displayMode = config.displayMode || "EXPANDED"; // COLLAPSED | EXPANDED | SQUISHED
46712
- this.labelDisplayMode = config.labelDisplayMode;
46713
46728
  this.expandedVariantHeight = config.expandedVariantHeight || config.variantHeight || 10;
46714
- this.squishedVariantHeight = config.squishedVariantHeight || 2;
46715
- this.squishedCallHeight = config.squishedCallHeight || 1;
46716
- this.expandedCallHeight = config.expandedCallHeight || 10;
46717
- this.expandedVGap = config.expandedVGap !== undefined ? config.expandedVGap : 2;
46718
- this.squishedVGap = config.squishedVGap !== undefined ? config.squishedVGap : 1;
46719
- this.expandedGroupGap = config.expandedGroupGap || 10;
46720
- this.squishedGroupGap = config.squishedGroupGap || 5;
46721
- this.featureHeight = config.featureHeight || 14;
46722
- this.visibilityWindow = config.visibilityWindow;
46729
+
46723
46730
  this.featureSource = FeatureSource(config, this.browser.genome);
46724
- this.noGenotypeColor = config.noGenotypeColor || "rgb(200,180,180)";
46725
- this.noCallColor = config.noCallColor || "rgb(225, 225, 225)";
46726
- this.nonRefColor = config.nonRefColor || "rgb(200, 200, 215)";
46727
- this.mixedColor = config.mixedColor || "rgb(200, 220, 200)";
46728
- this.homrefColor = config.homrefColor || "rgb(200, 200, 200)";
46729
- this.homvarColor = config.homvarColor || "rgb(17,248,254)";
46730
- this.hetvarColor = config.hetvarColor || "rgb(34,12,253)";
46731
- this.sortDirection = "ASC";
46732
- this.type = config.type || "variant";
46733
-
46734
- this.colorBy = config.colorBy; // Can be undefined => default
46731
+
46735
46732
  this._initColorBy = config.colorBy;
46736
46733
  if (config.colorTable) {
46737
46734
  this.colorTables = new Map();
46738
46735
  this.colorTables.set(config.colorBy, new ColorTable(config.colorTable));
46739
46736
  }
46740
-
46741
46737
  this._strokecolor = config.strokecolor;
46742
46738
  this._context_hook = config.context_hook;
46743
46739
 
46744
- this.showGenotypes = config.showGenotypes === undefined ? true : config.showGenotypes;
46745
46740
 
46746
46741
  // The number of variant rows are computed dynamically, but start with "1" by default
46747
46742
  this.variantRowCount(1);
@@ -46751,7 +46746,7 @@
46751
46746
  async postInit() {
46752
46747
 
46753
46748
  this.header = await this.getHeader(); // cricital, don't remove'
46754
- if(this.disposed) return; // This track was removed during async load
46749
+ if (this.disposed) return // This track was removed during async load
46755
46750
  if (undefined === this.visibilityWindow && this.config.indexed !== false) {
46756
46751
  const fn = isFile(this.config.url) ? this.config.url.name : this.config.url;
46757
46752
  if (isString(fn) && fn.toLowerCase().includes("gnomad")) {
@@ -46854,7 +46849,7 @@
46854
46849
  this.variantBandHeight = TOP_MARGIN + rowCount * (variantHeight + vGap);
46855
46850
 
46856
46851
  let callSets = this.callSets;
46857
- if(!callSets && this._f) {
46852
+ if (!callSets && this._f) {
46858
46853
  callSets = this._f.callSets; // "Complementary" variant for structural variants
46859
46854
  }
46860
46855
  const nCalls = this.getCallsetsLength();
@@ -46894,9 +46889,9 @@
46894
46889
 
46895
46890
  //only paint stroke if a color is defined
46896
46891
  let strokecolor = this.getVariantStrokecolor(variant);
46897
- if (strokecolor){
46898
- context.strokeStyle = strokecolor;
46899
- context.strokeRect(x, y, w, h);
46892
+ if (strokecolor) {
46893
+ context.strokeStyle = strokecolor;
46894
+ context.strokeRect(x, y, w, h);
46900
46895
  }
46901
46896
 
46902
46897
  // call hook if _context_hook fn is defined
@@ -46912,7 +46907,7 @@
46912
46907
  this.sampleHeight = nVariantRows * (callHeight + vGap); // For each sample, there is a call for each variant at this position
46913
46908
 
46914
46909
  let sampleNumber = 0;
46915
- if(callSets && variant.calls) {
46910
+ if (callSets && variant.calls) {
46916
46911
  for (let callSet of callSets) {
46917
46912
  const call = variant.calls[callSet.id];
46918
46913
  if (call) {
@@ -46988,13 +46983,12 @@
46988
46983
  } else if ("MIXED" === v.type) {
46989
46984
  variantColor = this.mixedColor;
46990
46985
  } else {
46991
- variantColor = this.defaultColor;
46986
+ variantColor = this.color;
46992
46987
  }
46993
46988
  return variantColor
46994
46989
  }
46995
46990
 
46996
46991
 
46997
-
46998
46992
  getVariantStrokecolor(variant) {
46999
46993
 
47000
46994
  const v = variant._f || variant;
@@ -47010,13 +47004,13 @@
47010
47004
 
47011
47005
  callContextHook(variant, context, x, y, w, h) {
47012
47006
  if (this._context_hook) {
47013
- if (typeof this._context_hook === "function") {
47014
- const v = variant._f || variant;
47007
+ if (typeof this._context_hook === "function") {
47008
+ const v = variant._f || variant;
47015
47009
 
47016
- context.save();
47017
- this._context_hook(v, context, x, y, w, h);
47018
- context.restore();
47019
- }
47010
+ context.save();
47011
+ this._context_hook(v, context, x, y, w, h);
47012
+ context.restore();
47013
+ }
47020
47014
  }
47021
47015
  }
47022
47016
 
@@ -47060,7 +47054,7 @@
47060
47054
  */
47061
47055
  popupData(clickState, featureList) {
47062
47056
 
47063
- if(featureList === undefined) featureList = this.clickedFeatures(clickState);
47057
+ if (featureList === undefined) featureList = this.clickedFeatures(clickState);
47064
47058
  const genomicLocation = clickState.genomicLocation;
47065
47059
  const genomeID = this.browser.genome.id;
47066
47060
  const sampleInformation = this.browser.sampleInformation;
@@ -47288,12 +47282,12 @@
47288
47282
  sendChordsForViewport(viewport) {
47289
47283
  const refFrame = viewport.referenceFrame;
47290
47284
  let inView;
47291
- if("all" === refFrame.chr) {
47285
+ if ("all" === refFrame.chr) {
47292
47286
  const all = this.featureSource.getAllFeatures();
47293
47287
  const arrays = Object.keys(all).map(k => all[k]);
47294
47288
  inView = [].concat(...arrays);
47295
47289
  } else {
47296
- inView = this.featureSource.featureCache.queryFeatures(refFrame.chr, refFrame.start, refFrame.end);
47290
+ inView = this.featureSource.featureCache.queryFeatures(refFrame.chr, refFrame.start, refFrame.end);
47297
47291
 
47298
47292
  }
47299
47293
 
@@ -57531,7 +57525,7 @@
57531
57525
  let locusObject = parseLocusString(browser, locus);
57532
57526
 
57533
57527
  if (!locusObject) {
57534
- const feature = browser.genome.featureDB[locus.toUpperCase()];
57528
+ const feature = browser.genome.featureDB.get(locus.toUpperCase());
57535
57529
  if (feature) {
57536
57530
  locusObject = {
57537
57531
  chr: feature.chr,
@@ -59384,7 +59378,7 @@
59384
59378
 
59385
59379
  renderTable(records) {
59386
59380
 
59387
- Array.from(this.rowContainerDOM.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
59381
+ Array.from(this.tableRowContainer.querySelectorAll('.igv-roi-table-row')).forEach(el => el.remove());
59388
59382
 
59389
59383
  if (records.length > 0) {
59390
59384
 
@@ -59392,7 +59386,7 @@
59392
59386
 
59393
59387
  for (let record of sortedRecords) {
59394
59388
  const row = this.tableRowDOM(record);
59395
- this.rowContainerDOM.appendChild(row);
59389
+ this.tableRowContainer.appendChild(row);
59396
59390
  }
59397
59391
 
59398
59392
  }
@@ -59432,14 +59426,14 @@
59432
59426
 
59433
59427
  event.stopPropagation();
59434
59428
 
59435
- const selected = this.container.querySelectorAll('.igv-roi-table-row-selected');
59429
+ const selected = this.tableDOM.querySelectorAll('.igv-roi-table-row-selected');
59436
59430
  const loci = [];
59437
59431
  for (let el of selected) {
59438
59432
  const { locus } = parseRegionKey(el.dataset.region);
59439
59433
  loci.push(locus);
59440
59434
  }
59441
59435
 
59442
- for (let el of this.container.querySelectorAll('.igv-roi-table-row')) {
59436
+ for (let el of this.tableDOM.querySelectorAll('.igv-roi-table-row')) {
59443
59437
  el.classList.remove('igv-roi-table-row-selected');
59444
59438
  }
59445
59439
 
@@ -62072,7 +62066,7 @@
62072
62066
 
62073
62067
  function embedCSS() {
62074
62068
 
62075
- var css = '.igv-navbar {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n color: #444;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n line-height: 32px;\n padding-left: 8px;\n padding-right: 8px;\n margin-top: 2px;\n margin-bottom: 6px;\n height: 32px;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: #f3f3f3;\n}\n.igv-navbar .igv-navbar-left-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-left-container .igv-logo {\n width: 34px;\n height: 32px;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-left-container .igv-current-genome {\n height: 32px;\n margin-left: 4px;\n margin-right: 4px;\n user-select: none;\n line-height: 32px;\n vertical-align: middle;\n text-align: center;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container {\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n height: 100%;\n width: 125px;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container select {\n display: block;\n cursor: pointer;\n width: 100px;\n height: 75%;\n outline: none;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n margin-left: 8px;\n height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 210px;\n height: 22px;\n line-height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container input.igv-search-input {\n cursor: text;\n width: 85%;\n height: 22px;\n line-height: 22px;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n text-align: left;\n padding-left: 8px;\n margin-right: 8px;\n outline: none;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: white;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container .igv-search-icon-container {\n cursor: pointer;\n height: 16px;\n width: 16px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-windowsize-panel-container {\n margin-left: 4px;\n user-select: none;\n}\n.igv-navbar .igv-navbar-right-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div {\n margin-left: 0;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div:last-child {\n margin-left: 0;\n margin-right: 0;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container-750 {\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:nth-child(even) {\n display: block;\n height: fit-content;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget input {\n display: block;\n width: 125px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:nth-child(even) {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 input {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-hidden {\n display: none;\n}\n\n.igv-navbar-button {\n display: block;\n box-sizing: unset;\n padding-left: 6px;\n padding-right: 6px;\n height: 18px;\n text-transform: capitalize;\n user-select: none;\n line-height: 18px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 11px;\n font-weight: 200;\n color: #737373;\n background-color: #f3f3f3;\n border-color: #737373;\n border-style: solid;\n border-width: thin;\n border-radius: 6px;\n}\n\n.igv-navbar-button-clicked {\n color: white;\n background-color: #737373;\n}\n\n.igv-navbar-button:hover {\n cursor: pointer;\n}\n\n.igv-zoom-in-notice-container {\n z-index: 1024;\n position: absolute;\n top: 8px;\n left: 50%;\n transform: translate(-50%, 0%);\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n background-color: white;\n}\n.igv-zoom-in-notice-container > div {\n padding-left: 4px;\n padding-right: 4px;\n padding-top: 2px;\n padding-bottom: 2px;\n width: 100%;\n height: 100%;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: #3f3f3f;\n}\n\n.igv-zoom-in-notice {\n position: absolute;\n top: 10px;\n left: 50%;\n}\n.igv-zoom-in-notice div {\n position: relative;\n left: -50%;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #3f3f3f;\n background-color: rgba(255, 255, 255, 0.51);\n z-index: 64;\n}\n\n.igv-container-spinner {\n position: absolute;\n top: 90%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1024;\n width: 24px;\n height: 24px;\n pointer-events: none;\n color: #737373;\n}\n\n.igv-multi-locus-close-button {\n position: absolute;\n top: 2px;\n right: 0;\n padding-left: 2px;\n padding-right: 2px;\n width: 12px;\n height: 12px;\n color: #666666;\n background-color: white;\n z-index: 1000;\n}\n.igv-multi-locus-close-button > svg {\n vertical-align: top;\n}\n\n.igv-multi-locus-close-button:hover {\n cursor: pointer;\n color: #434343;\n}\n\n.igv-multi-locus-ruler-label {\n z-index: 64;\n position: absolute;\n top: 2px;\n left: 0;\n width: 100%;\n height: 12px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-multi-locus-ruler-label > div {\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n color: rgb(16, 16, 16);\n background-color: white;\n}\n.igv-multi-locus-ruler-label > div {\n cursor: pointer;\n}\n\n.igv-multi-locus-ruler-label-square-dot {\n z-index: 64;\n position: absolute;\n left: 50%;\n top: 5%;\n transform: translate(-50%, 0%);\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-multi-locus-ruler-label-square-dot > div:first-child {\n width: 14px;\n height: 14px;\n}\n.igv-multi-locus-ruler-label-square-dot > div:last-child {\n margin-left: 16px;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n}\n\n.igv-ruler-sweeper {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 26px;\n bottom: 0;\n left: 0;\n width: 0;\n z-index: 99999;\n background-color: rgba(68, 134, 247, 0.25);\n}\n\n.igv-ruler-tooltip {\n pointer-events: none;\n z-index: 128;\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n height: 32px;\n background-color: transparent;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-ruler-tooltip > div {\n pointer-events: none;\n width: 128px;\n height: auto;\n padding: 1px;\n color: #373737;\n font-size: 10px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n background-color: white;\n border-style: solid;\n border-width: thin;\n border-color: #373737;\n}\n\n.igv-track-label {\n position: absolute;\n left: 8px;\n top: 8px;\n width: auto;\n height: auto;\n max-width: 50%;\n padding-left: 4px;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n text-align: center;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-color: #444;\n border-radius: 2px;\n border-style: solid;\n border-width: thin;\n background-color: white;\n z-index: 128;\n cursor: pointer;\n}\n\n.igv-track-label:hover,\n.igv-track-label:focus,\n.igv-track-label:active {\n background-color: #e8e8e8;\n}\n\n.igv-track-label-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-top: 4px;\n}\n\n.igv-center-line {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n z-index: 8;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-left-style: dashed;\n border-left-width: thin;\n border-right-style: dashed;\n border-right-width: thin;\n}\n\n.igv-center-line-wide {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(127, 127, 127, 0.51);\n}\n\n.igv-center-line-thin {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(0, 0, 0, 0);\n}\n\n.igv-cursor-guide-horizontal {\n display: none;\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n left: 0;\n right: 0;\n top: 50%;\n height: 1px;\n z-index: 1;\n margin-left: 50px;\n margin-right: 54px;\n border-top-style: dotted;\n border-top-width: thin;\n border-top-color: rgba(127, 127, 127, 0.76);\n}\n\n.igv-cursor-guide-vertical {\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n width: 1px;\n z-index: 1;\n border-left-style: dotted;\n border-left-width: thin;\n border-left-color: rgba(127, 127, 127, 0.76);\n display: none;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-generic-dialog-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 300px;\n height: 200px;\n border-color: #7F7F7F;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n z-index: 2048;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-generic-dialog-container .igv-generic-dialog-one-liner {\n color: #373737;\n width: 95%;\n height: 24px;\n line-height: 24px;\n text-align: left;\n margin-top: 8px;\n padding-left: 8px;\n overflow-wrap: break-word;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input {\n margin-top: 8px;\n width: 95%;\n height: 24px;\n color: #373737;\n line-height: 24px;\n padding-left: 8px;\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input div {\n width: 30%;\n height: 100%;\n font-size: 16px;\n text-align: right;\n padding-right: 8px;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n width: 50%;\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input {\n margin-top: 8px;\n width: calc(100% - 16px);\n height: 24px;\n color: #373737;\n line-height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel {\n width: 100%;\n height: 28px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div {\n margin-top: 32px;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n width: 75px;\n height: 28px;\n line-height: 28px;\n text-align: center;\n border-color: transparent;\n border-style: solid;\n border-width: thin;\n border-radius: 2px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child {\n margin-left: 32px;\n margin-right: 0;\n background-color: #5ea4e0;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child {\n margin-left: 0;\n margin-right: 32px;\n background-color: #c4c4c4;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child:hover {\n cursor: pointer;\n background-color: #3b5c7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child:hover {\n cursor: pointer;\n background-color: #7f7f7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok {\n width: 100%;\n height: 36px;\n margin-top: 32px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div {\n width: 98px;\n height: 36px;\n line-height: 36px;\n text-align: center;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n border-color: white;\n border-style: solid;\n border-width: thin;\n border-radius: 4px;\n background-color: #2B81AF;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div:hover {\n cursor: pointer;\n background-color: #25597f;\n}\n\n.igv-generic-container {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 2048;\n background-color: white;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-container div:first-child {\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n height: 24px;\n width: 100%;\n background-color: #dddddd;\n}\n.igv-generic-container div:first-child i {\n display: block;\n color: #5f5f5f;\n cursor: pointer;\n width: 14px;\n height: 14px;\n margin-right: 8px;\n margin-bottom: 4px;\n}\n\n.igv-menu-popup {\n position: absolute;\n top: 0;\n left: 0;\n width: max-content;\n z-index: 4096;\n cursor: pointer;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background: white;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-end;\n text-align: left;\n}\n.igv-menu-popup > div:not(:first-child) {\n width: 100%;\n}\n.igv-menu-popup > div:not(:first-child) > div {\n background: white;\n}\n.igv-menu-popup > div:not(:first-child) > div.context-menu {\n padding-left: 4px;\n padding-right: 4px;\n}\n.igv-menu-popup > div:not(:first-child) > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-menu-popup > div:not(:first-child) > div:hover {\n background: #efefef;\n}\n\n.igv-menu-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-bottom: 1px;\n padding-top: 1px;\n}\n\n.igv-menu-popup-header {\n position: relative;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-menu-popup-header div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-menu-popup-header div:hover {\n cursor: pointer;\n color: #444;\n}\n\n.igv-menu-popup-check-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 100%;\n height: 20px;\n margin-right: 4px;\n background-color: transparent;\n}\n.igv-menu-popup-check-container div {\n padding-top: 2px;\n padding-left: 8px;\n}\n.igv-menu-popup-check-container div:first-child {\n position: relative;\n width: 12px;\n height: 12px;\n}\n.igv-menu-popup-check-container div:first-child svg {\n position: absolute;\n width: 12px;\n height: 12px;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-loading-spinner-container {\n z-index: 1024;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 32px;\n height: 32px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-loading-spinner-container > div {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n border: 4px solid rgba(128, 128, 128, 0.5);\n border-top-color: rgb(255, 255, 255);\n animation: spin 1s ease-in-out infinite;\n -webkit-animation: spin 1s ease-in-out infinite;\n}\n\n@keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n@-webkit-keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n.igv-roi-menu-next-gen {\n position: absolute;\n z-index: 512;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background-color: white;\n width: 192px;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu-next-gen > div:first-child {\n height: 24px;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-roi-menu-next-gen > div:first-child > div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-roi-menu-next-gen > div:first-child > div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-menu-next-gen > div:last-child {\n background-color: white;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n text-align: start;\n vertical-align: middle;\n}\n.igv-roi-menu-next-gen > div:last-child > div {\n height: 24px;\n padding-left: 4px;\n border-bottom-style: solid;\n border-bottom-width: thin;\n border-bottom-color: #7f7f7f;\n}\n.igv-roi-menu-next-gen > div:last-child > div:not(:first-child):hover {\n background-color: rgba(127, 127, 127, 0.1);\n}\n.igv-roi-menu-next-gen > div:last-child div:first-child {\n font-style: italic;\n text-align: center;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-menu-next-gen > div:last-child > div:last-child {\n border-bottom-width: 0;\n border-bottom-color: transparent;\n}\n\n.igv-roi-placeholder {\n font-style: normal;\n color: rgba(75, 75, 75, 0.6);\n}\n\n.igv-roi-table {\n position: absolute;\n z-index: 1024;\n width: fit-content;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n cursor: default;\n}\n.igv-roi-table > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table > div:first-child > div:first-child {\n text-align: center;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table > .igv-roi-table-description {\n height: fit-content;\n padding: 4px;\n margin-left: 4px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n word-break: break-all;\n max-height: 300px;\n overflow-y: auto;\n}\n.igv-roi-table > .igv-roi-table-goto-explainer {\n margin-left: 4px;\n color: #7F7F7F;\n font-style: italic;\n border-top: solid lightgray;\n margin-top: 5px;\n}\n.igv-roi-table > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: #7f7f7f;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container {\n overflow: scroll;\n min-height: 72px;\n height: 144px;\n max-height: 480px;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: transparent;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-row-selected {\n background-color: rgba(0, 0, 0, 0.125);\n}\n\n.igv-roi-table-button {\n cursor: pointer;\n height: 20px;\n user-select: none;\n line-height: 20px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 13px;\n font-weight: 400;\n color: black;\n padding-left: 6px;\n padding-right: 6px;\n background-color: rgb(239, 239, 239);\n border-color: black;\n border-style: solid;\n border-width: thin;\n border-radius: 3px;\n}\n\n.igv-roi-table-button:hover {\n font-weight: 400;\n background-color: rgba(0, 0, 0, 0.13);\n}\n\n.igv-roi-region {\n z-index: 64;\n position: absolute;\n top: 0;\n bottom: 0;\n pointer-events: none;\n overflow: visible;\n margin-top: 44px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-region > div {\n position: relative;\n width: 100%;\n height: 8px;\n pointer-events: auto;\n}\n\n.igv-roi-menu {\n position: absolute;\n z-index: 1024;\n width: 144px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu > div:not(:last-child) {\n border-bottom-color: rgba(128, 128, 128, 0.5);\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-menu > div:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-color: transparent;\n border-top-style: solid;\n border-top-width: 0;\n}\n.igv-roi-menu > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n}\n\n.igv-roi-menu-row {\n height: 24px;\n padding-left: 8px;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n background-color: white;\n}\n\n.igv-roi-menu-row-edit-description {\n width: -webkit-fill-available;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n background-color: white;\n padding-left: 4px;\n padding-right: 4px;\n padding-bottom: 4px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-menu-row-edit-description > label {\n margin-left: 2px;\n margin-bottom: 0;\n display: block;\n width: -webkit-fill-available;\n}\n.igv-roi-menu-row-edit-description > input {\n display: block;\n margin-left: 2px;\n margin-right: 2px;\n margin-bottom: 1px;\n width: -webkit-fill-available;\n}\n\n.igv-container {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n padding-top: 4px;\n user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n}\n\n.igv-viewport {\n position: relative;\n margin-top: 5px;\n line-height: 1;\n overflow-x: hidden;\n overflow-y: hidden;\n}\n\n.igv-viewport-content {\n position: relative;\n width: 100%;\n}\n.igv-viewport-content > canvas {\n position: relative;\n display: block;\n}\n\n.igv-column-container {\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n width: 100%;\n}\n\n.igv-column-shim {\n width: 1px;\n margin-left: 2px;\n margin-right: 2px;\n background-color: #545453;\n}\n\n.igv-column {\n position: relative;\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-axis-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 50px;\n}\n.igv-axis-column > div {\n margin-top: 5px;\n width: 100%;\n}\n\n.igv-sample-name-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-scrollbar-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 14px;\n}\n.igv-scrollbar-column > div {\n position: relative;\n margin-top: 5px;\n width: 14px;\n}\n.igv-scrollbar-column > div > div {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 2px;\n width: 8px;\n border-width: 1px;\n border-style: solid;\n border-color: #c4c4c4;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.igv-scrollbar-column > div > div:hover {\n background-color: #c4c4c4;\n}\n\n.igv-track-drag-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 12px;\n background-color: white;\n}\n.igv-track-drag-column > .igv-track-drag-handle {\n z-index: 512;\n position: relative;\n cursor: pointer;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n background-color: #c4c4c4;\n}\n.igv-track-drag-column .igv-track-drag-handle-hover {\n background-color: #787878;\n}\n.igv-track-drag-column > .igv-track-drag-shim {\n position: relative;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n}\n\n.igv-gear-menu-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 28px;\n}\n.igv-gear-menu-column > div {\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n margin-top: 5px;\n width: 100%;\n background: white;\n}\n.igv-gear-menu-column > div > div {\n position: relative;\n margin-top: 4px;\n width: 16px;\n height: 16px;\n color: #7F7F7F;\n}\n.igv-gear-menu-column > div > div:hover {\n cursor: pointer;\n color: #444;\n}\n\n/*# sourceMappingURL=dom.css.map */\n';
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: min-content;\n max-width: 1600px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n cursor: default;\n}\n.igv-roi-table > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table > div:first-child > div:first-child {\n text-align: center;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n margin-left: 4px;\n margin-right: 4px;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table > .igv-roi-table-description {\n padding: 4px;\n margin-left: 4px;\n word-break: break-all;\n overflow-y: auto;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n background-color: transparent;\n}\n.igv-roi-table > .igv-roi-table-goto-explainer {\n margin-top: 5px;\n margin-left: 4px;\n color: #7F7F7F;\n font-style: italic;\n height: 24px;\n border-top: solid lightgray;\n background-color: transparent;\n}\n.igv-roi-table > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: left;\n margin-left: 4px;\n height: 24px;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: #7f7f7f;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container {\n overflow: auto;\n resize: both;\n max-width: 1600px;\n height: 360px;\n background-color: transparent;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: left;\n margin-left: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n border-right-color: transparent;\n border-right-style: solid;\n border-right-width: thin;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:last-child {\n border-right: unset;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-row-selected {\n background-color: rgba(0, 0, 0, 0.125);\n}\n\n.igv-roi-table-button {\n cursor: pointer;\n height: 20px;\n user-select: none;\n line-height: 20px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 13px;\n font-weight: 400;\n color: black;\n padding-left: 6px;\n padding-right: 6px;\n background-color: rgb(239, 239, 239);\n border-color: black;\n border-style: solid;\n border-width: thin;\n border-radius: 3px;\n}\n\n.igv-roi-table-button:hover {\n font-weight: 400;\n background-color: rgba(0, 0, 0, 0.13);\n}\n\n.igv-roi-region {\n z-index: 64;\n position: absolute;\n top: 0;\n bottom: 0;\n pointer-events: none;\n overflow: visible;\n margin-top: 44px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-region > div {\n position: relative;\n width: 100%;\n height: 8px;\n pointer-events: auto;\n}\n\n.igv-roi-menu {\n position: absolute;\n z-index: 1024;\n width: 144px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu > div:not(:last-child) {\n border-bottom-color: rgba(128, 128, 128, 0.5);\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-menu > div:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-color: transparent;\n border-top-style: solid;\n border-top-width: 0;\n}\n.igv-roi-menu > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n}\n\n.igv-roi-menu-row {\n height: 24px;\n padding-left: 8px;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n background-color: white;\n}\n\n.igv-roi-menu-row-edit-description {\n width: -webkit-fill-available;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n background-color: white;\n padding-left: 4px;\n padding-right: 4px;\n padding-bottom: 4px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-menu-row-edit-description > label {\n margin-left: 2px;\n margin-bottom: 0;\n display: block;\n width: -webkit-fill-available;\n}\n.igv-roi-menu-row-edit-description > input {\n display: block;\n margin-left: 2px;\n margin-right: 2px;\n margin-bottom: 1px;\n width: -webkit-fill-available;\n}\n\n.igv-container {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n padding-top: 4px;\n user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n}\n\n.igv-viewport {\n position: relative;\n margin-top: 5px;\n line-height: 1;\n overflow-x: hidden;\n overflow-y: hidden;\n}\n\n.igv-viewport-content {\n position: relative;\n width: 100%;\n}\n.igv-viewport-content > canvas {\n position: relative;\n display: block;\n}\n\n.igv-column-container {\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n width: 100%;\n}\n\n.igv-column-shim {\n width: 1px;\n margin-left: 2px;\n margin-right: 2px;\n background-color: #545453;\n}\n\n.igv-column {\n position: relative;\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-axis-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 50px;\n}\n.igv-axis-column > div {\n margin-top: 5px;\n width: 100%;\n}\n\n.igv-sample-name-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-scrollbar-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 14px;\n}\n.igv-scrollbar-column > div {\n position: relative;\n margin-top: 5px;\n width: 14px;\n}\n.igv-scrollbar-column > div > div {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 2px;\n width: 8px;\n border-width: 1px;\n border-style: solid;\n border-color: #c4c4c4;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.igv-scrollbar-column > div > div:hover {\n background-color: #c4c4c4;\n}\n\n.igv-track-drag-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 12px;\n background-color: white;\n}\n.igv-track-drag-column > .igv-track-drag-handle {\n z-index: 512;\n position: relative;\n cursor: pointer;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n background-color: #c4c4c4;\n}\n.igv-track-drag-column .igv-track-drag-handle-hover {\n background-color: #787878;\n}\n.igv-track-drag-column > .igv-track-drag-shim {\n position: relative;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n}\n\n.igv-gear-menu-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 28px;\n}\n.igv-gear-menu-column > div {\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n margin-top: 5px;\n width: 100%;\n background: white;\n}\n.igv-gear-menu-column > div > div {\n position: relative;\n margin-top: 4px;\n width: 16px;\n height: 16px;\n color: #7F7F7F;\n}\n.igv-gear-menu-column > div > div:hover {\n cursor: pointer;\n color: #444;\n}\n\n/*# sourceMappingURL=dom.css.map */\n';
62076
62070
 
62077
62071
  var style = document.createElement('style');
62078
62072
  style.setAttribute('type', 'text/css');