react-msaview 7.0.0 → 8.1.0
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/README.md +11 -10
- package/bundle/index.js +122 -111
- package/bundle/index.js.map +4 -4
- package/dist/calculateBlocks.js +5 -3
- package/dist/calculateBlocks.js.map +1 -1
- package/dist/colorSchemes.js +1 -2
- package/dist/colorSchemes.js.map +1 -1
- package/dist/columnStats.d.ts +28 -0
- package/dist/columnStats.js +34 -0
- package/dist/columnStats.js.map +1 -0
- package/dist/components/DragHandle.d.ts +3 -2
- package/dist/components/DragHandle.js +11 -5
- package/dist/components/DragHandle.js.map +1 -1
- package/dist/components/Loading.js +2 -8
- package/dist/components/Loading.js.map +1 -1
- package/dist/components/MSAView.js +17 -6
- package/dist/components/MSAView.js.map +1 -1
- package/dist/components/MSAViewer.d.ts +64 -7
- package/dist/components/MSAViewer.js +128 -23
- package/dist/components/MSAViewer.js.map +1 -1
- package/dist/components/PortalTooltip.d.ts +11 -0
- package/dist/components/PortalTooltip.js +29 -0
- package/dist/components/PortalTooltip.js.map +1 -0
- package/dist/components/ResizeHandles.js +11 -29
- package/dist/components/ResizeHandles.js.map +1 -1
- package/dist/components/SequenceTextArea.js +3 -4
- package/dist/components/SequenceTextArea.js.map +1 -1
- package/dist/components/Track.js +43 -24
- package/dist/components/Track.js.map +1 -1
- package/dist/components/dialogs/AboutDialog.js +6 -6
- package/dist/components/dialogs/AboutDialog.js.map +1 -1
- package/dist/components/dialogs/AnnotationFileDialog.js +5 -2
- package/dist/components/dialogs/AnnotationFileDialog.js.map +1 -1
- package/dist/components/dialogs/ExportSVGDialog.js +6 -4
- package/dist/components/dialogs/ExportSVGDialog.js.map +1 -1
- package/dist/components/dialogs/FeatureDialog.js +8 -3
- package/dist/components/dialogs/FeatureDialog.js.map +1 -1
- package/dist/components/dialogs/TrackInfoDialog.js +1 -1
- package/dist/components/dialogs/TrackInfoDialog.js.map +1 -1
- package/dist/components/header/GappynessSlider.js +6 -11
- package/dist/components/header/GappynessSlider.js.map +1 -1
- package/dist/components/header/Header.js +4 -1
- package/dist/components/header/Header.js.map +1 -1
- package/dist/components/header/LoadWarnings.js +6 -23
- package/dist/components/header/LoadWarnings.js.map +1 -1
- package/dist/components/header/ScrollZoomIcons.d.ts +6 -0
- package/dist/components/header/ScrollZoomIcons.js +35 -0
- package/dist/components/header/ScrollZoomIcons.js.map +1 -0
- package/dist/components/header/TreeSettingsMenu.js +1 -3
- package/dist/components/header/TreeSettingsMenu.js.map +1 -1
- package/dist/components/header/UnshareableDataWarning.js +2 -4
- package/dist/components/header/UnshareableDataWarning.js.map +1 -1
- package/dist/components/header/ZoomControls.js +49 -6
- package/dist/components/header/ZoomControls.js.map +1 -1
- package/dist/components/header/getAnnotationsMenu.js +3 -6
- package/dist/components/header/getAnnotationsMenu.js.map +1 -1
- package/dist/components/header/settingsMenuItems.js +12 -9
- package/dist/components/header/settingsMenuItems.js.map +1 -1
- package/dist/components/import/ImportForm.js +1 -1
- package/dist/components/import/ImportForm.js.map +1 -1
- package/dist/components/import/util.js +1 -2
- package/dist/components/import/util.js.map +1 -1
- package/dist/components/minimap/Minimap.js +1 -2
- package/dist/components/minimap/Minimap.js.map +1 -1
- package/dist/components/msa/AnnotationLegend.js +27 -19
- package/dist/components/msa/AnnotationLegend.js.map +1 -1
- package/dist/components/msa/MSACanvas.js +2 -4
- package/dist/components/msa/MSACanvas.js.map +1 -1
- package/dist/components/msa/MSACanvasBlock.js +13 -15
- package/dist/components/msa/MSACanvasBlock.js.map +1 -1
- package/dist/components/msa/MSAMouseoverCanvas.js +2 -1
- package/dist/components/msa/MSAMouseoverCanvas.js.map +1 -1
- package/dist/components/msa/domainBandCursor.d.ts +7 -11
- package/dist/components/msa/domainBandCursor.js +7 -11
- package/dist/components/msa/domainBandCursor.js.map +1 -1
- package/dist/components/msa/drawFeatureSpans.d.ts +59 -0
- package/dist/components/msa/drawFeatureSpans.js +113 -0
- package/dist/components/msa/drawFeatureSpans.js.map +1 -0
- package/dist/components/msa/legendRows.d.ts +8 -0
- package/dist/components/msa/legendRows.js +16 -0
- package/dist/components/msa/legendRows.js.map +1 -0
- package/dist/components/msa/msaRaster.d.ts +24 -31
- package/dist/components/msa/msaRaster.js +30 -39
- package/dist/components/msa/msaRaster.js.map +1 -1
- package/dist/components/msa/packDomainLanes.d.ts +20 -0
- package/dist/components/msa/packDomainLanes.js +33 -0
- package/dist/components/msa/packDomainLanes.js.map +1 -0
- package/dist/components/msa/renderBoxFeatureCanvasBlock.d.ts +3 -1
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js +50 -87
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -1
- package/dist/components/msa/renderHighlights.d.ts +15 -13
- package/dist/components/msa/renderHighlights.js +43 -20
- package/dist/components/msa/renderHighlights.js.map +1 -1
- package/dist/components/msa/renderMSABlock.js +12 -12
- package/dist/components/msa/renderMSABlock.js.map +1 -1
- package/dist/components/msa/tileColor.js +4 -7
- package/dist/components/msa/tileColor.js.map +1 -1
- package/dist/components/msa/useMsaBlockMouse.d.ts +5 -3
- package/dist/components/msa/useMsaBlockMouse.js +6 -6
- package/dist/components/msa/useMsaBlockMouse.js.map +1 -1
- package/dist/components/rowpanels/RowPanelBlock.d.ts +9 -0
- package/dist/components/rowpanels/RowPanelBlock.js +86 -0
- package/dist/components/rowpanels/RowPanelBlock.js.map +1 -0
- package/dist/components/rowpanels/RowPanelHeaders.d.ts +12 -0
- package/dist/components/rowpanels/RowPanelHeaders.js +38 -0
- package/dist/components/rowpanels/RowPanelHeaders.js.map +1 -0
- package/dist/components/{msa/ColumnStats.d.ts → rowpanels/RowPanels.d.ts} +2 -2
- package/dist/components/rowpanels/RowPanels.js +32 -0
- package/dist/components/rowpanels/RowPanels.js.map +1 -0
- package/dist/components/rowpanels/headerLayout.d.ts +1 -0
- package/dist/components/rowpanels/headerLayout.js +5 -0
- package/dist/components/rowpanels/headerLayout.js.map +1 -0
- package/dist/components/rowpanels/renderFeaturePanel.d.ts +21 -0
- package/dist/components/rowpanels/renderFeaturePanel.js +37 -0
- package/dist/components/rowpanels/renderFeaturePanel.js.map +1 -0
- package/dist/components/rowpanels/renderRowPanel.d.ts +23 -0
- package/dist/components/rowpanels/renderRowPanel.js +22 -0
- package/dist/components/rowpanels/renderRowPanel.js.map +1 -0
- package/dist/components/rowpanels/renderStrip.d.ts +20 -0
- package/dist/components/rowpanels/renderStrip.js +26 -0
- package/dist/components/rowpanels/renderStrip.js.map +1 -0
- package/dist/components/tracks/TrackBlocks.js +3 -5
- package/dist/components/tracks/TrackBlocks.js.map +1 -1
- package/dist/components/tracks/TrackTooltipContent.d.ts +15 -0
- package/dist/components/tracks/TrackTooltipContent.js +109 -0
- package/dist/components/tracks/TrackTooltipContent.js.map +1 -0
- package/dist/components/tracks/drawTracks.d.ts +4 -4
- package/dist/components/tracks/drawTracks.js +25 -39
- package/dist/components/tracks/drawTracks.js.map +1 -1
- package/dist/components/tracks/useTrackHover.d.ts +22 -0
- package/dist/components/tracks/useTrackHover.js +30 -0
- package/dist/components/tracks/useTrackHover.js.map +1 -0
- package/dist/components/tree/CladeLabels.d.ts +12 -0
- package/dist/components/tree/CladeLabels.js +48 -0
- package/dist/components/tree/CladeLabels.js.map +1 -0
- package/dist/components/tree/TreeBranchMenu.js +1 -1
- package/dist/components/tree/TreeBranchMenu.js.map +1 -1
- package/dist/components/tree/TreeCanvas.js +5 -4
- package/dist/components/tree/TreeCanvas.js.map +1 -1
- package/dist/components/tree/TreeCanvasBlock.js +4 -21
- package/dist/components/tree/TreeCanvasBlock.js.map +1 -1
- package/dist/components/tree/TreeNodeMenu.js +1 -1
- package/dist/components/tree/TreeNodeMenu.js.map +1 -1
- package/dist/components/tree/TreeOverview.d.ts +14 -0
- package/dist/components/tree/TreeOverview.js +75 -0
- package/dist/components/tree/TreeOverview.js.map +1 -0
- package/dist/components/tree/TreeRuler.js +9 -13
- package/dist/components/tree/TreeRuler.js.map +1 -1
- package/dist/components/tree/cladeBrackets.d.ts +25 -0
- package/dist/components/tree/cladeBrackets.js +51 -0
- package/dist/components/tree/cladeBrackets.js.map +1 -0
- package/dist/components/tree/dialogs/TreeNodeInfoDialog.js +2 -2
- package/dist/components/tree/dialogs/TreeNodeInfoDialog.js.map +1 -1
- package/dist/components/tree/renderTreeCanvas.js +160 -25
- package/dist/components/tree/renderTreeCanvas.js.map +1 -1
- package/dist/components/tree/renderTreeOverview.d.ts +52 -0
- package/dist/components/tree/renderTreeOverview.js +138 -0
- package/dist/components/tree/renderTreeOverview.js.map +1 -0
- package/dist/components/tree/useTreeHover.js +2 -4
- package/dist/components/tree/useTreeHover.js.map +1 -1
- package/dist/constants.d.ts +16 -0
- package/dist/constants.js +52 -22
- package/dist/constants.js.map +1 -1
- package/dist/createPaletteMap.d.ts +7 -6
- package/dist/createPaletteMap.js +10 -9
- package/dist/createPaletteMap.js.map +1 -1
- package/dist/element.d.ts +13 -0
- package/dist/element.js +269 -0
- package/dist/element.js.map +1 -0
- package/dist/featureFields.d.ts +11 -0
- package/dist/featureFields.js +17 -0
- package/dist/featureFields.js.map +1 -0
- package/dist/flatToTree.js +1 -2
- package/dist/flatToTree.js.map +1 -1
- package/dist/ggplotPalettes.d.ts +10 -0
- package/dist/ggplotPalettes.js +58 -0
- package/dist/ggplotPalettes.js.map +1 -1
- package/dist/hierarchy.d.ts +27 -0
- package/dist/hierarchy.js +66 -9
- package/dist/hierarchy.js.map +1 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/model/DataModel.js +2 -5
- package/dist/model/DataModel.js.map +1 -1
- package/dist/model/msaModel.d.ts +3 -2
- package/dist/model/msaModel.js +3 -2
- package/dist/model/msaModel.js.map +1 -1
- package/dist/model/treeModel.d.ts +30 -0
- package/dist/model/treeModel.js +37 -1
- package/dist/model/treeModel.js.map +1 -1
- package/dist/model.d.ts +549 -294
- package/dist/model.js +1412 -621
- package/dist/model.js.map +1 -1
- package/dist/mount.d.ts +11 -0
- package/dist/mount.js +22 -0
- package/dist/mount.js.map +1 -0
- package/dist/neighborJoining.js +8 -32
- package/dist/neighborJoining.js.map +1 -1
- package/dist/renderToStaticMarkup.d.ts +10 -19
- package/dist/renderToStaticMarkup.js +13 -24
- package/dist/renderToStaticMarkup.js.map +1 -1
- package/dist/renderToSvg.js +180 -56
- package/dist/renderToSvg.js.map +1 -1
- package/dist/rowCoordinateCalculations.d.ts +4 -6
- package/dist/rowCoordinateCalculations.js +4 -6
- package/dist/rowCoordinateCalculations.js.map +1 -1
- package/dist/scales.d.ts +22 -0
- package/dist/scales.js +30 -0
- package/dist/scales.js.map +1 -0
- package/dist/seqPosToGlobalCol.d.ts +2 -3
- package/dist/seqPosToGlobalCol.js +2 -3
- package/dist/seqPosToGlobalCol.js.map +1 -1
- package/dist/sequenceLogo.d.ts +6 -11
- package/dist/sequenceLogo.js +6 -11
- package/dist/sequenceLogo.js.map +1 -1
- package/dist/stripDefault.d.ts +7 -14
- package/dist/stripDefault.js +7 -14
- package/dist/stripDefault.js.map +1 -1
- package/dist/svgTestUtil.d.ts +186 -70
- package/dist/types.d.ts +221 -21
- package/dist/umd.d.ts +2 -0
- package/dist/umd.js +4 -2
- package/dist/umd.js.map +1 -1
- package/dist/useCanvasAutorun.d.ts +5 -10
- package/dist/useCanvasAutorun.js +5 -10
- package/dist/useCanvasAutorun.js.map +1 -1
- package/dist/useMsaSvgFigure.d.ts +20 -0
- package/dist/useMsaSvgFigure.js +46 -0
- package/dist/useMsaSvgFigure.js.map +1 -0
- package/dist/useWheelScroll.js +0 -4
- package/dist/useWheelScroll.js.map +1 -1
- package/dist/util.d.ts +5 -6
- package/dist/util.js +13 -6
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +19 -12
- package/src/calculateBlocks.ts +5 -3
- package/src/colorSchemes.ts +1 -2
- package/src/columnStats.ts +58 -0
- package/src/components/DragHandle.tsx +18 -7
- package/src/components/Loading.tsx +4 -36
- package/src/components/MSAView.tsx +19 -5
- package/src/components/MSAViewer.tsx +240 -28
- package/src/components/PortalTooltip.tsx +47 -0
- package/src/components/ResizeHandles.tsx +17 -32
- package/src/components/SequenceTextArea.tsx +3 -4
- package/src/components/Track.tsx +57 -19
- package/src/components/dialogs/AboutDialog.tsx +35 -6
- package/src/components/dialogs/AnnotationFileDialog.tsx +10 -1
- package/src/components/dialogs/ExportSVGDialog.tsx +8 -3
- package/src/components/dialogs/FeatureDialog.tsx +11 -3
- package/src/components/dialogs/TrackInfoDialog.tsx +1 -1
- package/src/components/header/GappynessSlider.tsx +6 -11
- package/src/components/header/Header.tsx +7 -1
- package/src/components/header/LoadWarnings.tsx +11 -25
- package/src/components/header/ScrollZoomIcons.tsx +52 -0
- package/src/components/header/TreeSettingsMenu.tsx +1 -3
- package/src/components/header/UnshareableDataWarning.tsx +2 -4
- package/src/components/header/ZoomControls.tsx +74 -14
- package/src/components/header/getAnnotationsMenu.ts +3 -6
- package/src/components/header/settingsMenuItems.ts +13 -8
- package/src/components/import/ImportForm.tsx +3 -5
- package/src/components/import/ImportFormExamples.tsx +2 -2
- package/src/components/import/util.ts +1 -2
- package/src/components/minimap/Minimap.tsx +1 -2
- package/src/components/msa/AnnotationLegend.tsx +48 -38
- package/src/components/msa/MSACanvas.tsx +3 -8
- package/src/components/msa/MSACanvasBlock.tsx +13 -16
- package/src/components/msa/MSAMouseoverCanvas.tsx +2 -1
- package/src/components/msa/domainBandCursor.ts +7 -11
- package/src/components/msa/drawFeatureSpans.ts +205 -0
- package/src/components/msa/legendRows.ts +24 -0
- package/src/components/msa/msaRaster.ts +30 -39
- package/src/components/msa/packDomainLanes.ts +36 -0
- package/src/components/msa/renderBoxFeatureCanvasBlock.ts +67 -123
- package/src/components/msa/renderHighlights.ts +53 -20
- package/src/components/msa/renderMSABlock.ts +14 -11
- package/src/components/msa/tileColor.ts +4 -7
- package/src/components/msa/useMsaBlockMouse.ts +6 -6
- package/src/components/rowpanels/RowPanelBlock.tsx +139 -0
- package/src/components/rowpanels/RowPanelHeaders.tsx +57 -0
- package/src/components/rowpanels/RowPanels.tsx +77 -0
- package/src/components/rowpanels/headerLayout.ts +5 -0
- package/src/components/rowpanels/renderFeaturePanel.ts +66 -0
- package/src/components/rowpanels/renderRowPanel.ts +41 -0
- package/src/components/rowpanels/renderStrip.ts +46 -0
- package/src/components/tracks/TrackBlocks.tsx +3 -5
- package/src/components/tracks/TrackTooltipContent.tsx +156 -0
- package/src/components/tracks/drawTracks.ts +25 -50
- package/src/components/tracks/useTrackHover.ts +42 -0
- package/src/components/tree/CladeLabels.tsx +77 -0
- package/src/components/tree/TreeBranchMenu.tsx +1 -2
- package/src/components/tree/TreeCanvas.tsx +2 -3
- package/src/components/tree/TreeCanvasBlock.tsx +8 -32
- package/src/components/tree/TreeNodeMenu.tsx +1 -2
- package/src/components/tree/TreeOverview.tsx +106 -0
- package/src/components/tree/TreeRuler.tsx +11 -22
- package/src/components/tree/cladeBrackets.ts +73 -0
- package/src/components/tree/dialogs/TreeNodeInfoDialog.tsx +2 -2
- package/src/components/tree/renderTreeCanvas.ts +242 -21
- package/src/components/tree/renderTreeOverview.ts +212 -0
- package/src/components/tree/useTreeHover.ts +2 -4
- package/src/constants.ts +61 -22
- package/src/createPaletteMap.ts +10 -9
- package/src/element.ts +321 -0
- package/src/featureFields.ts +19 -0
- package/src/flatToTree.ts +1 -2
- package/src/ggplotPalettes.ts +60 -0
- package/src/hierarchy.ts +77 -9
- package/src/index.ts +31 -7
- package/src/model/DataModel.ts +2 -5
- package/src/model/msaModel.ts +3 -2
- package/src/model/treeModel.ts +42 -0
- package/src/model.ts +1677 -643
- package/src/mount.tsx +32 -0
- package/src/neighborJoining.ts +8 -32
- package/src/renderToStaticMarkup.ts +13 -24
- package/src/renderToSvg.tsx +335 -68
- package/src/rowCoordinateCalculations.ts +4 -6
- package/src/scales.ts +47 -0
- package/src/seqPosToGlobalCol.ts +2 -3
- package/src/sequenceLogo.ts +6 -11
- package/src/stripDefault.ts +7 -14
- package/src/types.ts +260 -45
- package/src/umd.ts +4 -2
- package/src/useCanvasAutorun.ts +5 -10
- package/src/useMsaSvgFigure.ts +72 -0
- package/src/useWheelScroll.ts +0 -4
- package/src/util.ts +15 -6
- package/src/version.ts +1 -1
- package/dist/components/msa/ColumnStats.js +0 -42
- package/dist/components/msa/ColumnStats.js.map +0 -1
- package/src/components/msa/ColumnStats.tsx +0 -54
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-msaview",
|
|
3
3
|
"author": "Colin",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "8.1.0",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"repository": {
|
|
@@ -27,26 +27,33 @@
|
|
|
27
27
|
"node": ">=18"
|
|
28
28
|
},
|
|
29
29
|
"peerDependencies": {
|
|
30
|
-
"@jbrowse/core": ">=
|
|
31
|
-
"@jbrowse/mobx-state-tree": ">=
|
|
32
|
-
"@mui/icons-material": ">=
|
|
33
|
-
"@mui/material": ">=
|
|
34
|
-
"mobx": ">=
|
|
35
|
-
"mobx-react": ">=
|
|
30
|
+
"@jbrowse/core": ">=5.0.0-0",
|
|
31
|
+
"@jbrowse/mobx-state-tree": ">=6.0.0",
|
|
32
|
+
"@mui/icons-material": ">=9.0.0",
|
|
33
|
+
"@mui/material": ">=9.0.0",
|
|
34
|
+
"mobx": ">=7.0.0",
|
|
35
|
+
"mobx-react": ">=10.0.0",
|
|
36
36
|
"react": ">=16.8.0",
|
|
37
37
|
"react-dom": ">=16.8.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@jbrowse/core": "file:vendor-jbrowse/jbrowse-core.tgz",
|
|
41
|
-
"@
|
|
42
|
-
"
|
|
41
|
+
"@jbrowse/mobx-state-tree": "^6.5.1",
|
|
42
|
+
"@mui/icons-material": "^9.4.0",
|
|
43
|
+
"@mui/material": "^9.4.0",
|
|
44
|
+
"@types/node": "^26.5.1",
|
|
45
|
+
"esbuild": "^0.28.2",
|
|
46
|
+
"mobx": "^7.0.3",
|
|
47
|
+
"mobx-react": "^10.0.2",
|
|
48
|
+
"react": "^19.3.0",
|
|
49
|
+
"react-dom": "^19.3.0"
|
|
43
50
|
},
|
|
44
51
|
"dependencies": {
|
|
45
52
|
"@gmod/newick": "^1.0.3",
|
|
46
|
-
"@jbrowse/svgcanvas": "
|
|
47
|
-
"colord": "^2.
|
|
53
|
+
"@jbrowse/svgcanvas": "8.1.0",
|
|
54
|
+
"colord": "^2.10.0",
|
|
48
55
|
"flatbush": "^4.6.2",
|
|
49
|
-
"msa-parsers": "
|
|
56
|
+
"msa-parsers": "8.1.0"
|
|
50
57
|
},
|
|
51
58
|
"scripts": {
|
|
52
59
|
"clean": "rimraf dist bundle",
|
package/src/calculateBlocks.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// Returns the block offsets (in pixels) needed to cover the viewport along one
|
|
2
2
|
// axis. mapSize/viewportPos/viewportSize are all in pixels. The clamp pins the
|
|
3
|
-
// block set to the content edge so an over-scroll past the end still fills
|
|
4
|
-
// viewport
|
|
3
|
+
// block set to the content edge, so an over-scroll past the end still fills
|
|
4
|
+
// the viewport, and content smaller than the viewport mounts only the blocks
|
|
5
|
+
// it covers: none for a tree-only figure with zero columns.
|
|
5
6
|
export function calculateBlocks({
|
|
6
7
|
mapSize,
|
|
7
8
|
blockSize,
|
|
@@ -14,8 +15,9 @@ export function calculateBlocks({
|
|
|
14
15
|
viewportSize: number
|
|
15
16
|
}) {
|
|
16
17
|
const clamped = Math.max(0, Math.min(viewportPos, mapSize - viewportSize))
|
|
18
|
+
const end = Math.min(clamped + viewportSize, mapSize)
|
|
17
19
|
const minTile = Math.floor(clamped / blockSize)
|
|
18
|
-
const maxTile = Math.
|
|
20
|
+
const maxTile = Math.ceil(end / blockSize) - 1
|
|
19
21
|
|
|
20
22
|
const blocks = []
|
|
21
23
|
for (let tile = minTile; tile <= maxTile; tile++) {
|
package/src/colorSchemes.ts
CHANGED
|
@@ -16,8 +16,7 @@ const dna = {
|
|
|
16
16
|
U: red[500],
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
//
|
|
20
|
-
// scheme name index this, and an annotation still checks the literal against it
|
|
19
|
+
// Record<string, ...> so a free-string scheme name can index it
|
|
21
20
|
const colorSchemes: Record<string, Record<string, string>> = {
|
|
22
21
|
none: {},
|
|
23
22
|
nucleotide: dna,
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { ColumnCounts } from './columnCounts.ts'
|
|
2
|
+
|
|
3
|
+
export interface ColumnStats {
|
|
4
|
+
col: number
|
|
5
|
+
total: number
|
|
6
|
+
gaps: number
|
|
7
|
+
gapFraction: number
|
|
8
|
+
conservation: number
|
|
9
|
+
propertyConservation: number | undefined
|
|
10
|
+
consensusLetter: string
|
|
11
|
+
consensusCount: number
|
|
12
|
+
consensusFraction: number
|
|
13
|
+
distribution: [string, number][]
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Summarize one column: consensus residue and its identity fraction, the two
|
|
18
|
+
* conservation scores, gap fraction, and the non-gap residue distribution
|
|
19
|
+
* sorted by count. undefined past the end of the alignment or for a column with
|
|
20
|
+
* no sequences.
|
|
21
|
+
*
|
|
22
|
+
* A module-level function: a getter that reached the method through `this` made
|
|
23
|
+
* TypeScript infer the whole views object to type it, and fell back to `any`.
|
|
24
|
+
*/
|
|
25
|
+
export function columnStats({
|
|
26
|
+
col,
|
|
27
|
+
colStats,
|
|
28
|
+
conservation,
|
|
29
|
+
propertyConservation,
|
|
30
|
+
}: {
|
|
31
|
+
col: number
|
|
32
|
+
colStats: ColumnCounts
|
|
33
|
+
conservation: number[]
|
|
34
|
+
propertyConservation: number[]
|
|
35
|
+
}): ColumnStats | undefined {
|
|
36
|
+
if (col >= colStats.numColumns) {
|
|
37
|
+
return undefined
|
|
38
|
+
}
|
|
39
|
+
const total = colStats.total(col)
|
|
40
|
+
if (!total) {
|
|
41
|
+
return undefined
|
|
42
|
+
}
|
|
43
|
+
const gaps = colStats.gapCount(col)
|
|
44
|
+
const distribution = colStats.residueEntries(col).sort((a, b) => b[1] - a[1])
|
|
45
|
+
const consensus = distribution[0]
|
|
46
|
+
return {
|
|
47
|
+
col,
|
|
48
|
+
total,
|
|
49
|
+
gaps,
|
|
50
|
+
gapFraction: gaps / total,
|
|
51
|
+
conservation: conservation[col] ?? 0,
|
|
52
|
+
propertyConservation: propertyConservation[col],
|
|
53
|
+
consensusLetter: consensus?.[0] ?? '',
|
|
54
|
+
consensusCount: consensus?.[1] ?? 0,
|
|
55
|
+
consensusFraction: consensus ? consensus[1] / total : 0,
|
|
56
|
+
distribution,
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import React, { useState } from 'react'
|
|
2
2
|
|
|
3
|
+
import { useTheme } from '@mui/material'
|
|
4
|
+
|
|
3
5
|
import { useDragScroll } from '../useDragScroll.ts'
|
|
4
6
|
|
|
7
|
+
import type { Theme } from '@mui/material'
|
|
8
|
+
|
|
5
9
|
export const scrollbarThumbFill = 'rgba(66,119,127,0.3)'
|
|
6
10
|
|
|
7
11
|
// The scroll thumbs (minimap, vertical scrollbar) and the resize dividers are
|
|
@@ -11,23 +15,29 @@ export const scrollbarThumbFill = 'rgba(66,119,127,0.3)'
|
|
|
11
15
|
const variants: Record<
|
|
12
16
|
'thumb' | 'resizer',
|
|
13
17
|
{
|
|
14
|
-
fill: string
|
|
15
|
-
fillHovered: string
|
|
18
|
+
fill: (theme: Theme) => string
|
|
19
|
+
fillHovered: (theme: Theme) => string
|
|
16
20
|
cursor: (axis: 'x' | 'y') => string
|
|
17
21
|
position: React.CSSProperties['position']
|
|
18
22
|
zIndex?: number
|
|
19
23
|
}
|
|
20
24
|
> = {
|
|
21
25
|
thumb: {
|
|
22
|
-
fill: scrollbarThumbFill,
|
|
23
|
-
fillHovered: 'rgba(66,119,127,0.6)',
|
|
26
|
+
fill: () => scrollbarThumbFill,
|
|
27
|
+
fillHovered: () => 'rgba(66,119,127,0.6)',
|
|
24
28
|
cursor: () => 'pointer',
|
|
25
29
|
position: 'absolute',
|
|
26
30
|
zIndex: 100,
|
|
27
31
|
},
|
|
28
32
|
resizer: {
|
|
29
|
-
fill:
|
|
30
|
-
|
|
33
|
+
fill: theme =>
|
|
34
|
+
theme.palette.mode === 'dark'
|
|
35
|
+
? theme.palette.grey[800]
|
|
36
|
+
: 'rgba(200,200,200)',
|
|
37
|
+
fillHovered: theme =>
|
|
38
|
+
theme.palette.mode === 'dark'
|
|
39
|
+
? theme.palette.grey[600]
|
|
40
|
+
: 'rgba(150,150,150)',
|
|
31
41
|
cursor: axis => (axis === 'x' ? 'ew-resize' : 'ns-resize'),
|
|
32
42
|
position: 'relative',
|
|
33
43
|
},
|
|
@@ -54,6 +64,7 @@ export default function DragHandle({
|
|
|
54
64
|
onDrag: (delta: number, startValue: number) => void
|
|
55
65
|
style: React.CSSProperties
|
|
56
66
|
}) {
|
|
67
|
+
const theme = useTheme()
|
|
57
68
|
const [hovered, setHovered] = useState(false)
|
|
58
69
|
const { startDrag } = useDragScroll(axis, onDrag)
|
|
59
70
|
const { fill, fillHovered, cursor, position, zIndex } = variants[variant]
|
|
@@ -73,7 +84,7 @@ export default function DragHandle({
|
|
|
73
84
|
position,
|
|
74
85
|
zIndex,
|
|
75
86
|
cursor: cursor(axis),
|
|
76
|
-
background: hovered ? fillHovered : fill,
|
|
87
|
+
background: hovered ? fillHovered(theme) : fill(theme),
|
|
77
88
|
...style,
|
|
78
89
|
}}
|
|
79
90
|
/>
|
|
@@ -2,7 +2,7 @@ import React from 'react'
|
|
|
2
2
|
|
|
3
3
|
import { ErrorMessage } from '@jbrowse/core/ui'
|
|
4
4
|
import { ErrorBoundary } from '@jbrowse/core/ui/ErrorBoundary'
|
|
5
|
-
import { Button, Typography } from '@mui/material'
|
|
5
|
+
import { Button, CircularProgress, Typography } from '@mui/material'
|
|
6
6
|
import { observer } from 'mobx-react'
|
|
7
7
|
|
|
8
8
|
import MSAView from './MSAView.tsx'
|
|
@@ -16,35 +16,7 @@ const LoadingSpinner = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
16
16
|
<div
|
|
17
17
|
style={{ display: 'flex', alignItems: 'center', gap: 12, padding: 20 }}
|
|
18
18
|
>
|
|
19
|
-
<
|
|
20
|
-
width="24"
|
|
21
|
-
height="24"
|
|
22
|
-
viewBox="0 0 24 24"
|
|
23
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
24
|
-
>
|
|
25
|
-
<style>
|
|
26
|
-
{`@keyframes spinner { to { transform: rotate(360deg); } }`}
|
|
27
|
-
</style>
|
|
28
|
-
<circle
|
|
29
|
-
cx="12"
|
|
30
|
-
cy="12"
|
|
31
|
-
r="10"
|
|
32
|
-
stroke="#ccc"
|
|
33
|
-
strokeWidth="3"
|
|
34
|
-
fill="none"
|
|
35
|
-
/>
|
|
36
|
-
<path
|
|
37
|
-
d="M12 2a10 10 0 0 1 10 10"
|
|
38
|
-
stroke="#1976d2"
|
|
39
|
-
strokeWidth="3"
|
|
40
|
-
fill="none"
|
|
41
|
-
strokeLinecap="round"
|
|
42
|
-
style={{
|
|
43
|
-
animation: 'spinner 1s linear infinite',
|
|
44
|
-
transformOrigin: 'center',
|
|
45
|
-
}}
|
|
46
|
-
/>
|
|
47
|
-
</svg>
|
|
19
|
+
<CircularProgress size={24} />
|
|
48
20
|
<Typography variant="h6">{status?.msg ?? 'Loading...'}</Typography>
|
|
49
21
|
{status?.onCancel ? (
|
|
50
22
|
<Button
|
|
@@ -109,12 +81,8 @@ const Loading = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
109
81
|
<MSAView model={model} />
|
|
110
82
|
)
|
|
111
83
|
) : error ? (
|
|
112
|
-
//
|
|
113
|
-
// only an abort clears it
|
|
114
|
-
// fell to the spinner below, and the ImportForm that renders
|
|
115
|
-
// `model.error` was never reached: the reader got "Downloading file"
|
|
116
|
-
// and a Cancel button for as long as they were willing to watch it.
|
|
117
|
-
// Found on AlphaFold's files/msa/ prefix answering 403 to every key.
|
|
84
|
+
// checked before the spinner: a failed load keeps its filehandle
|
|
85
|
+
// (only an abort clears it), so hasPendingFilehandle stays true
|
|
118
86
|
<Reset model={model} error={error} />
|
|
119
87
|
) : hasPendingFilehandle || isLoading ? (
|
|
120
88
|
<LoadingSpinner model={model} />
|
|
@@ -12,16 +12,27 @@ import Header from './header/Header.tsx'
|
|
|
12
12
|
import Minimap from './minimap/Minimap.tsx'
|
|
13
13
|
import MSAPanel from './msa/MSAPanel.tsx'
|
|
14
14
|
import { clickColor, hoverColor } from './overlayColors.ts'
|
|
15
|
+
import RowPanelHeaders from './rowpanels/RowPanelHeaders.tsx'
|
|
16
|
+
import RowPanels from './rowpanels/RowPanels.tsx'
|
|
17
|
+
import TreeOverview from './tree/TreeOverview.tsx'
|
|
15
18
|
import TreePanel from './tree/TreePanel.tsx'
|
|
16
19
|
import TreeRuler from './tree/TreeRuler.tsx'
|
|
17
20
|
|
|
18
21
|
import type { MsaViewModel } from '../model.ts'
|
|
19
22
|
|
|
23
|
+
// The band above the panels: the tree overview and scale bar, the strip
|
|
24
|
+
// headers, and the minimap over the alignment. The spacer stands in for the
|
|
25
|
+
// resize handle, so the minimap starts exactly where the alignment canvas does.
|
|
20
26
|
const TopArea = observer(function ({ model }: { model: MsaViewModel }) {
|
|
21
|
-
const { showHorizontalScrollbar } = model
|
|
27
|
+
const { showHorizontalScrollbar, showTreeOverview, resizeHandleWidth } = model
|
|
22
28
|
return (
|
|
23
29
|
<div style={{ display: 'flex' }}>
|
|
24
|
-
<
|
|
30
|
+
<div style={{ flexShrink: 0 }}>
|
|
31
|
+
{showTreeOverview ? <TreeOverview model={model} /> : null}
|
|
32
|
+
<TreeRuler model={model} />
|
|
33
|
+
</div>
|
|
34
|
+
<RowPanelHeaders model={model} />
|
|
35
|
+
<div style={{ width: resizeHandleWidth, flexShrink: 0 }} />
|
|
25
36
|
{showHorizontalScrollbar ? <Minimap model={model} /> : null}
|
|
26
37
|
</div>
|
|
27
38
|
)
|
|
@@ -38,6 +49,7 @@ const TrackColumnIndicator = observer(function ({
|
|
|
38
49
|
colWidth,
|
|
39
50
|
scrollX,
|
|
40
51
|
treeAreaWidth,
|
|
52
|
+
rowPanelsWidth,
|
|
41
53
|
resizeHandleWidth,
|
|
42
54
|
totalTrackAreaHeight,
|
|
43
55
|
msaCanvasWidth,
|
|
@@ -53,7 +65,7 @@ const TrackColumnIndicator = observer(function ({
|
|
|
53
65
|
<div
|
|
54
66
|
style={{
|
|
55
67
|
position: 'absolute',
|
|
56
|
-
left: treeAreaWidth + resizeHandleWidth,
|
|
68
|
+
left: treeAreaWidth + rowPanelsWidth + resizeHandleWidth,
|
|
57
69
|
top: 0,
|
|
58
70
|
width: msaCanvasWidth,
|
|
59
71
|
height: totalTrackAreaHeight,
|
|
@@ -102,6 +114,7 @@ const MainArea = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
102
114
|
return (
|
|
103
115
|
<div style={{ display: 'flex' }}>
|
|
104
116
|
<TreePanel model={model} />
|
|
117
|
+
<RowPanels model={model} />
|
|
105
118
|
<VerticalResizeHandle model={model} />
|
|
106
119
|
<MSAPanel model={model} />
|
|
107
120
|
{showVerticalScrollbar ? <VerticalScrollbar model={model} /> : null}
|
|
@@ -120,14 +133,15 @@ const View = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
120
133
|
})
|
|
121
134
|
|
|
122
135
|
const MSAView = observer(function ({ model }: { model: MsaViewModel }) {
|
|
123
|
-
const { height, viewInitialized, DialogComponent, DialogProps } =
|
|
136
|
+
const { height, hideHeader, viewInitialized, DialogComponent, DialogProps } =
|
|
137
|
+
model
|
|
124
138
|
|
|
125
139
|
return (
|
|
126
140
|
<div>
|
|
127
141
|
{viewInitialized ? (
|
|
128
142
|
<>
|
|
129
143
|
<div style={{ height, overflow: 'hidden' }}>
|
|
130
|
-
<Header model={model} />
|
|
144
|
+
{hideHeader ? null : <Header model={model} />}
|
|
131
145
|
<View model={model} />
|
|
132
146
|
</div>
|
|
133
147
|
<HorizontalResizeHandle model={model} />
|