react-msaview 6.5.0 → 8.0.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 +13 -11
- package/bundle/index.js +122 -112
- package/bundle/index.js.map +4 -4
- 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 -2
- 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 +69 -4
- package/dist/components/MSAViewer.js +201 -8
- 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.d.ts +3 -3
- package/dist/components/ResizeHandles.js +13 -24
- package/dist/components/ResizeHandles.js.map +1 -1
- package/dist/components/SequenceTextArea.js +3 -3
- package/dist/components/SequenceTextArea.js.map +1 -1
- package/dist/components/Track.js +41 -22
- package/dist/components/Track.js.map +1 -1
- package/dist/components/dialogs/{InterProScanDialog.d.ts → AnnotationFileDialog.d.ts} +2 -2
- package/dist/components/dialogs/AnnotationFileDialog.js +92 -0
- package/dist/components/dialogs/AnnotationFileDialog.js.map +1 -0
- package/dist/components/dialogs/ExportSVGDialog.js +5 -3
- package/dist/components/dialogs/ExportSVGDialog.js.map +1 -1
- package/dist/components/dialogs/FeatureDialog.js +13 -9
- 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 +7 -0
- package/dist/components/header/Header.js.map +1 -1
- package/dist/components/header/HeaderStatusArea.js +0 -2
- package/dist/components/header/HeaderStatusArea.js.map +1 -1
- package/dist/components/header/LoadWarnings.d.ts +6 -0
- package/dist/components/header/LoadWarnings.js +35 -0
- package/dist/components/header/LoadWarnings.js.map +1 -0
- package/dist/components/header/MultiAlignmentSelector.js +0 -0
- package/dist/components/header/MultiAlignmentSelector.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 +7 -1
- package/dist/components/header/TreeSettingsMenu.js.map +1 -1
- package/dist/components/header/UnshareableDataWarning.d.ts +6 -0
- package/dist/components/header/UnshareableDataWarning.js +40 -0
- package/dist/components/header/UnshareableDataWarning.js.map +1 -0
- package/dist/components/header/ZoomControls.js +49 -6
- package/dist/components/header/ZoomControls.js.map +1 -1
- package/dist/components/header/getAnnotationsMenu.js +11 -14
- package/dist/components/header/getAnnotationsMenu.js.map +1 -1
- package/dist/components/header/settingsMenuItems.js +10 -7
- 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/ImportFormExamples.js +2 -6
- package/dist/components/import/ImportFormExamples.js.map +1 -1
- package/dist/components/import/util.js +2 -0
- 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 +1 -1
- package/dist/components/msa/MSACanvas.js.map +1 -1
- package/dist/components/msa/MSACanvasBlock.js +17 -20
- 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 +53 -0
- package/dist/components/msa/drawFeatureSpans.js +78 -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 +30 -27
- package/dist/components/msa/msaRaster.js +193 -90
- 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 +51 -87
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -1
- package/dist/components/msa/renderHighlights.d.ts +44 -4
- package/dist/components/msa/renderHighlights.js +99 -11
- package/dist/components/msa/renderHighlights.js.map +1 -1
- package/dist/components/msa/renderMSABlock.d.ts +1 -2
- package/dist/components/msa/renderMSABlock.js +28 -31
- package/dist/components/msa/renderMSABlock.js.map +1 -1
- package/dist/components/msa/renderMSAMouseover.js +9 -30
- package/dist/components/msa/renderMSAMouseover.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/renderCtx.d.ts +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 +13 -16
- 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 +30 -12
- package/dist/components/tracks/drawTracks.js +127 -34
- 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/TreeCanvas.js +6 -4
- package/dist/components/tree/TreeCanvas.js.map +1 -1
- package/dist/components/tree/TreeCanvasBlock.js +6 -21
- package/dist/components/tree/TreeCanvasBlock.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 +11 -5
- 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.d.ts +0 -1
- package/dist/components/tree/renderTreeCanvas.js +221 -47
- 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/scaleBar.d.ts +10 -0
- package/dist/components/tree/scaleBar.js +24 -0
- package/dist/components/tree/scaleBar.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 +18 -1
- package/dist/constants.js +51 -8
- 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/fetchUtils.d.ts +7 -7
- package/dist/fetchUtils.js +4 -32
- package/dist/fetchUtils.js.map +1 -1
- 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 +29 -1
- package/dist/hierarchy.js +82 -19
- package/dist/hierarchy.js.map +1 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/model/DataModel.js +4 -4
- 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 +792 -259
- package/dist/model.js +2092 -675
- 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 +15 -13
- package/dist/renderToStaticMarkup.js +37 -25
- package/dist/renderToStaticMarkup.js.map +1 -1
- package/dist/renderToSvg.js +198 -68
- package/dist/renderToSvg.js.map +1 -1
- package/dist/rowCoordinateCalculations.d.ts +26 -28
- package/dist/rowCoordinateCalculations.js +13 -39
- 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 +5 -4
- 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 +306 -124
- package/dist/types.d.ts +295 -3
- 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/util.d.ts +10 -4
- package/dist/util.js +37 -10
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/wuss.d.ts +14 -0
- package/dist/wuss.js +55 -0
- package/dist/wuss.js.map +1 -0
- package/package.json +23 -14
- package/src/colorSchemes.ts +1 -2
- package/src/columnStats.ts +58 -0
- package/src/components/DragHandle.tsx +18 -7
- package/src/components/Loading.tsx +14 -8
- package/src/components/MSAView.tsx +19 -5
- package/src/components/MSAViewer.tsx +326 -10
- package/src/components/PortalTooltip.tsx +47 -0
- package/src/components/ResizeHandles.tsx +21 -36
- package/src/components/SequenceTextArea.tsx +3 -3
- package/src/components/Track.tsx +55 -18
- package/src/components/dialogs/AnnotationFileDialog.tsx +162 -0
- package/src/components/dialogs/ExportSVGDialog.tsx +7 -2
- package/src/components/dialogs/FeatureDialog.tsx +13 -9
- package/src/components/dialogs/TrackInfoDialog.tsx +1 -1
- package/src/components/header/GappynessSlider.tsx +6 -11
- package/src/components/header/Header.tsx +10 -0
- package/src/components/header/HeaderStatusArea.tsx +0 -5
- package/src/components/header/LoadWarnings.tsx +48 -0
- package/src/components/header/MultiAlignmentSelector.tsx +0 -0
- package/src/components/header/ScrollZoomIcons.tsx +52 -0
- package/src/components/header/TreeSettingsMenu.tsx +7 -1
- package/src/components/header/UnshareableDataWarning.tsx +56 -0
- package/src/components/header/ZoomControls.tsx +74 -14
- package/src/components/header/getAnnotationsMenu.ts +13 -17
- package/src/components/header/settingsMenuItems.ts +11 -6
- package/src/components/import/ImportForm.tsx +2 -2
- package/src/components/import/ImportFormExamples.tsx +4 -8
- package/src/components/import/util.ts +2 -0
- package/src/components/minimap/Minimap.tsx +1 -2
- package/src/components/msa/AnnotationLegend.tsx +48 -38
- package/src/components/msa/MSACanvas.tsx +3 -5
- package/src/components/msa/MSACanvasBlock.tsx +17 -21
- package/src/components/msa/MSAMouseoverCanvas.tsx +2 -1
- package/src/components/msa/domainBandCursor.ts +7 -11
- package/src/components/msa/drawFeatureSpans.ts +150 -0
- package/src/components/msa/legendRows.ts +24 -0
- package/src/components/msa/msaRaster.ts +236 -88
- package/src/components/msa/packDomainLanes.ts +36 -0
- package/src/components/msa/renderBoxFeatureCanvasBlock.ts +69 -123
- package/src/components/msa/renderHighlights.ts +141 -10
- package/src/components/msa/renderMSABlock.ts +29 -38
- package/src/components/msa/renderMSAMouseover.ts +9 -39
- package/src/components/msa/tileColor.ts +4 -7
- package/src/components/msa/useMsaBlockMouse.ts +6 -6
- package/src/components/renderCtx.ts +1 -0
- 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 +13 -18
- package/src/components/tracks/TrackTooltipContent.tsx +156 -0
- package/src/components/tracks/drawTracks.ts +169 -38
- package/src/components/tracks/useTrackHover.ts +42 -0
- package/src/components/tree/CladeLabels.tsx +77 -0
- package/src/components/tree/TreeCanvas.tsx +4 -3
- package/src/components/tree/TreeCanvasBlock.tsx +10 -32
- package/src/components/tree/TreeOverview.tsx +106 -0
- package/src/components/tree/TreeRuler.tsx +29 -5
- package/src/components/tree/cladeBrackets.ts +73 -0
- package/src/components/tree/dialogs/TreeNodeInfoDialog.tsx +2 -2
- package/src/components/tree/renderTreeCanvas.ts +312 -48
- package/src/components/tree/renderTreeOverview.ts +212 -0
- package/src/components/tree/scaleBar.ts +23 -0
- package/src/components/tree/useTreeHover.ts +2 -4
- package/src/constants.ts +61 -8
- package/src/createPaletteMap.ts +10 -9
- package/src/element.ts +321 -0
- package/src/featureFields.ts +19 -0
- package/src/fetchUtils.ts +7 -40
- package/src/flatToTree.ts +1 -2
- package/src/ggplotPalettes.ts +60 -0
- package/src/hierarchy.ts +97 -20
- package/src/index.ts +46 -6
- package/src/model/DataModel.ts +5 -4
- package/src/model/msaModel.ts +3 -2
- package/src/model/treeModel.ts +42 -0
- package/src/model.ts +2492 -793
- package/src/mount.tsx +32 -0
- package/src/neighborJoining.ts +8 -32
- package/src/rawImports.d.ts +9 -0
- package/src/renderToStaticMarkup.ts +41 -25
- package/src/renderToSvg.tsx +365 -92
- package/src/rowCoordinateCalculations.ts +16 -62
- package/src/scales.ts +47 -0
- package/src/seqPosToGlobalCol.ts +5 -4
- package/src/sequenceLogo.ts +6 -11
- package/src/stripDefault.ts +7 -14
- package/src/types.ts +352 -12
- package/src/umd.ts +4 -2
- package/src/useCanvasAutorun.ts +5 -10
- package/src/useMsaSvgFigure.ts +72 -0
- package/src/util.ts +40 -14
- package/src/version.ts +1 -1
- package/src/wuss.ts +62 -0
- package/dist/components/dialogs/InterProScanDialog.js +0 -137
- package/dist/components/dialogs/InterProScanDialog.js.map +0 -1
- package/dist/components/dialogs/InterProScanFileDialog.d.ts +0 -7
- package/dist/components/dialogs/InterProScanFileDialog.js +0 -64
- package/dist/components/dialogs/InterProScanFileDialog.js.map +0 -1
- package/dist/components/msa/ColumnStats.js +0 -42
- package/dist/components/msa/ColumnStats.js.map +0 -1
- package/dist/launchInterProScan.d.ts +0 -13
- package/dist/launchInterProScan.js +0 -110
- package/dist/launchInterProScan.js.map +0 -1
- package/dist/useColorContrast.d.ts +0 -10
- package/dist/useColorContrast.js +0 -13
- package/dist/useColorContrast.js.map +0 -1
- package/src/clustalX.test.ts +0 -74
- package/src/colSpace.test.ts +0 -67
- package/src/collapseLogic.test.ts +0 -115
- package/src/colorSchemes.docs.test.ts +0 -57
- package/src/columnCounts.test.ts +0 -73
- package/src/columnStats.test.ts +0 -94
- package/src/columnTracks.test.ts +0 -97
- package/src/components/dialogs/InterProScanDialog.tsx +0 -214
- package/src/components/dialogs/InterProScanFileDialog.tsx +0 -138
- package/src/components/minimap/minimapLayout.test.ts +0 -71
- package/src/components/msa/ColumnStats.tsx +0 -54
- package/src/components/msa/msaRaster.test.ts +0 -145
- package/src/components/msa/renderBoxFeatureCanvasBlock.test.ts +0 -51
- package/src/components/tree/renderTreeCanvas.test.ts +0 -296
- package/src/dataInitialized.test.ts +0 -42
- package/src/domainBands.test.ts +0 -122
- package/src/domainLetterColor.test.ts +0 -80
- package/src/exportFileName.test.ts +0 -40
- package/src/fetchUtils.test.ts +0 -83
- package/src/flatToTree.test.ts +0 -51
- package/src/hierarchy.test.ts +0 -228
- package/src/highlights.test.ts +0 -70
- package/src/impgRender.test.tsx +0 -68
- package/src/largeTree.test.ts +0 -67
- package/src/launchInterProScan.ts +0 -167
- package/src/loadErrorDisplay.test.tsx +0 -102
- package/src/modelFilehandleLoaders.test.ts +0 -137
- package/src/modelReset.test.ts +0 -120
- package/src/neighborJoining.test.ts +0 -164
- package/src/parseAsn1.test.ts +0 -36
- package/src/propertyConservation.test.ts +0 -36
- package/src/renderColumnTracksSvg.test.tsx +0 -108
- package/src/renderDomainsSvg.test.tsx +0 -118
- package/src/renderHighlightsSvg.test.tsx +0 -85
- package/src/renderMinimapSvg.test.tsx +0 -62
- package/src/renderRasterSvg.test.tsx +0 -144
- package/src/renderSequenceLogoSvg.test.tsx +0 -165
- package/src/renderToSvg.test.tsx +0 -65
- package/src/reset.test.ts +0 -61
- package/src/rowCoordinateCalculations.test.ts +0 -211
- package/src/rowSpace.test.ts +0 -46
- package/src/segmentOverlay.test.ts +0 -70
- package/src/seqPosToGlobalCol.test.ts +0 -59
- package/src/sequenceLogo.test.ts +0 -88
- package/src/setFontSize.test.ts +0 -33
- package/src/stripDefault.test.ts +0 -48
- package/src/stripDefaultSnapshot.test.ts +0 -87
- package/src/treeMetadata.test.ts +0 -39
- package/src/useCanvasAutorun.test.tsx +0 -98
- package/src/useColorContrast.ts +0 -18
- package/src/viewChrome.test.tsx +0 -134
- package/src/wheelZoom.test.ts +0 -46
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { observer } from 'mobx-react';
|
|
3
|
+
import { columnLogoStack } from '../../sequenceLogo.js';
|
|
4
|
+
import { barTrackValues } from './drawTracks.js';
|
|
5
|
+
const pct = (n) => `${Math.round(n * 100)}%`;
|
|
6
|
+
const MAX_PARTNERS = 8;
|
|
7
|
+
function ColumnLabel({ model, col }) {
|
|
8
|
+
const { relativeTo } = model;
|
|
9
|
+
const pos = relativeTo
|
|
10
|
+
? model.visibleColToSeqPosOneBased(relativeTo, col)
|
|
11
|
+
: undefined;
|
|
12
|
+
return (React.createElement("b", null,
|
|
13
|
+
"Column ",
|
|
14
|
+
col + 1,
|
|
15
|
+
pos === undefined ? null : ` (${relativeTo}:${pos})`));
|
|
16
|
+
}
|
|
17
|
+
function BarTooltip({ model, track, col, }) {
|
|
18
|
+
const { id, name } = track.model;
|
|
19
|
+
const value = barTrackValues(model, id)[col];
|
|
20
|
+
return value === undefined ? null : (React.createElement("div", null,
|
|
21
|
+
React.createElement(ColumnLabel, { model: model, col: col }),
|
|
22
|
+
React.createElement("br", null),
|
|
23
|
+
name,
|
|
24
|
+
": ",
|
|
25
|
+
value.toFixed(2)));
|
|
26
|
+
}
|
|
27
|
+
function LogoTooltip({ model, col }) {
|
|
28
|
+
const stats = model.columnStatsAt(col);
|
|
29
|
+
if (!stats) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
const { total, consensusLetter, consensusFraction, gapFraction } = stats;
|
|
33
|
+
const stack = columnLogoStack(model.colStats, col, model.alphabetMaxBits);
|
|
34
|
+
const bits = stack.reduce((a, b) => a + b.bits, 0);
|
|
35
|
+
return (React.createElement("div", null,
|
|
36
|
+
React.createElement(ColumnLabel, { model: model, col: col }),
|
|
37
|
+
" (",
|
|
38
|
+
total,
|
|
39
|
+
" seqs)",
|
|
40
|
+
React.createElement("br", null),
|
|
41
|
+
"Information: ",
|
|
42
|
+
bits.toFixed(2),
|
|
43
|
+
" bits",
|
|
44
|
+
React.createElement("br", null),
|
|
45
|
+
"Consensus: ",
|
|
46
|
+
consensusLetter || '-',
|
|
47
|
+
" (",
|
|
48
|
+
pct(consensusFraction),
|
|
49
|
+
")",
|
|
50
|
+
React.createElement("br", null),
|
|
51
|
+
"Gaps: ",
|
|
52
|
+
pct(gapFraction),
|
|
53
|
+
React.createElement("br", null),
|
|
54
|
+
stats.distribution.slice(0, 6).map(([letter, count]) => (React.createElement("span", { key: letter, style: { marginRight: 8 } },
|
|
55
|
+
letter,
|
|
56
|
+
" ",
|
|
57
|
+
pct(count / total))))));
|
|
58
|
+
}
|
|
59
|
+
function TextTooltip({ model, track, col, }) {
|
|
60
|
+
const { name, data } = track.model;
|
|
61
|
+
const letter = data?.[col];
|
|
62
|
+
return letter === undefined ? null : (React.createElement("div", null,
|
|
63
|
+
React.createElement(ColumnLabel, { model: model, col: col }),
|
|
64
|
+
React.createElement("br", null),
|
|
65
|
+
name,
|
|
66
|
+
": ",
|
|
67
|
+
letter === ' ' ? 'blank' : letter));
|
|
68
|
+
}
|
|
69
|
+
function ArcTooltip({ model, track, col, }) {
|
|
70
|
+
const { name, arcs } = track.model;
|
|
71
|
+
const partners = (arcs ?? [])
|
|
72
|
+
.filter(arc => arc.start === col || arc.end === col)
|
|
73
|
+
.map(arc => (arc.start === col ? arc.end : arc.start) + 1);
|
|
74
|
+
return partners.length === 0 ? null : (React.createElement("div", null,
|
|
75
|
+
React.createElement(ColumnLabel, { model: model, col: col }),
|
|
76
|
+
React.createElement("br", null),
|
|
77
|
+
name,
|
|
78
|
+
": pairs with ",
|
|
79
|
+
partners.slice(0, MAX_PARTNERS).join(', '),
|
|
80
|
+
partners.length > MAX_PARTNERS ? '...' : null));
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* One track's reading at the hovered column: a bar track's value, the logo's
|
|
84
|
+
* information content and composition, the columns an arc joins, the letter on a
|
|
85
|
+
* text track. `drawTrackBlock` dispatches on the same `kind`, so a new kind
|
|
86
|
+
* needs a case in both.
|
|
87
|
+
*/
|
|
88
|
+
const TrackTooltipContent = observer(function ({ model, track, col, }) {
|
|
89
|
+
switch (track.model.kind) {
|
|
90
|
+
case 'bar': {
|
|
91
|
+
return React.createElement(BarTooltip, { model: model, track: track, col: col });
|
|
92
|
+
}
|
|
93
|
+
case 'logo': {
|
|
94
|
+
return React.createElement(LogoTooltip, { model: model, col: col });
|
|
95
|
+
}
|
|
96
|
+
case 'text': {
|
|
97
|
+
return React.createElement(TextTooltip, { model: model, track: track, col: col });
|
|
98
|
+
}
|
|
99
|
+
case 'arc': {
|
|
100
|
+
return React.createElement(ArcTooltip, { model: model, track: track, col: col });
|
|
101
|
+
}
|
|
102
|
+
case 'ruler': {
|
|
103
|
+
return (React.createElement("div", null,
|
|
104
|
+
React.createElement(ColumnLabel, { model: model, col: col })));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
export default TrackTooltipContent;
|
|
109
|
+
//# sourceMappingURL=TrackTooltipContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TrackTooltipContent.js","sourceRoot":"","sources":["../../../src/components/tracks/TrackTooltipContent.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ColumnCounts } from '../../columnCounts.ts';
|
|
2
2
|
import type { MsaViewModel } from '../../model.ts';
|
|
3
|
-
import type { BasicTrack } from '../../types.ts';
|
|
3
|
+
import type { Arc, BasicTrack } from '../../types.ts';
|
|
4
4
|
import type { RenderCtx } from '../renderCtx.ts';
|
|
5
5
|
import type { Theme } from '@mui/material';
|
|
6
6
|
export declare function drawConservationBars({ ctx, values, color, colWidth, trackHeight, offsetX, blockSize, }: {
|
|
@@ -13,18 +13,38 @@ export declare function drawConservationBars({ ctx, values, color, colWidth, tra
|
|
|
13
13
|
blockSize: number;
|
|
14
14
|
}): void;
|
|
15
15
|
export declare function barTrackValues(model: MsaViewModel, trackId: string): number[];
|
|
16
|
-
export declare function
|
|
16
|
+
export declare function drawArcs({ ctx, arcs, color, colWidth, trackHeight, offsetX, blockSize, }: {
|
|
17
|
+
ctx: RenderCtx;
|
|
18
|
+
arcs: Arc[] | undefined;
|
|
19
|
+
color: string;
|
|
20
|
+
colWidth: number;
|
|
21
|
+
trackHeight: number;
|
|
22
|
+
offsetX: number;
|
|
23
|
+
blockSize: number;
|
|
24
|
+
}): void;
|
|
25
|
+
export declare function drawTextTrackContent({ ctx, data, colorScheme, contrastText, bgColor, drawLetters, colWidth, rowHeight, offsetX, blockSize, }: {
|
|
17
26
|
ctx: RenderCtx;
|
|
18
27
|
data: string | undefined;
|
|
19
28
|
colorScheme: Record<string, string>;
|
|
20
|
-
|
|
29
|
+
contrastText: (color: string | undefined) => string;
|
|
21
30
|
bgColor: boolean;
|
|
22
|
-
|
|
31
|
+
drawLetters: boolean;
|
|
23
32
|
colWidth: number;
|
|
24
33
|
rowHeight: number;
|
|
25
34
|
offsetX: number;
|
|
26
35
|
blockSize: number;
|
|
27
36
|
}): void;
|
|
37
|
+
export declare function rulerStep(colWidth: number, minPixels?: number): number;
|
|
38
|
+
export declare function drawColumnRuler({ ctx, numColumns, label, textColor, colWidth, trackHeight, offsetX, blockSize, }: {
|
|
39
|
+
ctx: RenderCtx;
|
|
40
|
+
numColumns: number;
|
|
41
|
+
label: (col: number) => string | undefined;
|
|
42
|
+
textColor: string;
|
|
43
|
+
colWidth: number;
|
|
44
|
+
trackHeight: number;
|
|
45
|
+
offsetX: number;
|
|
46
|
+
blockSize: number;
|
|
47
|
+
}): void;
|
|
28
48
|
export declare function drawSequenceLogo({ ctx, colStats, colorScheme, maxBits, textColor, colWidth, trackHeight, offsetX, blockSize, }: {
|
|
29
49
|
ctx: RenderCtx;
|
|
30
50
|
colStats: ColumnCounts;
|
|
@@ -38,30 +58,28 @@ export declare function drawSequenceLogo({ ctx, colStats, colorScheme, maxBits,
|
|
|
38
58
|
}): void;
|
|
39
59
|
/**
|
|
40
60
|
* Draw one track's content into a block of the alignment's column space, at
|
|
41
|
-
* `offsetY` within the ctx. Owns the transform, so
|
|
42
|
-
*
|
|
43
|
-
*
|
|
61
|
+
* `offsetY` within the ctx. Owns the transform, so the live canvas blocks and
|
|
62
|
+
* the SVG export draw into the same coordinate space. A new track kind needs a
|
|
63
|
+
* `kind`, a draw function above, and a case here.
|
|
44
64
|
*/
|
|
45
|
-
export declare function drawTrackBlock({ model, ctx, track, offsetX, offsetY, theme,
|
|
65
|
+
export declare function drawTrackBlock({ model, ctx, track, offsetX, offsetY, theme, blockSizeXOverride, highResScaleFactorOverride, }: {
|
|
46
66
|
model: MsaViewModel;
|
|
47
67
|
ctx: RenderCtx;
|
|
48
68
|
track: BasicTrack;
|
|
49
69
|
offsetX: number;
|
|
50
70
|
offsetY?: number;
|
|
51
71
|
theme: Theme;
|
|
52
|
-
contrastScheme: Record<string, string>;
|
|
53
72
|
blockSizeXOverride?: number;
|
|
54
73
|
highResScaleFactorOverride?: number;
|
|
55
74
|
}): void;
|
|
56
75
|
/**
|
|
57
76
|
* Every turned-on track stacked top to bottom, for the SVG export. The live
|
|
58
|
-
* view draws the same content one canvas block at a time
|
|
77
|
+
* view draws the same content one canvas block at a time in TrackBlocks.
|
|
59
78
|
*/
|
|
60
|
-
export declare function renderAllTracks({ model, ctx, offsetX,
|
|
79
|
+
export declare function renderAllTracks({ model, ctx, offsetX, theme, blockSizeXOverride, highResScaleFactorOverride, }: {
|
|
61
80
|
model: MsaViewModel;
|
|
62
81
|
ctx: RenderCtx;
|
|
63
82
|
offsetX: number;
|
|
64
|
-
contrastScheme: Record<string, string>;
|
|
65
83
|
theme: Theme;
|
|
66
84
|
blockSizeXOverride?: number;
|
|
67
85
|
highResScaleFactorOverride?: number;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { columnLogoStack } from '../../sequenceLogo.js';
|
|
2
2
|
import { setFontSize } from '../../setFontSize.js';
|
|
3
|
+
import { contrastTextFn } from '../../util.js';
|
|
3
4
|
import { visibleColRange } from '../msa/visibleColRange.js';
|
|
4
5
|
export function drawConservationBars({ ctx, values, color, colWidth, trackHeight, offsetX, blockSize, }) {
|
|
5
6
|
const { xStart, xEnd } = visibleColRange({
|
|
@@ -15,8 +16,8 @@ export function drawConservationBars({ ctx, values, color, colWidth, trackHeight
|
|
|
15
16
|
ctx.fillRect(x, trackHeight - barHeight, colWidth, barHeight);
|
|
16
17
|
}
|
|
17
18
|
}
|
|
18
|
-
//
|
|
19
|
-
//
|
|
19
|
+
// bar-track values are model getters, off the plain track object, so the canvas
|
|
20
|
+
// autorun stays reactive
|
|
20
21
|
export function barTrackValues(model, trackId) {
|
|
21
22
|
const supplied = model.columnTrackContent.get(trackId)?.values;
|
|
22
23
|
if (supplied) {
|
|
@@ -26,14 +27,46 @@ export function barTrackValues(model, trackId) {
|
|
|
26
27
|
? model.propertyConservation
|
|
27
28
|
: model.conservation;
|
|
28
29
|
}
|
|
29
|
-
|
|
30
|
+
// An arc's apex scales with the square root of its span. Contact-map spans skew
|
|
31
|
+
// short, and a linear scale flattens them along the baseline.
|
|
32
|
+
export function drawArcs({ ctx, arcs, color, colWidth, trackHeight, offsetX, blockSize, }) {
|
|
33
|
+
if (!arcs?.length) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const { xStart, xEnd } = visibleColRange({
|
|
37
|
+
offsetX,
|
|
38
|
+
blockWidth: blockSize,
|
|
39
|
+
colWidth,
|
|
40
|
+
});
|
|
41
|
+
let maxSpan = 1;
|
|
42
|
+
for (const arc of arcs) {
|
|
43
|
+
maxSpan = Math.max(maxSpan, arc.end - arc.start);
|
|
44
|
+
}
|
|
45
|
+
// a full-height apex would put the stroke half outside the track
|
|
46
|
+
const apexRoom = trackHeight - 1;
|
|
47
|
+
ctx.lineWidth = 1;
|
|
48
|
+
for (const arc of arcs) {
|
|
49
|
+
// an arc that spans the block draws even though neither foot is inside it
|
|
50
|
+
if (arc.end < xStart || arc.start > xEnd) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const x1 = (arc.start + 0.5) * colWidth;
|
|
54
|
+
const x2 = (arc.end + 0.5) * colWidth;
|
|
55
|
+
const apex = apexRoom * Math.sqrt((arc.end - arc.start) / maxSpan);
|
|
56
|
+
ctx.strokeStyle = arc.color ?? color;
|
|
57
|
+
ctx.beginPath();
|
|
58
|
+
ctx.moveTo(x1, trackHeight);
|
|
59
|
+
ctx.quadraticCurveTo((x1 + x2) / 2, trackHeight - 2 * apex, x2, trackHeight);
|
|
60
|
+
ctx.stroke();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export function drawTextTrackContent({ ctx, data, colorScheme, contrastText, bgColor, drawLetters, colWidth, rowHeight, offsetX, blockSize, }) {
|
|
30
64
|
const { xStart, xEnd } = visibleColRange({
|
|
31
65
|
offsetX,
|
|
32
66
|
blockWidth: blockSize,
|
|
33
67
|
colWidth,
|
|
34
68
|
});
|
|
35
69
|
const str = data?.slice(xStart, xEnd);
|
|
36
|
-
const drawLetters = rowHeight >= 10 && colWidth >= rowHeight / 2;
|
|
37
70
|
for (let i = 0; str && i < str.length; i++) {
|
|
38
71
|
const letter = str[i];
|
|
39
72
|
const upper = letter.toUpperCase();
|
|
@@ -44,24 +77,54 @@ export function drawTextTrackContent({ ctx, data, colorScheme, contrastScheme, b
|
|
|
44
77
|
ctx.fillRect(x, 0, colWidth, rowHeight);
|
|
45
78
|
}
|
|
46
79
|
if (drawLetters) {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
ctx.fillStyle = fill ? (contrastScheme[upper] ?? 'black') : textColor;
|
|
50
|
-
ctx.fillText(letter, x + colWidth / 2, rowHeight / 2 + 1);
|
|
80
|
+
ctx.fillStyle = contrastText(fill);
|
|
81
|
+
ctx.fillText(letter, x + colWidth / 2, rowHeight / 2);
|
|
51
82
|
}
|
|
52
83
|
}
|
|
53
84
|
}
|
|
54
|
-
//
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
85
|
+
// the smallest 1/2/5 x 10^n column step that leaves room for a label
|
|
86
|
+
export function rulerStep(colWidth, minPixels = 55) {
|
|
87
|
+
let step = 1;
|
|
88
|
+
const mantissas = [1, 2, 5];
|
|
89
|
+
for (let i = 0; step * colWidth < minPixels; i++) {
|
|
90
|
+
step = mantissas[i % 3] * 10 ** Math.floor(i / 3);
|
|
91
|
+
}
|
|
92
|
+
return step;
|
|
93
|
+
}
|
|
94
|
+
const RULER_FONT_SIZE = 10;
|
|
95
|
+
const TICK_HEIGHT = 4;
|
|
96
|
+
export function drawColumnRuler({ ctx, numColumns, label, textColor, colWidth, trackHeight, offsetX, blockSize, }) {
|
|
97
|
+
const { xStart, xEnd } = visibleColRange({
|
|
98
|
+
offsetX,
|
|
99
|
+
blockWidth: blockSize,
|
|
100
|
+
colWidth,
|
|
101
|
+
});
|
|
102
|
+
const step = rulerStep(colWidth);
|
|
103
|
+
const end = Math.min(xEnd, numColumns);
|
|
104
|
+
setFontSize(ctx, RULER_FONT_SIZE);
|
|
105
|
+
ctx.textAlign = 'center';
|
|
106
|
+
ctx.textBaseline = 'alphabetic';
|
|
107
|
+
ctx.fillStyle = textColor;
|
|
108
|
+
ctx.strokeStyle = textColor;
|
|
109
|
+
ctx.lineWidth = 1;
|
|
110
|
+
for (let col = Math.ceil(xStart / step) * step; col < end; col += step) {
|
|
111
|
+
const text = label(col);
|
|
112
|
+
if (text === undefined) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const x = (col + 0.5) * colWidth;
|
|
116
|
+
ctx.fillText(text, x, trackHeight - TICK_HEIGHT - 2);
|
|
117
|
+
ctx.beginPath();
|
|
118
|
+
ctx.moveTo(x, trackHeight - TICK_HEIGHT);
|
|
119
|
+
ctx.lineTo(x, trackHeight);
|
|
120
|
+
ctx.stroke();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Cap height as a fraction of the font size, within a percent or two for the
|
|
124
|
+
// sans-serif faces both backends use. `measureText` reports no vertical box in
|
|
125
|
+
// the SVG export backend, so one constant ratio scales every logo letter, and
|
|
126
|
+
// the slices sum to the stack height.
|
|
62
127
|
const CAP_HEIGHT_RATIO = 0.72;
|
|
63
|
-
// letters below this many pixels are noise, and a stack that thin reads better
|
|
64
|
-
// as the bar chart it approximates
|
|
65
128
|
const MIN_LETTER_PX = 3;
|
|
66
129
|
export function drawSequenceLogo({ ctx, colStats, colorScheme, maxBits, textColor, colWidth, trackHeight, offsetX, blockSize, }) {
|
|
67
130
|
const { xStart, xEnd } = visibleColRange({
|
|
@@ -70,8 +133,8 @@ export function drawSequenceLogo({ ctx, colStats, colorScheme, maxBits, textColo
|
|
|
70
133
|
colWidth,
|
|
71
134
|
});
|
|
72
135
|
const end = Math.min(xEnd, colStats.numColumns);
|
|
73
|
-
// one reference size for
|
|
74
|
-
//
|
|
136
|
+
// one reference font size for the block; each letter's transform scales it to
|
|
137
|
+
// a height proportional to its frequency
|
|
75
138
|
const referenceFontSize = trackHeight;
|
|
76
139
|
setFontSize(ctx, referenceFontSize);
|
|
77
140
|
ctx.textAlign = 'left';
|
|
@@ -83,9 +146,7 @@ export function drawSequenceLogo({ ctx, colStats, colorScheme, maxBits, textColo
|
|
|
83
146
|
continue;
|
|
84
147
|
}
|
|
85
148
|
const x = col * colWidth;
|
|
86
|
-
//
|
|
87
|
-
// lands on top, which is the convention that makes a logo readable at a
|
|
88
|
-
// glance
|
|
149
|
+
// the stack is ascending, so the tallest letter lands on top
|
|
89
150
|
let bottom = trackHeight;
|
|
90
151
|
for (const { letter, bits } of stack) {
|
|
91
152
|
const h = (bits / maxBits) * trackHeight;
|
|
@@ -112,13 +173,13 @@ export function drawSequenceLogo({ ctx, colStats, colorScheme, maxBits, textColo
|
|
|
112
173
|
}
|
|
113
174
|
/**
|
|
114
175
|
* Draw one track's content into a block of the alignment's column space, at
|
|
115
|
-
* `offsetY` within the ctx. Owns the transform, so
|
|
116
|
-
*
|
|
117
|
-
*
|
|
176
|
+
* `offsetY` within the ctx. Owns the transform, so the live canvas blocks and
|
|
177
|
+
* the SVG export draw into the same coordinate space. A new track kind needs a
|
|
178
|
+
* `kind`, a draw function above, and a case here.
|
|
118
179
|
*/
|
|
119
|
-
export function drawTrackBlock({ model, ctx, track, offsetX, offsetY = 0, theme,
|
|
120
|
-
const { blockSize, bgColor, colWidth, colStats, colorScheme: modelColorScheme, fontSize, rowHeight, alphabetMaxBits, highResScaleFactor, } = model;
|
|
121
|
-
const { id, kind, height: trackHeight, barColor, customColorScheme, data, } = track.model;
|
|
180
|
+
export function drawTrackBlock({ model, ctx, track, offsetX, offsetY = 0, theme, blockSizeXOverride, highResScaleFactorOverride, }) {
|
|
181
|
+
const { blockSize, bgColor, colWidth, colStats, colorScheme: modelColorScheme, fontSize, rowHeight, showMsaLetters, alphabetMaxBits, highResScaleFactor, } = model;
|
|
182
|
+
const { id, kind, height: trackHeight, barColor, arcColor, arcs, customColorScheme, data, } = track.model;
|
|
122
183
|
const blockSizeX = blockSizeXOverride ?? blockSize;
|
|
123
184
|
const k = highResScaleFactorOverride ?? highResScaleFactor;
|
|
124
185
|
const textColor = theme.palette.text.primary;
|
|
@@ -138,6 +199,18 @@ export function drawTrackBlock({ model, ctx, track, offsetX, offsetY = 0, theme,
|
|
|
138
199
|
});
|
|
139
200
|
break;
|
|
140
201
|
}
|
|
202
|
+
case 'arc': {
|
|
203
|
+
drawArcs({
|
|
204
|
+
ctx,
|
|
205
|
+
arcs,
|
|
206
|
+
color: arcColor ?? theme.palette.text.primary,
|
|
207
|
+
colWidth,
|
|
208
|
+
trackHeight,
|
|
209
|
+
offsetX,
|
|
210
|
+
blockSize: blockSizeX,
|
|
211
|
+
});
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
141
214
|
case 'logo': {
|
|
142
215
|
drawSequenceLogo({
|
|
143
216
|
ctx,
|
|
@@ -152,16 +225,37 @@ export function drawTrackBlock({ model, ctx, track, offsetX, offsetY = 0, theme,
|
|
|
152
225
|
});
|
|
153
226
|
break;
|
|
154
227
|
}
|
|
228
|
+
case 'ruler': {
|
|
229
|
+
const { relativeTo, numColumns } = model;
|
|
230
|
+
drawColumnRuler({
|
|
231
|
+
ctx,
|
|
232
|
+
numColumns,
|
|
233
|
+
// with relativeTo set, number by the reference row's residues
|
|
234
|
+
label: relativeTo
|
|
235
|
+
? col => {
|
|
236
|
+
const pos = model.visibleColToSeqPosOneBased(relativeTo, col);
|
|
237
|
+
return pos === undefined ? undefined : `${pos}`;
|
|
238
|
+
}
|
|
239
|
+
: col => `${col + 1}`,
|
|
240
|
+
textColor,
|
|
241
|
+
colWidth,
|
|
242
|
+
trackHeight,
|
|
243
|
+
offsetX,
|
|
244
|
+
blockSize: blockSizeX,
|
|
245
|
+
});
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
155
248
|
case 'text': {
|
|
156
249
|
ctx.textAlign = 'center';
|
|
250
|
+
ctx.textBaseline = 'middle';
|
|
157
251
|
setFontSize(ctx, fontSize);
|
|
158
252
|
drawTextTrackContent({
|
|
159
253
|
ctx,
|
|
160
254
|
data,
|
|
161
255
|
colorScheme: customColorScheme ?? modelColorScheme,
|
|
162
|
-
|
|
256
|
+
contrastText: contrastTextFn(theme),
|
|
163
257
|
bgColor,
|
|
164
|
-
|
|
258
|
+
drawLetters: showMsaLetters,
|
|
165
259
|
colWidth,
|
|
166
260
|
rowHeight,
|
|
167
261
|
offsetX,
|
|
@@ -174,9 +268,9 @@ export function drawTrackBlock({ model, ctx, track, offsetX, offsetY = 0, theme,
|
|
|
174
268
|
}
|
|
175
269
|
/**
|
|
176
270
|
* Every turned-on track stacked top to bottom, for the SVG export. The live
|
|
177
|
-
* view draws the same content one canvas block at a time
|
|
271
|
+
* view draws the same content one canvas block at a time in TrackBlocks.
|
|
178
272
|
*/
|
|
179
|
-
export function renderAllTracks({ model, ctx, offsetX,
|
|
273
|
+
export function renderAllTracks({ model, ctx, offsetX, theme, blockSizeXOverride, highResScaleFactorOverride, }) {
|
|
180
274
|
let currentY = 0;
|
|
181
275
|
for (const track of model.turnedOnTracks) {
|
|
182
276
|
drawTrackBlock({
|
|
@@ -186,7 +280,6 @@ export function renderAllTracks({ model, ctx, offsetX, contrastScheme, theme, bl
|
|
|
186
280
|
offsetX,
|
|
187
281
|
offsetY: currentY,
|
|
188
282
|
theme,
|
|
189
|
-
contrastScheme,
|
|
190
283
|
blockSizeXOverride,
|
|
191
284
|
highResScaleFactorOverride,
|
|
192
285
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drawTracks.js","sourceRoot":"","sources":["../../../src/components/tracks/drawTracks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAQ3D,MAAM,UAAU,oBAAoB,CAAC,EACnC,GAAG,EACH,MAAM,EACN,KAAK,EACL,QAAQ,EACR,WAAW,EACX,OAAO,EACP,SAAS,GASV;IACC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,eAAe,CAAC;QACvC,OAAO;QACP,UAAU,EAAE,SAAS;QACrB,QAAQ;KACT,CAAC,CAAA;IAEF,GAAG,CAAC,SAAS,GAAG,KAAK,CAAA;IACrB,KAAK,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE,CAAA;QACxB,MAAM,SAAS,GAAG,KAAK,GAAG,WAAW,CAAA;QACrC,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAA;QACtB,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAA;IAC/D,CAAC;AACH,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"drawTracks.js","sourceRoot":"","sources":["../../../src/components/tracks/drawTracks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { MsaViewModel } from '../../model.ts';
|
|
2
|
+
import type React from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* Translates pointer events over a track's row into the hovered column and a
|
|
5
|
+
* tooltip anchor. The track shares the alignment's columns, so hovering it sets
|
|
6
|
+
* the model's mouse column too and the alignment's hover band follows along.
|
|
7
|
+
*
|
|
8
|
+
* `tooltip` off skips the anchor, so a track whose tooltip is turned off still
|
|
9
|
+
* drives the hover band without re-rendering on every mouse move.
|
|
10
|
+
*/
|
|
11
|
+
export declare function useTrackHover({ model, tooltip, }: {
|
|
12
|
+
model: MsaViewModel;
|
|
13
|
+
tooltip: boolean;
|
|
14
|
+
}): {
|
|
15
|
+
hover: {
|
|
16
|
+
col: number;
|
|
17
|
+
x: number;
|
|
18
|
+
y: number;
|
|
19
|
+
} | undefined;
|
|
20
|
+
onMouseMove: (event: React.MouseEvent, el: HTMLElement) => void;
|
|
21
|
+
onMouseLeave: () => void;
|
|
22
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Translates pointer events over a track's row into the hovered column and a
|
|
4
|
+
* tooltip anchor. The track shares the alignment's columns, so hovering it sets
|
|
5
|
+
* the model's mouse column too and the alignment's hover band follows along.
|
|
6
|
+
*
|
|
7
|
+
* `tooltip` off skips the anchor, so a track whose tooltip is turned off still
|
|
8
|
+
* drives the hover band without re-rendering on every mouse move.
|
|
9
|
+
*/
|
|
10
|
+
export function useTrackHover({ model, tooltip, }) {
|
|
11
|
+
const [hover, setHover] = useState();
|
|
12
|
+
// the blocks are laid out in column space and scrolled by a transform on
|
|
13
|
+
// their container, so the pointer's column comes off the untransformed row
|
|
14
|
+
function onMouseMove(event, el) {
|
|
15
|
+
const { colWidth, scrollX, numColumns } = model;
|
|
16
|
+
const { left } = el.getBoundingClientRect();
|
|
17
|
+
const col = Math.floor((event.clientX - left - scrollX) / colWidth);
|
|
18
|
+
const hit = col >= 0 && col < numColumns;
|
|
19
|
+
model.setMousePos(hit ? col : undefined, undefined);
|
|
20
|
+
if (tooltip) {
|
|
21
|
+
setHover(hit ? { col, x: event.clientX, y: event.clientY } : undefined);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function onMouseLeave() {
|
|
25
|
+
setHover(undefined);
|
|
26
|
+
model.setMousePos(undefined, undefined);
|
|
27
|
+
}
|
|
28
|
+
return { hover: tooltip ? hover : undefined, onMouseMove, onMouseLeave };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=useTrackHover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTrackHover.js","sourceRoot":"","sources":["../../../src/components/tracks/useTrackHover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAKhC;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,EAC5B,KAAK,EACL,OAAO,GAIR;IACC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAyC,CAAA;IAE3E,yEAAyE;IACzE,2EAA2E;IAC3E,SAAS,WAAW,CAAC,KAAuB,EAAE,EAAe;QAC3D,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,KAAK,CAAA;QAC/C,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAA;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAA;QACnE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,UAAU,CAAA;QACxC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QACnD,IAAI,OAAO,EAAE,CAAC;YACZ,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QACzE,CAAC;IACH,CAAC;IAED,SAAS,YAAY;QACnB,QAAQ,CAAC,SAAS,CAAC,CAAA;QACnB,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;IACzC,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,CAAA;AAC1E,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { MsaViewModel } from '../../model.ts';
|
|
3
|
+
/**
|
|
4
|
+
* The label of each bracket, in the gutter beside its bar, where the canvas
|
|
5
|
+
* draws the bar itself. The text is DOM text, turned on its side for a clade
|
|
6
|
+
* shorter than the font, the way the strip headers are; the SVG export draws
|
|
7
|
+
* the same labels with a `rotate(-90)`.
|
|
8
|
+
*/
|
|
9
|
+
declare const CladeLabels: ({ model }: {
|
|
10
|
+
model: MsaViewModel;
|
|
11
|
+
}) => React.JSX.Element | null;
|
|
12
|
+
export default CladeLabels;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useTheme } from '@mui/material';
|
|
3
|
+
import { observer } from 'mobx-react';
|
|
4
|
+
import { bracketGap, cladeHeight, cladeInGutter, cladeLabelHorizontal, cladeLabelOffset, } from './cladeBrackets.js';
|
|
5
|
+
/**
|
|
6
|
+
* The label of each bracket, in the gutter beside its bar, where the canvas
|
|
7
|
+
* draws the bar itself. The text is DOM text, turned on its side for a clade
|
|
8
|
+
* shorter than the font, the way the strip headers are; the SVG export draws
|
|
9
|
+
* the same labels with a `rotate(-90)`.
|
|
10
|
+
*/
|
|
11
|
+
const CladeLabels = observer(function ({ model }) {
|
|
12
|
+
const { resolvedClades, cladeGutterWidth, rowHeight, treeAreaWidth, fontSize, } = model;
|
|
13
|
+
const theme = useTheme();
|
|
14
|
+
if (cladeGutterWidth === 0) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const gutterLeft = treeAreaWidth - cladeGutterWidth;
|
|
18
|
+
return (React.createElement(React.Fragment, null, resolvedClades.map((clade, index) => {
|
|
19
|
+
const { label, markColor, rows } = clade;
|
|
20
|
+
if (!label || !cladeInGutter(clade)) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const left = gutterLeft + cladeLabelOffset(clade);
|
|
24
|
+
const horizontal = cladeLabelHorizontal(clade, rowHeight, fontSize);
|
|
25
|
+
return (React.createElement("div", { key: `${rows[0]}-${rows[1]}-${index}`, title: label, style: {
|
|
26
|
+
position: 'absolute',
|
|
27
|
+
left,
|
|
28
|
+
top: rows[0] * rowHeight,
|
|
29
|
+
width: treeAreaWidth - left - bracketGap,
|
|
30
|
+
height: cladeHeight(clade, rowHeight),
|
|
31
|
+
display: 'flex',
|
|
32
|
+
alignItems: 'center',
|
|
33
|
+
color: markColor ?? theme.palette.text.primary,
|
|
34
|
+
fontSize,
|
|
35
|
+
overflow: 'hidden',
|
|
36
|
+
textOverflow: 'ellipsis',
|
|
37
|
+
whiteSpace: 'nowrap',
|
|
38
|
+
pointerEvents: 'none',
|
|
39
|
+
// vertical-rl reads top to bottom, and the half turn makes it
|
|
40
|
+
// read upwards, which is what rotate(-90) exports
|
|
41
|
+
...(horizontal
|
|
42
|
+
? {}
|
|
43
|
+
: { writingMode: 'vertical-rl', transform: 'rotate(180deg)' }),
|
|
44
|
+
} }, label));
|
|
45
|
+
})));
|
|
46
|
+
});
|
|
47
|
+
export default CladeLabels;
|
|
48
|
+
//# sourceMappingURL=CladeLabels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CladeLabels.js","sourceRoot":"","sources":["../../../src/components/tree/CladeLabels.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,OAAO,EACL,UAAU,EACV,WAAW,EACX,aAAa,EACb,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,oBAAoB,CAAA;AAI3B;;;;;GAKG;AACH,MAAM,WAAW,GAAG,QAAQ,CAAC,UAAU,EAAE,KAAK,EAA2B;IACvE,MAAM,EACJ,cAAc,EACd,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,QAAQ,GACT,GAAG,KAAK,CAAA;IACT,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;IACxB,IAAI,gBAAgB,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,UAAU,GAAG,aAAa,GAAG,gBAAgB,CAAA;IACnD,OAAO,CACL,0CACG,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACnC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;QACxC,IAAI,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAA;QACjD,MAAM,UAAU,GAAG,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;QACnE,OAAO,CACL,6BACE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,EACrC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE;gBACL,QAAQ,EAAE,UAAU;gBACpB,IAAI;gBACJ,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS;gBACxB,KAAK,EAAE,aAAa,GAAG,IAAI,GAAG,UAAU;gBACxC,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC;gBACrC,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,QAAQ;gBACpB,KAAK,EAAE,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO;gBAC9C,QAAQ;gBACR,QAAQ,EAAE,QAAQ;gBAClB,YAAY,EAAE,UAAU;gBACxB,UAAU,EAAE,QAAQ;gBACpB,aAAa,EAAE,MAAM;gBACrB,8DAA8D;gBAC9D,kDAAkD;gBAClD,GAAG,CAAC,UAAU;oBACZ,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;aACjE,IAEA,KAAK,CACF,CACP,CAAA;IACH,CAAC,CAAC,CACD,CACJ,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,WAAW,CAAA"}
|