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.
Files changed (335) hide show
  1. package/README.md +11 -10
  2. package/bundle/index.js +122 -111
  3. package/bundle/index.js.map +4 -4
  4. package/dist/calculateBlocks.js +5 -3
  5. package/dist/calculateBlocks.js.map +1 -1
  6. package/dist/colorSchemes.js +1 -2
  7. package/dist/colorSchemes.js.map +1 -1
  8. package/dist/columnStats.d.ts +28 -0
  9. package/dist/columnStats.js +34 -0
  10. package/dist/columnStats.js.map +1 -0
  11. package/dist/components/DragHandle.d.ts +3 -2
  12. package/dist/components/DragHandle.js +11 -5
  13. package/dist/components/DragHandle.js.map +1 -1
  14. package/dist/components/Loading.js +2 -8
  15. package/dist/components/Loading.js.map +1 -1
  16. package/dist/components/MSAView.js +17 -6
  17. package/dist/components/MSAView.js.map +1 -1
  18. package/dist/components/MSAViewer.d.ts +64 -7
  19. package/dist/components/MSAViewer.js +128 -23
  20. package/dist/components/MSAViewer.js.map +1 -1
  21. package/dist/components/PortalTooltip.d.ts +11 -0
  22. package/dist/components/PortalTooltip.js +29 -0
  23. package/dist/components/PortalTooltip.js.map +1 -0
  24. package/dist/components/ResizeHandles.js +11 -29
  25. package/dist/components/ResizeHandles.js.map +1 -1
  26. package/dist/components/SequenceTextArea.js +3 -4
  27. package/dist/components/SequenceTextArea.js.map +1 -1
  28. package/dist/components/Track.js +43 -24
  29. package/dist/components/Track.js.map +1 -1
  30. package/dist/components/dialogs/AboutDialog.js +6 -6
  31. package/dist/components/dialogs/AboutDialog.js.map +1 -1
  32. package/dist/components/dialogs/AnnotationFileDialog.js +5 -2
  33. package/dist/components/dialogs/AnnotationFileDialog.js.map +1 -1
  34. package/dist/components/dialogs/ExportSVGDialog.js +6 -4
  35. package/dist/components/dialogs/ExportSVGDialog.js.map +1 -1
  36. package/dist/components/dialogs/FeatureDialog.js +8 -3
  37. package/dist/components/dialogs/FeatureDialog.js.map +1 -1
  38. package/dist/components/dialogs/TrackInfoDialog.js +1 -1
  39. package/dist/components/dialogs/TrackInfoDialog.js.map +1 -1
  40. package/dist/components/header/GappynessSlider.js +6 -11
  41. package/dist/components/header/GappynessSlider.js.map +1 -1
  42. package/dist/components/header/Header.js +4 -1
  43. package/dist/components/header/Header.js.map +1 -1
  44. package/dist/components/header/LoadWarnings.js +6 -23
  45. package/dist/components/header/LoadWarnings.js.map +1 -1
  46. package/dist/components/header/ScrollZoomIcons.d.ts +6 -0
  47. package/dist/components/header/ScrollZoomIcons.js +35 -0
  48. package/dist/components/header/ScrollZoomIcons.js.map +1 -0
  49. package/dist/components/header/TreeSettingsMenu.js +1 -3
  50. package/dist/components/header/TreeSettingsMenu.js.map +1 -1
  51. package/dist/components/header/UnshareableDataWarning.js +2 -4
  52. package/dist/components/header/UnshareableDataWarning.js.map +1 -1
  53. package/dist/components/header/ZoomControls.js +49 -6
  54. package/dist/components/header/ZoomControls.js.map +1 -1
  55. package/dist/components/header/getAnnotationsMenu.js +3 -6
  56. package/dist/components/header/getAnnotationsMenu.js.map +1 -1
  57. package/dist/components/header/settingsMenuItems.js +12 -9
  58. package/dist/components/header/settingsMenuItems.js.map +1 -1
  59. package/dist/components/import/ImportForm.js +1 -1
  60. package/dist/components/import/ImportForm.js.map +1 -1
  61. package/dist/components/import/util.js +1 -2
  62. package/dist/components/import/util.js.map +1 -1
  63. package/dist/components/minimap/Minimap.js +1 -2
  64. package/dist/components/minimap/Minimap.js.map +1 -1
  65. package/dist/components/msa/AnnotationLegend.js +27 -19
  66. package/dist/components/msa/AnnotationLegend.js.map +1 -1
  67. package/dist/components/msa/MSACanvas.js +2 -4
  68. package/dist/components/msa/MSACanvas.js.map +1 -1
  69. package/dist/components/msa/MSACanvasBlock.js +13 -15
  70. package/dist/components/msa/MSACanvasBlock.js.map +1 -1
  71. package/dist/components/msa/MSAMouseoverCanvas.js +2 -1
  72. package/dist/components/msa/MSAMouseoverCanvas.js.map +1 -1
  73. package/dist/components/msa/domainBandCursor.d.ts +7 -11
  74. package/dist/components/msa/domainBandCursor.js +7 -11
  75. package/dist/components/msa/domainBandCursor.js.map +1 -1
  76. package/dist/components/msa/drawFeatureSpans.d.ts +59 -0
  77. package/dist/components/msa/drawFeatureSpans.js +113 -0
  78. package/dist/components/msa/drawFeatureSpans.js.map +1 -0
  79. package/dist/components/msa/legendRows.d.ts +8 -0
  80. package/dist/components/msa/legendRows.js +16 -0
  81. package/dist/components/msa/legendRows.js.map +1 -0
  82. package/dist/components/msa/msaRaster.d.ts +24 -31
  83. package/dist/components/msa/msaRaster.js +30 -39
  84. package/dist/components/msa/msaRaster.js.map +1 -1
  85. package/dist/components/msa/packDomainLanes.d.ts +20 -0
  86. package/dist/components/msa/packDomainLanes.js +33 -0
  87. package/dist/components/msa/packDomainLanes.js.map +1 -0
  88. package/dist/components/msa/renderBoxFeatureCanvasBlock.d.ts +3 -1
  89. package/dist/components/msa/renderBoxFeatureCanvasBlock.js +50 -87
  90. package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -1
  91. package/dist/components/msa/renderHighlights.d.ts +15 -13
  92. package/dist/components/msa/renderHighlights.js +43 -20
  93. package/dist/components/msa/renderHighlights.js.map +1 -1
  94. package/dist/components/msa/renderMSABlock.js +12 -12
  95. package/dist/components/msa/renderMSABlock.js.map +1 -1
  96. package/dist/components/msa/tileColor.js +4 -7
  97. package/dist/components/msa/tileColor.js.map +1 -1
  98. package/dist/components/msa/useMsaBlockMouse.d.ts +5 -3
  99. package/dist/components/msa/useMsaBlockMouse.js +6 -6
  100. package/dist/components/msa/useMsaBlockMouse.js.map +1 -1
  101. package/dist/components/rowpanels/RowPanelBlock.d.ts +9 -0
  102. package/dist/components/rowpanels/RowPanelBlock.js +86 -0
  103. package/dist/components/rowpanels/RowPanelBlock.js.map +1 -0
  104. package/dist/components/rowpanels/RowPanelHeaders.d.ts +12 -0
  105. package/dist/components/rowpanels/RowPanelHeaders.js +38 -0
  106. package/dist/components/rowpanels/RowPanelHeaders.js.map +1 -0
  107. package/dist/components/{msa/ColumnStats.d.ts → rowpanels/RowPanels.d.ts} +2 -2
  108. package/dist/components/rowpanels/RowPanels.js +32 -0
  109. package/dist/components/rowpanels/RowPanels.js.map +1 -0
  110. package/dist/components/rowpanels/headerLayout.d.ts +1 -0
  111. package/dist/components/rowpanels/headerLayout.js +5 -0
  112. package/dist/components/rowpanels/headerLayout.js.map +1 -0
  113. package/dist/components/rowpanels/renderFeaturePanel.d.ts +21 -0
  114. package/dist/components/rowpanels/renderFeaturePanel.js +37 -0
  115. package/dist/components/rowpanels/renderFeaturePanel.js.map +1 -0
  116. package/dist/components/rowpanels/renderRowPanel.d.ts +23 -0
  117. package/dist/components/rowpanels/renderRowPanel.js +22 -0
  118. package/dist/components/rowpanels/renderRowPanel.js.map +1 -0
  119. package/dist/components/rowpanels/renderStrip.d.ts +20 -0
  120. package/dist/components/rowpanels/renderStrip.js +26 -0
  121. package/dist/components/rowpanels/renderStrip.js.map +1 -0
  122. package/dist/components/tracks/TrackBlocks.js +3 -5
  123. package/dist/components/tracks/TrackBlocks.js.map +1 -1
  124. package/dist/components/tracks/TrackTooltipContent.d.ts +15 -0
  125. package/dist/components/tracks/TrackTooltipContent.js +109 -0
  126. package/dist/components/tracks/TrackTooltipContent.js.map +1 -0
  127. package/dist/components/tracks/drawTracks.d.ts +4 -4
  128. package/dist/components/tracks/drawTracks.js +25 -39
  129. package/dist/components/tracks/drawTracks.js.map +1 -1
  130. package/dist/components/tracks/useTrackHover.d.ts +22 -0
  131. package/dist/components/tracks/useTrackHover.js +30 -0
  132. package/dist/components/tracks/useTrackHover.js.map +1 -0
  133. package/dist/components/tree/CladeLabels.d.ts +12 -0
  134. package/dist/components/tree/CladeLabels.js +48 -0
  135. package/dist/components/tree/CladeLabels.js.map +1 -0
  136. package/dist/components/tree/TreeBranchMenu.js +1 -1
  137. package/dist/components/tree/TreeBranchMenu.js.map +1 -1
  138. package/dist/components/tree/TreeCanvas.js +5 -4
  139. package/dist/components/tree/TreeCanvas.js.map +1 -1
  140. package/dist/components/tree/TreeCanvasBlock.js +4 -21
  141. package/dist/components/tree/TreeCanvasBlock.js.map +1 -1
  142. package/dist/components/tree/TreeNodeMenu.js +1 -1
  143. package/dist/components/tree/TreeNodeMenu.js.map +1 -1
  144. package/dist/components/tree/TreeOverview.d.ts +14 -0
  145. package/dist/components/tree/TreeOverview.js +75 -0
  146. package/dist/components/tree/TreeOverview.js.map +1 -0
  147. package/dist/components/tree/TreeRuler.js +9 -13
  148. package/dist/components/tree/TreeRuler.js.map +1 -1
  149. package/dist/components/tree/cladeBrackets.d.ts +25 -0
  150. package/dist/components/tree/cladeBrackets.js +51 -0
  151. package/dist/components/tree/cladeBrackets.js.map +1 -0
  152. package/dist/components/tree/dialogs/TreeNodeInfoDialog.js +2 -2
  153. package/dist/components/tree/dialogs/TreeNodeInfoDialog.js.map +1 -1
  154. package/dist/components/tree/renderTreeCanvas.js +160 -25
  155. package/dist/components/tree/renderTreeCanvas.js.map +1 -1
  156. package/dist/components/tree/renderTreeOverview.d.ts +52 -0
  157. package/dist/components/tree/renderTreeOverview.js +138 -0
  158. package/dist/components/tree/renderTreeOverview.js.map +1 -0
  159. package/dist/components/tree/useTreeHover.js +2 -4
  160. package/dist/components/tree/useTreeHover.js.map +1 -1
  161. package/dist/constants.d.ts +16 -0
  162. package/dist/constants.js +52 -22
  163. package/dist/constants.js.map +1 -1
  164. package/dist/createPaletteMap.d.ts +7 -6
  165. package/dist/createPaletteMap.js +10 -9
  166. package/dist/createPaletteMap.js.map +1 -1
  167. package/dist/element.d.ts +13 -0
  168. package/dist/element.js +269 -0
  169. package/dist/element.js.map +1 -0
  170. package/dist/featureFields.d.ts +11 -0
  171. package/dist/featureFields.js +17 -0
  172. package/dist/featureFields.js.map +1 -0
  173. package/dist/flatToTree.js +1 -2
  174. package/dist/flatToTree.js.map +1 -1
  175. package/dist/ggplotPalettes.d.ts +10 -0
  176. package/dist/ggplotPalettes.js +58 -0
  177. package/dist/ggplotPalettes.js.map +1 -1
  178. package/dist/hierarchy.d.ts +27 -0
  179. package/dist/hierarchy.js +66 -9
  180. package/dist/hierarchy.js.map +1 -1
  181. package/dist/index.d.ts +9 -1
  182. package/dist/index.js +5 -3
  183. package/dist/index.js.map +1 -1
  184. package/dist/model/DataModel.js +2 -5
  185. package/dist/model/DataModel.js.map +1 -1
  186. package/dist/model/msaModel.d.ts +3 -2
  187. package/dist/model/msaModel.js +3 -2
  188. package/dist/model/msaModel.js.map +1 -1
  189. package/dist/model/treeModel.d.ts +30 -0
  190. package/dist/model/treeModel.js +37 -1
  191. package/dist/model/treeModel.js.map +1 -1
  192. package/dist/model.d.ts +549 -294
  193. package/dist/model.js +1412 -621
  194. package/dist/model.js.map +1 -1
  195. package/dist/mount.d.ts +11 -0
  196. package/dist/mount.js +22 -0
  197. package/dist/mount.js.map +1 -0
  198. package/dist/neighborJoining.js +8 -32
  199. package/dist/neighborJoining.js.map +1 -1
  200. package/dist/renderToStaticMarkup.d.ts +10 -19
  201. package/dist/renderToStaticMarkup.js +13 -24
  202. package/dist/renderToStaticMarkup.js.map +1 -1
  203. package/dist/renderToSvg.js +180 -56
  204. package/dist/renderToSvg.js.map +1 -1
  205. package/dist/rowCoordinateCalculations.d.ts +4 -6
  206. package/dist/rowCoordinateCalculations.js +4 -6
  207. package/dist/rowCoordinateCalculations.js.map +1 -1
  208. package/dist/scales.d.ts +22 -0
  209. package/dist/scales.js +30 -0
  210. package/dist/scales.js.map +1 -0
  211. package/dist/seqPosToGlobalCol.d.ts +2 -3
  212. package/dist/seqPosToGlobalCol.js +2 -3
  213. package/dist/seqPosToGlobalCol.js.map +1 -1
  214. package/dist/sequenceLogo.d.ts +6 -11
  215. package/dist/sequenceLogo.js +6 -11
  216. package/dist/sequenceLogo.js.map +1 -1
  217. package/dist/stripDefault.d.ts +7 -14
  218. package/dist/stripDefault.js +7 -14
  219. package/dist/stripDefault.js.map +1 -1
  220. package/dist/svgTestUtil.d.ts +186 -70
  221. package/dist/types.d.ts +221 -21
  222. package/dist/umd.d.ts +2 -0
  223. package/dist/umd.js +4 -2
  224. package/dist/umd.js.map +1 -1
  225. package/dist/useCanvasAutorun.d.ts +5 -10
  226. package/dist/useCanvasAutorun.js +5 -10
  227. package/dist/useCanvasAutorun.js.map +1 -1
  228. package/dist/useMsaSvgFigure.d.ts +20 -0
  229. package/dist/useMsaSvgFigure.js +46 -0
  230. package/dist/useMsaSvgFigure.js.map +1 -0
  231. package/dist/useWheelScroll.js +0 -4
  232. package/dist/useWheelScroll.js.map +1 -1
  233. package/dist/util.d.ts +5 -6
  234. package/dist/util.js +13 -6
  235. package/dist/util.js.map +1 -1
  236. package/dist/version.d.ts +1 -1
  237. package/dist/version.js +1 -1
  238. package/package.json +19 -12
  239. package/src/calculateBlocks.ts +5 -3
  240. package/src/colorSchemes.ts +1 -2
  241. package/src/columnStats.ts +58 -0
  242. package/src/components/DragHandle.tsx +18 -7
  243. package/src/components/Loading.tsx +4 -36
  244. package/src/components/MSAView.tsx +19 -5
  245. package/src/components/MSAViewer.tsx +240 -28
  246. package/src/components/PortalTooltip.tsx +47 -0
  247. package/src/components/ResizeHandles.tsx +17 -32
  248. package/src/components/SequenceTextArea.tsx +3 -4
  249. package/src/components/Track.tsx +57 -19
  250. package/src/components/dialogs/AboutDialog.tsx +35 -6
  251. package/src/components/dialogs/AnnotationFileDialog.tsx +10 -1
  252. package/src/components/dialogs/ExportSVGDialog.tsx +8 -3
  253. package/src/components/dialogs/FeatureDialog.tsx +11 -3
  254. package/src/components/dialogs/TrackInfoDialog.tsx +1 -1
  255. package/src/components/header/GappynessSlider.tsx +6 -11
  256. package/src/components/header/Header.tsx +7 -1
  257. package/src/components/header/LoadWarnings.tsx +11 -25
  258. package/src/components/header/ScrollZoomIcons.tsx +52 -0
  259. package/src/components/header/TreeSettingsMenu.tsx +1 -3
  260. package/src/components/header/UnshareableDataWarning.tsx +2 -4
  261. package/src/components/header/ZoomControls.tsx +74 -14
  262. package/src/components/header/getAnnotationsMenu.ts +3 -6
  263. package/src/components/header/settingsMenuItems.ts +13 -8
  264. package/src/components/import/ImportForm.tsx +3 -5
  265. package/src/components/import/ImportFormExamples.tsx +2 -2
  266. package/src/components/import/util.ts +1 -2
  267. package/src/components/minimap/Minimap.tsx +1 -2
  268. package/src/components/msa/AnnotationLegend.tsx +48 -38
  269. package/src/components/msa/MSACanvas.tsx +3 -8
  270. package/src/components/msa/MSACanvasBlock.tsx +13 -16
  271. package/src/components/msa/MSAMouseoverCanvas.tsx +2 -1
  272. package/src/components/msa/domainBandCursor.ts +7 -11
  273. package/src/components/msa/drawFeatureSpans.ts +205 -0
  274. package/src/components/msa/legendRows.ts +24 -0
  275. package/src/components/msa/msaRaster.ts +30 -39
  276. package/src/components/msa/packDomainLanes.ts +36 -0
  277. package/src/components/msa/renderBoxFeatureCanvasBlock.ts +67 -123
  278. package/src/components/msa/renderHighlights.ts +53 -20
  279. package/src/components/msa/renderMSABlock.ts +14 -11
  280. package/src/components/msa/tileColor.ts +4 -7
  281. package/src/components/msa/useMsaBlockMouse.ts +6 -6
  282. package/src/components/rowpanels/RowPanelBlock.tsx +139 -0
  283. package/src/components/rowpanels/RowPanelHeaders.tsx +57 -0
  284. package/src/components/rowpanels/RowPanels.tsx +77 -0
  285. package/src/components/rowpanels/headerLayout.ts +5 -0
  286. package/src/components/rowpanels/renderFeaturePanel.ts +66 -0
  287. package/src/components/rowpanels/renderRowPanel.ts +41 -0
  288. package/src/components/rowpanels/renderStrip.ts +46 -0
  289. package/src/components/tracks/TrackBlocks.tsx +3 -5
  290. package/src/components/tracks/TrackTooltipContent.tsx +156 -0
  291. package/src/components/tracks/drawTracks.ts +25 -50
  292. package/src/components/tracks/useTrackHover.ts +42 -0
  293. package/src/components/tree/CladeLabels.tsx +77 -0
  294. package/src/components/tree/TreeBranchMenu.tsx +1 -2
  295. package/src/components/tree/TreeCanvas.tsx +2 -3
  296. package/src/components/tree/TreeCanvasBlock.tsx +8 -32
  297. package/src/components/tree/TreeNodeMenu.tsx +1 -2
  298. package/src/components/tree/TreeOverview.tsx +106 -0
  299. package/src/components/tree/TreeRuler.tsx +11 -22
  300. package/src/components/tree/cladeBrackets.ts +73 -0
  301. package/src/components/tree/dialogs/TreeNodeInfoDialog.tsx +2 -2
  302. package/src/components/tree/renderTreeCanvas.ts +242 -21
  303. package/src/components/tree/renderTreeOverview.ts +212 -0
  304. package/src/components/tree/useTreeHover.ts +2 -4
  305. package/src/constants.ts +61 -22
  306. package/src/createPaletteMap.ts +10 -9
  307. package/src/element.ts +321 -0
  308. package/src/featureFields.ts +19 -0
  309. package/src/flatToTree.ts +1 -2
  310. package/src/ggplotPalettes.ts +60 -0
  311. package/src/hierarchy.ts +77 -9
  312. package/src/index.ts +31 -7
  313. package/src/model/DataModel.ts +2 -5
  314. package/src/model/msaModel.ts +3 -2
  315. package/src/model/treeModel.ts +42 -0
  316. package/src/model.ts +1677 -643
  317. package/src/mount.tsx +32 -0
  318. package/src/neighborJoining.ts +8 -32
  319. package/src/renderToStaticMarkup.ts +13 -24
  320. package/src/renderToSvg.tsx +335 -68
  321. package/src/rowCoordinateCalculations.ts +4 -6
  322. package/src/scales.ts +47 -0
  323. package/src/seqPosToGlobalCol.ts +2 -3
  324. package/src/sequenceLogo.ts +6 -11
  325. package/src/stripDefault.ts +7 -14
  326. package/src/types.ts +260 -45
  327. package/src/umd.ts +4 -2
  328. package/src/useCanvasAutorun.ts +5 -10
  329. package/src/useMsaSvgFigure.ts +72 -0
  330. package/src/useWheelScroll.ts +0 -4
  331. package/src/util.ts +15 -6
  332. package/src/version.ts +1 -1
  333. package/dist/components/msa/ColumnStats.js +0 -42
  334. package/dist/components/msa/ColumnStats.js.map +0 -1
  335. 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": "7.0.0",
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": ">=2.0.0",
31
- "@jbrowse/mobx-state-tree": ">=5.0.0",
32
- "@mui/icons-material": ">=5.0.0",
33
- "@mui/material": ">=5.0.0",
34
- "mobx": ">=6.0.0",
35
- "mobx-react": ">=9.0.0",
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
- "@types/node": "^26.1.2",
42
- "esbuild": "^0.28.1"
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": "7.0.0",
47
- "colord": "^2.9.3",
53
+ "@jbrowse/svgcanvas": "8.1.0",
54
+ "colord": "^2.10.0",
48
55
  "flatbush": "^4.6.2",
49
- "msa-parsers": "7.0.0"
56
+ "msa-parsers": "8.1.0"
50
57
  },
51
58
  "scripts": {
52
59
  "clean": "rimraf dist bundle",
@@ -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 the
4
- // viewport rather than leaving a gap.
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.floor((clamped + viewportSize - 1) / blockSize)
20
+ const maxTile = Math.ceil(end / blockSize) - 1
19
21
 
20
22
  const blocks = []
21
23
  for (let tile = minTile; tile <= maxTile; tile++) {
@@ -16,8 +16,7 @@ const dna = {
16
16
  U: red[500],
17
17
  }
18
18
 
19
- // annotated rather than asserted: the wide type is what lets a free-string
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: 'rgba(200,200,200)',
30
- fillHovered: 'rgba(150,150,150)',
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
- <svg
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
- // Ahead of the spinner, because a failed load KEEPS its filehandle --
113
- // only an abort clears it. So hasPendingFilehandle stays true, this
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
- <TreeRuler model={model} />
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 } = model
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} />