react-msaview 6.0.0 → 6.1.1

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 (122) hide show
  1. package/bundle/index.js +98 -98
  2. package/bundle/index.js.map +4 -4
  3. package/dist/columnCounts.d.ts +7 -0
  4. package/dist/columnCounts.js +18 -0
  5. package/dist/columnCounts.js.map +1 -1
  6. package/dist/components/DragHandle.d.ts +25 -0
  7. package/dist/components/DragHandle.js +49 -0
  8. package/dist/components/DragHandle.js.map +1 -0
  9. package/dist/components/ResizeHandles.d.ts +4 -2
  10. package/dist/components/ResizeHandles.js +29 -32
  11. package/dist/components/ResizeHandles.js.map +1 -1
  12. package/dist/components/VerticalScrollbar.js +2 -2
  13. package/dist/components/VerticalScrollbar.js.map +1 -1
  14. package/dist/components/dialogs/InterProScanDialog.js +52 -129
  15. package/dist/components/dialogs/InterProScanDialog.js.map +1 -1
  16. package/dist/components/header/settingsMenuItems.js +16 -1
  17. package/dist/components/header/settingsMenuItems.js.map +1 -1
  18. package/dist/components/minimap/Minimap.js +32 -4
  19. package/dist/components/minimap/Minimap.js.map +1 -1
  20. package/dist/components/msa/MSACanvas.js +8 -2
  21. package/dist/components/msa/MSACanvas.js.map +1 -1
  22. package/dist/components/msa/MSACanvasBlock.js +12 -3
  23. package/dist/components/msa/MSACanvasBlock.js.map +1 -1
  24. package/dist/components/msa/msaRaster.d.ts +63 -0
  25. package/dist/components/msa/msaRaster.js +252 -0
  26. package/dist/components/msa/msaRaster.js.map +1 -0
  27. package/dist/components/msa/renderMSABlock.d.ts +2 -1
  28. package/dist/components/msa/renderMSABlock.js +13 -21
  29. package/dist/components/msa/renderMSABlock.js.map +1 -1
  30. package/dist/components/msa/tileColor.d.ts +6 -0
  31. package/dist/components/msa/tileColor.js +35 -0
  32. package/dist/components/msa/tileColor.js.map +1 -0
  33. package/dist/components/renderCtx.d.ts +1 -1
  34. package/dist/components/tracks/TrackBlocks.d.ts +14 -0
  35. package/dist/components/tracks/TrackBlocks.js +65 -0
  36. package/dist/components/tracks/TrackBlocks.js.map +1 -0
  37. package/dist/components/tracks/{renderTracksSvg.d.ts → drawTracks.d.ts} +22 -10
  38. package/dist/components/tracks/drawTracks.js +193 -0
  39. package/dist/components/tracks/drawTracks.js.map +1 -0
  40. package/dist/components/tree/TreeCanvas.js +8 -2
  41. package/dist/components/tree/TreeCanvas.js.map +1 -1
  42. package/dist/components/tree/TreeCanvasBlock.js +7 -4
  43. package/dist/components/tree/TreeCanvasBlock.js.map +1 -1
  44. package/dist/components/tree/renderTreeCanvas.js +27 -21
  45. package/dist/components/tree/renderTreeCanvas.js.map +1 -1
  46. package/dist/constants.d.ts +3 -0
  47. package/dist/constants.js +8 -0
  48. package/dist/constants.js.map +1 -1
  49. package/dist/model/DataModel.d.ts +1 -4
  50. package/dist/model/DataModel.js +8 -10
  51. package/dist/model/DataModel.js.map +1 -1
  52. package/dist/model/treeModel.d.ts +1 -1
  53. package/dist/model/treeModel.js +1 -1
  54. package/dist/model.d.ts +36 -7
  55. package/dist/model.js +113 -58
  56. package/dist/model.js.map +1 -1
  57. package/dist/neighborJoining.js +34 -18
  58. package/dist/neighborJoining.js.map +1 -1
  59. package/dist/renderTestEnv.d.ts +43 -0
  60. package/dist/renderTestEnv.js +88 -0
  61. package/dist/renderTestEnv.js.map +1 -0
  62. package/dist/renderToSvg.js +1 -1
  63. package/dist/renderToSvg.js.map +1 -1
  64. package/dist/sequenceLogo.d.ts +28 -0
  65. package/dist/sequenceLogo.js +47 -0
  66. package/dist/sequenceLogo.js.map +1 -0
  67. package/dist/types.d.ts +2 -0
  68. package/dist/version.d.ts +1 -1
  69. package/dist/version.js +1 -1
  70. package/package.json +3 -3
  71. package/src/columnCounts.test.ts +15 -0
  72. package/src/columnCounts.ts +19 -0
  73. package/src/components/DragHandle.tsx +81 -0
  74. package/src/components/ResizeHandles.tsx +46 -54
  75. package/src/components/VerticalScrollbar.tsx +3 -2
  76. package/src/components/dialogs/InterProScanDialog.tsx +54 -131
  77. package/src/components/header/settingsMenuItems.ts +19 -1
  78. package/src/components/minimap/Minimap.tsx +47 -4
  79. package/src/components/msa/MSACanvas.tsx +30 -10
  80. package/src/components/msa/MSACanvasBlock.tsx +13 -3
  81. package/src/components/msa/msaRaster.test.ts +145 -0
  82. package/src/components/msa/msaRaster.ts +350 -0
  83. package/src/components/msa/renderMSABlock.ts +15 -20
  84. package/src/components/msa/tileColor.ts +37 -0
  85. package/src/components/renderCtx.ts +2 -0
  86. package/src/components/tracks/TrackBlocks.tsx +111 -0
  87. package/src/components/tracks/drawTracks.ts +323 -0
  88. package/src/components/tree/TreeCanvas.tsx +16 -4
  89. package/src/components/tree/TreeCanvasBlock.tsx +18 -11
  90. package/src/components/tree/renderTreeCanvas.test.ts +55 -0
  91. package/src/components/tree/renderTreeCanvas.ts +28 -19
  92. package/src/constants.ts +10 -0
  93. package/src/impgRender.test.tsx +2 -57
  94. package/src/largeTree.test.ts +16 -2
  95. package/src/model/DataModel.ts +11 -11
  96. package/src/model/treeModel.ts +1 -1
  97. package/src/model.ts +128 -60
  98. package/src/neighborJoining.ts +36 -18
  99. package/src/renderDomainsSvg.test.tsx +2 -57
  100. package/src/renderMinimapSvg.test.tsx +2 -56
  101. package/src/renderSequenceLogoSvg.test.tsx +176 -0
  102. package/src/renderTestEnv.ts +96 -0
  103. package/src/renderToSvg.tsx +1 -1
  104. package/src/sequenceLogo.test.ts +88 -0
  105. package/src/sequenceLogo.ts +63 -0
  106. package/src/types.ts +7 -1
  107. package/src/version.ts +1 -1
  108. package/dist/components/ConservationTrack.d.ts +0 -8
  109. package/dist/components/ConservationTrack.js +0 -49
  110. package/dist/components/ConservationTrack.js.map +0 -1
  111. package/dist/components/ScrollbarThumb.d.ts +0 -14
  112. package/dist/components/ScrollbarThumb.js +0 -28
  113. package/dist/components/ScrollbarThumb.js.map +0 -1
  114. package/dist/components/TextTrack.d.ts +0 -8
  115. package/dist/components/TextTrack.js +0 -58
  116. package/dist/components/TextTrack.js.map +0 -1
  117. package/dist/components/tracks/renderTracksSvg.js +0 -126
  118. package/dist/components/tracks/renderTracksSvg.js.map +0 -1
  119. package/src/components/ConservationTrack.tsx +0 -99
  120. package/src/components/ScrollbarThumb.tsx +0 -48
  121. package/src/components/TextTrack.tsx +0 -103
  122. package/src/components/tracks/renderTracksSvg.ts +0 -247
@@ -1,8 +0,0 @@
1
- import React from 'react';
2
- import type { MsaViewModel } from '../model.ts';
3
- import type { BasicTrack } from '../types.ts';
4
- declare const ConservationTrack: ({ model, track, }: {
5
- model: MsaViewModel;
6
- track: BasicTrack;
7
- }) => React.JSX.Element;
8
- export default ConservationTrack;
@@ -1,49 +0,0 @@
1
- import React from 'react';
2
- import { observer } from 'mobx-react';
3
- import { useCanvasAutorun } from '../useCanvasAutorun.js';
4
- import { ConservationTrackResizeHandle } from './ResizeHandles.js';
5
- import { barTrackValues, drawConservationBars, } from './tracks/renderTracksSvg.js';
6
- const ConservationBlock = observer(function ({ model, track, offsetX, trackHeight, }) {
7
- const { blockSize, scrollX, highResScaleFactor } = model;
8
- const ref = useCanvasAutorun({
9
- draw: ctx => {
10
- const { colWidth } = model;
11
- ctx.resetTransform();
12
- ctx.scale(highResScaleFactor, highResScaleFactor);
13
- ctx.clearRect(0, 0, blockSize, trackHeight);
14
- ctx.translate(-offsetX, 0);
15
- drawConservationBars({
16
- ctx,
17
- values: barTrackValues(model, track.model.id),
18
- color: track.model.barColor ?? 'gray',
19
- colWidth,
20
- trackHeight,
21
- offsetX,
22
- blockSize,
23
- });
24
- },
25
- width: blockSize * highResScaleFactor,
26
- height: trackHeight * highResScaleFactor,
27
- deps: [model, track, offsetX, trackHeight],
28
- });
29
- return (React.createElement("canvas", { ref: ref, height: trackHeight * highResScaleFactor, width: blockSize * highResScaleFactor, style: {
30
- position: 'absolute',
31
- left: scrollX + offsetX,
32
- width: blockSize,
33
- height: trackHeight,
34
- } }));
35
- });
36
- const ConservationTrack = observer(function ({ model, track, }) {
37
- const { blocksX, msaAreaWidth } = model;
38
- const trackHeight = track.model.height;
39
- return (React.createElement("div", { style: {
40
- position: 'relative',
41
- height: trackHeight,
42
- width: msaAreaWidth,
43
- overflow: 'hidden',
44
- } },
45
- blocksX.map(bx => (React.createElement(ConservationBlock, { key: bx, model: model, track: track, offsetX: bx, trackHeight: trackHeight }))),
46
- React.createElement(ConservationTrackResizeHandle, { model: model })));
47
- });
48
- export default ConservationTrack;
49
- //# sourceMappingURL=ConservationTrack.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ConservationTrack.js","sourceRoot":"","sources":["../../src/components/ConservationTrack.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,6BAA6B,EAAE,MAAM,oBAAqB,CAAA;AACnE,OAAO,EACL,cAAc,EACd,oBAAoB,GACrB,MAAM,6BAA6B,CAAA;AAKpC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,UAAU,EAC3C,KAAK,EACL,KAAK,EACL,OAAO,EACP,WAAW,GAMZ;IACC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,KAAK,CAAA;IAExD,MAAM,GAAG,GAAG,gBAAgB,CAAC;QAC3B,IAAI,EAAE,GAAG,CAAC,EAAE;YACV,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAA;YAC1B,GAAG,CAAC,cAAc,EAAE,CAAA;YACpB,GAAG,CAAC,KAAK,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAA;YACjD,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;YAC3C,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;YAE1B,oBAAoB,CAAC;gBACnB,GAAG;gBACH,MAAM,EAAE,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7C,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM;gBACrC,QAAQ;gBACR,WAAW;gBACX,OAAO;gBACP,SAAS;aACV,CAAC,CAAA;QACJ,CAAC;QACD,KAAK,EAAE,SAAS,GAAG,kBAAkB;QACrC,MAAM,EAAE,WAAW,GAAG,kBAAkB;QACxC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC;KAC3C,CAAC,CAAA;IAEF,OAAO,CACL,gCACE,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,WAAW,GAAG,kBAAkB,EACxC,KAAK,EAAE,SAAS,GAAG,kBAAkB,EACrC,KAAK,EAAE;YACL,QAAQ,EAAE,UAAU;YACpB,IAAI,EAAE,OAAO,GAAG,OAAO;YACvB,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,WAAW;SACpB,GACD,CACH,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,iBAAiB,GAAG,QAAQ,CAAC,UAAU,EAC3C,KAAK,EACL,KAAK,GAIN;IACC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,KAAK,CAAA;IACvC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAA;IAEtC,OAAO,CACL,6BACE,KAAK,EAAE;YACL,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,YAAY;YACnB,QAAQ,EAAE,QAAQ;SACnB;QAEA,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CACjB,oBAAC,iBAAiB,IAChB,GAAG,EAAE,EAAE,EACP,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,EAAE,EACX,WAAW,EAAE,WAAW,GACxB,CACH,CAAC;QACF,oBAAC,6BAA6B,IAAC,KAAK,EAAE,KAAK,GAAI,CAC3C,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,iBAAiB,CAAA"}
@@ -1,14 +0,0 @@
1
- import React from 'react';
2
- export declare const scrollbarThumbFill = "rgba(66,119,127,0.3)";
3
- /**
4
- * The draggable thumb shared by the horizontal Minimap and the
5
- * VerticalScrollbar. `getStart` is read at mousedown and handed back to
6
- * `onDrag` alongside the pixel delta since, so a caller only supplies the
7
- * scroll offset it drives and where the thumb sits.
8
- */
9
- export default function ScrollbarThumb({ axis, getStart, onDrag, style, }: {
10
- axis: 'x' | 'y';
11
- getStart: () => number;
12
- onDrag: (delta: number, startValue: number) => void;
13
- style: React.CSSProperties;
14
- }): React.JSX.Element;
@@ -1,28 +0,0 @@
1
- import React, { useState } from 'react';
2
- import { useDragScroll } from '../useDragScroll.js';
3
- export const scrollbarThumbFill = 'rgba(66,119,127,0.3)';
4
- const scrollbarThumbFillHovered = 'rgba(66,119,127,0.6)';
5
- /**
6
- * The draggable thumb shared by the horizontal Minimap and the
7
- * VerticalScrollbar. `getStart` is read at mousedown and handed back to
8
- * `onDrag` alongside the pixel delta since, so a caller only supplies the
9
- * scroll offset it drives and where the thumb sits.
10
- */
11
- export default function ScrollbarThumb({ axis, getStart, onDrag, style, }) {
12
- const [hovered, setHovered] = useState(false);
13
- const { startDrag } = useDragScroll(axis, onDrag);
14
- return (React.createElement("div", { onMouseOver: () => {
15
- setHovered(true);
16
- }, onMouseOut: () => {
17
- setHovered(false);
18
- }, onMouseDown: event => {
19
- startDrag(event, getStart());
20
- }, style: {
21
- position: 'absolute',
22
- zIndex: 100,
23
- cursor: 'pointer',
24
- background: hovered ? scrollbarThumbFillHovered : scrollbarThumbFill,
25
- ...style,
26
- } }));
27
- }
28
- //# sourceMappingURL=ScrollbarThumb.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ScrollbarThumb.js","sourceRoot":"","sources":["../../src/components/ScrollbarThumb.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD,MAAM,CAAC,MAAM,kBAAkB,GAAG,sBAAsB,CAAA;AACxD,MAAM,yBAAyB,GAAG,sBAAsB,CAAA;AAExD;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACrC,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,KAAK,GAMN;IACC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7C,MAAM,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAEjD,OAAO,CACL,6BACE,WAAW,EAAE,GAAG,EAAE;YAChB,UAAU,CAAC,IAAI,CAAC,CAAA;QAClB,CAAC,EACD,UAAU,EAAE,GAAG,EAAE;YACf,UAAU,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC,EACD,WAAW,EAAE,KAAK,CAAC,EAAE;YACnB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC9B,CAAC,EACD,KAAK,EAAE;YACL,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,GAAG;YACX,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,kBAAkB;YACpE,GAAG,KAAK;SACT,GACD,CACH,CAAA;AACH,CAAC"}
@@ -1,8 +0,0 @@
1
- import React from 'react';
2
- import type { MsaViewModel } from '../model.ts';
3
- import type { BasicTrack } from '../types.ts';
4
- declare const AnnotationTrack: ({ track, model, }: {
5
- track: BasicTrack;
6
- model: MsaViewModel;
7
- }) => React.JSX.Element | null;
8
- export default AnnotationTrack;
@@ -1,58 +0,0 @@
1
- import React from 'react';
2
- import { observer } from 'mobx-react';
3
- import { setFontSize } from '../setFontSize.js';
4
- import { useCanvasAutorun } from '../useCanvasAutorun.js';
5
- import { useColorContrast } from '../useColorContrast.js';
6
- import { drawTextTrackContent } from './tracks/renderTracksSvg.js';
7
- const AnnotationBlock = observer(function ({ track, model, offsetX, }) {
8
- const { blockSize, scrollX, colorScheme: modelColorScheme, rowHeight, highResScaleFactor, } = model;
9
- const { model: { customColorScheme, data }, } = track;
10
- const colorScheme = customColorScheme ?? modelColorScheme;
11
- const { theme, contrastScheme } = useColorContrast(colorScheme);
12
- const ref = useCanvasAutorun({
13
- draw: ctx => {
14
- const { bgColor, colWidth, fontSize } = model;
15
- ctx.resetTransform();
16
- ctx.scale(highResScaleFactor, highResScaleFactor);
17
- ctx.clearRect(0, 0, blockSize, rowHeight);
18
- ctx.translate(-offsetX, 0);
19
- ctx.textAlign = 'center';
20
- setFontSize(ctx, fontSize);
21
- drawTextTrackContent({
22
- ctx,
23
- data,
24
- colorScheme,
25
- contrastScheme,
26
- bgColor,
27
- textColor: theme.palette.text.primary,
28
- colWidth,
29
- rowHeight,
30
- offsetX,
31
- blockSize,
32
- });
33
- },
34
- width: blockSize * highResScaleFactor,
35
- height: rowHeight * highResScaleFactor,
36
- deps: [model, offsetX, theme, contrastScheme, colorScheme, data],
37
- });
38
- return (React.createElement("canvas", { ref: ref, height: rowHeight * highResScaleFactor, width: blockSize * highResScaleFactor, style: {
39
- position: 'absolute',
40
- left: scrollX + offsetX,
41
- width: blockSize,
42
- height: rowHeight,
43
- } }));
44
- });
45
- const AnnotationTrack = observer(function ({ track, model, }) {
46
- const { blocksX, msaAreaWidth, rowHeight } = model;
47
- if (!track.model.data) {
48
- return null;
49
- }
50
- return (React.createElement("div", { style: {
51
- position: 'relative',
52
- height: rowHeight,
53
- width: msaAreaWidth,
54
- overflow: 'hidden',
55
- } }, blocksX.map(bx => (React.createElement(AnnotationBlock, { key: bx, track: track, model: model, offsetX: bx })))));
56
- });
57
- export default AnnotationTrack;
58
- //# sourceMappingURL=TextTrack.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TextTrack.js","sourceRoot":"","sources":["../../src/components/TextTrack.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAKlE,MAAM,eAAe,GAAG,QAAQ,CAAC,UAAU,EACzC,KAAK,EACL,KAAK,EACL,OAAO,GAKR;IACC,MAAM,EACJ,SAAS,EACT,OAAO,EACP,WAAW,EAAE,gBAAgB,EAC7B,SAAS,EACT,kBAAkB,GACnB,GAAG,KAAK,CAAA;IACT,MAAM,EACJ,KAAK,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,GACnC,GAAG,KAAK,CAAA;IAET,MAAM,WAAW,GAAG,iBAAiB,IAAI,gBAAgB,CAAA;IACzD,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAA;IAC/D,MAAM,GAAG,GAAG,gBAAgB,CAAC;QAC3B,IAAI,EAAE,GAAG,CAAC,EAAE;YACV,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAA;YAC7C,GAAG,CAAC,cAAc,EAAE,CAAA;YACpB,GAAG,CAAC,KAAK,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAA;YACjD,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;YACzC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;YAC1B,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAA;YACxB,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;YAE1B,oBAAoB,CAAC;gBACnB,GAAG;gBACH,IAAI;gBACJ,WAAW;gBACX,cAAc;gBACd,OAAO;gBACP,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO;gBACrC,QAAQ;gBACR,SAAS;gBACT,OAAO;gBACP,SAAS;aACV,CAAC,CAAA;QACJ,CAAC;QACD,KAAK,EAAE,SAAS,GAAG,kBAAkB;QACrC,MAAM,EAAE,SAAS,GAAG,kBAAkB;QACtC,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,CAAC;KACjE,CAAC,CAAA;IACF,OAAO,CACL,gCACE,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,SAAS,GAAG,kBAAkB,EACtC,KAAK,EAAE,SAAS,GAAG,kBAAkB,EACrC,KAAK,EAAE;YACL,QAAQ,EAAE,UAAU;YACpB,IAAI,EAAE,OAAO,GAAG,OAAO;YACvB,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,SAAS;SAClB,GACD,CACH,CAAA;AACH,CAAC,CAAC,CAAA;AACF,MAAM,eAAe,GAAG,QAAQ,CAAC,UAAU,EACzC,KAAK,EACL,KAAK,GAIN;IACC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,KAAK,CAAA;IAClD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACtB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,CACL,6BACE,KAAK,EAAE;YACL,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,SAAS;YACjB,KAAK,EAAE,YAAY;YACnB,QAAQ,EAAE,QAAQ;SACnB,IAEA,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CACjB,oBAAC,eAAe,IAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAI,CACtE,CAAC,CACE,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,eAAe,CAAA"}
@@ -1,126 +0,0 @@
1
- import { setFontSize } from '../../setFontSize.js';
2
- import { visibleColRange } from '../msa/visibleColRange.js';
3
- export function drawConservationBars({ ctx, values, color, colWidth, trackHeight, offsetX, blockSize, }) {
4
- const { xStart, xEnd } = visibleColRange({
5
- offsetX,
6
- blockWidth: blockSize,
7
- colWidth,
8
- });
9
- ctx.fillStyle = color;
10
- for (let i = xStart; i < xEnd && i < values.length; i++) {
11
- const value = values[i];
12
- const barHeight = value * trackHeight;
13
- const x = i * colWidth;
14
- ctx.fillRect(x, trackHeight - barHeight, colWidth, barHeight);
15
- }
16
- }
17
- // the bar-track values live on model getters (kept off the plain track object so
18
- // the live canvas autorun stays reactive); select the right one by track id
19
- export function barTrackValues(model, trackId) {
20
- return trackId === 'property-conservation'
21
- ? model.propertyConservation
22
- : model.conservation;
23
- }
24
- export function drawTextTrackContent({ ctx, data, colorScheme, contrastScheme, bgColor, textColor, colWidth, rowHeight, offsetX, blockSize, }) {
25
- const { xStart, xEnd } = visibleColRange({
26
- offsetX,
27
- blockWidth: blockSize,
28
- colWidth,
29
- });
30
- const str = data?.slice(xStart, xEnd);
31
- const drawLetters = rowHeight >= 10 && colWidth >= rowHeight / 2;
32
- for (let i = 0; str && i < str.length; i++) {
33
- const letter = str[i];
34
- const upper = letter.toUpperCase();
35
- const color = colorScheme[upper];
36
- const x = (xStart + i) * colWidth;
37
- const filled = bgColor && !!color;
38
- if (filled) {
39
- ctx.fillStyle = color;
40
- ctx.fillRect(x, 0, colWidth, rowHeight);
41
- }
42
- if (drawLetters) {
43
- // a letter on a colored tile needs the tile's contrast color; otherwise it
44
- // sits on the plain background and takes the theme's text color
45
- ctx.fillStyle = filled ? (contrastScheme[upper] ?? 'black') : textColor;
46
- ctx.fillText(letter, x + colWidth / 2, rowHeight / 2 + 1);
47
- }
48
- }
49
- }
50
- export function renderConservationTrack({ model, ctx, track, offsetX, offsetY, trackHeight, blockSizeXOverride, highResScaleFactorOverride, }) {
51
- const { blockSize, colWidth, highResScaleFactor } = model;
52
- const bx = blockSizeXOverride ?? blockSize;
53
- const k = highResScaleFactorOverride ?? highResScaleFactor;
54
- ctx.resetTransform();
55
- ctx.scale(k, k);
56
- ctx.translate(-offsetX, offsetY);
57
- drawConservationBars({
58
- ctx,
59
- values: barTrackValues(model, track.model.id),
60
- color: track.model.barColor ?? 'gray',
61
- colWidth,
62
- trackHeight,
63
- offsetX,
64
- blockSize: bx,
65
- });
66
- ctx.resetTransform();
67
- }
68
- export function renderTextTrack({ model, ctx, track, offsetX, offsetY, contrastScheme, theme, blockSizeXOverride, highResScaleFactorOverride, }) {
69
- const { blockSize, bgColor, colorScheme: modelColorScheme, colWidth, fontSize, rowHeight, highResScaleFactor, } = model;
70
- const { customColorScheme, data } = track.model;
71
- const colorScheme = customColorScheme ?? modelColorScheme;
72
- const bx = blockSizeXOverride ?? blockSize;
73
- const k = highResScaleFactorOverride ?? highResScaleFactor;
74
- ctx.resetTransform();
75
- ctx.scale(k, k);
76
- ctx.translate(-offsetX, offsetY);
77
- ctx.textAlign = 'center';
78
- setFontSize(ctx, fontSize);
79
- drawTextTrackContent({
80
- ctx,
81
- data,
82
- colorScheme,
83
- contrastScheme,
84
- bgColor,
85
- textColor: theme.palette.text.primary,
86
- colWidth,
87
- rowHeight,
88
- offsetX,
89
- blockSize: bx,
90
- });
91
- ctx.resetTransform();
92
- }
93
- export function renderAllTracks({ model, ctx, offsetX, contrastScheme, theme, blockSizeXOverride, highResScaleFactorOverride, }) {
94
- const { turnedOnTracks } = model;
95
- let currentY = 0;
96
- for (const track of turnedOnTracks) {
97
- const trackHeight = track.model.height;
98
- if (track.model.barColor !== undefined) {
99
- renderConservationTrack({
100
- model,
101
- ctx,
102
- track,
103
- offsetX,
104
- offsetY: currentY,
105
- trackHeight,
106
- blockSizeXOverride,
107
- highResScaleFactorOverride,
108
- });
109
- }
110
- else {
111
- renderTextTrack({
112
- model,
113
- ctx,
114
- track,
115
- offsetX,
116
- offsetY: currentY,
117
- contrastScheme,
118
- theme,
119
- blockSizeXOverride,
120
- highResScaleFactorOverride,
121
- });
122
- }
123
- currentY += trackHeight;
124
- }
125
- }
126
- //# sourceMappingURL=renderTracksSvg.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"renderTracksSvg.js","sourceRoot":"","sources":["../../../src/components/tracks/renderTracksSvg.ts"],"names":[],"mappings":"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"}
@@ -1,99 +0,0 @@
1
- import React from 'react'
2
-
3
- import { observer } from 'mobx-react'
4
-
5
- import { useCanvasAutorun } from '../useCanvasAutorun.ts'
6
- import { ConservationTrackResizeHandle } from './ResizeHandles.tsx'
7
- import {
8
- barTrackValues,
9
- drawConservationBars,
10
- } from './tracks/renderTracksSvg.ts'
11
-
12
- import type { MsaViewModel } from '../model.ts'
13
- import type { BasicTrack } from '../types.ts'
14
-
15
- const ConservationBlock = observer(function ({
16
- model,
17
- track,
18
- offsetX,
19
- trackHeight,
20
- }: {
21
- model: MsaViewModel
22
- track: BasicTrack
23
- offsetX: number
24
- trackHeight: number
25
- }) {
26
- const { blockSize, scrollX, highResScaleFactor } = model
27
-
28
- const ref = useCanvasAutorun({
29
- draw: ctx => {
30
- const { colWidth } = model
31
- ctx.resetTransform()
32
- ctx.scale(highResScaleFactor, highResScaleFactor)
33
- ctx.clearRect(0, 0, blockSize, trackHeight)
34
- ctx.translate(-offsetX, 0)
35
-
36
- drawConservationBars({
37
- ctx,
38
- values: barTrackValues(model, track.model.id),
39
- color: track.model.barColor ?? 'gray',
40
- colWidth,
41
- trackHeight,
42
- offsetX,
43
- blockSize,
44
- })
45
- },
46
- width: blockSize * highResScaleFactor,
47
- height: trackHeight * highResScaleFactor,
48
- deps: [model, track, offsetX, trackHeight],
49
- })
50
-
51
- return (
52
- <canvas
53
- ref={ref}
54
- height={trackHeight * highResScaleFactor}
55
- width={blockSize * highResScaleFactor}
56
- style={{
57
- position: 'absolute',
58
- left: scrollX + offsetX,
59
- width: blockSize,
60
- height: trackHeight,
61
- }}
62
- />
63
- )
64
- })
65
-
66
- const ConservationTrack = observer(function ({
67
- model,
68
- track,
69
- }: {
70
- model: MsaViewModel
71
- track: BasicTrack
72
- }) {
73
- const { blocksX, msaAreaWidth } = model
74
- const trackHeight = track.model.height
75
-
76
- return (
77
- <div
78
- style={{
79
- position: 'relative',
80
- height: trackHeight,
81
- width: msaAreaWidth,
82
- overflow: 'hidden',
83
- }}
84
- >
85
- {blocksX.map(bx => (
86
- <ConservationBlock
87
- key={bx}
88
- model={model}
89
- track={track}
90
- offsetX={bx}
91
- trackHeight={trackHeight}
92
- />
93
- ))}
94
- <ConservationTrackResizeHandle model={model} />
95
- </div>
96
- )
97
- })
98
-
99
- export default ConservationTrack
@@ -1,48 +0,0 @@
1
- import React, { useState } from 'react'
2
-
3
- import { useDragScroll } from '../useDragScroll.ts'
4
-
5
- export const scrollbarThumbFill = 'rgba(66,119,127,0.3)'
6
- const scrollbarThumbFillHovered = 'rgba(66,119,127,0.6)'
7
-
8
- /**
9
- * The draggable thumb shared by the horizontal Minimap and the
10
- * VerticalScrollbar. `getStart` is read at mousedown and handed back to
11
- * `onDrag` alongside the pixel delta since, so a caller only supplies the
12
- * scroll offset it drives and where the thumb sits.
13
- */
14
- export default function ScrollbarThumb({
15
- axis,
16
- getStart,
17
- onDrag,
18
- style,
19
- }: {
20
- axis: 'x' | 'y'
21
- getStart: () => number
22
- onDrag: (delta: number, startValue: number) => void
23
- style: React.CSSProperties
24
- }) {
25
- const [hovered, setHovered] = useState(false)
26
- const { startDrag } = useDragScroll(axis, onDrag)
27
-
28
- return (
29
- <div
30
- onMouseOver={() => {
31
- setHovered(true)
32
- }}
33
- onMouseOut={() => {
34
- setHovered(false)
35
- }}
36
- onMouseDown={event => {
37
- startDrag(event, getStart())
38
- }}
39
- style={{
40
- position: 'absolute',
41
- zIndex: 100,
42
- cursor: 'pointer',
43
- background: hovered ? scrollbarThumbFillHovered : scrollbarThumbFill,
44
- ...style,
45
- }}
46
- />
47
- )
48
- }
@@ -1,103 +0,0 @@
1
- import React from 'react'
2
-
3
- import { observer } from 'mobx-react'
4
-
5
- import { setFontSize } from '../setFontSize.ts'
6
- import { useCanvasAutorun } from '../useCanvasAutorun.ts'
7
- import { useColorContrast } from '../useColorContrast.ts'
8
- import { drawTextTrackContent } from './tracks/renderTracksSvg.ts'
9
-
10
- import type { MsaViewModel } from '../model.ts'
11
- import type { BasicTrack } from '../types.ts'
12
-
13
- const AnnotationBlock = observer(function ({
14
- track,
15
- model,
16
- offsetX,
17
- }: {
18
- track: BasicTrack
19
- model: MsaViewModel
20
- offsetX: number
21
- }) {
22
- const {
23
- blockSize,
24
- scrollX,
25
- colorScheme: modelColorScheme,
26
- rowHeight,
27
- highResScaleFactor,
28
- } = model
29
- const {
30
- model: { customColorScheme, data },
31
- } = track
32
-
33
- const colorScheme = customColorScheme ?? modelColorScheme
34
- const { theme, contrastScheme } = useColorContrast(colorScheme)
35
- const ref = useCanvasAutorun({
36
- draw: ctx => {
37
- const { bgColor, colWidth, fontSize } = model
38
- ctx.resetTransform()
39
- ctx.scale(highResScaleFactor, highResScaleFactor)
40
- ctx.clearRect(0, 0, blockSize, rowHeight)
41
- ctx.translate(-offsetX, 0)
42
- ctx.textAlign = 'center'
43
- setFontSize(ctx, fontSize)
44
-
45
- drawTextTrackContent({
46
- ctx,
47
- data,
48
- colorScheme,
49
- contrastScheme,
50
- bgColor,
51
- textColor: theme.palette.text.primary,
52
- colWidth,
53
- rowHeight,
54
- offsetX,
55
- blockSize,
56
- })
57
- },
58
- width: blockSize * highResScaleFactor,
59
- height: rowHeight * highResScaleFactor,
60
- deps: [model, offsetX, theme, contrastScheme, colorScheme, data],
61
- })
62
- return (
63
- <canvas
64
- ref={ref}
65
- height={rowHeight * highResScaleFactor}
66
- width={blockSize * highResScaleFactor}
67
- style={{
68
- position: 'absolute',
69
- left: scrollX + offsetX,
70
- width: blockSize,
71
- height: rowHeight,
72
- }}
73
- />
74
- )
75
- })
76
- const AnnotationTrack = observer(function ({
77
- track,
78
- model,
79
- }: {
80
- track: BasicTrack
81
- model: MsaViewModel
82
- }) {
83
- const { blocksX, msaAreaWidth, rowHeight } = model
84
- if (!track.model.data) {
85
- return null
86
- }
87
- return (
88
- <div
89
- style={{
90
- position: 'relative',
91
- height: rowHeight,
92
- width: msaAreaWidth,
93
- overflow: 'hidden',
94
- }}
95
- >
96
- {blocksX.map(bx => (
97
- <AnnotationBlock key={bx} track={track} model={model} offsetX={bx} />
98
- ))}
99
- </div>
100
- )
101
- })
102
-
103
- export default AnnotationTrack