react-msaview 3.1.2 → 3.1.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.
Files changed (77) hide show
  1. package/bundle/index.js +31 -31
  2. package/dist/DialogQueue.js +2 -4
  3. package/dist/DialogQueue.js.map +1 -1
  4. package/dist/UniprotTrack.js +1 -1
  5. package/dist/UniprotTrack.js.map +1 -1
  6. package/dist/components/BoxTrackBlock.js +3 -4
  7. package/dist/components/BoxTrackBlock.js.map +1 -1
  8. package/dist/components/ExportSVGDialog.js +17 -4
  9. package/dist/components/ExportSVGDialog.js.map +1 -1
  10. package/dist/components/ImportForm/util.js +1 -0
  11. package/dist/components/ImportForm/util.js.map +1 -1
  12. package/dist/components/Loading.d.ts +6 -0
  13. package/dist/components/Loading.js +12 -0
  14. package/dist/components/Loading.js.map +1 -0
  15. package/dist/components/MSAPanel/MSABlock.js +3 -3
  16. package/dist/components/MSAPanel/MSABlock.js.map +1 -1
  17. package/dist/components/MSAPanel/MSAMouseoverCanvas.js +7 -9
  18. package/dist/components/MSAPanel/MSAMouseoverCanvas.js.map +1 -1
  19. package/dist/components/MSAPanel/index.js +1 -1
  20. package/dist/components/MSAPanel/index.js.map +1 -1
  21. package/dist/components/MSAPanel/renderMSABlock.d.ts +3 -1
  22. package/dist/components/MSAPanel/renderMSABlock.js +10 -10
  23. package/dist/components/MSAPanel/renderMSABlock.js.map +1 -1
  24. package/dist/components/MSAPanel/renderMSAMouseover.js +5 -8
  25. package/dist/components/MSAPanel/renderMSAMouseover.js.map +1 -1
  26. package/dist/components/MSAView.js +20 -16
  27. package/dist/components/MSAView.js.map +1 -1
  28. package/dist/components/TextTrack.js +1 -1
  29. package/dist/components/TextTrack.js.map +1 -1
  30. package/dist/components/TreePanel/TreeCanvasBlock.js +11 -13
  31. package/dist/components/TreePanel/TreeCanvasBlock.js.map +1 -1
  32. package/dist/components/TreePanel/TreeNodeMenu.js +4 -6
  33. package/dist/components/TreePanel/TreeNodeMenu.js.map +1 -1
  34. package/dist/components/TreePanel/renderTreeCanvas.js +12 -13
  35. package/dist/components/TreePanel/renderTreeCanvas.js.map +1 -1
  36. package/dist/index.d.ts +1 -1
  37. package/dist/index.js +1 -1
  38. package/dist/layout.js +5 -0
  39. package/dist/layout.js.map +1 -1
  40. package/dist/measureTextCanvas.d.ts +1 -0
  41. package/dist/measureTextCanvas.js +13 -0
  42. package/dist/measureTextCanvas.js.map +1 -0
  43. package/dist/model.d.ts +53 -47
  44. package/dist/model.js +20 -40
  45. package/dist/model.js.map +1 -1
  46. package/dist/parseNewick.js +1 -2
  47. package/dist/parseNewick.js.map +1 -1
  48. package/dist/parsers/ClustalMSA.js +3 -4
  49. package/dist/parsers/ClustalMSA.js.map +1 -1
  50. package/dist/parsers/FastaMSA.js +3 -4
  51. package/dist/parsers/FastaMSA.js.map +1 -1
  52. package/dist/parsers/StockholmMSA.js +13 -19
  53. package/dist/parsers/StockholmMSA.js.map +1 -1
  54. package/dist/renderToSvg.d.ts +1 -0
  55. package/dist/renderToSvg.js +78 -22
  56. package/dist/renderToSvg.js.map +1 -1
  57. package/dist/util.js +7 -4
  58. package/dist/util.js.map +1 -1
  59. package/dist/version.d.ts +1 -1
  60. package/dist/version.js +1 -1
  61. package/package.json +1 -23
  62. package/src/components/ExportSVGDialog.tsx +48 -13
  63. package/src/components/ImportForm/util.ts +1 -0
  64. package/src/components/Loading.tsx +27 -0
  65. package/src/components/MSAPanel/MSABlock.tsx +2 -1
  66. package/src/components/MSAPanel/MSAMouseoverCanvas.tsx +6 -6
  67. package/src/components/MSAPanel/index.tsx +2 -2
  68. package/src/components/MSAPanel/renderMSABlock.ts +10 -1
  69. package/src/components/MSAPanel/renderMSAMouseover.ts +3 -17
  70. package/src/components/MSAView.tsx +28 -30
  71. package/src/components/TreePanel/TreeCanvasBlock.tsx +5 -6
  72. package/src/components/TreePanel/renderTreeCanvas.ts +4 -6
  73. package/src/index.ts +1 -1
  74. package/src/measureTextCanvas.ts +14 -0
  75. package/src/model.ts +14 -16
  76. package/src/renderToSvg.tsx +156 -40
  77. package/src/version.ts +1 -1
@@ -6,19 +6,75 @@ import { renderTreeCanvas } from './components/TreePanel/renderTreeCanvas';
6
6
  import { renderMSABlock } from './components/MSAPanel/renderMSABlock';
7
7
  import { colorContrast } from './util';
8
8
  import MinimapSVG from './components/MinimapSVG';
9
- // render LGV to SVG
10
9
  export async function renderToSvg(model, opts) {
11
10
  await when(() => !!model.initialized);
12
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
- const { width, height, scrollX, scrollY, colorScheme, treeAreaWidth } = model;
14
- const { theme, includeMinimap } = opts;
11
+ const { width, height, scrollX, scrollY } = model;
12
+ const { exportType, theme, includeMinimap } = opts;
13
+ if (exportType === 'entire') {
14
+ return render({
15
+ width: model.totalWidth + model.treeAreaWidth,
16
+ height: model.totalHeight,
17
+ theme,
18
+ model,
19
+ offsetY: 0,
20
+ offsetX: 0,
21
+ includeMinimap,
22
+ });
23
+ }
24
+ else if (exportType === 'viewport') {
25
+ return render({
26
+ width,
27
+ height,
28
+ theme,
29
+ model,
30
+ offsetY: scrollY,
31
+ offsetX: -scrollX,
32
+ includeMinimap,
33
+ });
34
+ }
35
+ else {
36
+ throw new Error('unknown export type');
37
+ }
38
+ }
39
+ async function render({ width, height, offsetX, offsetY, theme, model, includeMinimap, }) {
15
40
  const { Context } = await import('svgcanvas');
41
+ const Wrapper = includeMinimap ? MinimapWrapper : NullWrapper;
42
+ return renderToStaticMarkup(React.createElement(SvgWrapper, { width: width, height: height },
43
+ React.createElement(Wrapper, { model: model },
44
+ React.createElement(CoreRendering, { Context: Context, model: model, theme: theme, offsetX: offsetX, offsetY: offsetY, width: width, height: height }))), createRoot);
45
+ }
46
+ // function renderMultiline({ model }: { model: MsaViewModel }) {
47
+ // const { treeAreaWidth, height } = model
48
+ // const clipId = 'tree'
49
+ // return (
50
+ // <Wrapper model={model}>
51
+ // <defs>
52
+ // <clipPath id={clipId}>
53
+ // <rect x={0} y={0} width={treeAreaWidth} height={height} />
54
+ // </clipPath>
55
+ // </defs>
56
+ // <g
57
+ // clipPath={`url(#${clipId})`}
58
+ // /* eslint-disable-next-line react/no-danger */
59
+ // dangerouslySetInnerHTML={{ __html: ctx1.getSvg().innerHTML }}
60
+ // />
61
+ // <g
62
+ // transform={`translate(${treeAreaWidth} 0)`}
63
+ // /* eslint-disable-next-line react/no-danger */
64
+ // dangerouslySetInnerHTML={{ __html: ctx2.getSvg().innerHTML }}
65
+ // />
66
+ // </Wrapper>
67
+ // )
68
+ // }
69
+ function CoreRendering({ model, theme, width, height, offsetX, offsetY, Context, }) {
70
+ const clipId = 'tree';
71
+ const { treeAreaWidth, colorScheme } = model;
72
+ const contrastScheme = colorContrast(colorScheme, theme);
16
73
  const ctx1 = Context(width, height);
17
74
  const ctx2 = Context(width, height);
18
- const contrastScheme = colorContrast(colorScheme, theme);
19
75
  renderTreeCanvas({
20
76
  model,
21
- offsetY: scrollY,
77
+ offsetY,
22
78
  ctx: ctx1,
23
79
  theme,
24
80
  blockSizeYOverride: height,
@@ -26,28 +82,25 @@ export async function renderToSvg(model, opts) {
26
82
  });
27
83
  renderMSABlock({
28
84
  model,
29
- offsetY: scrollY,
30
- offsetX: -scrollX,
85
+ theme,
86
+ offsetY,
87
+ offsetX,
31
88
  contrastScheme,
32
89
  ctx: ctx2,
33
90
  blockSizeXOverride: width - treeAreaWidth,
34
91
  blockSizeYOverride: height,
35
92
  highResScaleFactorOverride: 1,
36
93
  });
37
- const Wrapper = includeMinimap ? MinimapWrapper : NullWrapper;
38
- const clipId = 'tree';
39
- // the xlink namespace is used for rendering <image> tag
40
- return renderToStaticMarkup(React.createElement("svg", { width: width, height: height, xmlns: "http://www.w3.org/2000/svg", xmlnsXlink: "http://www.w3.org/1999/xlink", viewBox: [0, 0, width, height].toString() },
41
- React.createElement(Wrapper, { model: model },
42
- React.createElement("defs", null,
43
- React.createElement("clipPath", { id: clipId },
44
- React.createElement("rect", { x: 0, y: 0, width: treeAreaWidth, height: height }))),
45
- React.createElement("g", { clipPath: `url(#${clipId})`,
46
- /* eslint-disable-next-line react/no-danger */
47
- dangerouslySetInnerHTML: { __html: ctx1.getSvg().innerHTML } }),
48
- React.createElement("g", { transform: `translate(${treeAreaWidth} 0)`,
49
- /* eslint-disable-next-line react/no-danger */
50
- dangerouslySetInnerHTML: { __html: ctx2.getSvg().innerHTML } }))), createRoot);
94
+ return (React.createElement(React.Fragment, null,
95
+ React.createElement("defs", null,
96
+ React.createElement("clipPath", { id: clipId },
97
+ React.createElement("rect", { x: 0, y: 0, width: treeAreaWidth, height: height }))),
98
+ React.createElement("g", { clipPath: `url(#${clipId})`,
99
+ /* eslint-disable-next-line react/no-danger */
100
+ dangerouslySetInnerHTML: { __html: ctx1.getSvg().innerHTML } }),
101
+ React.createElement("g", { transform: `translate(${treeAreaWidth} 0)`,
102
+ /* eslint-disable-next-line react/no-danger */
103
+ dangerouslySetInnerHTML: { __html: ctx2.getSvg().innerHTML } })));
51
104
  }
52
105
  function MinimapWrapper({ model, children, }) {
53
106
  const { minimapHeight, treeAreaWidth } = model;
@@ -56,6 +109,9 @@ function MinimapWrapper({ model, children, }) {
56
109
  React.createElement(MinimapSVG, { model: model })),
57
110
  React.createElement("g", { transform: `translate(0 ${minimapHeight})` }, children)));
58
111
  }
112
+ function SvgWrapper({ width, height, children, }) {
113
+ return (React.createElement("svg", { width: width, height: height, xmlns: "http://www.w3.org/2000/svg", xmlnsXlink: "http://www.w3.org/1999/xlink", viewBox: [0, 0, width, height].toString() }, children));
114
+ }
59
115
  function NullWrapper({ children }) {
60
116
  return React.createElement(React.Fragment, null, children);
61
117
  }
@@ -1 +1 @@
1
- {"version":3,"file":"renderToSvg.js","sourceRoot":"","sources":["../src/renderToSvg.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renderToSvg.js","sourceRoot":"","sources":["../src/renderToSvg.tsx"],"names":[],"mappings":"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"}
package/dist/util.js CHANGED
@@ -6,13 +6,12 @@ export function transform(obj, cb) {
6
6
  return Object.fromEntries(Object.entries(obj).map(cb));
7
7
  }
8
8
  export function generateNodeIds(tree, parent = 'node', depth = 0) {
9
- var _a;
10
9
  const id = `${parent}-${depth}`;
11
10
  return {
12
11
  ...tree,
13
12
  id,
14
13
  name: tree.name || id,
15
- branchset: ((_a = tree.branchset) === null || _a === void 0 ? void 0 : _a.map((b, i) => generateNodeIds(b, `${id}-${i}`, depth + 1))) || [],
14
+ branchset: tree.branchset?.map((b, i) => generateNodeIds(b, `${id}-${i}`, depth + 1)) || [],
16
15
  };
17
16
  }
18
17
  export function colorContrast(colorScheme, theme) {
@@ -22,7 +21,11 @@ export function colorContrast(colorScheme, theme) {
22
21
  ]);
23
22
  }
24
23
  export function parseGFF(str) {
25
- return str === null || str === void 0 ? void 0 : str.split('\n').map(f => f.trim()).filter(f => !!f && !f.startsWith('#')).map(f => {
24
+ return str
25
+ ?.split('\n')
26
+ .map(f => f.trim())
27
+ .filter(f => !!f && !f.startsWith('#'))
28
+ .map(f => {
26
29
  const [seq_id, source, type, start, end, score, strand, phase, col9] = f.split('\t');
27
30
  return {
28
31
  seq_id,
@@ -87,7 +90,7 @@ export function collapse(d) {
87
90
  // Collapse the node and all it's children, from
88
91
  // https://bl.ocks.org/d3noob/43a860bc0024792f8803bba8ca0d5ecd
89
92
  export function filterHiddenLeafNodes(d, hiddenId) {
90
- if (d === null || d === void 0 ? void 0 : d.children) {
93
+ if (d?.children) {
91
94
  d.children = d.children.filter(f => f.id !== hiddenId);
92
95
  }
93
96
  }
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 = "3.1.2";
1
+ export declare const version = "3.1.4";
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const version = '3.1.2';
1
+ export const version = '3.1.4';
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": "3.1.2",
4
+ "version": "3.1.4",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
7
7
  "files": [
@@ -34,29 +34,7 @@
34
34
  "react": ">=16.8.0",
35
35
  "react-dom": ">=16.8.0"
36
36
  },
37
- "devDependencies": {
38
- "@rollup/plugin-commonjs": "^25.0.4",
39
- "@rollup/plugin-json": "^6.0.0",
40
- "@rollup/plugin-node-resolve": "^15.0.2",
41
- "@rollup/plugin-replace": "^5.0.5",
42
- "@rollup/plugin-terser": "^0.4.1",
43
- "@rollup/plugin-typescript": "^11.1.0",
44
- "@types/color": "^3.0.1",
45
- "@types/d3": "^7.4.0",
46
- "@types/react": "^18.2.55",
47
- "@types/react-dom": "^18.2.19",
48
- "@typescript-eslint/eslint-plugin": "^6.21.0",
49
- "@typescript-eslint/parser": "^6.21.0",
50
- "eslint-plugin-unicorn": "^51.0.1",
51
- "rollup": "^4.9.1",
52
- "rollup-plugin-polyfill-node": "^0.13.0",
53
- "slugify": "^1.6.6",
54
- "tslib": "^2.1.0",
55
- "typescript": "^5.0.4"
56
- },
57
37
  "dependencies": {
58
- "@typescript-eslint/eslint-plugin": "^6.21.0",
59
- "@typescript-eslint/parser": "^6.21.0",
60
38
  "canvas2svg": "^1.0.16",
61
39
  "clustal-js": "^2.0.0",
62
40
  "colord": "^2.9.3",
@@ -1,13 +1,17 @@
1
1
  import React, { useState } from 'react'
2
2
  import { Dialog, ErrorMessage } from '@jbrowse/core/ui'
3
3
  import {
4
- DialogContent,
5
- DialogActions,
6
4
  Button,
7
5
  Checkbox,
6
+ DialogContent,
7
+ DialogActions,
8
8
  FormControlLabel,
9
- useTheme,
9
+ FormControl,
10
+ FormLabel,
11
+ RadioGroup,
12
+ Radio,
10
13
  Typography,
14
+ useTheme,
11
15
  } from '@mui/material'
12
16
  import { MsaViewModel } from '../model'
13
17
 
@@ -19,22 +23,48 @@ export default function ExportSVGDialog({
19
23
  onClose: () => void
20
24
  }) {
21
25
  const [includeMinimap, setIncludeMinimap] = useState(true)
26
+ const [exportType, setExportType] = useState('viewport')
22
27
  const [error, setError] = useState<unknown>()
23
28
  const theme = useTheme()
24
29
  return (
25
30
  <Dialog onClose={() => onClose()} open title="Export SVG">
26
31
  <DialogContent>
27
- <Typography>Export SVG of current view</Typography>
28
32
  {error ? <ErrorMessage error={error} /> : null}
29
- <FormControlLabel
30
- control={
31
- <Checkbox
32
- checked={includeMinimap}
33
- onChange={event => setIncludeMinimap(event.target.checked)}
33
+ <Typography>Settings:</Typography>
34
+ <div>
35
+ <FormControl>
36
+ <FormControlLabel
37
+ control={
38
+ <Checkbox
39
+ checked={includeMinimap}
40
+ onChange={event => setIncludeMinimap(event.target.checked)}
41
+ />
42
+ }
43
+ disabled={exportType === 'entire'}
44
+ label="Include minimap?"
34
45
  />
35
- }
36
- label="Include minimap?"
37
- />
46
+ </FormControl>
47
+ </div>
48
+ <div>
49
+ <FormControl>
50
+ <FormLabel>Export type</FormLabel>
51
+ <RadioGroup
52
+ value={exportType}
53
+ onChange={event => setExportType(event.target.value)}
54
+ >
55
+ <FormControlLabel
56
+ value="entire"
57
+ control={<Radio />}
58
+ label="Entire MSA"
59
+ />
60
+ <FormControlLabel
61
+ value="viewport"
62
+ control={<Radio />}
63
+ label="Current viewport only"
64
+ />
65
+ </RadioGroup>
66
+ </FormControl>
67
+ </div>
38
68
  </DialogContent>
39
69
  <DialogActions>
40
70
  <Button
@@ -42,7 +72,12 @@ export default function ExportSVGDialog({
42
72
  color="primary"
43
73
  onClick={async () => {
44
74
  try {
45
- await model.exportSVG({ theme, includeMinimap })
75
+ await model.exportSVG({
76
+ theme,
77
+ includeMinimap:
78
+ exportType === 'entire' ? false : includeMinimap,
79
+ exportType,
80
+ })
46
81
  } catch (e) {
47
82
  console.error(e)
48
83
  setError(e)
@@ -15,6 +15,7 @@ export async function load(
15
15
  await model.setTreeFilehandle(treeFile)
16
16
  }
17
17
  } catch (e) {
18
+ console.error(e)
18
19
  model.setError(e)
19
20
  }
20
21
  }
@@ -0,0 +1,27 @@
1
+ import React from 'react'
2
+
3
+ import { observer } from 'mobx-react'
4
+ import { Typography } from '@mui/material'
5
+
6
+ // locals
7
+ import ImportForm from './ImportForm'
8
+ import MSAView from './MSAView'
9
+ import { MsaViewModel } from '../model'
10
+
11
+ const Loading = observer(function ({ model }: { model: MsaViewModel }) {
12
+ const { done, initialized } = model
13
+
14
+ return (
15
+ <div>
16
+ {!initialized ? (
17
+ <ImportForm model={model} />
18
+ ) : !done ? (
19
+ <Typography variant="h4">Loading...</Typography>
20
+ ) : (
21
+ <MSAView model={model} />
22
+ )}
23
+ </div>
24
+ )
25
+ })
26
+
27
+ export default Loading
@@ -42,13 +42,14 @@ const MSABlock = observer(function ({
42
42
  return autorun(() => {
43
43
  renderMSABlock({
44
44
  ctx,
45
+ theme,
45
46
  offsetX,
46
47
  offsetY,
47
48
  contrastScheme,
48
49
  model,
49
50
  })
50
51
  })
51
- }, [model, offsetX, offsetY, contrastScheme])
52
+ }, [model, offsetX, offsetY, theme, contrastScheme])
52
53
  return (
53
54
  <canvas
54
55
  ref={ref}
@@ -15,17 +15,17 @@ const MSAMouseoverCanvas = observer(function ({
15
15
  const { height, width } = model
16
16
  useEffect(() => {
17
17
  const ctx = ref.current?.getContext('2d')
18
- if (!ctx) {
19
- return
20
- }
21
- return autorun(() => {
22
- renderMouseover({ ctx, model })
23
- })
18
+ return ctx
19
+ ? autorun(() => {
20
+ renderMouseover({ ctx, model })
21
+ })
22
+ : undefined
24
23
  }, [model])
25
24
 
26
25
  return (
27
26
  <canvas
28
27
  ref={ref}
28
+ id="mouseover"
29
29
  width={width}
30
30
  height={height}
31
31
  style={{
@@ -5,9 +5,9 @@ import { MsaViewModel } from '../../model'
5
5
 
6
6
  export default function MSAPanel({ model }: { model: MsaViewModel }) {
7
7
  return (
8
- <>
8
+ <div style={{ position: 'relative' }}>
9
9
  <MSACanvas model={model} />
10
10
  <MSAMouseoverCanvas model={model} />
11
- </>
11
+ </div>
12
12
  )
13
13
  }
@@ -3,6 +3,7 @@ import { MsaViewModel } from '../../model'
3
3
  import { getClustalXColor, getPercentIdentityColor } from '../../colorSchemes'
4
4
  import { NodeWithIdsAndLength } from '../../util'
5
5
  import { HierarchyNode } from 'd3-hierarchy'
6
+ import { Theme } from '@mui/material'
6
7
 
7
8
  export function renderMSABlock({
8
9
  model,
@@ -10,12 +11,14 @@ export function renderMSABlock({
10
11
  offsetY,
11
12
  contrastScheme,
12
13
  ctx,
14
+ theme,
13
15
  highResScaleFactorOverride,
14
16
  blockSizeXOverride,
15
17
  blockSizeYOverride,
16
18
  }: {
17
19
  offsetX: number
18
20
  offsetY: number
21
+ theme: Theme
19
22
  model: MsaViewModel
20
23
  contrastScheme: Record<string, string>
21
24
  ctx: CanvasRenderingContext2D
@@ -52,6 +55,7 @@ export function renderMSABlock({
52
55
  drawTiles({
53
56
  model,
54
57
  ctx,
58
+ theme,
55
59
  offsetX,
56
60
  offsetY,
57
61
  xStart,
@@ -63,6 +67,7 @@ export function renderMSABlock({
63
67
  ctx,
64
68
  offsetX,
65
69
  contrastScheme,
70
+ theme,
66
71
  xStart,
67
72
  xEnd,
68
73
  visibleLeaves,
@@ -74,11 +79,13 @@ function drawTiles({
74
79
  offsetX,
75
80
  ctx,
76
81
  visibleLeaves,
82
+ theme,
77
83
  xStart,
78
84
  xEnd,
79
85
  }: {
80
86
  model: MsaViewModel
81
87
  offsetX: number
88
+ theme: Theme
82
89
  offsetY: number
83
90
  ctx: CanvasRenderingContext2D
84
91
  visibleLeaves: HierarchyNode<NodeWithIdsAndLength>[]
@@ -118,7 +125,7 @@ function drawTiles({
118
125
  : colorScheme[letter.toUpperCase()]
119
126
  if (bgColor) {
120
127
  const x = i * colWidth + offsetX - (offsetX % colWidth)
121
- ctx.fillStyle = color || 'white'
128
+ ctx.fillStyle = color || theme.palette.background.default
122
129
  ctx.fillRect(x, y - rowHeight, colWidth, rowHeight)
123
130
  }
124
131
  }
@@ -129,6 +136,7 @@ function drawText({
129
136
  model,
130
137
  offsetX,
131
138
  contrastScheme,
139
+ theme,
132
140
  ctx,
133
141
  visibleLeaves,
134
142
  xStart,
@@ -137,6 +145,7 @@ function drawText({
137
145
  offsetX: number
138
146
  model: MsaViewModel
139
147
  contrastScheme: Record<string, string>
148
+ theme: Theme
140
149
  ctx: CanvasRenderingContext2D
141
150
  visibleLeaves: HierarchyNode<NodeWithIdsAndLength>[]
142
151
  xStart: number
@@ -10,8 +10,6 @@ export function renderMouseover({
10
10
  const {
11
11
  mouseCol,
12
12
  colWidth,
13
- treeAreaWidth,
14
- resizeHandleWidth,
15
13
  width,
16
14
  height,
17
15
  rowHeight,
@@ -20,31 +18,19 @@ export function renderMouseover({
20
18
  mouseRow,
21
19
  // @ts-expect-error
22
20
  mouseCol2,
23
- minimapHeight,
24
- totalTrackAreaHeight,
25
21
  } = model
26
22
  ctx.resetTransform()
27
23
  ctx.clearRect(0, 0, width, height)
28
-
29
24
  if (mouseCol !== undefined) {
30
25
  ctx.fillStyle = 'rgba(0,0,0,0.15)'
31
- const x =
32
- (mouseCol - 1) * colWidth + scrollX + treeAreaWidth + resizeHandleWidth
33
-
34
- ctx.fillRect(x, minimapHeight, colWidth, height)
26
+ ctx.fillRect((mouseCol - 1) * colWidth + scrollX, 0, colWidth, height)
35
27
  }
36
-
37
28
  if (mouseRow !== undefined) {
38
29
  ctx.fillStyle = 'rgba(0,0,0,0.15)'
39
- const y =
40
- mouseRow * rowHeight + scrollY + minimapHeight + totalTrackAreaHeight
41
- ctx.fillRect(treeAreaWidth + resizeHandleWidth, y, width, rowHeight)
30
+ ctx.fillRect(0, mouseRow * rowHeight + scrollY, width, rowHeight)
42
31
  }
43
32
  if (mouseCol2 !== undefined) {
44
33
  ctx.fillStyle = 'rgba(255,255,0,0.2)'
45
- const x =
46
- (mouseCol2 - 1) * colWidth + scrollX + treeAreaWidth + resizeHandleWidth
47
-
48
- ctx.fillRect(x, 0, colWidth, height)
34
+ ctx.fillRect((mouseCol2 - 1) * colWidth + scrollX, 0, colWidth, height)
49
35
  }
50
36
  }
@@ -1,10 +1,7 @@
1
1
  import React, { Suspense } from 'react'
2
-
3
2
  import { observer } from 'mobx-react'
4
- import { Typography } from '@mui/material'
5
3
 
6
4
  // locals
7
- import ImportForm from './ImportForm'
8
5
  import TreeRuler from './TreePanel/TreeRuler'
9
6
  import Header from './Header'
10
7
  import Track from './Track'
@@ -14,43 +11,44 @@ import MSAPanel from './MSAPanel'
14
11
  import TreePanel from './TreePanel'
15
12
  import Minimap from './Minimap'
16
13
 
17
- const MSAView = observer(function ({ model }: { model: MsaViewModel }) {
18
- const { done, initialized } = model
14
+ function TopArea({ model }: { model: MsaViewModel }) {
15
+ return (
16
+ <div style={{ display: 'flex' }}>
17
+ <TreeRuler model={model} />
18
+ <Minimap model={model} />
19
+ </div>
20
+ )
21
+ }
22
+ function MainArea({ model }: { model: MsaViewModel }) {
23
+ return (
24
+ <div style={{ display: 'flex' }}>
25
+ <TreePanel model={model} />
26
+ <VerticalResizeHandle model={model} />
27
+ <MSAPanel model={model} />
28
+ </div>
29
+ )
30
+ }
19
31
 
32
+ const View = observer(function ({ model }: { model: MsaViewModel }) {
33
+ const { turnedOnTracks } = model
20
34
  return (
21
- <div>
22
- {!initialized ? (
23
- <ImportForm model={model} />
24
- ) : !done ? (
25
- <Typography variant="h4">Loading...</Typography>
26
- ) : (
27
- <MSAView2 model={model} />
28
- )}
35
+ <div style={{ paddingLeft: 20, position: 'relative' }}>
36
+ <TopArea model={model} />
37
+ {turnedOnTracks?.map(track => (
38
+ <Track key={track.model.id} model={model} track={track} />
39
+ ))}
40
+ <MainArea model={model} />
29
41
  </div>
30
42
  )
31
43
  })
32
44
 
33
- const MSAView2 = observer(function ({ model }: { model: MsaViewModel }) {
34
- const { height, turnedOnTracks, DialogComponent, DialogProps } = model
45
+ const MSAView = observer(function ({ model }: { model: MsaViewModel }) {
46
+ const { height, DialogComponent, DialogProps } = model
35
47
  return (
36
48
  <div>
37
49
  <div style={{ height, overflow: 'hidden' }}>
38
50
  <Header model={model} />
39
- <div style={{ position: 'relative' }}>
40
- <div style={{ display: 'flex' }}>
41
- <TreeRuler model={model} />
42
- <Minimap model={model} />
43
- </div>
44
- {turnedOnTracks?.map(track => (
45
- <Track key={track.model.id} model={model} track={track} />
46
- ))}
47
-
48
- <div style={{ display: 'flex' }}>
49
- <TreePanel model={model} />
50
- <VerticalResizeHandle model={model} />
51
- <MSAPanel model={model} />
52
- </div>
53
- </div>
51
+ <View model={model} />
54
52
  </div>
55
53
  <HorizontalResizeHandle model={model} />
56
54