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/src/mount.tsx ADDED
@@ -0,0 +1,32 @@
1
+ import React from 'react'
2
+
3
+ import { createRoot } from 'react-dom/client'
4
+
5
+ import MSAViewer from './components/MSAViewer.tsx'
6
+
7
+ import type { MSAViewerProps } from './components/MSAViewer.tsx'
8
+
9
+ export interface MountedViewer {
10
+ /** merge new props over the current ones */
11
+ update: (props: Partial<MSAViewerProps>) => void
12
+ destroy: () => void
13
+ }
14
+
15
+ /**
16
+ * Render MSAViewer into an element, for a host that is not a React app: a
17
+ * script tag, an R htmlwidget, a notebook widget, a custom element.
18
+ */
19
+ export function mount(el: HTMLElement, props: MSAViewerProps): MountedViewer {
20
+ const root = createRoot(el)
21
+ let current = props
22
+ root.render(<MSAViewer {...current} />)
23
+ return {
24
+ update(next) {
25
+ current = { ...current, ...next }
26
+ root.render(<MSAViewer {...current} />)
27
+ },
28
+ destroy() {
29
+ root.unmount()
30
+ },
31
+ }
32
+ }
@@ -35,11 +35,8 @@ const NUM_SYMBOLS = BLOSUM62_KEYS.length
35
35
  const BLOSUM62 = Int8Array.from(BLOSUM62_DATA.flat())
36
36
 
37
37
  // charCode -> row/column in BLOSUM62, -1 for anything the matrix does not name.
38
- // A flat table rather than a Map of Maps keyed by an upper-cased character, for
39
- // the reason columnCounts.ts gives: the distance matrix is O(rows^2 * columns)
40
- // lookups, and on a 120x800 alignment the Map form spent nearly all of its time
41
- // allocating one-character strings in toUpperCase: 2.6s to build a tree, versus
42
- // 0.34s here for a byte-identical newick.
38
+ // On a 120x800 alignment a Map keyed by upper-cased character took 2.6s to
39
+ // build a tree, against 0.34s for this table.
43
40
  const symbolOfCode = new Int8Array(128).fill(-1)
44
41
  for (let i = 0; i < NUM_SYMBOLS; i++) {
45
42
  const key = BLOSUM62_KEYS[i]!
@@ -50,10 +47,7 @@ for (let i = 0; i < NUM_SYMBOLS; i++) {
50
47
  // gap, or past the end of a row shorter than the alignment
51
48
  const GAP = -2
52
49
 
53
- // stockholm and a3m write gaps as '.', not just '-'. Scoring a '.' as a residue
54
- // charges the pair the unknown-symbol penalty on every padded column, so two
55
- // sequences that differ only in where an unrelated row forced padding come out
56
- // as divergent.
50
+ // stockholm and a3m also write gaps as '.'
57
51
  function symbolAt(seq: string, i: number) {
58
52
  if (i >= seq.length) {
59
53
  return GAP
@@ -71,10 +65,8 @@ function blosumScore(a: number, b: number) {
71
65
  }
72
66
 
73
67
  function computePairwiseDistance(seq1: string, seq2: string) {
74
- // ragged input is real -- a3m and hand-edited fasta both produce rows shorter
75
- // than the alignment -- so a row that stops early counts as gapped for the
76
- // remainder, the same rule the model's `blanks` getter applies. Requiring
77
- // equal lengths here instead made "build tree from MSA" throw on those files.
68
+ // a3m and hand-edited fasta produce short rows; past its end a row counts as
69
+ // gapped, as in the model's `blanks` getter
78
70
  const len = Math.max(seq1.length, seq2.length)
79
71
  let compared = 0
80
72
  let totalScore = 0
@@ -103,17 +95,14 @@ function computePairwiseDistance(seq1: string, seq2: string) {
103
95
  return 1
104
96
  }
105
97
 
106
- // Convert similarity to distance using normalized BLOSUM62 score
107
- // Higher scores mean more similar, so we invert
108
98
  if (maxPossibleScore <= 0) {
109
99
  return 1
110
100
  }
111
101
 
112
102
  const normalizedScore = totalScore / maxPossibleScore
113
- // Clamp to valid range and convert to distance
114
103
  const clampedScore = Math.max(0.01, Math.min(1, normalizedScore))
115
104
 
116
- // Use Kimura-like correction: d = -ln(similarity)
105
+ // Kimura-like correction: d = -ln(similarity)
117
106
  return -Math.log(clampedScore)
118
107
  }
119
108
 
@@ -160,7 +149,6 @@ function neighborJoining(distances: number[][], names: string[]): NJNode {
160
149
  }
161
150
  }
162
151
 
163
- // Work with copies that we'll modify
164
152
  const D: number[][] = []
165
153
  for (let i = 0; i < n; i++) {
166
154
  D[i] = [...distances[i]!]
@@ -170,7 +158,6 @@ function neighborJoining(distances: number[][], names: string[]): NJNode {
170
158
  let remaining = n
171
159
 
172
160
  while (remaining > 2) {
173
- // Find active indices
174
161
  const active: number[] = []
175
162
  for (let i = 0; i < nodes.length; i++) {
176
163
  if (nodes[i] !== undefined) {
@@ -178,7 +165,6 @@ function neighborJoining(distances: number[][], names: string[]): NJNode {
178
165
  }
179
166
  }
180
167
 
181
- // Compute r values (sum of distances for each node)
182
168
  const r = new Map<number, number>()
183
169
  for (const i of active) {
184
170
  let sum = 0
@@ -190,7 +176,6 @@ function neighborJoining(distances: number[][], names: string[]): NJNode {
190
176
  r.set(i, sum)
191
177
  }
192
178
 
193
- // Find pair with minimum Q value
194
179
  let minQ = Infinity
195
180
  let minI = -1
196
181
  let minJ = -1
@@ -209,21 +194,16 @@ function neighborJoining(distances: number[][], names: string[]): NJNode {
209
194
  }
210
195
  }
211
196
 
212
- // Calculate branch lengths
213
197
  const dij = D[minI]![minJ]!
214
198
  const ri = r.get(minI)!
215
199
  const rj = r.get(minJ)!
216
200
 
217
- // remaining is always > 2 inside this loop; the final two nodes are
218
- // connected after it
219
201
  let limbI = dij / 2 + (ri - rj) / (2 * (remaining - 2))
220
202
  let limbJ = dij - limbI
221
203
 
222
- // Ensure non-negative branch lengths
223
204
  limbI = Math.max(0, limbI)
224
205
  limbJ = Math.max(0, limbJ)
225
206
 
226
- // Create new node
227
207
  const newNode: NJNode = {
228
208
  left: nodes[minI],
229
209
  right: nodes[minJ],
@@ -231,7 +211,7 @@ function neighborJoining(distances: number[][], names: string[]): NJNode {
231
211
  rightLength: limbJ,
232
212
  }
233
213
 
234
- // Update distance matrix, reusing minI's slot for the merged node
214
+ // the merged node reuses minI's slot
235
215
  for (const k of active) {
236
216
  if (k !== minI && k !== minJ) {
237
217
  const newDist = (D[minI]![k]! + D[minJ]![k]! - dij) / 2
@@ -240,14 +220,12 @@ function neighborJoining(distances: number[][], names: string[]): NJNode {
240
220
  }
241
221
  }
242
222
 
243
- // Mark minJ as removed
244
223
  nodes[minJ] = undefined
245
224
  nodes[minI] = newNode
246
225
 
247
226
  remaining--
248
227
  }
249
228
 
250
- // Connect final two nodes
251
229
  const finalActive: number[] = []
252
230
  for (let i = 0; i < nodes.length; i++) {
253
231
  if (nodes[i] !== undefined) {
@@ -276,9 +254,7 @@ function withBranchLength(newick: string, branchLength?: number) {
276
254
  : `${newick}:${branchLength.toFixed(6)}`
277
255
  }
278
256
 
279
- // Emit Newick iteratively rather than recursively: an NJ tree of N leaves can
280
- // be a caterpillar of depth ~N, so recursion risks a stack overflow on large
281
- // alignments (matching the iterative-traversal convention in hierarchy.ts).
257
+ // iterative: an NJ tree of N leaves can be a caterpillar of depth ~N
282
258
  function nodeToNewick(root: NJNode): string {
283
259
  const postOrder: NJNode[] = []
284
260
  const stack: NJNode[] = [root]
@@ -7,19 +7,11 @@ import type React from 'react'
7
7
  /**
8
8
  * Render a React element to a static markup string, for the SVG export.
9
9
  *
10
- * Inlined rather than imported from `@jbrowse/core/util` on purpose, and this
11
- * one is the removal direction of the rule in CLAUDE.md rather than the
12
- * addition direction. Core dropped `renderToStaticMarkup` from that barrel in
13
- * jbrowse-components 0d034e2bd8 -- deliberately, because it was the barrel's
14
- * only reach into react-dom and the barrel is loaded in the RPC worker, which
15
- * never renders. The export path is the only caller, so nothing here or in
16
- * jbrowse-plugin-msaview/-tview failed to build, lint, typecheck, or boot; the
17
- * published 3.4.0 and 2.2.1 bundles simply threw the first time a user asked
18
- * for an SVG on a v5 host.
19
- *
20
- * A rendering library asking its host for a renderer was the odd coupling. Both
21
- * `react-dom` and `react-dom/client` are long-established host externals, so
22
- * this costs a few hundred bytes in the plugin bundle and no duplicate react.
10
+ * Inlined because core removed `renderToStaticMarkup` from the
11
+ * `@jbrowse/core/util` barrel in jbrowse-components 0d034e2bd8; see the
12
+ * `@jbrowse/core` note in CLAUDE.md. `react-dom` and `react-dom/client` are
13
+ * host externals, so this adds a few hundred bytes to the plugin bundle and no
14
+ * duplicate react.
23
15
  */
24
16
  export function renderToStaticMarkup(node: React.ReactElement) {
25
17
  const div = document.createElement('div')
@@ -31,11 +23,9 @@ export function renderToStaticMarkup(node: React.ReactElement) {
31
23
  })
32
24
  html = div.innerHTML
33
25
  } finally {
34
- // A real client root, not a server render: effects run, so every `observer`
35
- // in the tree gets a live MobX reaction. Left mounted, an export of a large
36
- // alignment keeps tens of thousands of detached nodes subscribed to the
37
- // model and re-rendering into a dead div on every pan and zoom, once per
38
- // export ever taken. The markup is a string by here and needs no DOM.
26
+ // effects run in a client root, so every `observer` holds a MobX reaction;
27
+ // a mounted export of a large alignment would keep tens of thousands of
28
+ // detached nodes re-rendering on every pan and zoom
39
29
  root.unmount()
40
30
  }
41
31
  return html
@@ -47,12 +37,11 @@ const colorAttr = /\b(fill|stroke|stop-color)="([^"]+)"/g
47
37
  /**
48
38
  * Rewrites every color an SVG 1.1 presentation attribute cannot hold.
49
39
  *
50
- * `fill`, `stroke` and `stop-color` take a <color>, which is a keyword, a hex
51
- * triplet or rgb() -- not rgba(), which MUI palette values are full of, and not
52
- * hsl(), which the percent-identity scheme colors with. Illustrator and older
53
- * Inkscape drop an element whose fill they cannot parse, so the minimap thumb
54
- * came out opaque and the identity coloring came out missing. Alpha moves to
55
- * the matching -opacity attribute, unless the element already carries one.
40
+ * `fill`, `stroke` and `stop-color` take a keyword, a hex triplet or rgb(). MUI
41
+ * palette values use rgba() and the percent-identity scheme uses hsl(), and
42
+ * Illustrator and older Inkscape drop an element whose fill they cannot parse.
43
+ * Alpha moves to the matching -opacity attribute unless the element already
44
+ * carries one.
56
45
  */
57
46
  export function svgSafeColors(html: string) {
58
47
  return html.replaceAll(tag, el =>