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.
Files changed (414) hide show
  1. package/README.md +13 -11
  2. package/bundle/index.js +122 -112
  3. package/bundle/index.js.map +4 -4
  4. package/dist/colorSchemes.js +1 -2
  5. package/dist/colorSchemes.js.map +1 -1
  6. package/dist/columnStats.d.ts +28 -0
  7. package/dist/columnStats.js +34 -0
  8. package/dist/columnStats.js.map +1 -0
  9. package/dist/components/DragHandle.d.ts +3 -2
  10. package/dist/components/DragHandle.js +11 -5
  11. package/dist/components/DragHandle.js.map +1 -1
  12. package/dist/components/Loading.js +2 -2
  13. package/dist/components/Loading.js.map +1 -1
  14. package/dist/components/MSAView.js +17 -6
  15. package/dist/components/MSAView.js.map +1 -1
  16. package/dist/components/MSAViewer.d.ts +69 -4
  17. package/dist/components/MSAViewer.js +201 -8
  18. package/dist/components/MSAViewer.js.map +1 -1
  19. package/dist/components/PortalTooltip.d.ts +11 -0
  20. package/dist/components/PortalTooltip.js +29 -0
  21. package/dist/components/PortalTooltip.js.map +1 -0
  22. package/dist/components/ResizeHandles.d.ts +3 -3
  23. package/dist/components/ResizeHandles.js +13 -24
  24. package/dist/components/ResizeHandles.js.map +1 -1
  25. package/dist/components/SequenceTextArea.js +3 -3
  26. package/dist/components/SequenceTextArea.js.map +1 -1
  27. package/dist/components/Track.js +41 -22
  28. package/dist/components/Track.js.map +1 -1
  29. package/dist/components/dialogs/{InterProScanDialog.d.ts → AnnotationFileDialog.d.ts} +2 -2
  30. package/dist/components/dialogs/AnnotationFileDialog.js +92 -0
  31. package/dist/components/dialogs/AnnotationFileDialog.js.map +1 -0
  32. package/dist/components/dialogs/ExportSVGDialog.js +5 -3
  33. package/dist/components/dialogs/ExportSVGDialog.js.map +1 -1
  34. package/dist/components/dialogs/FeatureDialog.js +13 -9
  35. package/dist/components/dialogs/FeatureDialog.js.map +1 -1
  36. package/dist/components/dialogs/TrackInfoDialog.js +1 -1
  37. package/dist/components/dialogs/TrackInfoDialog.js.map +1 -1
  38. package/dist/components/header/GappynessSlider.js +6 -11
  39. package/dist/components/header/GappynessSlider.js.map +1 -1
  40. package/dist/components/header/Header.js +7 -0
  41. package/dist/components/header/Header.js.map +1 -1
  42. package/dist/components/header/HeaderStatusArea.js +0 -2
  43. package/dist/components/header/HeaderStatusArea.js.map +1 -1
  44. package/dist/components/header/LoadWarnings.d.ts +6 -0
  45. package/dist/components/header/LoadWarnings.js +35 -0
  46. package/dist/components/header/LoadWarnings.js.map +1 -0
  47. package/dist/components/header/MultiAlignmentSelector.js +0 -0
  48. package/dist/components/header/MultiAlignmentSelector.js.map +1 -1
  49. package/dist/components/header/ScrollZoomIcons.d.ts +6 -0
  50. package/dist/components/header/ScrollZoomIcons.js +35 -0
  51. package/dist/components/header/ScrollZoomIcons.js.map +1 -0
  52. package/dist/components/header/TreeSettingsMenu.js +7 -1
  53. package/dist/components/header/TreeSettingsMenu.js.map +1 -1
  54. package/dist/components/header/UnshareableDataWarning.d.ts +6 -0
  55. package/dist/components/header/UnshareableDataWarning.js +40 -0
  56. package/dist/components/header/UnshareableDataWarning.js.map +1 -0
  57. package/dist/components/header/ZoomControls.js +49 -6
  58. package/dist/components/header/ZoomControls.js.map +1 -1
  59. package/dist/components/header/getAnnotationsMenu.js +11 -14
  60. package/dist/components/header/getAnnotationsMenu.js.map +1 -1
  61. package/dist/components/header/settingsMenuItems.js +10 -7
  62. package/dist/components/header/settingsMenuItems.js.map +1 -1
  63. package/dist/components/import/ImportForm.js +1 -1
  64. package/dist/components/import/ImportForm.js.map +1 -1
  65. package/dist/components/import/ImportFormExamples.js +2 -6
  66. package/dist/components/import/ImportFormExamples.js.map +1 -1
  67. package/dist/components/import/util.js +2 -0
  68. package/dist/components/import/util.js.map +1 -1
  69. package/dist/components/minimap/Minimap.js +1 -2
  70. package/dist/components/minimap/Minimap.js.map +1 -1
  71. package/dist/components/msa/AnnotationLegend.js +27 -19
  72. package/dist/components/msa/AnnotationLegend.js.map +1 -1
  73. package/dist/components/msa/MSACanvas.js +1 -1
  74. package/dist/components/msa/MSACanvas.js.map +1 -1
  75. package/dist/components/msa/MSACanvasBlock.js +17 -20
  76. package/dist/components/msa/MSACanvasBlock.js.map +1 -1
  77. package/dist/components/msa/MSAMouseoverCanvas.js +2 -1
  78. package/dist/components/msa/MSAMouseoverCanvas.js.map +1 -1
  79. package/dist/components/msa/domainBandCursor.d.ts +7 -11
  80. package/dist/components/msa/domainBandCursor.js +7 -11
  81. package/dist/components/msa/domainBandCursor.js.map +1 -1
  82. package/dist/components/msa/drawFeatureSpans.d.ts +53 -0
  83. package/dist/components/msa/drawFeatureSpans.js +78 -0
  84. package/dist/components/msa/drawFeatureSpans.js.map +1 -0
  85. package/dist/components/msa/legendRows.d.ts +8 -0
  86. package/dist/components/msa/legendRows.js +16 -0
  87. package/dist/components/msa/legendRows.js.map +1 -0
  88. package/dist/components/msa/msaRaster.d.ts +30 -27
  89. package/dist/components/msa/msaRaster.js +193 -90
  90. package/dist/components/msa/msaRaster.js.map +1 -1
  91. package/dist/components/msa/packDomainLanes.d.ts +20 -0
  92. package/dist/components/msa/packDomainLanes.js +33 -0
  93. package/dist/components/msa/packDomainLanes.js.map +1 -0
  94. package/dist/components/msa/renderBoxFeatureCanvasBlock.d.ts +3 -1
  95. package/dist/components/msa/renderBoxFeatureCanvasBlock.js +51 -87
  96. package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -1
  97. package/dist/components/msa/renderHighlights.d.ts +44 -4
  98. package/dist/components/msa/renderHighlights.js +99 -11
  99. package/dist/components/msa/renderHighlights.js.map +1 -1
  100. package/dist/components/msa/renderMSABlock.d.ts +1 -2
  101. package/dist/components/msa/renderMSABlock.js +28 -31
  102. package/dist/components/msa/renderMSABlock.js.map +1 -1
  103. package/dist/components/msa/renderMSAMouseover.js +9 -30
  104. package/dist/components/msa/renderMSAMouseover.js.map +1 -1
  105. package/dist/components/msa/tileColor.js +4 -7
  106. package/dist/components/msa/tileColor.js.map +1 -1
  107. package/dist/components/msa/useMsaBlockMouse.d.ts +5 -3
  108. package/dist/components/msa/useMsaBlockMouse.js +6 -6
  109. package/dist/components/msa/useMsaBlockMouse.js.map +1 -1
  110. package/dist/components/renderCtx.d.ts +1 -1
  111. package/dist/components/rowpanels/RowPanelBlock.d.ts +9 -0
  112. package/dist/components/rowpanels/RowPanelBlock.js +86 -0
  113. package/dist/components/rowpanels/RowPanelBlock.js.map +1 -0
  114. package/dist/components/rowpanels/RowPanelHeaders.d.ts +12 -0
  115. package/dist/components/rowpanels/RowPanelHeaders.js +38 -0
  116. package/dist/components/rowpanels/RowPanelHeaders.js.map +1 -0
  117. package/dist/components/{msa/ColumnStats.d.ts → rowpanels/RowPanels.d.ts} +2 -2
  118. package/dist/components/rowpanels/RowPanels.js +32 -0
  119. package/dist/components/rowpanels/RowPanels.js.map +1 -0
  120. package/dist/components/rowpanels/headerLayout.d.ts +1 -0
  121. package/dist/components/rowpanels/headerLayout.js +5 -0
  122. package/dist/components/rowpanels/headerLayout.js.map +1 -0
  123. package/dist/components/rowpanels/renderFeaturePanel.d.ts +21 -0
  124. package/dist/components/rowpanels/renderFeaturePanel.js +37 -0
  125. package/dist/components/rowpanels/renderFeaturePanel.js.map +1 -0
  126. package/dist/components/rowpanels/renderRowPanel.d.ts +23 -0
  127. package/dist/components/rowpanels/renderRowPanel.js +22 -0
  128. package/dist/components/rowpanels/renderRowPanel.js.map +1 -0
  129. package/dist/components/rowpanels/renderStrip.d.ts +20 -0
  130. package/dist/components/rowpanels/renderStrip.js +26 -0
  131. package/dist/components/rowpanels/renderStrip.js.map +1 -0
  132. package/dist/components/tracks/TrackBlocks.js +13 -16
  133. package/dist/components/tracks/TrackBlocks.js.map +1 -1
  134. package/dist/components/tracks/TrackTooltipContent.d.ts +15 -0
  135. package/dist/components/tracks/TrackTooltipContent.js +109 -0
  136. package/dist/components/tracks/TrackTooltipContent.js.map +1 -0
  137. package/dist/components/tracks/drawTracks.d.ts +30 -12
  138. package/dist/components/tracks/drawTracks.js +127 -34
  139. package/dist/components/tracks/drawTracks.js.map +1 -1
  140. package/dist/components/tracks/useTrackHover.d.ts +22 -0
  141. package/dist/components/tracks/useTrackHover.js +30 -0
  142. package/dist/components/tracks/useTrackHover.js.map +1 -0
  143. package/dist/components/tree/CladeLabels.d.ts +12 -0
  144. package/dist/components/tree/CladeLabels.js +48 -0
  145. package/dist/components/tree/CladeLabels.js.map +1 -0
  146. package/dist/components/tree/TreeCanvas.js +6 -4
  147. package/dist/components/tree/TreeCanvas.js.map +1 -1
  148. package/dist/components/tree/TreeCanvasBlock.js +6 -21
  149. package/dist/components/tree/TreeCanvasBlock.js.map +1 -1
  150. package/dist/components/tree/TreeOverview.d.ts +14 -0
  151. package/dist/components/tree/TreeOverview.js +75 -0
  152. package/dist/components/tree/TreeOverview.js.map +1 -0
  153. package/dist/components/tree/TreeRuler.js +11 -5
  154. package/dist/components/tree/TreeRuler.js.map +1 -1
  155. package/dist/components/tree/cladeBrackets.d.ts +25 -0
  156. package/dist/components/tree/cladeBrackets.js +51 -0
  157. package/dist/components/tree/cladeBrackets.js.map +1 -0
  158. package/dist/components/tree/dialogs/TreeNodeInfoDialog.js +2 -2
  159. package/dist/components/tree/dialogs/TreeNodeInfoDialog.js.map +1 -1
  160. package/dist/components/tree/renderTreeCanvas.d.ts +0 -1
  161. package/dist/components/tree/renderTreeCanvas.js +221 -47
  162. package/dist/components/tree/renderTreeCanvas.js.map +1 -1
  163. package/dist/components/tree/renderTreeOverview.d.ts +52 -0
  164. package/dist/components/tree/renderTreeOverview.js +138 -0
  165. package/dist/components/tree/renderTreeOverview.js.map +1 -0
  166. package/dist/components/tree/scaleBar.d.ts +10 -0
  167. package/dist/components/tree/scaleBar.js +24 -0
  168. package/dist/components/tree/scaleBar.js.map +1 -0
  169. package/dist/components/tree/useTreeHover.js +2 -4
  170. package/dist/components/tree/useTreeHover.js.map +1 -1
  171. package/dist/constants.d.ts +18 -1
  172. package/dist/constants.js +51 -8
  173. package/dist/constants.js.map +1 -1
  174. package/dist/createPaletteMap.d.ts +7 -6
  175. package/dist/createPaletteMap.js +10 -9
  176. package/dist/createPaletteMap.js.map +1 -1
  177. package/dist/element.d.ts +13 -0
  178. package/dist/element.js +269 -0
  179. package/dist/element.js.map +1 -0
  180. package/dist/featureFields.d.ts +11 -0
  181. package/dist/featureFields.js +17 -0
  182. package/dist/featureFields.js.map +1 -0
  183. package/dist/fetchUtils.d.ts +7 -7
  184. package/dist/fetchUtils.js +4 -32
  185. package/dist/fetchUtils.js.map +1 -1
  186. package/dist/flatToTree.js +1 -2
  187. package/dist/flatToTree.js.map +1 -1
  188. package/dist/ggplotPalettes.d.ts +10 -0
  189. package/dist/ggplotPalettes.js +58 -0
  190. package/dist/ggplotPalettes.js.map +1 -1
  191. package/dist/hierarchy.d.ts +29 -1
  192. package/dist/hierarchy.js +82 -19
  193. package/dist/hierarchy.js.map +1 -1
  194. package/dist/index.d.ts +10 -1
  195. package/dist/index.js +10 -2
  196. package/dist/index.js.map +1 -1
  197. package/dist/model/DataModel.js +4 -4
  198. package/dist/model/DataModel.js.map +1 -1
  199. package/dist/model/msaModel.d.ts +3 -2
  200. package/dist/model/msaModel.js +3 -2
  201. package/dist/model/msaModel.js.map +1 -1
  202. package/dist/model/treeModel.d.ts +30 -0
  203. package/dist/model/treeModel.js +37 -1
  204. package/dist/model/treeModel.js.map +1 -1
  205. package/dist/model.d.ts +792 -259
  206. package/dist/model.js +2092 -675
  207. package/dist/model.js.map +1 -1
  208. package/dist/mount.d.ts +11 -0
  209. package/dist/mount.js +22 -0
  210. package/dist/mount.js.map +1 -0
  211. package/dist/neighborJoining.js +8 -32
  212. package/dist/neighborJoining.js.map +1 -1
  213. package/dist/renderToStaticMarkup.d.ts +15 -13
  214. package/dist/renderToStaticMarkup.js +37 -25
  215. package/dist/renderToStaticMarkup.js.map +1 -1
  216. package/dist/renderToSvg.js +198 -68
  217. package/dist/renderToSvg.js.map +1 -1
  218. package/dist/rowCoordinateCalculations.d.ts +26 -28
  219. package/dist/rowCoordinateCalculations.js +13 -39
  220. package/dist/rowCoordinateCalculations.js.map +1 -1
  221. package/dist/scales.d.ts +22 -0
  222. package/dist/scales.js +30 -0
  223. package/dist/scales.js.map +1 -0
  224. package/dist/seqPosToGlobalCol.d.ts +2 -3
  225. package/dist/seqPosToGlobalCol.js +5 -4
  226. package/dist/seqPosToGlobalCol.js.map +1 -1
  227. package/dist/sequenceLogo.d.ts +6 -11
  228. package/dist/sequenceLogo.js +6 -11
  229. package/dist/sequenceLogo.js.map +1 -1
  230. package/dist/stripDefault.d.ts +7 -14
  231. package/dist/stripDefault.js +7 -14
  232. package/dist/stripDefault.js.map +1 -1
  233. package/dist/svgTestUtil.d.ts +306 -124
  234. package/dist/types.d.ts +295 -3
  235. package/dist/umd.d.ts +2 -0
  236. package/dist/umd.js +4 -2
  237. package/dist/umd.js.map +1 -1
  238. package/dist/useCanvasAutorun.d.ts +5 -10
  239. package/dist/useCanvasAutorun.js +5 -10
  240. package/dist/useCanvasAutorun.js.map +1 -1
  241. package/dist/useMsaSvgFigure.d.ts +20 -0
  242. package/dist/useMsaSvgFigure.js +46 -0
  243. package/dist/useMsaSvgFigure.js.map +1 -0
  244. package/dist/util.d.ts +10 -4
  245. package/dist/util.js +37 -10
  246. package/dist/util.js.map +1 -1
  247. package/dist/version.d.ts +1 -1
  248. package/dist/version.js +1 -1
  249. package/dist/wuss.d.ts +14 -0
  250. package/dist/wuss.js +55 -0
  251. package/dist/wuss.js.map +1 -0
  252. package/package.json +23 -14
  253. package/src/colorSchemes.ts +1 -2
  254. package/src/columnStats.ts +58 -0
  255. package/src/components/DragHandle.tsx +18 -7
  256. package/src/components/Loading.tsx +14 -8
  257. package/src/components/MSAView.tsx +19 -5
  258. package/src/components/MSAViewer.tsx +326 -10
  259. package/src/components/PortalTooltip.tsx +47 -0
  260. package/src/components/ResizeHandles.tsx +21 -36
  261. package/src/components/SequenceTextArea.tsx +3 -3
  262. package/src/components/Track.tsx +55 -18
  263. package/src/components/dialogs/AnnotationFileDialog.tsx +162 -0
  264. package/src/components/dialogs/ExportSVGDialog.tsx +7 -2
  265. package/src/components/dialogs/FeatureDialog.tsx +13 -9
  266. package/src/components/dialogs/TrackInfoDialog.tsx +1 -1
  267. package/src/components/header/GappynessSlider.tsx +6 -11
  268. package/src/components/header/Header.tsx +10 -0
  269. package/src/components/header/HeaderStatusArea.tsx +0 -5
  270. package/src/components/header/LoadWarnings.tsx +48 -0
  271. package/src/components/header/MultiAlignmentSelector.tsx +0 -0
  272. package/src/components/header/ScrollZoomIcons.tsx +52 -0
  273. package/src/components/header/TreeSettingsMenu.tsx +7 -1
  274. package/src/components/header/UnshareableDataWarning.tsx +56 -0
  275. package/src/components/header/ZoomControls.tsx +74 -14
  276. package/src/components/header/getAnnotationsMenu.ts +13 -17
  277. package/src/components/header/settingsMenuItems.ts +11 -6
  278. package/src/components/import/ImportForm.tsx +2 -2
  279. package/src/components/import/ImportFormExamples.tsx +4 -8
  280. package/src/components/import/util.ts +2 -0
  281. package/src/components/minimap/Minimap.tsx +1 -2
  282. package/src/components/msa/AnnotationLegend.tsx +48 -38
  283. package/src/components/msa/MSACanvas.tsx +3 -5
  284. package/src/components/msa/MSACanvasBlock.tsx +17 -21
  285. package/src/components/msa/MSAMouseoverCanvas.tsx +2 -1
  286. package/src/components/msa/domainBandCursor.ts +7 -11
  287. package/src/components/msa/drawFeatureSpans.ts +150 -0
  288. package/src/components/msa/legendRows.ts +24 -0
  289. package/src/components/msa/msaRaster.ts +236 -88
  290. package/src/components/msa/packDomainLanes.ts +36 -0
  291. package/src/components/msa/renderBoxFeatureCanvasBlock.ts +69 -123
  292. package/src/components/msa/renderHighlights.ts +141 -10
  293. package/src/components/msa/renderMSABlock.ts +29 -38
  294. package/src/components/msa/renderMSAMouseover.ts +9 -39
  295. package/src/components/msa/tileColor.ts +4 -7
  296. package/src/components/msa/useMsaBlockMouse.ts +6 -6
  297. package/src/components/renderCtx.ts +1 -0
  298. package/src/components/rowpanels/RowPanelBlock.tsx +139 -0
  299. package/src/components/rowpanels/RowPanelHeaders.tsx +57 -0
  300. package/src/components/rowpanels/RowPanels.tsx +77 -0
  301. package/src/components/rowpanels/headerLayout.ts +5 -0
  302. package/src/components/rowpanels/renderFeaturePanel.ts +66 -0
  303. package/src/components/rowpanels/renderRowPanel.ts +41 -0
  304. package/src/components/rowpanels/renderStrip.ts +46 -0
  305. package/src/components/tracks/TrackBlocks.tsx +13 -18
  306. package/src/components/tracks/TrackTooltipContent.tsx +156 -0
  307. package/src/components/tracks/drawTracks.ts +169 -38
  308. package/src/components/tracks/useTrackHover.ts +42 -0
  309. package/src/components/tree/CladeLabels.tsx +77 -0
  310. package/src/components/tree/TreeCanvas.tsx +4 -3
  311. package/src/components/tree/TreeCanvasBlock.tsx +10 -32
  312. package/src/components/tree/TreeOverview.tsx +106 -0
  313. package/src/components/tree/TreeRuler.tsx +29 -5
  314. package/src/components/tree/cladeBrackets.ts +73 -0
  315. package/src/components/tree/dialogs/TreeNodeInfoDialog.tsx +2 -2
  316. package/src/components/tree/renderTreeCanvas.ts +312 -48
  317. package/src/components/tree/renderTreeOverview.ts +212 -0
  318. package/src/components/tree/scaleBar.ts +23 -0
  319. package/src/components/tree/useTreeHover.ts +2 -4
  320. package/src/constants.ts +61 -8
  321. package/src/createPaletteMap.ts +10 -9
  322. package/src/element.ts +321 -0
  323. package/src/featureFields.ts +19 -0
  324. package/src/fetchUtils.ts +7 -40
  325. package/src/flatToTree.ts +1 -2
  326. package/src/ggplotPalettes.ts +60 -0
  327. package/src/hierarchy.ts +97 -20
  328. package/src/index.ts +46 -6
  329. package/src/model/DataModel.ts +5 -4
  330. package/src/model/msaModel.ts +3 -2
  331. package/src/model/treeModel.ts +42 -0
  332. package/src/model.ts +2492 -793
  333. package/src/mount.tsx +32 -0
  334. package/src/neighborJoining.ts +8 -32
  335. package/src/rawImports.d.ts +9 -0
  336. package/src/renderToStaticMarkup.ts +41 -25
  337. package/src/renderToSvg.tsx +365 -92
  338. package/src/rowCoordinateCalculations.ts +16 -62
  339. package/src/scales.ts +47 -0
  340. package/src/seqPosToGlobalCol.ts +5 -4
  341. package/src/sequenceLogo.ts +6 -11
  342. package/src/stripDefault.ts +7 -14
  343. package/src/types.ts +352 -12
  344. package/src/umd.ts +4 -2
  345. package/src/useCanvasAutorun.ts +5 -10
  346. package/src/useMsaSvgFigure.ts +72 -0
  347. package/src/util.ts +40 -14
  348. package/src/version.ts +1 -1
  349. package/src/wuss.ts +62 -0
  350. package/dist/components/dialogs/InterProScanDialog.js +0 -137
  351. package/dist/components/dialogs/InterProScanDialog.js.map +0 -1
  352. package/dist/components/dialogs/InterProScanFileDialog.d.ts +0 -7
  353. package/dist/components/dialogs/InterProScanFileDialog.js +0 -64
  354. package/dist/components/dialogs/InterProScanFileDialog.js.map +0 -1
  355. package/dist/components/msa/ColumnStats.js +0 -42
  356. package/dist/components/msa/ColumnStats.js.map +0 -1
  357. package/dist/launchInterProScan.d.ts +0 -13
  358. package/dist/launchInterProScan.js +0 -110
  359. package/dist/launchInterProScan.js.map +0 -1
  360. package/dist/useColorContrast.d.ts +0 -10
  361. package/dist/useColorContrast.js +0 -13
  362. package/dist/useColorContrast.js.map +0 -1
  363. package/src/clustalX.test.ts +0 -74
  364. package/src/colSpace.test.ts +0 -67
  365. package/src/collapseLogic.test.ts +0 -115
  366. package/src/colorSchemes.docs.test.ts +0 -57
  367. package/src/columnCounts.test.ts +0 -73
  368. package/src/columnStats.test.ts +0 -94
  369. package/src/columnTracks.test.ts +0 -97
  370. package/src/components/dialogs/InterProScanDialog.tsx +0 -214
  371. package/src/components/dialogs/InterProScanFileDialog.tsx +0 -138
  372. package/src/components/minimap/minimapLayout.test.ts +0 -71
  373. package/src/components/msa/ColumnStats.tsx +0 -54
  374. package/src/components/msa/msaRaster.test.ts +0 -145
  375. package/src/components/msa/renderBoxFeatureCanvasBlock.test.ts +0 -51
  376. package/src/components/tree/renderTreeCanvas.test.ts +0 -296
  377. package/src/dataInitialized.test.ts +0 -42
  378. package/src/domainBands.test.ts +0 -122
  379. package/src/domainLetterColor.test.ts +0 -80
  380. package/src/exportFileName.test.ts +0 -40
  381. package/src/fetchUtils.test.ts +0 -83
  382. package/src/flatToTree.test.ts +0 -51
  383. package/src/hierarchy.test.ts +0 -228
  384. package/src/highlights.test.ts +0 -70
  385. package/src/impgRender.test.tsx +0 -68
  386. package/src/largeTree.test.ts +0 -67
  387. package/src/launchInterProScan.ts +0 -167
  388. package/src/loadErrorDisplay.test.tsx +0 -102
  389. package/src/modelFilehandleLoaders.test.ts +0 -137
  390. package/src/modelReset.test.ts +0 -120
  391. package/src/neighborJoining.test.ts +0 -164
  392. package/src/parseAsn1.test.ts +0 -36
  393. package/src/propertyConservation.test.ts +0 -36
  394. package/src/renderColumnTracksSvg.test.tsx +0 -108
  395. package/src/renderDomainsSvg.test.tsx +0 -118
  396. package/src/renderHighlightsSvg.test.tsx +0 -85
  397. package/src/renderMinimapSvg.test.tsx +0 -62
  398. package/src/renderRasterSvg.test.tsx +0 -144
  399. package/src/renderSequenceLogoSvg.test.tsx +0 -165
  400. package/src/renderToSvg.test.tsx +0 -65
  401. package/src/reset.test.ts +0 -61
  402. package/src/rowCoordinateCalculations.test.ts +0 -211
  403. package/src/rowSpace.test.ts +0 -46
  404. package/src/segmentOverlay.test.ts +0 -70
  405. package/src/seqPosToGlobalCol.test.ts +0 -59
  406. package/src/sequenceLogo.test.ts +0 -88
  407. package/src/setFontSize.test.ts +0 -33
  408. package/src/stripDefault.test.ts +0 -48
  409. package/src/stripDefaultSnapshot.test.ts +0 -87
  410. package/src/treeMetadata.test.ts +0 -39
  411. package/src/useCanvasAutorun.test.tsx +0 -98
  412. package/src/useColorContrast.ts +0 -18
  413. package/src/viewChrome.test.tsx +0 -134
  414. package/src/wheelZoom.test.ts +0 -46
@@ -1,98 +1,62 @@
1
- import { subFeatureRowHeight } from '../../constants.js';
1
+ import { domainUnderlineHeight, subFeatureRowHeight } from '../../constants.js';
2
+ import { contrastTextFn } from '../../util.js';
2
3
  import { getVisibleLeaves } from '../getVisibleLeaves.js';
3
- export function renderBoxFeatureCanvasBlock({ model, offsetX, offsetY, ctx, highResScaleFactorOverride, blockSizeXOverride, blockSizeYOverride, }) {
4
- const { blockSize, rowHeight, highResScaleFactor, actuallyShowDomains } = model;
5
- if (actuallyShowDomains) {
6
- const k = highResScaleFactorOverride ?? highResScaleFactor;
7
- const bx = blockSizeXOverride ?? blockSize;
8
- const by = blockSizeYOverride ?? blockSize;
9
- ctx.resetTransform();
10
- ctx.scale(k, k);
11
- ctx.translate(-offsetX, rowHeight / 2 - offsetY);
12
- drawTiles({
13
- model,
14
- ctx,
15
- visibleLeaves: getVisibleLeaves({ model, offsetY, blockSizeY: by }),
16
- offsetX,
17
- blockWidth: bx,
18
- });
4
+ import { drawFeatureSpans, spanRows } from './drawFeatureSpans.js';
5
+ export function renderBoxFeatureCanvasBlock({ model, theme, offsetX, offsetY, ctx, highResScaleFactorOverride, blockSizeXOverride, blockSizeYOverride, }) {
6
+ const { blockSize, rowHeight, highResScaleFactor, actuallyShowDomains, subFeatureRows, colWidth, featureColors, featureLabels, segmentLabels, showMsaLetters, domainUnderline, domainBands, } = model;
7
+ if (!actuallyShowDomains) {
8
+ return;
19
9
  }
20
- }
21
- function drawTiles({ model, ctx, visibleLeaves, offsetX, blockWidth, }) {
22
- const { subFeatureRows, colWidth, rowHeight, fillPalette, strokePalette, segmentLabels, showMsaLetters, domainBands, } = model;
23
- const h = subFeatureRows ? subFeatureRowHeight : rowHeight;
10
+ const k = highResScaleFactorOverride ?? highResScaleFactor;
11
+ const bx = blockSizeXOverride ?? blockSize;
12
+ const by = blockSizeYOverride ?? blockSize;
13
+ ctx.resetTransform();
14
+ ctx.scale(k, k);
15
+ ctx.translate(-offsetX, rowHeight / 2 - offsetY);
16
+ // the plain and underline modes give every band the same height; a sub-row
17
+ // band is thinner, and how thin depends on how many lanes its row needs
18
+ const barHeight = domainUnderline
19
+ ? Math.min(domainUnderlineHeight, rowHeight)
20
+ : rowHeight;
24
21
  // exon numbers label the bands only when residue letters aren't drawn (zoomed
25
22
  // out); when letters show, the alternating shades alone mark the boundaries
26
- // and a number would collide with the sequence
27
- const drawSegmentLabels = !showMsaLetters && !subFeatureRows && h >= 9;
28
- // gene arrow heads stick out one row-height past the band, so pad the cull
29
- // window enough that a band just outside the block still draws its head
30
- const cull = h + colWidth;
31
- const xMin = offsetX - cull;
32
- const xMax = offsetX + blockWidth + cull;
23
+ // and a number would collide with the sequence. A featureLabel encoding names
24
+ // what every span carries instead
25
+ const drawSegmentLabels = !featureLabels && !showMsaLetters && !subFeatureRows && barHeight >= 9;
33
26
  // a segment (exon) number labels its band once per block, on the topmost
34
27
  // visible row carrying that segment, so it reads as a column header for the
35
28
  // whole band. Keyed by accession rather than drawn on row 0, because the rows
36
29
  // carrying the gene model are often not the first ones in the alignment
37
30
  const labelled = drawSegmentLabels ? new Set() : undefined;
38
- for (const node of visibleLeaves) {
39
- const y = node.x;
40
- const bands = domainBands.get(node.data.name);
41
- if (bands) {
42
- for (const { annotation, startCol, endCol, stackIndex } of bands) {
43
- const { accession, strand } = annotation;
44
- const x = startCol * colWidth;
45
- const lw = colWidth * (endCol - startCol);
46
- if (x + lw >= xMin && x <= xMax) {
47
- const t = y - rowHeight + (subFeatureRows ? stackIndex * h : 0);
48
- ctx.fillStyle = fillPalette[accession];
49
- ctx.strokeStyle = strokePalette[accession];
50
- if (strand === undefined) {
51
- ctx.fillRect(x, t, lw, h);
52
- ctx.strokeRect(x, t, lw, h);
53
- const label = labelled && !labelled.has(accession)
54
- ? segmentLabels.get(accession)
55
- : undefined;
56
- if (label !== undefined) {
57
- const fontSize = Math.min(h - 2, 11);
58
- ctx.font = `${fontSize}px sans-serif`;
59
- if (ctx.measureText(label).width + 2 <= lw) {
60
- labelled.add(accession);
61
- ctx.fillStyle = '#222';
62
- ctx.textAlign = 'center';
63
- ctx.textBaseline = 'middle';
64
- ctx.fillText(label, x + lw / 2, t + h / 2);
65
- }
66
- }
67
- }
68
- else {
69
- drawGeneArrow({ ctx, x, t, w: lw, h, strand });
70
- }
71
- }
72
- }
73
- }
74
- }
75
- }
76
- // A gene arrow: a full-width rectangular body spanning the feature's
77
- // start..end columns, plus a triangular head that points *beyond* that end in
78
- // the strand direction (right for +, left for -). Keeping the body aligned to
79
- // the exact start/end columns means + and - strand features read as having the
80
- // same boundaries; the arrow lives outside them purely to show transcription
81
- // direction, preserving the column-by-column homology down the rows.
82
- function drawGeneArrow({ ctx, x, t, w, h, strand, }) {
83
- // body spans bodyStart..bodyEnd (the exact columns); the head extends one
84
- // row-height past bodyEnd in the strand direction
85
- const dir = strand > 0 ? 1 : -1;
86
- const bodyStart = strand > 0 ? x : x + w;
87
- const bodyEnd = strand > 0 ? x + w : x;
88
- ctx.beginPath();
89
- ctx.moveTo(bodyStart, t);
90
- ctx.lineTo(bodyEnd, t);
91
- ctx.lineTo(bodyEnd + dir * h, t + h / 2);
92
- ctx.lineTo(bodyEnd, t + h);
93
- ctx.lineTo(bodyStart, t + h);
94
- ctx.closePath();
95
- ctx.fill();
96
- ctx.stroke();
31
+ // gene arrow heads stick out up to a row height past the band, so pad the
32
+ // cull window enough that a band just outside the block still draws its head
33
+ const cull = rowHeight + colWidth;
34
+ drawFeatureSpans({
35
+ ctx,
36
+ rows: spanRows(getVisibleLeaves({ model, offsetY, blockSizeY: by }), domainBands),
37
+ layout: {
38
+ // sub-rows are thin, but a row whose lanes would spill onto the row below
39
+ // shares out the row height between them instead
40
+ height: laneCount => subFeatureRows
41
+ ? Math.min(subFeatureRowHeight, rowHeight / laneCount)
42
+ : barHeight,
43
+ top: (y, lane, h) => y -
44
+ rowHeight +
45
+ (subFeatureRows ? lane * h : domainUnderline ? rowHeight - h : 0),
46
+ // the head keeps its full size on an underline bar, since a head as short
47
+ // as the bar reads as a nub rather than as a direction
48
+ headLength: h => (domainUnderline ? rowHeight / 2 : h),
49
+ },
50
+ xOf: band => [band.startCol * colWidth, band.endCol * colWidth],
51
+ colors: featureColors,
52
+ labelOf: band => featureLabels?.get(band.annotation) ??
53
+ (labelled && !labelled.has(band.annotation.accession)
54
+ ? segmentLabels.get(band.annotation.accession)
55
+ : undefined),
56
+ labelDrawn: band => labelled?.add(band.annotation.accession),
57
+ contrastText: contrastTextFn(theme),
58
+ xMin: offsetX - cull,
59
+ xMax: offsetX + bx + cull,
60
+ });
97
61
  }
98
62
  //# sourceMappingURL=renderBoxFeatureCanvasBlock.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderBoxFeatureCanvasBlock.js","sourceRoot":"","sources":["../../../src/components/msa/renderBoxFeatureCanvasBlock.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renderBoxFeatureCanvasBlock.js","sourceRoot":"","sources":["../../../src/components/msa/renderBoxFeatureCanvasBlock.ts"],"names":[],"mappings":"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"}
@@ -5,20 +5,45 @@ export declare const highlightFill = "rgba(255,140,0,0.28)";
5
5
  export declare const highlightBorder = "rgba(210,90,0,0.95)";
6
6
  export declare const highlightRowFill = "rgba(255,140,0,0.18)";
7
7
  export declare const labelFontSize = 11;
8
- export declare function drawHighlightLabel({ ctx, theme, label, x, y, spanWidth, }: {
8
+ export declare const highlightLabelHeight: number;
9
+ export interface LabelBox {
10
+ left: number;
11
+ right: number;
12
+ top: number;
13
+ bottom: number;
14
+ }
15
+ /**
16
+ * A highlight's label, over its band where it fits and beside it where it does
17
+ * not, kept inside `bounds` and out of the way of the labels already placed.
18
+ *
19
+ * `bounds` keeps the label of a band scrolled partly off the left edge visible.
20
+ * With `placed`, a label that would overlap an earlier one, as two
21
+ * single-residue highlights a column apart do, steps down a row.
22
+ */
23
+ export declare function drawHighlightLabel({ ctx, theme, label, x, y, spanWidth, bounds, placed, }: {
9
24
  ctx: RenderCtx;
10
25
  theme: Theme;
11
26
  label: string;
12
27
  x: number;
13
28
  y: number;
14
29
  spanWidth: number;
30
+ bounds?: {
31
+ min: number;
32
+ max: number;
33
+ };
34
+ placed?: LabelBox[];
15
35
  }): void;
16
36
  /**
17
- * The persistent `highlights` overlay on the alignment: row tints, bordered
18
- * column bands, and a label above each band. `offsetX`/`offsetY` are the
19
- * content coordinates at the canvas origin, the convention renderMSABlock
37
+ * The persistent overlay on the alignment: the band behind each clade of
38
+ * `clades`, the `rowTint` encoding's wash, the row tints and bordered column
39
+ * bands of `highlights`, and a label above each band. `offsetX`/`offsetY` are
40
+ * the content coordinates at the canvas origin, the convention renderMSABlock
20
41
  * uses, so the live overlay passes -scrollX/-scrollY and the export passes its
21
42
  * layout offsets.
43
+ *
44
+ * Rows are culled to the ones this block covers. A tint over every row of a
45
+ * large alignment would otherwise draw the whole column of rects in each block,
46
+ * and again on every pointer move through renderMouseover.
22
47
  */
23
48
  export declare function renderHighlights({ ctx, model, theme, offsetX, offsetY, width, height, }: {
24
49
  ctx: RenderCtx;
@@ -29,3 +54,18 @@ export declare function renderHighlights({ ctx, model, theme, offsetX, offsetY,
29
54
  width: number;
30
55
  height: number;
31
56
  }): void;
57
+ /**
58
+ * The overlay parts that come from the snapshot: the reference row's tint, a
59
+ * bordered band per run of highlighted columns, and the `highlights` layer. The
60
+ * live overlay draws these under its hover and click bands; the SVG export
61
+ * draws only these.
62
+ */
63
+ export declare function renderPersistentHighlights({ ctx, model, theme, offsetX, offsetY, width, height, }: {
64
+ ctx: RenderCtx;
65
+ model: MsaViewModel;
66
+ theme: Theme;
67
+ offsetX: number;
68
+ offsetY: number;
69
+ width: number;
70
+ height: number;
71
+ }): void;
@@ -1,34 +1,90 @@
1
1
  import { setFontSize } from '../../setFontSize.js';
2
+ import { referenceColor } from '../overlayColors.js';
3
+ // a fill plus a solid border; the hover wash alone is invisible over clustalx
4
+ // coloring
2
5
  export const highlightFill = 'rgba(255,140,0,0.28)';
3
6
  export const highlightBorder = 'rgba(210,90,0,0.95)';
4
7
  export const highlightRowFill = 'rgba(255,140,0,0.18)';
5
8
  export const labelFontSize = 11;
6
9
  const labelPad = 3;
7
- export function drawHighlightLabel({ ctx, theme, label, x, y, spanWidth, }) {
10
+ // the label box above a highlight band; tree blocks also check rows this far
11
+ // outside themselves
12
+ export const highlightLabelHeight = labelFontSize + labelPad * 2;
13
+ /**
14
+ * A highlight's label, over its band where it fits and beside it where it does
15
+ * not, kept inside `bounds` and out of the way of the labels already placed.
16
+ *
17
+ * `bounds` keeps the label of a band scrolled partly off the left edge visible.
18
+ * With `placed`, a label that would overlap an earlier one, as two
19
+ * single-residue highlights a column apart do, steps down a row.
20
+ */
21
+ export function drawHighlightLabel({ ctx, theme, label, x, y, spanWidth, bounds, placed, }) {
8
22
  setFontSize(ctx, labelFontSize);
9
23
  ctx.textAlign = 'start';
10
24
  const boxWidth = ctx.measureText(label).width + labelPad * 2;
11
- const boxHeight = labelFontSize + labelPad * 2;
12
- const left = boxWidth <= spanWidth ? x : x + spanWidth + 2;
25
+ const boxHeight = highlightLabelHeight;
26
+ let left = boxWidth <= spanWidth ? x : x + spanWidth + 2;
27
+ if (bounds) {
28
+ left = Math.max(bounds.min, Math.min(left, bounds.max - boxWidth));
29
+ }
30
+ let top = y;
31
+ if (placed) {
32
+ const overlaps = (box) => box.left < left + boxWidth &&
33
+ box.right > left &&
34
+ box.top < top + boxHeight &&
35
+ box.bottom > top;
36
+ while (placed.some(overlaps)) {
37
+ top += boxHeight;
38
+ }
39
+ placed.push({ left, right: left + boxWidth, top, bottom: top + boxHeight });
40
+ }
13
41
  ctx.fillStyle = theme.palette.background.paper;
14
- ctx.fillRect(left, y, boxWidth, boxHeight);
42
+ ctx.fillRect(left, top, boxWidth, boxHeight);
15
43
  ctx.fillStyle = theme.palette.text.primary;
16
- ctx.fillText(label, left + labelPad, y + labelPad + labelFontSize - 2);
44
+ ctx.fillText(label, left + labelPad, top + labelPad + labelFontSize - 2);
17
45
  }
18
46
  /**
19
- * The persistent `highlights` overlay on the alignment: row tints, bordered
20
- * column bands, and a label above each band. `offsetX`/`offsetY` are the
21
- * content coordinates at the canvas origin, the convention renderMSABlock
47
+ * The persistent overlay on the alignment: the band behind each clade of
48
+ * `clades`, the `rowTint` encoding's wash, the row tints and bordered column
49
+ * bands of `highlights`, and a label above each band. `offsetX`/`offsetY` are
50
+ * the content coordinates at the canvas origin, the convention renderMSABlock
22
51
  * uses, so the live overlay passes -scrollX/-scrollY and the export passes its
23
52
  * layout offsets.
53
+ *
54
+ * Rows are culled to the ones this block covers. A tint over every row of a
55
+ * large alignment would otherwise draw the whole column of rects in each block,
56
+ * and again on every pointer move through renderMouseover.
24
57
  */
25
58
  export function renderHighlights({ ctx, model, theme, offsetX, offsetY, width, height, }) {
26
- const { resolvedHighlights, colWidth, rowHeight } = model;
59
+ const { resolvedClades, resolvedHighlights, rowTints, colWidth, rowHeight } = model;
60
+ const placed = [];
27
61
  ctx.lineWidth = 2;
62
+ const firstRow = Math.max(0, Math.floor(offsetY / rowHeight));
63
+ const lastRow = Math.ceil((offsetY + height) / rowHeight);
64
+ const fillRow = (index) => {
65
+ ctx.fillRect(0, index * rowHeight - offsetY, width, rowHeight);
66
+ };
67
+ for (const { rows, color, mark } of resolvedClades) {
68
+ if (mark === 'highlight' && rows[1] >= firstRow && rows[0] <= lastRow) {
69
+ ctx.fillStyle = color;
70
+ ctx.fillRect(0, rows[0] * rowHeight - offsetY, width, (rows[1] - rows[0] + 1) * rowHeight);
71
+ }
72
+ }
73
+ if (rowTints) {
74
+ for (let index = firstRow; index <= Math.min(lastRow, rowTints.length - 1); index++) {
75
+ const color = rowTints[index];
76
+ if (color) {
77
+ ctx.fillStyle = color;
78
+ fillRow(index);
79
+ }
80
+ }
81
+ }
28
82
  for (const { rowIndices, color } of resolvedHighlights) {
29
83
  ctx.fillStyle = color ?? highlightRowFill;
30
84
  for (const index of rowIndices) {
31
- ctx.fillRect(0, index * rowHeight - offsetY, width, rowHeight);
85
+ if (index >= firstRow && index <= lastRow) {
86
+ fillRow(index);
87
+ }
32
88
  }
33
89
  }
34
90
  for (const { startCol, endCol, label, color } of resolvedHighlights) {
@@ -42,8 +98,40 @@ export function renderHighlights({ ctx, model, theme, offsetX, offsetY, width, h
42
98
  ctx.strokeStyle = color ?? highlightBorder;
43
99
  ctx.strokeRect(x, 0, spanWidth, height);
44
100
  if (label) {
45
- drawHighlightLabel({ ctx, theme, label, x, y: 0, spanWidth });
101
+ drawHighlightLabel({
102
+ ctx,
103
+ theme,
104
+ label,
105
+ x,
106
+ y: 0,
107
+ spanWidth,
108
+ bounds: { min: 0, max: width },
109
+ placed,
110
+ });
46
111
  }
47
112
  }
48
113
  }
114
+ /**
115
+ * The overlay parts that come from the snapshot: the reference row's tint, a
116
+ * bordered band per run of highlighted columns, and the `highlights` layer. The
117
+ * live overlay draws these under its hover and click bands; the SVG export
118
+ * draws only these.
119
+ */
120
+ export function renderPersistentHighlights({ ctx, model, theme, offsetX, offsetY, width, height, }) {
121
+ const { colWidth, rowHeight, referenceRowIndex, highlightedColumnRuns } = model;
122
+ if (referenceRowIndex !== undefined) {
123
+ ctx.fillStyle = referenceColor;
124
+ ctx.fillRect(0, referenceRowIndex * rowHeight - offsetY, width, rowHeight);
125
+ }
126
+ ctx.lineWidth = 2;
127
+ for (const { start, end } of highlightedColumnRuns) {
128
+ const x = start * colWidth - offsetX;
129
+ const w = (end - start + 1) * colWidth;
130
+ ctx.fillStyle = highlightFill;
131
+ ctx.fillRect(x, 0, w, height);
132
+ ctx.strokeStyle = highlightBorder;
133
+ ctx.strokeRect(x, 0, w, height);
134
+ }
135
+ renderHighlights({ ctx, model, theme, offsetX, offsetY, width, height });
136
+ }
49
137
  //# sourceMappingURL=renderHighlights.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderHighlights.js","sourceRoot":"","sources":["../../../src/components/msa/renderHighlights.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renderHighlights.js","sourceRoot":"","sources":["../../../src/components/msa/renderHighlights.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,11 @@
1
1
  import type { MsaViewModel } from '../../model.ts';
2
2
  import type { RenderCtx } from '../renderCtx.ts';
3
3
  import type { Theme } from '@mui/material';
4
- export declare function renderMSABlock({ model, offsetX, offsetY, contrastScheme, ctx, theme, highResScaleFactorOverride, blockSizeXOverride, blockSizeYOverride, rasterTiles, }: {
4
+ export declare function renderMSABlock({ model, offsetX, offsetY, ctx, theme, highResScaleFactorOverride, blockSizeXOverride, blockSizeYOverride, rasterTiles, }: {
5
5
  offsetX: number;
6
6
  offsetY: number;
7
7
  theme: Theme;
8
8
  model: MsaViewModel;
9
- contrastScheme: Record<string, string>;
10
9
  ctx: RenderCtx;
11
10
  highResScaleFactorOverride?: number;
12
11
  blockSizeXOverride?: number;
@@ -1,10 +1,10 @@
1
1
  import { setFontSize } from '../../setFontSize.js';
2
- import { adjustColorForContrast } from '../../util.js';
2
+ import { adjustColorForContrast, contrastTextFn } from '../../util.js';
3
3
  import { getVisibleLeaves } from '../getVisibleLeaves.js';
4
4
  import { domainBandCursor } from './domainBandCursor.js';
5
5
  import { tileColorFn } from './tileColor.js';
6
6
  import { visibleColRange } from './visibleColRange.js';
7
- export function renderMSABlock({ model, offsetX, offsetY, contrastScheme, ctx, theme, highResScaleFactorOverride, blockSizeXOverride, blockSizeYOverride, rasterTiles, }) {
7
+ export function renderMSABlock({ model, offsetX, offsetY, ctx, theme, highResScaleFactorOverride, blockSizeXOverride, blockSizeYOverride, rasterTiles, }) {
8
8
  const { colWidth, blockSize, rowHeight, fontSize, highResScaleFactor, actuallyShowDomains, bgColor, } = model;
9
9
  const k = highResScaleFactorOverride ?? highResScaleFactor;
10
10
  const bx = blockSizeXOverride ?? blockSize;
@@ -29,7 +29,6 @@ export function renderMSABlock({ model, offsetX, offsetY, contrastScheme, ctx, t
29
29
  model,
30
30
  ctx,
31
31
  theme,
32
- contrastScheme,
33
32
  xStart,
34
33
  xEnd,
35
34
  visibleLeaves,
@@ -50,35 +49,28 @@ export function renderMSABlock({ model, offsetX, offsetY, contrastScheme, ctx, t
50
49
  });
51
50
  ctx.resetTransform();
52
51
  }
53
- // Letter color to use over a domain box, keyed by accession. Domain fills come
54
- // from a categorical palette that has no fixed lightness, so ask the theme for a
55
- // readable text color per fill instead of assuming dark-on-light.
56
- function domainLetterColors(model, theme) {
57
- return new Map(Object.entries(model.fillPalette).map(([accession, fill]) => [
58
- accession,
59
- theme.palette.getContrastText(fill),
60
- ]));
61
- }
62
- function drawTilesAndText({ model, ctx, theme, contrastScheme, visibleLeaves, xStart, xEnd, referenceSeq, drawTiles, rasterTiles, }) {
63
- const { bgColor, columns, colWidth, rowHeight, relativeTo, showMsaLetters, subFeatureRows, domainBandsByStart, } = model;
52
+ function drawTilesAndText({ model, ctx, theme, visibleLeaves, xStart, xEnd, referenceSeq, drawTiles, rasterTiles, }) {
53
+ const { bgColor, columns, colWidth, rowHeight, relativeTo, showMsaLetters, subFeatureRows, domainUnderline, domainBandsByStart, } = model;
64
54
  const tiles = drawTiles && bgColor;
65
55
  const paintTiles = tiles && !rasterTiles;
66
56
  if (paintTiles || showMsaLetters) {
67
- // over raster tiles the letters take their color from contrastScheme, so
68
- // the scheme lookup per cell is pure waste
69
- const needsColor = paintTiles || !tiles;
57
+ // a letter takes its color from the cell it lands on, so the scheme lookup
58
+ // is only waste when nothing draws letters
59
+ const needsColor = paintTiles || showMsaLetters;
70
60
  const tileColor = tileColorFn(model);
61
+ // Domain fills come from a categorical palette with no fixed lightness, and
62
+ // a dynamic scheme colors a cell from its column, so a readable letter color
63
+ // is a question about the cell's own color rather than about its letter.
64
+ const contrastText = contrastTextFn(theme);
71
65
  const offsetXAligned = xStart * colWidth;
72
66
  const halfColWidth = colWidth / 2;
73
67
  // note: -rowHeight/4 matches +rowHeight/4 in tree
74
68
  const quarterRowHeight = rowHeight / 4;
75
69
  // with the tiles coming from the domain overlay instead, letters sit either
76
70
  // on a domain box or on the plain background; sub-row layout stacks the boxes
77
- // above the letters, so those rows are all plain background
78
- const overDomains = !drawTiles && !subFeatureRows;
79
- const domainColors = overDomains
80
- ? domainLetterColors(model, theme)
81
- : undefined;
71
+ // above the letters and letter-color mode shrinks them to a bar under the
72
+ // row, so neither leaves anything behind a letter
73
+ const overDomains = !drawTiles && !subFeatureRows && !domainUnderline;
82
74
  for (let i = 0, l1 = visibleLeaves.length; i < l1; i++) {
83
75
  const node = visibleLeaves[i];
84
76
  const { name } = node.data;
@@ -104,15 +96,20 @@ function drawTilesAndText({ model, ctx, theme, contrastScheme, visibleLeaves, xS
104
96
  const covering = bandAt(col);
105
97
  ctx.fillStyle = covering
106
98
  ? // on top of a domain box: contrast against the box fill
107
- domainColors.get(covering.annotation.accession)
108
- : tiles
109
- ? // on top of a colored tile
110
- (contrastScheme[letter] ?? 'black')
111
- : !drawTiles || !color
112
- ? // plain background, uncolored letters
113
- theme.palette.text.primary
114
- : // letter-color mode: darken/lighten to stay readable
115
- adjustColorForContrast(color, theme.palette.background.default);
99
+ contrastText(model.fillPalette[covering.annotation.accession])
100
+ : isMatchingReference
101
+ ? // the dot sits on the faint reference-match wash, which is
102
+ // the theme's background with a little of its text color in it
103
+ theme.palette.text.primary
104
+ : tiles
105
+ ? // on top of a colored tile, or on the background where the
106
+ // scheme gives that cell no color
107
+ contrastText(color)
108
+ : bgColor || !color
109
+ ? // plain background, uncolored letters
110
+ theme.palette.text.primary
111
+ : // letter-color mode: darken/lighten to stay readable
112
+ adjustColorForContrast(color, theme.palette.background.default);
116
113
  ctx.fillText(isMatchingReference ? '.' : letter, x + halfColWidth, textY);
117
114
  }
118
115
  }
@@ -1 +1 @@
1
- {"version":3,"file":"renderMSABlock.js","sourceRoot":"","sources":["../../../src/components/msa/renderMSABlock.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"renderMSABlock.js","sourceRoot":"","sources":["../../../src/components/msa/renderMSABlock.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,7 @@
1
- import { clickColor, hoverColor, multiRowHoverColor, referenceColor, } from '../overlayColors.js';
2
- import { renderHighlights } from './renderHighlights.js';
3
- // the persistent highlightColumns overlay: a stronger fill plus a solid border
4
- // so a domain/motif band reads clearly over the colored alignment cells (the
5
- // faint hover-style wash alone is invisible against clustalx coloring)
6
- const highlightColumnsFill = 'rgba(255,140,0,0.28)';
7
- const highlightColumnsBorder = 'rgba(210,90,0,0.95)';
1
+ import { clickColor, hoverColor, multiRowHoverColor } from '../overlayColors.js';
2
+ import { renderPersistentHighlights } from './renderHighlights.js';
8
3
  export function renderMouseover({ ctx, model, theme, }) {
9
- const { mouseCol, colWidth, msaCanvasWidth: width, height, rowHeight, scrollX, scrollY, mouseRow, mouseClickRow, mouseClickCol, highResScaleFactor, referenceRowIndex, hoveredRowIndices, highlightedColumnRuns, } = model;
4
+ const { mouseCol, colWidth, msaCanvasWidth: width, height, rowHeight, scrollX, scrollY, mouseRow, mouseClickRow, mouseClickCol, highResScaleFactor, hoveredRowIndices, } = model;
10
5
  ctx.resetTransform();
11
6
  ctx.clearRect(0, 0, width * highResScaleFactor, height * highResScaleFactor);
12
7
  ctx.scale(highResScaleFactor, highResScaleFactor);
@@ -18,28 +13,7 @@ export function renderMouseover({ ctx, model, theme, }) {
18
13
  const colBand = (index) => {
19
14
  ctx.fillRect(index * colWidth + scrollX, 0, colWidth, height);
20
15
  };
21
- // the reference row (relativeTo) stays lit, as does every tip under a hovered
22
- // tree node
23
- if (referenceRowIndex !== undefined) {
24
- ctx.fillStyle = referenceColor;
25
- rowBand(referenceRowIndex);
26
- }
27
- ctx.fillStyle = multiRowHoverColor;
28
- for (const rowIndex of hoveredRowIndices) {
29
- rowBand(rowIndex);
30
- }
31
- // each contiguous run of highlighted columns draws as one filled, bordered
32
- // band, so a domain/motif highlight stays visible over the alignment
33
- ctx.lineWidth = 2;
34
- for (const { start, end } of highlightedColumnRuns) {
35
- const x = start * colWidth + scrollX;
36
- const w = (end - start + 1) * colWidth;
37
- ctx.fillStyle = highlightColumnsFill;
38
- ctx.fillRect(x, 0, w, height);
39
- ctx.strokeStyle = highlightColumnsBorder;
40
- ctx.strokeRect(x, 0, w, height);
41
- }
42
- renderHighlights({
16
+ renderPersistentHighlights({
43
17
  ctx,
44
18
  model,
45
19
  theme,
@@ -48,6 +22,11 @@ export function renderMouseover({ ctx, model, theme, }) {
48
22
  width,
49
23
  height,
50
24
  });
25
+ // every tip under a hovered tree node stays lit
26
+ ctx.fillStyle = multiRowHoverColor;
27
+ for (const rowIndex of hoveredRowIndices) {
28
+ rowBand(rowIndex);
29
+ }
51
30
  ctx.fillStyle = hoverColor;
52
31
  if (mouseCol !== undefined) {
53
32
  colBand(mouseCol);