react-msaview 4.4.0 → 4.4.2

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.
Files changed (63) hide show
  1. package/bundle/index.js +15 -15
  2. package/bundle/index.js.LICENSE.txt +5 -13
  3. package/bundle/index.js.map +1 -1
  4. package/dist/colorSchemes.js +2 -2
  5. package/dist/colorSchemes.js.map +1 -1
  6. package/dist/components/VerticalScrollbar.js +2 -2
  7. package/dist/components/VerticalScrollbar.js.map +1 -1
  8. package/dist/components/dialogs/SettingsDialog.js +3 -2
  9. package/dist/components/dialogs/SettingsDialog.js.map +1 -1
  10. package/dist/components/header/Header.js +1 -1
  11. package/dist/components/header/Header.js.map +1 -1
  12. package/dist/components/header/HeaderInfoArea.js +3 -2
  13. package/dist/components/header/HeaderInfoArea.js.map +1 -1
  14. package/dist/components/header/HeaderMenu.js +15 -97
  15. package/dist/components/header/HeaderMenu.js.map +1 -1
  16. package/dist/components/header/SettingsMenu.js +57 -73
  17. package/dist/components/header/SettingsMenu.js.map +1 -1
  18. package/dist/components/header/ZoomMenu.js +14 -2
  19. package/dist/components/header/ZoomMenu.js.map +1 -1
  20. package/dist/components/msa/MSAMouseoverCanvas.js +4 -1
  21. package/dist/components/msa/MSAMouseoverCanvas.js.map +1 -1
  22. package/dist/components/msa/renderBoxFeatureCanvasBlock.js +4 -4
  23. package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -1
  24. package/dist/components/msa/renderMSABlock.js +13 -9
  25. package/dist/components/msa/renderMSABlock.js.map +1 -1
  26. package/dist/model.d.ts +17 -5
  27. package/dist/model.js +70 -57
  28. package/dist/model.js.map +1 -1
  29. package/dist/rowCoordinateCalculations.d.ts +13 -2
  30. package/dist/rowCoordinateCalculations.js +60 -17
  31. package/dist/rowCoordinateCalculations.js.map +1 -1
  32. package/dist/rowCoordinateCalculations.test.js +96 -2
  33. package/dist/rowCoordinateCalculations.test.js.map +1 -1
  34. package/dist/seqCoordToRowSpecificGlobalCoord.d.ts +4 -0
  35. package/dist/seqCoordToRowSpecificGlobalCoord.js +15 -0
  36. package/dist/seqCoordToRowSpecificGlobalCoord.js.map +1 -0
  37. package/dist/seqCoordToRowSpecificGlobalCoord.test.d.ts +1 -0
  38. package/dist/seqCoordToRowSpecificGlobalCoord.test.js +42 -0
  39. package/dist/seqCoordToRowSpecificGlobalCoord.test.js.map +1 -0
  40. package/dist/util.d.ts +1 -6
  41. package/dist/util.js +5 -22
  42. package/dist/util.js.map +1 -1
  43. package/dist/version.d.ts +1 -1
  44. package/dist/version.js +1 -1
  45. package/package.json +1 -1
  46. package/src/colorSchemes.ts +2 -2
  47. package/src/components/VerticalScrollbar.tsx +2 -3
  48. package/src/components/dialogs/SettingsDialog.tsx +4 -2
  49. package/src/components/header/Header.tsx +1 -1
  50. package/src/components/header/HeaderInfoArea.tsx +5 -2
  51. package/src/components/header/HeaderMenu.tsx +15 -110
  52. package/src/components/header/SettingsMenu.tsx +64 -81
  53. package/src/components/header/ZoomMenu.tsx +15 -2
  54. package/src/components/msa/MSAMouseoverCanvas.tsx +4 -1
  55. package/src/components/msa/renderBoxFeatureCanvasBlock.ts +4 -4
  56. package/src/components/msa/renderMSABlock.ts +26 -22
  57. package/src/model.ts +89 -67
  58. package/src/rowCoordinateCalculations.test.ts +138 -2
  59. package/src/rowCoordinateCalculations.ts +95 -18
  60. package/src/seqCoordToRowSpecificGlobalCoord.test.ts +53 -0
  61. package/src/seqCoordToRowSpecificGlobalCoord.ts +20 -0
  62. package/src/util.ts +5 -28
  63. package/src/version.ts +1 -1
@@ -1,26 +1,69 @@
1
- export function mouseOverCoordToGlobalCoord(blanks, pos) {
2
- let i = 0; // 'mouse over coord'
3
- let j = 0; // 'position in blanks array'
4
- let k = 0; // 'global coord'/return value
5
- for (; i < pos; i++, k++) {
6
- // skip multiple gaps in a row
7
- while (j < blanks.length && blanks[j] - 1 === k) {
8
- j++;
9
- k++;
1
+ import { isBlank } from './util';
2
+ export function mouseOverCoordToGlobalCoord(blanks, position) {
3
+ let mousePosition = 0; // Current position in mouse coordinates
4
+ let blankArrayIndex = 0; // Current index in the blanks array
5
+ let globalPosition = 0; // Position in global coordinates (return value)
6
+ const blanksLen = blanks.length;
7
+ // Iterate until we reach the target mouse position
8
+ while (mousePosition < position) {
9
+ // Skip any blank positions in the sequence
10
+ while (blankArrayIndex < blanksLen &&
11
+ blanks[blankArrayIndex] - 1 === globalPosition) {
12
+ blankArrayIndex++;
13
+ globalPosition++;
10
14
  }
15
+ // Move to next position
16
+ mousePosition++;
17
+ globalPosition++;
11
18
  }
12
- return k;
19
+ return globalPosition;
13
20
  }
14
- export function globalCoordToRowSpecificCoord(seq, pos) {
15
- let k = 0;
16
- for (let i = 0; i < pos; i++) {
17
- if (seq[i] !== '-') {
18
- k++;
21
+ export function globalCoordToRowSpecificCoord(seq, position) {
22
+ // Initialize counter for non-gap characters
23
+ let nonGapCount = 0;
24
+ // Initialize position counter
25
+ let currentPosition = 0;
26
+ const sequenceLength = seq.length;
27
+ // Iterate until we reach the target position or end of sequence
28
+ while (currentPosition < position && currentPosition < sequenceLength) {
29
+ // If current character is not a gap, increment the non-gap counter
30
+ if (seq[currentPosition] !== '-') {
31
+ nonGapCount++;
19
32
  }
20
- else if (k >= pos) {
33
+ // If we've reached the target position in non-gap coordinates, break
34
+ else if (nonGapCount >= position) {
21
35
  break;
22
36
  }
37
+ currentPosition++;
23
38
  }
24
- return k;
39
+ return nonGapCount;
40
+ }
41
+ export function mouseOverCoordToGapRemovedRowCoord({ rowName, position, rowMap, blanks, }) {
42
+ const seq = rowMap.get(rowName);
43
+ return seq !== undefined
44
+ ? mouseOverCoordToGapRemovedCoord({
45
+ seq,
46
+ position,
47
+ blanks,
48
+ })
49
+ : undefined;
50
+ }
51
+ export function mouseOverCoordToGapRemovedCoord({ seq, blanks, position, }) {
52
+ // First convert the mouse position to global coordinates
53
+ const globalPos = mouseOverCoordToGlobalCoord(blanks, position);
54
+ const seqLen = seq.length;
55
+ // Check if the position in the sequence is a gap
56
+ if (globalPos < seqLen && isBlank(seq[globalPos])) {
57
+ return undefined;
58
+ }
59
+ // Count non-gap characters up to the global position
60
+ let nonGapCount = 0;
61
+ for (let i = 0; i < globalPos && i < seqLen; i++) {
62
+ if (!isBlank(seq[i])) {
63
+ nonGapCount++;
64
+ }
65
+ }
66
+ // If we're at a valid position, return the count of non-gap characters
67
+ return globalPos < seqLen ? nonGapCount : undefined;
25
68
  }
26
69
  //# sourceMappingURL=rowCoordinateCalculations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rowCoordinateCalculations.js","sourceRoot":"","sources":["../src/rowCoordinateCalculations.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,2BAA2B,CAAC,MAAgB,EAAE,GAAW;IACvE,IAAI,CAAC,GAAG,CAAC,CAAA,CAAC,qBAAqB;IAC/B,IAAI,CAAC,GAAG,CAAC,CAAA,CAAC,6BAA6B;IACvC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAC,8BAA8B;IAExC,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QACzB,8BAA8B;QAC9B,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,CAAE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACjD,CAAC,EAAE,CAAA;YACH,CAAC,EAAE,CAAA;QACL,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,GAAW,EAAE,GAAW;IACpE,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACnB,CAAC,EAAE,CAAA;QACL,CAAC;aAAM,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YACpB,MAAK;QACP,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC"}
1
+ {"version":3,"file":"rowCoordinateCalculations.js","sourceRoot":"","sources":["../src/rowCoordinateCalculations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAEhC,MAAM,UAAU,2BAA2B,CACzC,MAAgB,EAChB,QAAgB;IAEhB,IAAI,aAAa,GAAG,CAAC,CAAA,CAAC,wCAAwC;IAC9D,IAAI,eAAe,GAAG,CAAC,CAAA,CAAC,oCAAoC;IAC5D,IAAI,cAAc,GAAG,CAAC,CAAA,CAAC,gDAAgD;IACvE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAA;IAE/B,mDAAmD;IACnD,OAAO,aAAa,GAAG,QAAQ,EAAE,CAAC;QAChC,2CAA2C;QAC3C,OACE,eAAe,GAAG,SAAS;YAC3B,MAAM,CAAC,eAAe,CAAE,GAAG,CAAC,KAAK,cAAc,EAC/C,CAAC;YACD,eAAe,EAAE,CAAA;YACjB,cAAc,EAAE,CAAA;QAClB,CAAC;QAED,wBAAwB;QACxB,aAAa,EAAE,CAAA;QACf,cAAc,EAAE,CAAA;IAClB,CAAC;IAED,OAAO,cAAc,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,GAAW,EAAE,QAAgB;IACzE,4CAA4C;IAC5C,IAAI,WAAW,GAAG,CAAC,CAAA;IACnB,8BAA8B;IAC9B,IAAI,eAAe,GAAG,CAAC,CAAA;IACvB,MAAM,cAAc,GAAG,GAAG,CAAC,MAAM,CAAA;IAEjC,gEAAgE;IAChE,OAAO,eAAe,GAAG,QAAQ,IAAI,eAAe,GAAG,cAAc,EAAE,CAAC;QACtE,mEAAmE;QACnE,IAAI,GAAG,CAAC,eAAe,CAAC,KAAK,GAAG,EAAE,CAAC;YACjC,WAAW,EAAE,CAAA;QACf,CAAC;QACD,qEAAqE;aAChE,IAAI,WAAW,IAAI,QAAQ,EAAE,CAAC;YACjC,MAAK;QACP,CAAC;QACD,eAAe,EAAE,CAAA;IACnB,CAAC;IAED,OAAO,WAAW,CAAA;AACpB,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,EACjD,OAAO,EACP,QAAQ,EACR,MAAM,EACN,MAAM,GAMP;IACC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC/B,OAAO,GAAG,KAAK,SAAS;QACtB,CAAC,CAAC,+BAA+B,CAAC;YAC9B,GAAG;YACH,QAAQ;YACR,MAAM;SACP,CAAC;QACJ,CAAC,CAAC,SAAS,CAAA;AACf,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,EAC9C,GAAG,EACH,MAAM,EACN,QAAQ,GAKT;IACC,yDAAyD;IACzD,MAAM,SAAS,GAAG,2BAA2B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC/D,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAA;IAEzB,iDAAiD;IACjD,IAAI,SAAS,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAClD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,qDAAqD;IACrD,IAAI,WAAW,GAAG,CAAC,CAAA;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,WAAW,EAAE,CAAA;QACf,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,OAAO,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAA;AACrD,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { expect, test } from 'vitest';
2
- import { mouseOverCoordToGlobalCoord } from './rowCoordinateCalculations';
3
- test('blanks3', () => {
2
+ import { globalCoordToRowSpecificCoord, mouseOverCoordToGapRemovedCoord, mouseOverCoordToGlobalCoord, } from './rowCoordinateCalculations';
3
+ test('with blanks at positions [2, 5, 8]', () => {
4
4
  const blanks = [2, 5, 8];
5
5
  [
6
6
  [0, 0],
@@ -15,4 +15,98 @@ test('blanks3', () => {
15
15
  expect(mouseOverCoordToGlobalCoord(blanks, r[0])).toBe(r[1]);
16
16
  });
17
17
  });
18
+ test('with no blanks', () => {
19
+ const blanks = [];
20
+ [
21
+ [0, 0],
22
+ [1, 1],
23
+ [5, 5],
24
+ [10, 10],
25
+ ].forEach(r => {
26
+ expect(mouseOverCoordToGlobalCoord(blanks, r[0])).toBe(r[1]);
27
+ });
28
+ });
29
+ test('with consecutive blanks', () => {
30
+ const blanks = [2, 3, 4, 7, 8];
31
+ [
32
+ [0, 0],
33
+ [1, 1],
34
+ [2, 5], // After position 1, skip 3 blanks (2,3,4)
35
+ [3, 6], // Next position
36
+ [4, 9], // After position 3, skip 2 blanks (7,8)
37
+ [5, 10],
38
+ ].forEach(r => {
39
+ expect(mouseOverCoordToGlobalCoord(blanks, r[0])).toBe(r[1]);
40
+ });
41
+ });
42
+ test('with blanks at the beginning', () => {
43
+ const blanks = [1, 2, 5];
44
+ [
45
+ [0, 0],
46
+ [1, 3], // After position 0, skip 2 blanks (1,2)
47
+ [2, 4],
48
+ [3, 6], // After position 2, skip 1 blank (5)
49
+ [4, 7],
50
+ ].forEach(r => {
51
+ expect(mouseOverCoordToGlobalCoord(blanks, r[0])).toBe(r[1]);
52
+ });
53
+ });
54
+ test('with position exceeding blanks array', () => {
55
+ const blanks = [2, 5];
56
+ [
57
+ [0, 0],
58
+ [1, 1],
59
+ [2, 3], // After position 1, skip 1 blank (2)
60
+ [3, 4],
61
+ [4, 6], // After position 3, skip 1 blank (5)
62
+ [10, 12], // Far beyond blanks array
63
+ ].forEach(r => {
64
+ expect(mouseOverCoordToGlobalCoord(blanks, r[0])).toBe(r[1]);
65
+ });
66
+ });
67
+ test('with gaps in sequence', () => {
68
+ const sequence = 'AC-GT-A';
69
+ expect(globalCoordToRowSpecificCoord(sequence, 0)).toBe(0);
70
+ expect(globalCoordToRowSpecificCoord(sequence, 1)).toBe(1);
71
+ expect(globalCoordToRowSpecificCoord(sequence, 2)).toBe(2);
72
+ // Position 3 in global coordinates is after the gap
73
+ expect(globalCoordToRowSpecificCoord(sequence, 3)).toBe(2);
74
+ expect(globalCoordToRowSpecificCoord(sequence, 4)).toBe(3);
75
+ expect(globalCoordToRowSpecificCoord(sequence, 5)).toBe(4);
76
+ // Position 6 in global coordinates is after the gap
77
+ expect(globalCoordToRowSpecificCoord(sequence, 6)).toBe(4);
78
+ });
79
+ test('with no gaps in sequence', () => {
80
+ const sequence = 'ACGTA';
81
+ expect(globalCoordToRowSpecificCoord(sequence, 0)).toBe(0);
82
+ expect(globalCoordToRowSpecificCoord(sequence, 1)).toBe(1);
83
+ expect(globalCoordToRowSpecificCoord(sequence, 2)).toBe(2);
84
+ expect(globalCoordToRowSpecificCoord(sequence, 3)).toBe(3);
85
+ expect(globalCoordToRowSpecificCoord(sequence, 4)).toBe(4);
86
+ });
87
+ test('with all gaps in sequence', () => {
88
+ const sequence = '-----';
89
+ expect(globalCoordToRowSpecificCoord(sequence, 0)).toBe(0);
90
+ expect(globalCoordToRowSpecificCoord(sequence, 1)).toBe(0);
91
+ expect(globalCoordToRowSpecificCoord(sequence, 2)).toBe(0);
92
+ expect(globalCoordToRowSpecificCoord(sequence, 3)).toBe(0);
93
+ expect(globalCoordToRowSpecificCoord(sequence, 4)).toBe(0);
94
+ });
95
+ test('with position exceeding sequence length', () => {
96
+ const sequence = 'AC-GT';
97
+ expect(globalCoordToRowSpecificCoord(sequence, 10)).toBe(4);
98
+ });
99
+ test('mouseOverCoordToGapRemovedCoord', () => {
100
+ const seq = 'AC--GT--CT';
101
+ expect(mouseOverCoordToGapRemovedCoord({ seq, position: 0, blanks: [] })).toBe(0);
102
+ expect(mouseOverCoordToGapRemovedCoord({ seq, position: 1, blanks: [] })).toBe(1);
103
+ expect(mouseOverCoordToGapRemovedCoord({ seq, position: 2, blanks: [] })).toBe(undefined);
104
+ expect(mouseOverCoordToGapRemovedCoord({ seq, position: 3, blanks: [] })).toBe(undefined);
105
+ expect(mouseOverCoordToGapRemovedCoord({ seq, position: 4, blanks: [] })).toBe(2);
106
+ expect(mouseOverCoordToGapRemovedCoord({ seq, position: 5, blanks: [] })).toBe(3);
107
+ expect(mouseOverCoordToGapRemovedCoord({ seq, position: 6, blanks: [] })).toBe(undefined);
108
+ expect(mouseOverCoordToGapRemovedCoord({ seq, position: 7, blanks: [] })).toBe(undefined);
109
+ expect(mouseOverCoordToGapRemovedCoord({ seq, position: 8, blanks: [] })).toBe(4);
110
+ expect(mouseOverCoordToGapRemovedCoord({ seq, position: 9, blanks: [] })).toBe(5);
111
+ });
18
112
  //# sourceMappingURL=rowCoordinateCalculations.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rowCoordinateCalculations.test.js","sourceRoot":"","sources":["../src/rowCoordinateCalculations.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAErC,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAA;AACzE,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;IACnB,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACvB;IACC;QACE,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,EAAE,EAAE,CAAC;KAEV,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QACZ,MAAM,CAAC,2BAA2B,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"rowCoordinateCalculations.test.js","sourceRoot":"","sources":["../src/rowCoordinateCalculations.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function seqCoordToRowSpecificGlobalCoord({ row, position, }: {
2
+ row: string;
3
+ position: number;
4
+ }): number;
@@ -0,0 +1,15 @@
1
+ import { isBlank } from './util';
2
+ export function seqCoordToRowSpecificGlobalCoord({ row, position, }) {
3
+ let k = 0;
4
+ let i = 0;
5
+ for (; k < position; i++) {
6
+ if (!isBlank(row[i])) {
7
+ k++;
8
+ }
9
+ else if (k >= position) {
10
+ break;
11
+ }
12
+ }
13
+ return i;
14
+ }
15
+ //# sourceMappingURL=seqCoordToRowSpecificGlobalCoord.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seqCoordToRowSpecificGlobalCoord.js","sourceRoot":"","sources":["../src/seqCoordToRowSpecificGlobalCoord.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAEhC,MAAM,UAAU,gCAAgC,CAAC,EAC/C,GAAG,EACH,QAAQ,GAIT;IACC,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,CAAC,EAAE,CAAA;QACL,CAAC;aAAM,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAK;QACP,CAAC;IACH,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,42 @@
1
+ import { describe, expect, test } from 'vitest';
2
+ import { seqCoordToRowSpecificGlobalCoord } from './seqCoordToRowSpecificGlobalCoord';
3
+ describe('seqCoordToRowSpecificGlobalCoord', () => {
4
+ test('converts sequence coordinate to global coordinate with no gaps', () => {
5
+ const row = 'ATGCATGC';
6
+ expect(seqCoordToRowSpecificGlobalCoord({ row, position: 3 })).toBe(3);
7
+ expect(seqCoordToRowSpecificGlobalCoord({ row, position: 0 })).toBe(0);
8
+ expect(seqCoordToRowSpecificGlobalCoord({ row, position: 8 })).toBe(8);
9
+ });
10
+ test('converts sequence coordinate to global coordinate with gaps', () => {
11
+ const row = 'A-TG-CA-TGC';
12
+ // A(0) -(1) T(2) G(3) -(4) C(5) A(6) -(7) T(8) G(9) C(10)
13
+ // Sequence positions: A(0) T(1) G(2) C(3) A(4) T(5) G(6) C(7)
14
+ // Position 0 (first A) -> Global index 0
15
+ expect(seqCoordToRowSpecificGlobalCoord({ row, position: 0 })).toBe(0);
16
+ // Position 1 (T after first gap) -> Global index 2
17
+ expect(seqCoordToRowSpecificGlobalCoord({ row, position: 1 })).toBe(1);
18
+ // Position 3 (C after second gap) -> Global index 5
19
+ expect(seqCoordToRowSpecificGlobalCoord({ row, position: 3 })).toBe(4);
20
+ // Position 5 (T after third gap) -> Global index 8
21
+ expect(seqCoordToRowSpecificGlobalCoord({ row, position: 5 })).toBe(7);
22
+ // Position 8 (end of sequence) -> Global index 11
23
+ expect(seqCoordToRowSpecificGlobalCoord({ row, position: 8 })).toBe(11);
24
+ });
25
+ test('handles empty row', () => {
26
+ expect(seqCoordToRowSpecificGlobalCoord({ row: '', position: 0 })).toBe(0);
27
+ });
28
+ test('handles row with only gaps', () => {
29
+ const row = '---..--';
30
+ expect(seqCoordToRowSpecificGlobalCoord({ row, position: 0 })).toBe(0);
31
+ });
32
+ test('handles mixed gap characters', () => {
33
+ const row = 'A-.G-C.';
34
+ // A(0) -(1) .(2) G(3) -(4) C(5) .(6)
35
+ // Sequence positions: A(0) G(1) C(2)
36
+ expect(seqCoordToRowSpecificGlobalCoord({ row, position: 0 })).toBe(0);
37
+ expect(seqCoordToRowSpecificGlobalCoord({ row, position: 1 })).toBe(1);
38
+ expect(seqCoordToRowSpecificGlobalCoord({ row, position: 2 })).toBe(4);
39
+ expect(seqCoordToRowSpecificGlobalCoord({ row, position: 3 })).toBe(6);
40
+ });
41
+ });
42
+ //# sourceMappingURL=seqCoordToRowSpecificGlobalCoord.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seqCoordToRowSpecificGlobalCoord.test.js","sourceRoot":"","sources":["../src/seqCoordToRowSpecificGlobalCoord.test.ts"],"names":[],"mappings":"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"}
package/dist/util.d.ts CHANGED
@@ -12,13 +12,8 @@ export declare function skipBlanks(blanks: number[], arg: string | string[]): st
12
12
  export declare function setBrLength(d: HierarchyNode<NodeWithIds>, y0: number, k: number): void;
13
13
  export declare function maxLength(d: HierarchyNode<NodeWithIds>): number;
14
14
  export declare function collapse(d: HierarchyNode<NodeWithIds>): void;
15
- export declare function clamp(min: number, num: number, max: number): number;
16
15
  export declare function len(a: {
17
16
  end: number;
18
17
  start: number;
19
18
  }): number;
20
- export declare function localStorageGetItem(item: string): string | null | undefined;
21
- export declare function localStorageGetBoolean(key: string, defaultVal: boolean): boolean;
22
- export declare function localStorageSetItem(str: string, item: string): void;
23
- export declare function localStorageSetBoolean(key: string, value: boolean): void;
24
- export declare function isGzip(buf: Uint8Array): boolean;
19
+ export declare function isBlank(s?: string): s is "-" | ".";
package/dist/util.js CHANGED
@@ -23,7 +23,7 @@ export function colorContrast(colorScheme, theme) {
23
23
  export function skipBlanks(blanks, arg) {
24
24
  let s = '';
25
25
  let b = 0;
26
- for (let j = 0; j < arg.length; j++) {
26
+ for (let j = 0, l = arg.length; j < l; j++) {
27
27
  if (j === blanks[b]) {
28
28
  b++;
29
29
  }
@@ -57,29 +57,12 @@ export function collapse(d) {
57
57
  d.children = null;
58
58
  }
59
59
  }
60
- export function clamp(min, num, max) {
61
- return Math.min(Math.max(num, min), max);
62
- }
63
60
  export function len(a) {
64
61
  return a.end - a.start;
65
62
  }
66
- export function localStorageGetItem(item) {
67
- return typeof localStorage !== 'undefined'
68
- ? localStorage.getItem(item)
69
- : undefined;
70
- }
71
- export function localStorageGetBoolean(key, defaultVal) {
72
- return Boolean(JSON.parse(localStorageGetItem(key) || JSON.stringify(defaultVal)));
73
- }
74
- export function localStorageSetItem(str, item) {
75
- if (typeof localStorage !== 'undefined') {
76
- localStorage.setItem(str, item);
77
- }
78
- }
79
- export function localStorageSetBoolean(key, value) {
80
- localStorageSetItem(key, JSON.stringify(value));
81
- }
82
- export function isGzip(buf) {
83
- return buf[0] === 31 && buf[1] === 139 && buf[2] === 8;
63
+ // https://sonnhammer.sbc.su.se/Stockholm.html
64
+ // gaps can be a . or - in stockholm
65
+ export function isBlank(s) {
66
+ return s === '-' || s === '.';
84
67
  }
85
68
  //# sourceMappingURL=util.js.map
package/dist/util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const version = "4.4.0";
1
+ export declare const version = "4.4.2";
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const version = '4.4.0';
1
+ export const version = '4.4.2';
2
2
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "react-msaview",
3
3
  "author": "Colin",
4
- "version": "4.4.0",
4
+ "version": "4.4.2",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",
@@ -2,7 +2,7 @@ import { blue, green, orange, red } from '@mui/material/colors'
2
2
  import { colord, extend } from 'colord'
3
3
  import namesPlugin from 'colord/plugins/names'
4
4
 
5
- import { transform } from './util'
5
+ import { isBlank, transform } from './util'
6
6
 
7
7
  extend([namesPlugin])
8
8
 
@@ -518,7 +518,7 @@ export function getPercentIdentityColor(
518
518
  let ent = 0
519
519
  let letter = ''
520
520
  for (const entry of entries) {
521
- if (entry[1] > ent && entry[0] !== '-') {
521
+ if (entry[1] > ent && !isBlank(entry[0])) {
522
522
  letter = entry[0]
523
523
  ent = entry[1]
524
524
  }
@@ -1,9 +1,8 @@
1
1
  import React, { useEffect, useRef, useState } from 'react'
2
2
 
3
+ import { clamp } from '@jbrowse/core/util'
3
4
  import { observer } from 'mobx-react'
4
5
 
5
- import { clamp } from '../util'
6
-
7
6
  import type { MsaViewModel } from '../model'
8
7
 
9
8
  const VerticalScrollbar = observer(({ model }: { model: MsaViewModel }) => {
@@ -28,8 +27,8 @@ const VerticalScrollbar = observer(({ model }: { model: MsaViewModel }) => {
28
27
  window.requestAnimationFrame(() => {
29
28
  model.setScrollY(
30
29
  clamp(
31
- -totalHeight,
32
30
  mouseDown.scrollY - (event.clientY - mouseDown.clientY) / unit,
31
+ -totalHeight,
33
32
  0,
34
33
  ),
35
34
  )
@@ -30,6 +30,8 @@ const useStyles = makeStyles()(theme => ({
30
30
  },
31
31
  }))
32
32
 
33
+ const toP = (s = 0) => +(+s).toFixed(1)
34
+
33
35
  const SettingsContent = observer(function ({ model }: { model: MsaViewModel }) {
34
36
  return (
35
37
  <>
@@ -189,7 +191,7 @@ const MSASettings = observer(function MSASettings({
189
191
  </div>
190
192
  ) : null}
191
193
  <div className={classes.flex}>
192
- <Typography>Column width ({colWidth}px)</Typography>
194
+ <Typography>Column width ({toP(colWidth)}px)</Typography>
193
195
  <Slider
194
196
  className={classes.field}
195
197
  min={1}
@@ -201,7 +203,7 @@ const MSASettings = observer(function MSASettings({
201
203
  />
202
204
  </div>
203
205
  <div className={classes.flex}>
204
- <Typography>Row height ({rowHeight}px)</Typography>
206
+ <Typography>Row height ({toP(rowHeight)}px)</Typography>
205
207
  <Slider
206
208
  className={classes.field}
207
209
  min={1}
@@ -5,11 +5,11 @@ import Help from '@mui/icons-material/Help'
5
5
  import { IconButton } from '@mui/material'
6
6
  import { observer } from 'mobx-react'
7
7
 
8
+ import SettingsMenu from './SettingsMenu'
8
9
  import HeaderInfoArea from './HeaderInfoArea'
9
10
  import HeaderMenu from './HeaderMenu'
10
11
  import HeaderStatusArea from './HeaderStatusArea'
11
12
  import MultiAlignmentSelector from './MultiAlignmentSelector'
12
- import SettingsMenu from './SettingsMenu'
13
13
  import ZoomControls from './ZoomControls'
14
14
  import ZoomMenu from './ZoomMenu'
15
15
  import ZoomStar from './ZoomStar'
@@ -19,8 +19,11 @@ const HeaderInfoArea = observer(function ({ model }: { model: MsaViewModel }) {
19
19
  return mouseOverRowName && mouseCol !== undefined ? (
20
20
  <Typography className={classes.margin}>
21
21
  {mouseOverRowName}:
22
- {model.mouseOverCoordToGapRemovedRowCoord(mouseOverRowName, mouseCol)} (
23
- {model.mouseOverCoordToRowLetter(mouseOverRowName, mouseCol)})
22
+ {model.mouseOverCoordToGapRemovedRowCoordOneBased(
23
+ mouseOverRowName,
24
+ mouseCol,
25
+ )}{' '}
26
+ ({model.mouseOverCoordToRowLetter(mouseOverRowName, mouseCol)})
24
27
  </Typography>
25
28
  ) : null
26
29
  })