@teselagen/ove 0.8.18 → 0.8.20

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/index.es.js CHANGED
@@ -8331,6 +8331,15 @@ function baseLt(value, other) {
8331
8331
  return value < other;
8332
8332
  }
8333
8333
  __name(baseLt, "baseLt");
8334
+ function mapValues$1(object3, iteratee) {
8335
+ var result = {};
8336
+ iteratee = baseIteratee(iteratee);
8337
+ baseForOwn(object3, function(value, key, object4) {
8338
+ baseAssignValue(result, key, iteratee(value, key, object4));
8339
+ });
8340
+ return result;
8341
+ }
8342
+ __name(mapValues$1, "mapValues$1");
8334
8343
  function baseExtremum(array2, iteratee, comparator) {
8335
8344
  var index2 = -1, length = array2.length;
8336
8345
  while (++index2 < length) {
@@ -13195,12 +13204,12 @@ var getComputedStyleX;
13195
13204
  if (typeof window !== "undefined") {
13196
13205
  getComputedStyleX = window.getComputedStyle ? _getComputedStyle : _getComputedStyleIE;
13197
13206
  }
13198
- function each$2(arr, fn4) {
13207
+ function each(arr, fn4) {
13199
13208
  for (var i = 0; i < arr.length; i++) {
13200
13209
  fn4(arr[i]);
13201
13210
  }
13202
13211
  }
13203
- __name(each$2, "each$2");
13212
+ __name(each, "each");
13204
13213
  function isBorderBoxFn(elem) {
13205
13214
  return getComputedStyleX(elem, "boxSizing") === "border-box";
13206
13215
  }
@@ -13255,7 +13264,7 @@ function isWindow(obj) {
13255
13264
  }
13256
13265
  __name(isWindow, "isWindow");
13257
13266
  var domUtils = {};
13258
- each$2(["Width", "Height"], function(name2) {
13267
+ each(["Width", "Height"], function(name2) {
13259
13268
  domUtils["doc".concat(name2)] = function(refWin) {
13260
13269
  var d2 = refWin.document;
13261
13270
  return Math.max(
@@ -13351,7 +13360,7 @@ function css(el, name2, v2) {
13351
13360
  return getComputedStyleX(el, name2);
13352
13361
  }
13353
13362
  __name(css, "css");
13354
- each$2(["width", "height"], function(name2) {
13363
+ each(["width", "height"], function(name2) {
13355
13364
  var first = name2.charAt(0).toUpperCase() + name2.slice(1);
13356
13365
  domUtils["outer".concat(first)] = function(el, includeMargin) {
13357
13366
  return el && getWHIgnoreDisplay(el, name2, includeMargin ? MARGIN_INDEX : BORDER_INDEX);
@@ -13402,7 +13411,7 @@ var util$2 = _objectSpread2$2({
13402
13411
  }
13403
13412
  }, "offset"),
13404
13413
  isWindow,
13405
- each: each$2,
13414
+ each,
13406
13415
  css,
13407
13416
  clone: /* @__PURE__ */ __name(function clone(obj) {
13408
13417
  var ret = {};
@@ -75191,17 +75200,25 @@ function tidyUpSequenceData(pSeqData, options = {}) {
75191
75200
  });
75192
75201
  if (!noTranslationData) {
75193
75202
  seqData.translations = flatMap(seqData.translations, (translation) => {
75203
+ var _a2, _b2;
75194
75204
  if (noCdsTranslations && translation.translationType === "CDS Feature") {
75195
75205
  return [];
75196
75206
  }
75197
- if (!translation.aminoAcids && !seqData.noSequence) {
75198
- translation.aminoAcids = getAminoAcidDataForEachBaseOfDna(
75207
+ const codonStart = ((_b2 = (_a2 = translation == null ? void 0 : translation.notes) == null ? void 0 : _a2.codon_start) == null ? void 0 : _b2[0]) - 1 || 0;
75208
+ const expandedRange = expandOrContractRangeByLength(
75209
+ translation,
75210
+ -codonStart,
75211
+ true,
75212
+ seqData.sequence.length
75213
+ );
75214
+ if (!expandedRange.aminoAcids && !seqData.noSequence) {
75215
+ expandedRange.aminoAcids = getAminoAcidDataForEachBaseOfDna(
75199
75216
  seqData.sequence,
75200
- translation.forward,
75201
- translation
75217
+ expandedRange.forward,
75218
+ expandedRange
75202
75219
  );
75203
75220
  }
75204
- return translation;
75221
+ return expandedRange;
75205
75222
  });
75206
75223
  }
75207
75224
  if (annotationsAsObjects) {
@@ -84314,6 +84331,160 @@ function calculateNebTm(sequence2, { monovalentCationConc = 0.05, primerConc = 5
84314
84331
  }
84315
84332
  }
84316
84333
  __name(calculateNebTm, "calculateNebTm");
84334
+ const PRIMER3_PARAMS = {
84335
+ saltMonovalent: 50,
84336
+ // mM
84337
+ saltDivalent: 1.5,
84338
+ // mM
84339
+ dntpConc: 0.6,
84340
+ // mM
84341
+ dnaConc: 50,
84342
+ // nM
84343
+ R: 1.987
84344
+ // Gas constant (cal/K·mol)
84345
+ };
84346
+ const SANTA_LUCIA_NN = {
84347
+ AA: { dH: -7.9, dS: -22.2 },
84348
+ TT: { dH: -7.9, dS: -22.2 },
84349
+ AT: { dH: -7.2, dS: -20.4 },
84350
+ TA: { dH: -7.2, dS: -21.3 },
84351
+ CA: { dH: -8.5, dS: -22.7 },
84352
+ TG: { dH: -8.5, dS: -22.7 },
84353
+ GT: { dH: -8.4, dS: -22.4 },
84354
+ AC: { dH: -8.4, dS: -22.4 },
84355
+ CT: { dH: -7.8, dS: -21 },
84356
+ AG: { dH: -7.8, dS: -21 },
84357
+ GA: { dH: -8.2, dS: -22.2 },
84358
+ TC: { dH: -8.2, dS: -22.2 },
84359
+ CG: { dH: -10.6, dS: -27.2 },
84360
+ GC: { dH: -9.8, dS: -24.4 },
84361
+ GG: { dH: -8, dS: -19.9 },
84362
+ CC: { dH: -8, dS: -19.9 }
84363
+ };
84364
+ const SANTA_LUCIA_INIT = {
84365
+ GC: { dH: 0.1, dS: -2.8 },
84366
+ // initiation with terminal GC
84367
+ AT: { dH: 2.3, dS: 4.1 }
84368
+ // initiation with terminal AT
84369
+ };
84370
+ function getEffectiveMonovalentConc() {
84371
+ let effectiveMono = PRIMER3_PARAMS.saltMonovalent;
84372
+ {
84373
+ const freeMg = Math.max(
84374
+ 0,
84375
+ PRIMER3_PARAMS.saltDivalent - PRIMER3_PARAMS.dntpConc
84376
+ );
84377
+ effectiveMono += 120 * Math.sqrt(freeMg);
84378
+ }
84379
+ return effectiveMono;
84380
+ }
84381
+ __name(getEffectiveMonovalentConc, "getEffectiveMonovalentConc");
84382
+ function applySaltCorrection(deltaS, nnPairs) {
84383
+ const effectiveMono = getEffectiveMonovalentConc();
84384
+ return deltaS + 0.368 * nnPairs * Math.log(effectiveMono / 1e3);
84385
+ }
84386
+ __name(applySaltCorrection, "applySaltCorrection");
84387
+ function isValidSequence(sequence2) {
84388
+ return /^[ATGCN]+$/.test(sequence2);
84389
+ }
84390
+ __name(isValidSequence, "isValidSequence");
84391
+ function calculateSantaLuciaTm(sequence2) {
84392
+ try {
84393
+ sequence2 = sequence2 == null ? void 0 : sequence2.toUpperCase().trim();
84394
+ if (!isValidSequence(sequence2)) {
84395
+ throw new Error("Invalid sequence: contains non-DNA characters");
84396
+ }
84397
+ if (sequence2.length < 2) {
84398
+ throw new Error("Sequence too short: minimum length is 2 bases");
84399
+ }
84400
+ let deltaH = 0;
84401
+ let deltaS = 0;
84402
+ for (let i = 0; i < sequence2.length - 1; i++) {
84403
+ const dinucleotide = sequence2.substring(i, i + 2);
84404
+ if (dinucleotide.includes("N")) {
84405
+ continue;
84406
+ }
84407
+ const params = SANTA_LUCIA_NN[dinucleotide];
84408
+ if (params) {
84409
+ deltaH += params.dH;
84410
+ deltaS += params.dS;
84411
+ }
84412
+ }
84413
+ const firstBase = sequence2[0];
84414
+ const lastBase = sequence2[sequence2.length - 1];
84415
+ if (firstBase === "G" || firstBase === "C") {
84416
+ deltaH += SANTA_LUCIA_INIT.GC.dH;
84417
+ deltaS += SANTA_LUCIA_INIT.GC.dS;
84418
+ } else {
84419
+ deltaH += SANTA_LUCIA_INIT.AT.dH;
84420
+ deltaS += SANTA_LUCIA_INIT.AT.dS;
84421
+ }
84422
+ if (lastBase === "G" || lastBase === "C") {
84423
+ deltaH += SANTA_LUCIA_INIT.GC.dH;
84424
+ deltaS += SANTA_LUCIA_INIT.GC.dS;
84425
+ } else {
84426
+ deltaH += SANTA_LUCIA_INIT.AT.dH;
84427
+ deltaS += SANTA_LUCIA_INIT.AT.dS;
84428
+ }
84429
+ const nnPairs = sequence2.length - 1;
84430
+ deltaS = applySaltCorrection(deltaS, nnPairs);
84431
+ const C = PRIMER3_PARAMS.dnaConc * 1e-9;
84432
+ const Tm = deltaH * 1e3 / (deltaS + PRIMER3_PARAMS.R * Math.log(C / 4));
84433
+ return Tm - 273.15;
84434
+ } catch (e) {
84435
+ return `Error calculating Tm for sequence ${sequence2}. ${e}`;
84436
+ }
84437
+ }
84438
+ __name(calculateSantaLuciaTm, "calculateSantaLuciaTm");
84439
+ function calculateEndStability(sequence2) {
84440
+ try {
84441
+ sequence2 = sequence2 == null ? void 0 : sequence2.toUpperCase().trim();
84442
+ if (!isValidSequence(sequence2)) {
84443
+ throw new Error("Invalid sequence: contains non-DNA characters");
84444
+ }
84445
+ if (sequence2.length < 5) {
84446
+ throw new Error(
84447
+ "Sequence too short: minimum length is 5 bases for end stability calculation"
84448
+ );
84449
+ }
84450
+ const last5Bases = sequence2.substring(sequence2.length - 5);
84451
+ let deltaH = 0;
84452
+ let deltaS = 0;
84453
+ for (let i = 0; i < 4; i++) {
84454
+ const dinucleotide = last5Bases.substring(i, i + 2);
84455
+ if (dinucleotide.includes("N")) {
84456
+ continue;
84457
+ }
84458
+ const params = SANTA_LUCIA_NN[dinucleotide];
84459
+ if (params) {
84460
+ deltaH += params.dH;
84461
+ deltaS += params.dS;
84462
+ }
84463
+ }
84464
+ const firstBase = last5Bases[0];
84465
+ const lastBase = last5Bases[last5Bases.length - 1];
84466
+ if (firstBase === "G" || firstBase === "C") {
84467
+ deltaH += SANTA_LUCIA_INIT.GC.dH;
84468
+ deltaS += SANTA_LUCIA_INIT.GC.dS;
84469
+ } else {
84470
+ deltaH += SANTA_LUCIA_INIT.AT.dH;
84471
+ deltaS += SANTA_LUCIA_INIT.AT.dS;
84472
+ }
84473
+ if (lastBase === "G" || lastBase === "C") {
84474
+ deltaH += SANTA_LUCIA_INIT.GC.dH;
84475
+ deltaS += SANTA_LUCIA_INIT.GC.dS;
84476
+ } else {
84477
+ deltaH += SANTA_LUCIA_INIT.AT.dH;
84478
+ deltaS += SANTA_LUCIA_INIT.AT.dS;
84479
+ }
84480
+ const T2 = 310.15;
84481
+ const deltaG = deltaH - T2 * deltaS / 1e3;
84482
+ return Math.round(Math.abs(deltaG) * 100) / 100;
84483
+ } catch (e) {
84484
+ return `Error calculating end stability for sequence ${sequence2}. ${e}`;
84485
+ }
84486
+ }
84487
+ __name(calculateEndStability, "calculateEndStability");
84317
84488
  function convertAACaretPositionOrRangeToDna(rangeOrCaret) {
84318
84489
  if (typeof rangeOrCaret === "object" && rangeOrCaret !== null) {
84319
84490
  return convertAARangeToDnaRange(__spreadProps(__spreadValues({}, rangeOrCaret), {
@@ -97792,32 +97963,6 @@ const orfsSelector = createSelector(
97792
97963
  (state2) => state2.useAdditionalOrfStartCodons,
97793
97964
  findOrfsInPlasmid
97794
97965
  );
97795
- var forEach_1;
97796
- var hasRequiredForEach;
97797
- function requireForEach() {
97798
- if (hasRequiredForEach) return forEach_1;
97799
- hasRequiredForEach = 1;
97800
- var arrayEach2 = require_arrayEach(), baseEach2 = require_baseEach(), castFunction2 = require_castFunction(), isArray2 = requireIsArray();
97801
- function forEach3(collection, iteratee) {
97802
- var func = isArray2(collection) ? arrayEach2 : baseEach2;
97803
- return func(collection, castFunction2(iteratee));
97804
- }
97805
- __name(forEach3, "forEach");
97806
- forEach_1 = forEach3;
97807
- return forEach_1;
97808
- }
97809
- __name(requireForEach, "requireForEach");
97810
- var each$1;
97811
- var hasRequiredEach;
97812
- function requireEach() {
97813
- if (hasRequiredEach) return each$1;
97814
- hasRequiredEach = 1;
97815
- each$1 = requireForEach();
97816
- return each$1;
97817
- }
97818
- __name(requireEach, "requireEach");
97819
- var eachExports = requireEach();
97820
- const each = /* @__PURE__ */ getDefaultExportFromCjs(eachExports);
97821
97966
  function translationsRawSelector(sequenceData2) {
97822
97967
  return sequenceData2.translations;
97823
97968
  }
@@ -97984,14 +98129,22 @@ function translationsSelector(isCircular, translationSearchMatches, sequence2, o
97984
98129
  },
97985
98130
  {}
97986
98131
  ));
97987
- each(translationsToPass, function(translation) {
97988
- translation.aminoAcids = getAminoAcidDataForEachBaseOfDna(
98132
+ return mapValues$1(translationsToPass, (translation) => {
98133
+ var _a2, _b2;
98134
+ const codonStart = ((_b2 = (_a2 = translation == null ? void 0 : translation.notes) == null ? void 0 : _a2.codon_start) == null ? void 0 : _b2[0]) - 1 || 0;
98135
+ const expandedRange = expandOrContractRangeByLength(
98136
+ translation,
98137
+ -codonStart,
98138
+ true,
98139
+ sequence2.length
98140
+ );
98141
+ expandedRange.aminoAcids = getAminoAcidDataForEachBaseOfDna(
97989
98142
  sequence2,
97990
- translation.forward,
97991
- translation
98143
+ expandedRange.forward,
98144
+ expandedRange
97992
98145
  );
98146
+ return expandedRange;
97993
98147
  });
97994
- return translationsToPass;
97995
98148
  }
97996
98149
  __name(translationsSelector, "translationsSelector");
97997
98150
  const translationsSelector$1 = createSelector(
@@ -109867,6 +110020,21 @@ function Orf(props) {
109867
110020
  );
109868
110021
  }
109869
110022
  __name(Orf, "Orf");
110023
+ var forEach_1;
110024
+ var hasRequiredForEach;
110025
+ function requireForEach() {
110026
+ if (hasRequiredForEach) return forEach_1;
110027
+ hasRequiredForEach = 1;
110028
+ var arrayEach2 = require_arrayEach(), baseEach2 = require_baseEach(), castFunction2 = require_castFunction(), isArray2 = requireIsArray();
110029
+ function forEach3(collection, iteratee) {
110030
+ var func = isArray2(collection) ? arrayEach2 : baseEach2;
110031
+ return func(collection, castFunction2(iteratee));
110032
+ }
110033
+ __name(forEach3, "forEach");
110034
+ forEach_1 = forEach3;
110035
+ return forEach_1;
110036
+ }
110037
+ __name(requireForEach, "requireForEach");
109870
110038
  var forEachExports = requireForEach();
109871
110039
  const forEach2 = /* @__PURE__ */ getDefaultExportFromCjs(forEachExports);
109872
110040
  var lib = {};
@@ -116622,7 +116790,7 @@ function showFileDialog({ multiple = false, onSelect }) {
116622
116790
  input.click();
116623
116791
  }
116624
116792
  __name(showFileDialog, "showFileDialog");
116625
- const version = "0.8.17";
116793
+ const version = "0.8.19";
116626
116794
  const packageJson = {
116627
116795
  version
116628
116796
  };
@@ -124274,6 +124442,7 @@ const __LinearView = class __LinearView extends React__default.Component {
124274
124442
  RowItem$1,
124275
124443
  __spreadProps(__spreadValues({}, __spreadValues(__spreadProps(__spreadValues({}, rest), {
124276
124444
  editorName,
124445
+ showAminoAcidUnitAsCodon,
124277
124446
  onScroll: /* @__PURE__ */ __name(() => {
124278
124447
  this.easyStore.viewportWidth = width;
124279
124448
  const row = this.linearView.querySelector(".veRowItemWrapper");
@@ -137321,7 +137490,7 @@ function MeltingTemp({
137321
137490
  /* , setMonovalentCationConc */
137322
137491
  ] = React__default.useState(0.05);
137323
137492
  const [tmType, setTmType] = useTmType();
137324
- let tm = (tmType === "neb_tm" ? calculateNebTm : calculateTm)(sequence2, {
137493
+ let tm = (tmType === "neb_tm" ? calculateNebTm : tmType === "default" ? calculateSantaLuciaTm : calculateTm)(sequence2, {
137325
137494
  monovalentCationConc,
137326
137495
  primerConc
137327
137496
  });
@@ -137346,8 +137515,9 @@ function MeltingTemp({
137346
137515
  {
137347
137516
  label: "Choose Tm Type:",
137348
137517
  options: [
137349
- { value: "default", label: "Default Tm (Breslauer)" },
137350
- { value: "neb_tm", label: "NEB Tm (SantaLucia)" }
137518
+ { value: "default", label: "Santa Lucia (Default)" },
137519
+ { value: "breslauer", label: "Breslauer" },
137520
+ { value: "neb_tm", label: "NEB Tm" }
137351
137521
  ],
137352
137522
  onChange: /* @__PURE__ */ __name((e) => setTmType(e.target.value), "onChange"),
137353
137523
  selectedValue: tmType
@@ -137361,7 +137531,7 @@ function MeltingTemp({
137361
137531
  }
137362
137532
  ), hasWarning, /* @__PURE__ */ React__default.createElement("br", null), /* @__PURE__ */ React__default.createElement("br", null), "Try using the Default Tm"))
137363
137533
  },
137364
- /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(InnerWrapper, null, "Melting Temp: ", Number(tm) || 0, " "), hasWarning && /* @__PURE__ */ React__default.createElement(
137534
+ /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, /* @__PURE__ */ React__default.createElement(InnerWrapper, null, "Melting Temp: ", Number(tm) || 0, "°C"), hasWarning && /* @__PURE__ */ React__default.createElement(
137365
137535
  Icon,
137366
137536
  {
137367
137537
  style: { marginLeft: 5, marginRight: 5 },
@@ -137625,12 +137795,24 @@ const RenderBases = /* @__PURE__ */ __name((props) => {
137625
137795
  )), /* @__PURE__ */ React__default.createElement(
137626
137796
  MeltingTemp,
137627
137797
  {
137628
- InnerWrapper: InnerWrapperMeltingTemp,
137798
+ InnerWrapper: TextInnerWrapper,
137629
137799
  sequence: bases
137630
137800
  }
137631
- ))
137801
+ ), /* @__PURE__ */ React__default.createElement(TextInnerWrapper, null, "GC content: ", bases && calculatePercentGC(bases).toFixed(1), "%"), /* @__PURE__ */ React__default.createElement(TextInnerWrapper, null, "3' Stability: ", bases && calculateEndStability(bases), " kcal/mol"))
137632
137802
  );
137633
137803
  }, "RenderBases");
137804
+ const TextInnerWrapper = /* @__PURE__ */ __name((p2) => /* @__PURE__ */ React__default.createElement(
137805
+ "div",
137806
+ {
137807
+ className: "bp3-text-muted bp3-text-small",
137808
+ style: {
137809
+ marginBottom: 15,
137810
+ marginTop: -5,
137811
+ fontStyle: "italic"
137812
+ }
137813
+ },
137814
+ p2.children
137815
+ ), "TextInnerWrapper");
137634
137816
  const AddOrEditPrimerDialog = AddOrEditAnnotationDialog$1({
137635
137817
  formName: "AddOrEditPrimerDialog",
137636
137818
  getProps: /* @__PURE__ */ __name((props) => ({
@@ -137639,14 +137821,6 @@ const AddOrEditPrimerDialog = AddOrEditAnnotationDialog$1({
137639
137821
  RenderBases
137640
137822
  }), "getProps")
137641
137823
  });
137642
- const InnerWrapperMeltingTemp = /* @__PURE__ */ __name((p2) => /* @__PURE__ */ React__default.createElement(
137643
- "div",
137644
- {
137645
- className: "bp3-text-muted bp3-text-small",
137646
- style: { marginBottom: 15, marginTop: -5, fontStyle: "italic" }
137647
- },
137648
- p2.children
137649
- ), "InnerWrapperMeltingTemp");
137650
137824
  const Dialogs = {
137651
137825
  RenameSequenceDialog,
137652
137826
  PrintDialog: PrintDialog$1,
@@ -138078,7 +138252,7 @@ const PropertySidePanel = /* @__PURE__ */ __name(({ properties: properties2, set
138078
138252
  item: selection && selection.start > -1 ? /* @__PURE__ */ React__default.createElement("span", null, selection.start + 1, " - ", selection.end + 1) : /* @__PURE__ */ React__default.createElement("span", null, "1 - ", isProtein2 ? proteinSize : size),
138079
138253
  title: "Region"
138080
138254
  }
138081
- )), /* @__PURE__ */ React__default.createElement("h5", null, isProtein2 ? "Amino Acid" : "Base Pair", " Frequencies"), /* @__PURE__ */ React__default.createElement("div", { className: "sidebar-table" }, /* @__PURE__ */ React__default.createElement("div", { className: "sidebar-row" }, /* @__PURE__ */ React__default.createElement("div", { className: "sidebar-cell" }, "Amino Acid"), /* @__PURE__ */ React__default.createElement("div", { className: "sidebar-cell" }, "Count"), /* @__PURE__ */ React__default.createElement("div", { className: "sidebar-cell" }, "Percentage")), frequencyEntries.map(([aa, data], idx) => {
138255
+ )), /* @__PURE__ */ React__default.createElement("h5", null, isProtein2 ? "Amino Acid" : "Base Pair", " Frequencies"), /* @__PURE__ */ React__default.createElement("div", { className: "sidebar-table" }, /* @__PURE__ */ React__default.createElement("div", { className: "sidebar-row" }, /* @__PURE__ */ React__default.createElement("div", { className: "sidebar-cell" }, isProtein2 ? "Amino Acid" : "Base"), /* @__PURE__ */ React__default.createElement("div", { className: "sidebar-cell" }, "Count"), /* @__PURE__ */ React__default.createElement("div", { className: "sidebar-cell" }, "Percentage")), frequencyEntries.map(([aa, data], idx) => {
138082
138256
  return /* @__PURE__ */ React__default.createElement("div", { className: `sidebar-row property-amino-acid-${idx}` }, /* @__PURE__ */ React__default.createElement("div", { className: "sidebar-cell" }, aa, " ", isProtein2 ? `(${aminoAcidShortNames[aa]})` : ""), /* @__PURE__ */ React__default.createElement("div", { className: "sidebar-cell" }, data.count), /* @__PURE__ */ React__default.createElement("div", { className: "sidebar-cell" }, data.percentage.toFixed(1), "%"));
138083
138257
  })));
138084
138258
  } else {
@@ -138578,7 +138752,11 @@ ${seqDataToCopy}\r
138578
138752
  }, [alignmentTracks, id2, store2]);
138579
138753
  useEffect(() => {
138580
138754
  const handleAlignmentCopy = /* @__PURE__ */ __name((event) => {
138755
+ var _a3, _b2, _c;
138581
138756
  if (event.key === "c" && !event.shiftKey && (event.metaKey === true || event.ctrlKey === true)) {
138757
+ if (!((_a3 = document.activeElement) == null ? void 0 : _a3.classList.contains("alignmentView"))) {
138758
+ return;
138759
+ }
138582
138760
  const input = document.createElement("textarea");
138583
138761
  document.body.appendChild(input);
138584
138762
  const seqDataToCopy = getAllAlignmentsFastaText();
@@ -138592,6 +138770,8 @@ ${seqDataToCopy}\r
138592
138770
  }
138593
138771
  document.body.removeChild(input);
138594
138772
  event.preventDefault();
138773
+ (_b2 = document.activeElement) == null ? void 0 : _b2.blur();
138774
+ (_c = document.querySelector(".alignmentView")) == null ? void 0 : _c.focus();
138595
138775
  }
138596
138776
  }, "handleAlignmentCopy");
138597
138777
  document.addEventListener("keydown", handleAlignmentCopy);
@@ -139750,6 +139930,7 @@ ${seqDataToCopy}\r
139750
139930
  position: "relative",
139751
139931
  overflowY: "auto"
139752
139932
  }, style2),
139933
+ tabIndex: 0,
139753
139934
  className: "alignmentView"
139754
139935
  },
139755
139936
  /* @__PURE__ */ React__default.createElement(