jbrowse-plugin-graphgenomeviewer 7.1.0 → 7.1.2

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 (233) hide show
  1. package/README.md +17 -8
  2. package/dist/chunks/AddTrackWorkflow-RPH4ZFSX.js +2 -0
  3. package/dist/chunks/{AddTrackWorkflow-Q6RY23LF.js.map → AddTrackWorkflow-RPH4ZFSX.js.map} +2 -2
  4. package/dist/chunks/{ChooseSamplesDialog-BNVYBGJQ.js → ChooseSamplesDialog-JRN4YLBY.js} +2 -2
  5. package/dist/chunks/{ChooseWalksDialog-EN3C6AQA.js → ChooseWalksDialog-UXLFZTZJ.js} +2 -2
  6. package/dist/chunks/GbzBaseSyntenyAdapter-LRECKL74.js +2 -0
  7. package/dist/chunks/GbzBaseSyntenyAdapter-LRECKL74.js.map +7 -0
  8. package/dist/chunks/{GraphGenomeView-Z2WZKEEO.js → GraphGenomeView-NJ5XCREB.js} +2 -2
  9. package/dist/chunks/GraphTrackSettingsDialog-47PQ6LM7.js +6 -0
  10. package/dist/chunks/GraphTrackSettingsDialog-47PQ6LM7.js.map +7 -0
  11. package/dist/chunks/{HighlightColorDialog-EYBKFSJU.js → HighlightColorDialog-UK5VDDV6.js} +2 -2
  12. package/dist/chunks/{LinearGraphDisplay-WIBVWRQE.js → LinearGraphDisplay-TXTKAACH.js} +2 -2
  13. package/dist/chunks/MinigraphBubbleAdapter-HW7XQMAI.js +2 -0
  14. package/dist/chunks/MinigraphBubbleAdapter-HW7XQMAI.js.map +7 -0
  15. package/dist/chunks/RgfaTabixAdapter-PSKYWD2X.js +3 -0
  16. package/dist/chunks/RgfaTabixAdapter-PSKYWD2X.js.map +7 -0
  17. package/dist/chunks/{TrackWarningsDialog-QT4YEXGD.js → TrackWarningsDialog-TRYBOIHX.js} +2 -2
  18. package/dist/chunks/WalkTabixSyntenyAdapter-U53JLYVU.js +2 -0
  19. package/dist/chunks/WalkTabixSyntenyAdapter-U53JLYVU.js.map +7 -0
  20. package/dist/chunks/chunk-2MCOY3YG.js +3 -0
  21. package/dist/chunks/chunk-2MCOY3YG.js.map +7 -0
  22. package/dist/chunks/{chunk-EWFJBQDV.js → chunk-5O6YRJHL.js} +2 -2
  23. package/dist/chunks/{chunk-EWFJBQDV.js.map → chunk-5O6YRJHL.js.map} +1 -1
  24. package/dist/chunks/chunk-BUY2PV7D.js +2 -0
  25. package/dist/chunks/chunk-BUY2PV7D.js.map +7 -0
  26. package/dist/chunks/chunk-DVCZ3BOC.js +2 -0
  27. package/dist/chunks/chunk-DVCZ3BOC.js.map +7 -0
  28. package/dist/chunks/{chunk-SAMJE6GH.js → chunk-EGDLEQ47.js} +3 -3
  29. package/dist/chunks/{chunk-SAMJE6GH.js.map → chunk-EGDLEQ47.js.map} +4 -4
  30. package/dist/chunks/chunk-FHZXW7IG.js +2 -0
  31. package/dist/chunks/chunk-FHZXW7IG.js.map +7 -0
  32. package/dist/chunks/{chunk-DZ4OUKQV.js → chunk-FITPB5X6.js} +2 -2
  33. package/dist/chunks/{chunk-DZ4OUKQV.js.map → chunk-FITPB5X6.js.map} +1 -1
  34. package/dist/chunks/chunk-FVK2THE4.js +2 -0
  35. package/dist/chunks/chunk-FVK2THE4.js.map +7 -0
  36. package/dist/chunks/{chunk-AHFQHYJI.js → chunk-IBWORBGY.js} +2 -2
  37. package/dist/chunks/chunk-MND7GAOG.js +2 -0
  38. package/dist/chunks/chunk-MND7GAOG.js.map +7 -0
  39. package/dist/chunks/chunk-MURN3JPK.js +2 -0
  40. package/dist/chunks/chunk-MURN3JPK.js.map +7 -0
  41. package/dist/chunks/{chunk-3Q4RBDCL.js → chunk-N6PQZSAX.js} +1 -1
  42. package/dist/chunks/{chunk-3Q4RBDCL.js.map → chunk-N6PQZSAX.js.map} +1 -1
  43. package/dist/chunks/chunk-NWJYLP6Z.js +4 -0
  44. package/dist/chunks/chunk-NWJYLP6Z.js.map +7 -0
  45. package/dist/chunks/{chunk-YJHYBDYF.js → chunk-S75W27NT.js} +2 -2
  46. package/dist/chunks/{chunk-YJHYBDYF.js.map → chunk-S75W27NT.js.map} +1 -1
  47. package/dist/chunks/{chunk-IXQK7JAW.js → chunk-T4HOC6O3.js} +1 -1
  48. package/dist/chunks/{chunk-IXQK7JAW.js.map → chunk-T4HOC6O3.js.map} +1 -1
  49. package/dist/chunks/{chunk-AU73K7LX.js → chunk-TUKJRVBS.js} +1 -1
  50. package/dist/chunks/{chunk-AU73K7LX.js.map → chunk-TUKJRVBS.js.map} +1 -1
  51. package/dist/chunks/chunk-UGCNPRKC.js +2 -0
  52. package/dist/chunks/{chunk-E3WYW7Z6.js.map → chunk-UGCNPRKC.js.map} +2 -2
  53. package/dist/chunks/{chunk-YSTMDXXX.js → chunk-VJ3SO4CH.js} +1 -1
  54. package/dist/chunks/{chunk-YSTMDXXX.js.map → chunk-VJ3SO4CH.js.map} +1 -1
  55. package/dist/chunks/{chunk-XT766CZ5.js → chunk-W6EQLQ6H.js} +1 -1
  56. package/dist/chunks/{chunk-XT766CZ5.js.map → chunk-W6EQLQ6H.js.map} +1 -1
  57. package/dist/chunks/chunk-WAMBI7OX.js +2 -0
  58. package/dist/chunks/chunk-WAMBI7OX.js.map +7 -0
  59. package/dist/chunks/chunk-WCGVUZWP.js +2 -0
  60. package/dist/chunks/chunk-WCGVUZWP.js.map +7 -0
  61. package/dist/chunks/chunk-WEGWTC52.js +2 -0
  62. package/dist/chunks/chunk-WEGWTC52.js.map +7 -0
  63. package/dist/chunks/chunk-YU7T5WOQ.js +2 -0
  64. package/dist/chunks/{chunk-6OPB7FOJ.js.map → chunk-YU7T5WOQ.js.map} +2 -2
  65. package/dist/chunks/{chunk-446RWIA3.js → chunk-ZMOMFU2B.js} +1 -1
  66. package/dist/chunks/{chunk-446RWIA3.js.map → chunk-ZMOMFU2B.js.map} +1 -1
  67. package/dist/chunks/renderSvg-KSQI5DH6.js +2 -0
  68. package/dist/chunks/renderSvg-KSQI5DH6.js.map +7 -0
  69. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +4 -4
  70. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +4 -4
  71. package/package.json +8 -9
  72. package/src/GbzBaseSyntenyAdapter/GbzBaseSyntenyAdapter.test.ts +12 -10
  73. package/src/GbzBaseSyntenyAdapter/GbzBaseSyntenyAdapter.ts +31 -39
  74. package/src/GbzBaseSyntenyAdapter/configSchema.ts +5 -29
  75. package/src/GetGraphHaplotypes.ts +6 -15
  76. package/src/GetGraphReads.ts +7 -14
  77. package/src/GetSubgraph.ts +11 -20
  78. package/src/GraphAddTrackWorkflow/AddTrackWorkflow.test.tsx +73 -0
  79. package/src/GraphAddTrackWorkflow/AddTrackWorkflow.tsx +1 -0
  80. package/src/GraphAddTrackWorkflow/buildTrackConfig.test.ts +3 -2
  81. package/src/GraphAddTrackWorkflow/buildTrackConfig.ts +2 -11
  82. package/src/GraphAddTrackWorkflow/graphManifest.ts +15 -3
  83. package/src/GraphGenomeView/components/BubbleHalos.tsx +5 -24
  84. package/src/GraphGenomeView/components/ElTree.tsx +6 -1
  85. package/src/GraphGenomeView/components/FacetPanels.test.tsx +65 -0
  86. package/src/GraphGenomeView/components/FacetPanels.tsx +17 -12
  87. package/src/GraphGenomeView/components/GenePins.tsx +5 -22
  88. package/src/GraphGenomeView/components/GraphCanvas.tsx +40 -234
  89. package/src/GraphGenomeView/components/GraphSettingsDialog.tsx +102 -108
  90. package/src/GraphGenomeView/components/GraphToolbar.tsx +5 -6
  91. package/src/GraphGenomeView/components/HoverLayer.tsx +3 -7
  92. package/src/GraphGenomeView/components/HoverTooltip.test.tsx +39 -0
  93. package/src/GraphGenomeView/components/HoverTooltip.tsx +122 -0
  94. package/src/GraphGenomeView/components/LabelChip.tsx +3 -5
  95. package/src/GraphGenomeView/components/LabelLayer.tsx +4 -17
  96. package/src/GraphGenomeView/components/LabelledSelect.tsx +1 -1
  97. package/src/GraphGenomeView/components/Legend.tsx +14 -23
  98. package/src/GraphGenomeView/components/PaneContextMenu.test.tsx +48 -0
  99. package/src/GraphGenomeView/components/PaneContextMenu.tsx +144 -0
  100. package/src/GraphGenomeView/components/PaneLayer.tsx +91 -0
  101. package/src/GraphGenomeView/components/PaneSvg.tsx +32 -50
  102. package/src/GraphGenomeView/components/ReferenceStripOverlay.test.tsx +48 -0
  103. package/src/GraphGenomeView/components/ReferenceStripOverlay.tsx +13 -42
  104. package/src/GraphGenomeView/components/SettingsMenu.test.tsx +29 -0
  105. package/src/GraphGenomeView/components/SettingsMenu.tsx +56 -65
  106. package/src/GraphGenomeView/components/TubeMapOverlay.tsx +15 -46
  107. package/src/GraphGenomeView/components/WalkRowsOverlay.tsx +58 -132
  108. package/src/GraphGenomeView/components/WalkStrip.tsx +17 -20
  109. package/src/GraphGenomeView/components/WalkStripLocator.tsx +8 -15
  110. package/src/GraphGenomeView/components/usePaneGestures.test.tsx +35 -0
  111. package/src/GraphGenomeView/components/usePaneGestures.ts +88 -91
  112. package/src/GraphGenomeView/genes/geneFeatures.ts +27 -45
  113. package/src/GraphGenomeView/graphLayers.ts +4 -4
  114. package/src/GraphGenomeView/host.ts +1 -1
  115. package/src/GraphGenomeView/legendSections.test.ts +23 -1
  116. package/src/GraphGenomeView/legendSections.ts +68 -74
  117. package/src/GraphGenomeView/model.test.ts +373 -39
  118. package/src/GraphGenomeView/model.ts +67 -11
  119. package/src/GraphGenomeView/pane/fitViews.ts +57 -514
  120. package/src/GraphGenomeView/pane/graphViews.ts +219 -160
  121. package/src/GraphGenomeView/pane/hostViews.ts +2 -10
  122. package/src/GraphGenomeView/pane/keepInView.ts +5 -4
  123. package/src/GraphGenomeView/pane/launchActions.ts +117 -139
  124. package/src/GraphGenomeView/pane/launchViews.ts +8 -27
  125. package/src/GraphGenomeView/pane/loadActions.ts +208 -187
  126. package/src/GraphGenomeView/pane/morph.ts +3 -9
  127. package/src/GraphGenomeView/pane/paneBase.ts +22 -11
  128. package/src/GraphGenomeView/pane/renderingActions.ts +65 -11
  129. package/src/GraphGenomeView/pane/settingActions.ts +17 -42
  130. package/src/GraphGenomeView/pane/tubeMapViews.ts +445 -0
  131. package/src/GraphGenomeView/pane/walkRowViews.ts +29 -37
  132. package/src/GraphGenomeView/renderPipeline.test.ts +1 -1
  133. package/src/GraphGenomeView/repeats/repeatFeatures.test.ts +23 -0
  134. package/src/GraphGenomeView/repeats/repeatFeatures.ts +16 -23
  135. package/src/GraphGenomeView/repeats/walkCalls.test.ts +18 -0
  136. package/src/GraphGenomeView/repeats/walkCalls.ts +46 -38
  137. package/src/GraphGenomeView/subgraphLoad.test.ts +67 -3
  138. package/src/GraphGenomeView/trackFeatures.ts +24 -0
  139. package/src/GraphGenomeView/tubeMapPanels.ts +28 -36
  140. package/src/GraphGenomeView/viewModel.ts +8 -56
  141. package/src/GraphGenomeView/walkRowGroups.ts +104 -30
  142. package/src/GraphGenomeView/walkRowSpans.test.ts +6 -0
  143. package/src/GraphGenomeView/walkRowSpans.ts +22 -31
  144. package/src/GraphGenomeView/walkRowsCut.ts +8 -17
  145. package/src/LinearGraphDisplay/LinearGraphDisplay.test.ts +173 -26
  146. package/src/LinearGraphDisplay/components/SubgraphContextSelect.test.tsx +1 -1
  147. package/src/LinearGraphDisplay/components/SubgraphContextSelect.tsx +3 -3
  148. package/src/LinearGraphDisplay/components/SubgraphHaplotypesField.test.tsx +3 -3
  149. package/src/LinearGraphDisplay/components/SubgraphHaplotypesField.tsx +7 -10
  150. package/src/LinearGraphDisplay/configSchema.ts +0 -3
  151. package/src/LinearGraphDisplay/denseWindow.ts +8 -11
  152. package/src/LinearGraphDisplay/model.ts +89 -82
  153. package/src/MinigraphBubbleAdapter/MinigraphBubbleAdapter.test.ts +21 -0
  154. package/src/MinigraphBubbleAdapter/MinigraphBubbleAdapter.ts +6 -14
  155. package/src/MinigraphBubbleAdapter/configSchema.ts +3 -9
  156. package/src/MinigraphBubbleAdapter/index.ts +1 -2
  157. package/src/RgfaTabixAdapter/RgfaTabixAdapter.test.ts +45 -1
  158. package/src/RgfaTabixAdapter/RgfaTabixAdapter.ts +111 -276
  159. package/src/RgfaTabixAdapter/configSchema.ts +15 -49
  160. package/src/RgfaTabixAdapter/index.ts +1 -2
  161. package/src/RgfaTabixAdapter/rgfaBed.ts +25 -15
  162. package/src/RgfaTabixAdapter/rgfaCut.ts +139 -0
  163. package/src/RgfaTabixAdapter/test_data/walks2_twopart.GRCh38.walks.bed.gz +0 -0
  164. package/src/RgfaTabixAdapter/test_data/walks2_twopart.GRCh38.walks.bed.gz.tbi +0 -0
  165. package/src/RgfaTabixAdapter/walkFiles.test.ts +33 -0
  166. package/src/RgfaTabixAdapter/walkReader.ts +103 -27
  167. package/src/RgfaTabixAdapter/walkRowRuns.test.ts +53 -0
  168. package/src/RgfaTabixAdapter/walkRowRuns.ts +42 -24
  169. package/src/WalkTabixSyntenyAdapter/WalkTabixSyntenyAdapter.test.ts +37 -6
  170. package/src/WalkTabixSyntenyAdapter/WalkTabixSyntenyAdapter.ts +23 -45
  171. package/src/WalkTabixSyntenyAdapter/configSchema.ts +11 -24
  172. package/src/WalkTabixSyntenyAdapter/index.ts +1 -2
  173. package/src/WalkTabixSyntenyAdapter/walkLanes.ts +35 -43
  174. package/src/adapterImplementing.ts +27 -0
  175. package/src/graphTrackDefaults/index.ts +14 -20
  176. package/src/hoverSync/lgvHover.ts +2 -4
  177. package/src/launchFromGraph/contributors.ts +1 -5
  178. package/src/launchFromGraph/graphMenuItems.ts +3 -4
  179. package/src/launchFromGraph/launchFromGraph.test.ts +0 -1
  180. package/src/launchFromGraph/launchFromGraph.ts +8 -13
  181. package/src/panSNTabix.test.ts +1 -26
  182. package/src/panSNTabix.ts +54 -51
  183. package/src/synteny/lanePairs.ts +8 -0
  184. package/src/synteny/matchFeature.ts +52 -0
  185. package/src/tabixRange.ts +13 -10
  186. package/src/version.ts +1 -1
  187. package/dist/chunks/AddTrackWorkflow-Q6RY23LF.js +0 -2
  188. package/dist/chunks/GbzBaseSyntenyAdapter-TIXR4Y3J.js +0 -2
  189. package/dist/chunks/GbzBaseSyntenyAdapter-TIXR4Y3J.js.map +0 -7
  190. package/dist/chunks/GraphTrackSettingsDialog-TAM6PMXD.js +0 -6
  191. package/dist/chunks/GraphTrackSettingsDialog-TAM6PMXD.js.map +0 -7
  192. package/dist/chunks/MinigraphBubbleAdapter-AGI2UYQR.js +0 -2
  193. package/dist/chunks/MinigraphBubbleAdapter-AGI2UYQR.js.map +0 -7
  194. package/dist/chunks/RgfaTabixAdapter-2OL5X3HF.js +0 -3
  195. package/dist/chunks/RgfaTabixAdapter-2OL5X3HF.js.map +0 -7
  196. package/dist/chunks/WalkTabixSyntenyAdapter-UKFHCFOF.js +0 -2
  197. package/dist/chunks/WalkTabixSyntenyAdapter-UKFHCFOF.js.map +0 -7
  198. package/dist/chunks/chunk-5SFGHDQA.js +0 -2
  199. package/dist/chunks/chunk-5SFGHDQA.js.map +0 -7
  200. package/dist/chunks/chunk-6OPB7FOJ.js +0 -2
  201. package/dist/chunks/chunk-AMFIBQVR.js +0 -2
  202. package/dist/chunks/chunk-AMFIBQVR.js.map +0 -7
  203. package/dist/chunks/chunk-BJMRBVG3.js +0 -2
  204. package/dist/chunks/chunk-BJMRBVG3.js.map +0 -7
  205. package/dist/chunks/chunk-E3WYW7Z6.js +0 -2
  206. package/dist/chunks/chunk-EHCF6AXH.js +0 -2
  207. package/dist/chunks/chunk-EHCF6AXH.js.map +0 -7
  208. package/dist/chunks/chunk-GOFS7BXK.js +0 -3
  209. package/dist/chunks/chunk-GOFS7BXK.js.map +0 -7
  210. package/dist/chunks/chunk-IJQTSJGT.js +0 -4
  211. package/dist/chunks/chunk-IJQTSJGT.js.map +0 -7
  212. package/dist/chunks/chunk-J6NZIAZF.js +0 -2
  213. package/dist/chunks/chunk-J6NZIAZF.js.map +0 -7
  214. package/dist/chunks/chunk-LUTMKRXY.js +0 -2
  215. package/dist/chunks/chunk-LUTMKRXY.js.map +0 -7
  216. package/dist/chunks/chunk-MHPJB22Z.js +0 -2
  217. package/dist/chunks/chunk-MHPJB22Z.js.map +0 -7
  218. package/dist/chunks/chunk-TXI43PEN.js +0 -2
  219. package/dist/chunks/chunk-TXI43PEN.js.map +0 -7
  220. package/dist/chunks/chunk-WRH2EJKX.js +0 -2
  221. package/dist/chunks/chunk-WRH2EJKX.js.map +0 -7
  222. package/dist/chunks/chunk-WX26KTZM.js +0 -2
  223. package/dist/chunks/chunk-WX26KTZM.js.map +0 -7
  224. package/dist/chunks/renderSvg-ST2GBBOC.js +0 -2
  225. package/dist/chunks/renderSvg-ST2GBBOC.js.map +0 -7
  226. package/src/GraphGenomeView/components/WalkRowContextMenu.tsx +0 -105
  227. /package/dist/chunks/{ChooseSamplesDialog-BNVYBGJQ.js.map → ChooseSamplesDialog-JRN4YLBY.js.map} +0 -0
  228. /package/dist/chunks/{ChooseWalksDialog-EN3C6AQA.js.map → ChooseWalksDialog-UXLFZTZJ.js.map} +0 -0
  229. /package/dist/chunks/{GraphGenomeView-Z2WZKEEO.js.map → GraphGenomeView-NJ5XCREB.js.map} +0 -0
  230. /package/dist/chunks/{HighlightColorDialog-EYBKFSJU.js.map → HighlightColorDialog-UK5VDDV6.js.map} +0 -0
  231. /package/dist/chunks/{LinearGraphDisplay-WIBVWRQE.js.map → LinearGraphDisplay-TXTKAACH.js.map} +0 -0
  232. /package/dist/chunks/{TrackWarningsDialog-QT4YEXGD.js.map → TrackWarningsDialog-TRYBOIHX.js.map} +0 -0
  233. /package/dist/chunks/{chunk-AHFQHYJI.js.map → chunk-IBWORBGY.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["host:@mui/material/SvgIcon", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-PUG7LXDF.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-IGVV37VI.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-OPPVSPEF.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-VPE4AYP7.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-5I3K4R2G.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-AR4BUBMU.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-PSMKPSO4.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-2QLLQJ72.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-WZNPX7Q6.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-BS4UZ44I.js", "host:@jbrowse/render-core/RenderLifecycleMixin", "../../src/GraphGenomeView/lenientEnum.ts", "../../src/GraphGenomeView/pane/paneBase.ts", "../../src/panSNAliases/trackAdapterConfig.ts", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-TZFWUT2C.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-LOEA5IHZ.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-XI3ZUTWF.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-L3O7AWLI.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-CM6LO6OC.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-LKW2TP4N.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-L2HDM2R3.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-TKIJ5535.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-WBSWROE6.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-AZFVORTC.js", "../../src/launchFromGraph/contributors.ts", "../../src/GraphGenomeView/host.ts", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-RPRHR56C.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-YYMW5XOF.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-LOCJN3BZ.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-CU6P5RUG.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-HNCXR2VS.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-JKJWSY4V.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-HFVGGB3U.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-XBHMXTOR.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-JA2HJIYS.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-T6V4KI2L.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-CQHUZHET.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-ABUIN5AK.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-T2PCSAFY.js", "host:@jbrowse/core/pluggableElementTypes/renderers/util/serializableFilterChain", "../../src/isRecord.ts", "../../src/launchFromGraph/linearViewTarget.ts", "../../src/launchFromGraph/launchFromGraph.ts", "../../node_modules/.pnpm/@jbrowse+bandage-core@10.2.6/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-G6UIYQZR.js", "../../src/GraphGenomeView/trackFeatures.ts", "../../src/GraphGenomeView/repeats/repeatFeatures.ts", "../../src/GraphGenomeView/genes/geneFeatures.ts", "../../src/GraphGenomeView/graphLayers.ts", "../../src/GraphGenomeView/nodeColor.ts", "../../src/GraphGenomeView/nodeSize.ts", "../../src/GraphGenomeView/pane/graphViews.ts", "../../src/GraphGenomeView/pane/launchViews.ts", "../../src/GraphGenomeView/pane/walkRowViews.ts", "../../src/GraphGenomeView/pane/hostViews.ts", "../../src/GraphGenomeView/pane/morph.ts", "../../src/GraphGenomeView/pane/fitViews.ts", "../../node_modules/.pnpm/@mui+icons-material@9.5.0_@mui+material@9.5.0_@emotion+react@11.14.0_@types+react@19.3._be9a1cae12a24c212d9554fb2bd39b80/node_modules/@mui/icons-material/LineStyle.mjs", "../../node_modules/.pnpm/@mui+icons-material@9.5.0_@mui+material@9.5.0_@emotion+react@11.14.0_@types+react@19.3._be9a1cae12a24c212d9554fb2bd39b80/node_modules/@mui/icons-material/CompareArrows.mjs", "../../node_modules/.pnpm/@mui+icons-material@9.5.0_@mui+material@9.5.0_@emotion+react@11.14.0_@types+react@19.3._be9a1cae12a24c212d9554fb2bd39b80/node_modules/@mui/icons-material/HighlightAlt.mjs", "../../src/launchFromGraph/graphMenuItems.ts", "../../node_modules/.pnpm/@mui+icons-material@9.5.0_@mui+material@9.5.0_@emotion+react@11.14.0_@types+react@19.3._be9a1cae12a24c212d9554fb2bd39b80/node_modules/@mui/icons-material/Route.mjs", "../../node_modules/.pnpm/@mui+icons-material@9.5.0_@mui+material@9.5.0_@emotion+react@11.14.0_@types+react@19.3._be9a1cae12a24c212d9554fb2bd39b80/node_modules/@mui/icons-material/Settings.mjs", "../../node_modules/.pnpm/@mui+icons-material@9.5.0_@mui+material@9.5.0_@emotion+react@11.14.0_@types+react@19.3._be9a1cae12a24c212d9554fb2bd39b80/node_modules/@mui/icons-material/Visibility.mjs"],
4
+ "sourcesContent": ["const host = JBrowseExports[\"@mui/material/SvgIcon\"]\nconst read = name =>\n host != null && name in Object(host)\n ? host[name]\n : Object.assign(\n function () {\n throw new Error(\n \"This JBrowse does not provide '\" + name + \"' from '\" + \"@mui/material/SvgIcon\" + \"' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse\",\n )\n },\n { jbrowseHostMissing: name },\n )\nexport const createSvgIcon = /* @__PURE__ */ read(\"createSvgIcon\")\nexport default host && host.__esModule ? host.default : host", "import {\n isBackbone\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layout/orientToReference.ts\nfunction orientToReference(graph, positions) {\n const backbone = graph.nodes.filter(\n (node) => isBackbone(node) && (positions[node.id]?.length ?? 0) > 0\n );\n if (backbone.length < 2) {\n return positions;\n }\n const points = backbone.map((node) => {\n const segments = positions[node.id];\n const mid = segments[Math.floor(segments.length / 2)];\n return {\n x: mid.x,\n y: mid.y,\n r: node.stable.start + node.length / 2,\n w: node.length\n };\n });\n const weight = points.reduce((sum, p) => sum + p.w, 0);\n const cx = points.reduce((sum, p) => sum + p.x * p.w, 0) / weight;\n const cy = points.reduce((sum, p) => sum + p.y * p.w, 0) / weight;\n const cr = points.reduce((sum, p) => sum + p.r * p.w, 0) / weight;\n let sxr = 0;\n let syr = 0;\n for (const p of points) {\n sxr += p.w * (p.x - cx) * (p.r - cr);\n syr += p.w * (p.y - cy) * (p.r - cr);\n }\n const angle = -Math.atan2(syr, sxr);\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n const out = {};\n for (const [id, segments] of Object.entries(positions)) {\n out[id] = segments.map((p) => {\n const x = p.x - cx;\n const y = p.y - cy;\n return { x: cx + c * x - s * y, y: cy + s * x + c * y };\n });\n }\n let below = 0;\n let above = 0;\n for (const node of graph.nodes) {\n if (isBackbone(node)) {\n continue;\n }\n for (const p of out[node.id] ?? []) {\n if (p.y > cy) {\n below++;\n } else {\n above++;\n }\n }\n }\n if (above > below) {\n for (const segments of Object.values(out)) {\n for (const p of segments) {\n p.y = 2 * cy - p.y;\n }\n }\n }\n return out;\n}\n\nexport {\n orientToReference\n};\n", "import {\n buildNeighbors\n} from \"./chunk-ES2N6V56.js\";\nimport {\n drawnNodeLength\n} from \"./chunk-6JEWNXCQ.js\";\nimport {\n isBackbone\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layout/referenceSeeds.ts\nvar LANE_GAP = 30;\nfunction referenceSeeds(graph, scaling) {\n const { opts } = scaling;\n const drawn = new Map(\n scaling.nodes.map((node) => [node.id, drawnNodeLength(opts, node.length)])\n );\n const drawnOf = (id) => drawn.get(id) ?? opts.minimumNodeLength;\n const backbone = graph.nodes.filter(isBackbone).sort((a, b) => a.stable.start - b.stable.start);\n const seeds = /* @__PURE__ */ new Map();\n let x = 0;\n for (const node of backbone) {\n seeds.set(node.id, { x, y: 0 });\n x += drawnOf(node.id) + opts.edgeLength;\n }\n const adjacent = buildNeighbors(graph);\n const depth = new Map(backbone.map((node) => [node.id, 0]));\n const queue = backbone.map((node) => node.id);\n for (const id of queue) {\n const at = seeds.get(id);\n const next = depth.get(id) + 1;\n for (const neighbour of adjacent.get(id) ?? []) {\n if (depth.has(neighbour)) {\n continue;\n }\n depth.set(neighbour, next);\n seeds.set(neighbour, { x: at.x + drawnOf(id) / 2, y: LANE_GAP * next });\n queue.push(neighbour);\n }\n }\n let unreached = 0;\n for (const node of graph.nodes) {\n if (!seeds.has(node.id)) {\n seeds.set(node.id, {\n x: unreached++ * x / graph.nodes.length,\n y: LANE_GAP * 3\n });\n }\n }\n return seeds;\n}\nfunction seededNodes(graph, scaling) {\n const seeds = referenceSeeds(graph, scaling);\n return scaling.nodes.map((node) => ({ ...node, ...seeds.get(node.id) }));\n}\n\nexport {\n referenceSeeds,\n seededNodes\n};\n", "// src/layout/smoothChains.ts\nvar STEP_TURN = Math.PI / 24;\nfunction turnAt(line, i) {\n const a = line[i - 1];\n const b = line[i];\n const c = line[i + 1];\n if (!a || !c) {\n return 0;\n }\n const t = Math.abs(\n Math.atan2(c.y - b.y, c.x - b.x) - Math.atan2(b.y - a.y, b.x - a.x)\n );\n return t > Math.PI ? 2 * Math.PI - t : t;\n}\nfunction centripetal(p0, p1, p2, p3, u) {\n const knot = (a, b) => Math.max(Math.hypot(b.x - a.x, b.y - a.y) ** 0.5, 1e-9);\n const t1 = knot(p0, p1);\n const t2 = t1 + knot(p1, p2);\n const t3 = t2 + knot(p2, p3);\n const t = t1 + u * (t2 - t1);\n const lerp = (a, b, ta, tb) => {\n const f = (t - ta) / (tb - ta);\n return { x: a.x + (b.x - a.x) * f, y: a.y + (b.y - a.y) * f };\n };\n const a1 = lerp(p0, p1, 0, t1);\n const a2 = lerp(p1, p2, t1, t2);\n const a3 = lerp(p2, p3, t2, t3);\n return lerp(lerp(a1, a2, 0, t2), lerp(a2, a3, t1, t3), t1, t2);\n}\nvar reflect = (p, about) => ({\n x: 2 * about.x - p.x,\n y: 2 * about.y - p.y\n});\nfunction smoothChain(line) {\n if (line.length < 3) {\n return line;\n }\n const out = [line[0]];\n for (let i = 0; i + 1 < line.length; i++) {\n const p1 = line[i];\n const p2 = line[i + 1];\n const steps = Math.ceil(\n Math.max(turnAt(line, i), turnAt(line, i + 1)) / STEP_TURN\n );\n const p0 = line[i - 1] ?? reflect(p2, p1);\n const p3 = line[i + 2] ?? reflect(p1, p2);\n for (let s = 1; s < steps; s++) {\n out.push(centripetal(p0, p1, p2, p3, s / steps));\n }\n out.push(p2);\n }\n return out;\n}\n\nexport {\n smoothChain\n};\n", "// src/layout/deletionRoutes.ts\nimport { ROUTE_ID } from \"@jbrowse/graph-stress-layout\";\nvar ROUTE_FRACTION = 0.5;\nfunction withDeletionRoutes(graph, deletions, dropped = /* @__PURE__ */ new Set()) {\n const routes = new Map(\n deletions.map((d) => [d.edgeIndex, `${ROUTE_ID}${d.edgeIndex}`])\n );\n const edges = [];\n graph.edges.forEach((edge, ei) => {\n const id = routes.get(ei);\n if (dropped.has(ei)) {\n return;\n }\n if (id === void 0) {\n edges.push(edge);\n } else {\n const { fromStrand, toStrand } = edge;\n edges.push(\n { from: edge.from, to: id, ...fromStrand ? { fromStrand } : {} },\n { from: id, to: edge.to, ...toStrand ? { toStrand } : {} }\n );\n }\n });\n return {\n graph: {\n ...graph,\n nodes: [\n ...graph.nodes,\n ...[...routes.values()].map((id) => ({\n id,\n name: id,\n length: 0,\n depth: 0\n }))\n ],\n edges\n },\n routes,\n ids: new Set(routes.values())\n };\n}\nfunction routeNodes(graph, deletions, routes, drawnOf, opts) {\n const lengths = new Map(graph.nodes.map((n) => [n.id, n.length]));\n return deletions.map((d) => {\n const skipped = d.bypassed.reduce(\n (sum, id2) => sum + (lengths.get(id2) ?? 0),\n 0\n );\n const drawn = Math.max(\n opts.minimumNodeLength,\n drawnOf(skipped) * ROUTE_FRACTION\n );\n const id = routes.get(d.edgeIndex);\n return {\n id,\n name: id,\n length: Math.round(drawn * 1e6 / opts.nodeLengthPerMegabase),\n depth: 0\n };\n });\n}\nfunction takeRoutes(positions, routes) {\n const nodePositions = { ...positions };\n const deletionRoutes = {};\n for (const [edgeIndex, id] of routes) {\n const route = nodePositions[id];\n delete nodePositions[id];\n if (route?.length) {\n deletionRoutes[edgeIndex] = route;\n }\n }\n return { nodePositions, deletionRoutes };\n}\n\nexport {\n withDeletionRoutes,\n routeNodes,\n takeRoutes\n};\n", "// src/gfa-core/gfaParser.ts\nfunction parseTag(tag, tags) {\n const nameEnd = tag.indexOf(\":\");\n const typeEnd = tag.indexOf(\":\", nameEnd + 1);\n if (nameEnd !== -1 && typeEnd !== -1) {\n const name = tag.slice(0, nameEnd);\n const type = tag.slice(nameEnd + 1, typeEnd);\n const val = tag.slice(typeEnd + 1);\n if (type === \"i\" || type === \"f\") {\n tags[name] = +val;\n } else if (type === \"Z\") {\n tags[name] = val;\n }\n }\n}\nfunction parseTags(fields) {\n const tags = {};\n for (const field of fields) {\n parseTag(field, tags);\n }\n return tags;\n}\nfunction stableCoordinate(node) {\n const { SN, SO, SR } = node.tags;\n return typeof SN === \"string\" && typeof SO === \"number\" && typeof SR === \"number\" ? { refName: SN, start: SO, rank: SR } : void 0;\n}\nvar GT = 62;\nvar LT = 60;\nfunction parseWalkBody(body) {\n const segments = [];\n let strand = \"+\";\n let start = 0;\n function push(end) {\n if (end > start) {\n segments.push({ id: body.slice(start, end), strand });\n }\n }\n for (let i = 0; i < body.length; i++) {\n const ch = body.charCodeAt(i);\n if (ch === GT || ch === LT) {\n push(i);\n strand = ch === GT ? \"+\" : \"-\";\n start = i + 1;\n }\n }\n push(body.length);\n return segments;\n}\nfunction parseGFA(file) {\n const graph = {\n nodes: [],\n links: [],\n paths: [],\n walks: [],\n header: [],\n id: \"\"\n };\n for (const rawLine of file.split(\"\\n\")) {\n const line = rawLine.endsWith(\"\\r\") ? rawLine.slice(0, -1) : rawLine;\n const type = line.split(\"\t\", 1)[0];\n if (type === \"H\") {\n const [, ...rest] = line.split(\"\t\");\n graph.header.push(parseTags(rest));\n } else if (type === \"S\") {\n const [, name, ...rest] = line.split(\"\t\");\n let len;\n let seq;\n let tagfields;\n let gfa1 = false;\n const first = rest[0] ?? \"*\";\n if (/^\\d+$/.test(first)) {\n len = +first;\n seq = rest[1] ?? \"*\";\n tagfields = rest.slice(2);\n } else {\n gfa1 = true;\n seq = first;\n len = seq === \"*\" ? 0 : seq.length;\n tagfields = rest.slice(1);\n }\n const tags = parseTags(tagfields);\n if (gfa1 && \"LN\" in tags) {\n len = +tags.LN;\n }\n graph.nodes.push({ id: name, length: len, sequence: seq, tags });\n } else if (type === \"E\") {\n const [, , source, target, , , , , cigar, ...rest] = line.split(\"\t\");\n if (source && target) {\n graph.links.push({\n source: source.slice(0, -1),\n target: target.slice(0, -1),\n strand1: source.at(-1),\n strand2: target.at(-1),\n cigar: cigar ?? \"*\",\n tags: parseTags(rest)\n });\n }\n } else if (type === \"L\") {\n const [, source, strand1, target, strand2, cigar, ...rest] = line.split(\"\t\");\n if (source && target && strand2) {\n graph.links.push({\n source,\n target,\n strand1,\n strand2,\n cigar: cigar ?? \"*\",\n tags: parseTags(rest)\n });\n }\n } else if (type === \"W\") {\n const [, sample, hap, contig, start, end, body, ...rest] = line.split(\"\t\");\n if (sample && hap && contig && start && end && body) {\n graph.walks.push({\n sample,\n haplotype: +hap,\n contig,\n start: start === \"*\" ? -1 : +start,\n end: end === \"*\" ? -1 : +end,\n segments: parseWalkBody(body),\n tags: parseTags(rest)\n });\n }\n } else if (type === \"P\") {\n const [, name, path, ...rest] = line.split(\"\t\");\n if (name && path) {\n graph.paths.push({ name, path, rest });\n }\n }\n }\n return graph;\n}\n\nexport {\n stableCoordinate,\n parseGFA\n};\n", "import {\n stableCoordinate\n} from \"./chunk-5I3K4R2G.js\";\nimport {\n pathOrigin,\n surveyPaths\n} from \"./chunk-M6LK4GII.js\";\n\n// src/gfa/gfaConverter.ts\nfunction surveySegments(gfaGraph) {\n const canonical = /* @__PURE__ */ new Map();\n const traversals = /* @__PURE__ */ new Map();\n function claim(id, strand) {\n if (!canonical.has(id)) {\n canonical.set(id, strand);\n }\n }\n function traverse(id, strand) {\n const seen = traversals.get(id);\n if (seen === void 0) {\n claim(id, strand);\n }\n traversals.set(id, (seen ?? 0) + 1);\n }\n for (const link of gfaGraph.links) {\n claim(link.source, link.strand1 === \"-\" ? \"-\" : \"+\");\n claim(link.target, link.strand2 === \"-\" ? \"-\" : \"+\");\n }\n for (const gfaPath of gfaGraph.paths) {\n for (const segment of gfaPath.path.split(\",\")) {\n traverse(segment.slice(0, -1), segment.endsWith(\"-\") ? \"-\" : \"+\");\n }\n }\n for (const walk of gfaGraph.walks) {\n for (const seg of walk.segments) {\n traverse(seg.id, seg.strand === \"-\" ? \"-\" : \"+\");\n }\n }\n return { canonical, traversals };\n}\nvar walkStart = (w) => w.start === -1 ? 0 : w.start;\nvar stranded = (s) => s.strand === \"+\" || s.strand === \"-\";\nfunction anchorablePaths(gfaGraph) {\n return [\n ...gfaGraph.paths.map((p) => ({\n ...pathOrigin(p.name),\n steps: p.path.split(\",\").map((segment) => ({\n id: segment.slice(0, -1),\n strand: segment.endsWith(\"-\") ? \"-\" : \"+\"\n }))\n })),\n ...gfaGraph.walks.map((w) => ({\n name: `${w.sample}#${w.haplotype}#${w.contig}`,\n start: walkStart(w),\n steps: w.segments.every(stranded) ? w.segments : w.segments.map((s) => ({\n id: s.id,\n strand: s.strand === \"-\" ? \"-\" : \"+\"\n }))\n }))\n ];\n}\nfunction carriedSamples(gfaNode) {\n const sm = gfaNode.tags.SM;\n if (typeof sm !== \"string\") {\n return void 0;\n }\n const samples = sm.split(\",\").map((s) => s.trim()).filter(Boolean);\n return samples.length > 0 ? samples : void 0;\n}\nvar positive = (v) => typeof v === \"number\" && v > 0 ? v : void 0;\nfunction statedDepth({ tags, length }) {\n const count = positive(tags.RC) ?? positive(tags.FC) ?? positive(tags.KC);\n return positive(tags.dp) ?? positive(tags.DP) ?? (count !== void 0 && length > 0 ? count / length : void 0);\n}\nfunction makeNode(gfaNode, strand, depth) {\n return {\n id: `${gfaNode.id}${strand}`,\n name: gfaNode.id,\n length: gfaNode.length,\n depth,\n stable: stableCoordinate(gfaNode),\n samples: carriedSamples(gfaNode)\n };\n}\nfunction convertGFAToGraph(gfaGraph, name = \"Imported GFA\") {\n const nodes = [];\n const edges = [];\n const { canonical, traversals } = surveySegments(gfaGraph);\n const nodeIds = /* @__PURE__ */ new Map();\n const nodeId = (segmentId) => {\n let id = nodeIds.get(segmentId);\n if (id === void 0) {\n id = `${segmentId}${canonical.get(segmentId) ?? \"+\"}`;\n nodeIds.set(segmentId, id);\n }\n return id;\n };\n const declared = /* @__PURE__ */ new Set();\n for (const gfaNode of gfaGraph.nodes) {\n if (declared.has(gfaNode.id)) {\n continue;\n }\n declared.add(gfaNode.id);\n const depth = statedDepth(gfaNode) ?? Math.max(traversals.get(gfaNode.id) ?? 1, 1);\n nodes.push(makeNode(gfaNode, canonical.get(gfaNode.id) ?? \"+\", depth));\n }\n for (const link of gfaGraph.links) {\n edges.push({\n from: nodeId(link.source),\n to: nodeId(link.target),\n fromStrand: link.strand1 === \"-\" ? \"-\" : \"+\",\n toStrand: link.strand2 === \"-\" ? \"-\" : \"+\"\n });\n }\n const paths = [];\n const pathsByPair = /* @__PURE__ */ new Map();\n const pairPaths = (a, b) => pathsByPair.get(a)?.get(b);\n function addPair(a, b, set) {\n let to = pathsByPair.get(a);\n if (!to) {\n to = /* @__PURE__ */ new Map();\n pathsByPair.set(a, to);\n }\n to.set(b, set);\n }\n const edgePaths = edges.map((edge) => {\n let set = pairPaths(edge.from, edge.to);\n if (!set) {\n set = /* @__PURE__ */ new Set();\n addPair(edge.from, edge.to, set);\n addPair(edge.to, edge.from, set);\n }\n return set;\n });\n function recordPathEdges(nodeIds2, name2) {\n for (let i = 0; i < nodeIds2.length - 1; i++) {\n pairPaths(nodeIds2[i], nodeIds2[i + 1])?.add(name2);\n }\n }\n for (const gfaPath of gfaGraph.paths) {\n const nodeIds2 = gfaPath.path.split(\",\").map((segment) => nodeId(segment.slice(0, -1)));\n paths.push({\n name: gfaPath.name,\n nodeIds: nodeIds2,\n start: pathOrigin(gfaPath.name).start\n });\n recordPathEdges(nodeIds2, gfaPath.name);\n }\n for (const walk of gfaGraph.walks) {\n const nodeIds2 = walk.segments.map((seg) => nodeId(seg.id));\n const name2 = `${walk.sample}#${walk.haplotype}#${walk.contig}`;\n paths.push({\n name: name2,\n nodeIds: nodeIds2,\n start: walkStart(walk),\n sample: walk.sample,\n haplotype: walk.haplotype,\n contig: walk.contig\n });\n recordPathEdges(nodeIds2, name2);\n }\n edges.forEach((edge, i) => {\n const pathIds = edgePaths[i];\n if (pathIds.size > 0) {\n edge.pathIds = [...pathIds];\n }\n });\n const lengths = new Map(gfaGraph.nodes.map((n) => [n.id, n.length]));\n const anchoring = gfaGraph.paths.length > 0 || gfaGraph.walks.length > 0 ? surveyPaths(anchorablePaths(gfaGraph), (id) => lengths.get(id) ?? 0) : void 0;\n return {\n name,\n nodes,\n edges,\n paths: paths.length > 0 ? paths : void 0,\n anchorPaths: anchoring?.anchorPaths,\n pathVisits: anchoring?.pathVisits,\n // rGFA's own tags win wherever they are present; pathAnchoring only ever\n // fills in for a graph that carries none.\n anchoredBy: nodes.some((n) => n.stable) ? \"tags\" : void 0\n };\n}\n\nexport {\n convertGFAToGraph\n};\n", "import {\n PathVisits\n} from \"./chunk-RAEABQNW.js\";\nimport {\n panSNSample\n} from \"./chunk-BPLIXMH7.js\";\n\n// src/gfa/graphTables.ts\nfunction walkFields(panSN) {\n const [sample = \"\", haplotype = \"\", ...contig] = panSN.split(\"#\");\n return { sample, haplotype, contig: contig.join(\"#\") };\n}\nfunction namesByList(lists, names, listCount, pathNames) {\n const starts = new Int32Array(listCount + 1);\n for (const list of lists) {\n starts[list + 1]++;\n }\n for (let i = 0; i < listCount; i++) {\n starts[i + 1] += starts[i];\n }\n const fill = starts.slice(0, listCount);\n const grouped = new Int32Array(lists.length);\n lists.forEach((list, i) => {\n grouped[fill[list]++] = names[i];\n });\n const listed = new Int32Array(pathNames.length).fill(-1);\n return Array.from({ length: listCount }, (_, list) => {\n const out = [];\n for (let i = starts[list]; i < starts[list + 1]; i++) {\n const k = grouped[i];\n if (listed[k] !== list) {\n listed[k] = list;\n out.push(pathNames[k]);\n }\n }\n return out;\n });\n}\nfunction graphFromTables({ nodes: n, links: l, walks: w }, name = \"Imported GFA\") {\n const count = n.names.length;\n const declared = n.lengths.length;\n const canonical = new Uint8Array(count);\n const claim = (node, reversed) => {\n if (canonical[node] === 0) {\n canonical[node] = reversed ? 2 : 1;\n }\n };\n for (let i = 0; i < l.from.length; i++) {\n claim(l.from[i], l.strands[i] & 1);\n claim(l.to[i], l.strands[i] & 2);\n }\n const drawnWalks = [];\n for (let p = 0; p < w.names.length; p++) {\n if (w.offsets[p + 1] > w.offsets[p]) {\n drawnWalks.push(p);\n }\n }\n const traversals = new Int32Array(count);\n for (const p of drawnWalks) {\n for (let s = w.offsets[p]; s < w.offsets[p + 1]; s++) {\n const node = w.steps[s];\n if (traversals[node] === 0) {\n claim(node, w.reversed[s]);\n }\n traversals[node]++;\n }\n }\n const ids = n.names.map(\n (segment, i) => `${segment}${canonical[i] === 2 ? \"-\" : \"+\"}`\n );\n const nodes = [];\n for (let i = 0; i < declared; i++) {\n const ref = n.refs[i];\n nodes.push({\n id: ids[i],\n name: n.names[i],\n length: n.lengths[i],\n depth: Math.max(traversals[i], 1),\n stable: ref < 0 ? void 0 : {\n refName: n.refNames[ref],\n start: n.starts[i],\n rank: n.ranks[i]\n },\n samples: void 0\n });\n }\n const edges = [];\n const neighbours = new Array(count);\n const pairList = (a, b) => {\n const near = neighbours[a];\n if (near) {\n for (let j = 0; j < near.length; j += 2) {\n if (near[j] === b) {\n return near[j + 1];\n }\n }\n }\n return void 0;\n };\n const addPair = (a, b, list) => {\n const near = neighbours[a];\n if (near) {\n near.push(b, list);\n } else {\n neighbours[a] = [b, list];\n }\n };\n const edgeLists = [];\n let lists = 0;\n for (let i = 0; i < l.from.length; i++) {\n const a = l.from[i];\n const b = l.to[i];\n edges.push({\n from: ids[a],\n to: ids[b],\n fromStrand: l.strands[i] & 1 ? \"-\" : \"+\",\n toStrand: l.strands[i] & 2 ? \"-\" : \"+\"\n });\n let list = pairList(a, b);\n if (list === void 0) {\n list = lists++;\n addPair(a, b, list);\n addPair(b, a, list);\n }\n edgeLists.push(list);\n }\n const adjacency = new Int32Array(count + 1);\n for (let a = 0; a < count; a++) {\n adjacency[a + 1] = adjacency[a] + (neighbours[a]?.length ?? 0) / 2;\n }\n const adjacentNode = new Int32Array(adjacency[count]);\n const adjacentList = new Int32Array(adjacency[count]);\n neighbours.forEach((near, a) => {\n for (let j = 0; j < near.length; j += 2) {\n adjacentNode[adjacency[a] + j / 2] = near[j];\n adjacentList[adjacency[a] + j / 2] = near[j + 1];\n }\n });\n const listOf = (a, b) => {\n for (let j = adjacency[a]; j < adjacency[a + 1]; j++) {\n if (adjacentNode[j] === b) {\n return adjacentList[j];\n }\n }\n return -1;\n };\n const nameIndex = /* @__PURE__ */ new Map();\n const pathNames = [];\n const crossedList = new Int32Array(w.offsets[w.names.length] ?? 0);\n const crossedName = new Int32Array(crossedList.length);\n let crossings = 0;\n const lastWalk = new Int32Array(lists).fill(-1);\n const paths = [];\n const anchorPaths = [];\n const totalSteps = w.offsets[w.names.length] ?? 0;\n const visitPath = new Int32Array(totalSteps);\n const visitStart = new Float64Array(totalSteps);\n const visitReversed = new Uint8Array(totalSteps);\n const fill = new Int32Array(count).fill(-1);\n const visitOrder = [];\n const blocks = [0];\n const pathSamples = [];\n for (const p of drawnWalks) {\n const { sample, haplotype, contig } = walkFields(w.names[p]);\n const pathName = `${sample}#${+haplotype}#${contig}`;\n let named = nameIndex.get(pathName);\n if (named === void 0) {\n named = pathNames.length;\n nameIndex.set(pathName, named);\n pathNames.push(pathName);\n pathSamples.push(panSNSample(pathName));\n }\n const start = w.starts[p];\n const visitSample = pathSamples[named];\n const first = w.offsets[p];\n const nodeIds = new Array(w.offsets[p + 1] - first);\n let pos = start;\n let prev = -1;\n for (let s = first; s < w.offsets[p + 1]; s++) {\n const node = w.steps[s];\n nodeIds[s - first] = ids[node];\n if (fill[node] === -1) {\n fill[node] = blocks.at(-1);\n blocks.push(fill[node] + traversals[node]);\n visitOrder.push(node);\n }\n const at = fill[node]++;\n visitPath[at] = named;\n visitStart[at] = pos;\n visitReversed[at] = w.reversed[s];\n pos += node < declared ? n.lengths[node] : 0;\n if (prev >= 0) {\n const list = listOf(prev, node);\n if (list >= 0 && lastWalk[list] !== p) {\n lastWalk[list] = p;\n crossedList[crossings] = list;\n crossedName[crossings++] = named;\n }\n }\n prev = node;\n }\n paths.push({\n name: pathName,\n nodeIds,\n start,\n sample,\n haplotype: +haplotype,\n contig\n });\n anchorPaths.push({\n name: pathName,\n sample: visitSample,\n start,\n length: pos - start\n });\n }\n const listNames = namesByList(\n crossedList.subarray(0, crossings),\n crossedName,\n lists,\n pathNames\n );\n edges.forEach((edge, i) => {\n const names = listNames[edgeLists[i]];\n if (names.length > 0) {\n edge.pathIds = names;\n }\n });\n const walked = drawnWalks.length > 0;\n return {\n name,\n nodes,\n edges,\n paths: walked ? paths : void 0,\n anchorPaths: walked ? anchorPaths : void 0,\n pathVisits: walked ? new PathVisits({\n segments: visitOrder.map((node) => n.names[node]),\n offsets: Int32Array.from(blocks),\n path: visitPath.subarray(0, blocks.at(-1)),\n start: visitStart.subarray(0, blocks.at(-1)),\n reversed: visitReversed.subarray(0, blocks.at(-1)),\n paths: pathNames,\n samples: pathSamples\n }) : void 0,\n anchoredBy: nodes.some((node) => node.stable) ? \"tags\" : void 0\n };\n}\nfunction graphTablesGFA({ nodes, links, walks }) {\n const { names } = nodes;\n const lines = [\"H\tVN:Z:1.1\"];\n for (let i = 0; i < nodes.lengths.length; i++) {\n const ref = nodes.refs[i];\n const stable = ref < 0 ? \"\" : `\tSN:Z:${nodes.refNames[ref]}\tSO:i:${nodes.starts[i]}\tSR:i:${nodes.ranks[i]}`;\n lines.push(`S\t${names[i]}\t*\tLN:i:${nodes.lengths[i]}${stable}`);\n }\n for (let i = 0; i < links.from.length; i++) {\n const strands = links.strands[i];\n lines.push(\n `L\t${names[links.from[i]]}\t${strands & 1 ? \"-\" : \"+\"}\t${names[links.to[i]]}\t${strands & 2 ? \"-\" : \"+\"}\t0M`\n );\n }\n for (let p = 0; p < walks.names.length; p++) {\n const { sample, haplotype, contig } = walkFields(walks.names[p]);\n let body = \"\";\n for (let s = walks.offsets[p]; s < walks.offsets[p + 1]; s++) {\n body += (walks.reversed[s] ? \"<\" : \">\") + names[walks.steps[s]];\n }\n lines.push(\n `W\t${sample}\t${haplotype}\t${contig}\t${walks.starts[p]}\t${walks.ends[p]}\t${body}`\n );\n }\n return lines.join(\"\\n\");\n}\n\nexport {\n graphFromTables,\n graphTablesGFA\n};\n", "import {\n orientToReference\n} from \"./chunk-PUG7LXDF.js\";\nimport {\n seededNodes\n} from \"./chunk-IGVV37VI.js\";\nimport {\n smoothChain\n} from \"./chunk-OPPVSPEF.js\";\nimport {\n routeNodes,\n takeRoutes,\n withDeletionRoutes\n} from \"./chunk-VPE4AYP7.js\";\nimport {\n convertGFAToGraph\n} from \"./chunk-AR4BUBMU.js\";\nimport {\n parseGFA\n} from \"./chunk-5I3K4R2G.js\";\nimport {\n graphFromTables\n} from \"./chunk-PSMKPSO4.js\";\nimport {\n anchorGraph\n} from \"./chunk-M6LK4GII.js\";\nimport {\n gfaTables\n} from \"./chunk-G45YY72K.js\";\nimport {\n mergeRuns,\n splitRuns\n} from \"./chunk-N73TI3VG.js\";\nimport {\n spreadFor\n} from \"./chunk-UVBGRJQX.js\";\nimport {\n drawnLengthOf,\n drawnNodeLength,\n layoutScaling\n} from \"./chunk-6JEWNXCQ.js\";\nimport {\n deletionDrawing,\n deletionEdges\n} from \"./chunk-24WITXQY.js\";\nimport {\n isBackbone\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/pipeline.ts\nfunction graphOf(source, name) {\n if (typeof source !== \"string\") {\n return graphFromTables(source, name);\n }\n const tables = gfaTables(source);\n return tables ? graphFromTables(tables, name) : convertGFAToGraph(parseGFA(source), name);\n}\nfunction loadGraph(source, name, opts = {}) {\n const graph = anchorGraph(graphOf(source, name), opts.referencePath);\n if (graph.nodes.length === 0) {\n throw new Error(`No graph segments in ${name}`);\n }\n if (opts.maxNodes !== void 0 && graph.nodes.length > opts.maxNodes) {\n throw new Error(\n `Graph too large to draw: ${graph.nodes.length.toLocaleString()} nodes (limit ${opts.maxNodes.toLocaleString()}). Zoom in to a smaller region, or raise maxGraphNodes on this view.`\n );\n }\n return graph;\n}\nvar ENGINE_DEFAULTS = {\n engine: \"fmmm\",\n quality: 2,\n linearLayout: false,\n bubbleSpread: \"auto\",\n spacing: 1,\n componentSeparation: 1,\n showDeletionEdges: true\n};\nfunction engineSettingsOf(s = {}) {\n return {\n engine: s.engine ?? ENGINE_DEFAULTS.engine,\n quality: s.quality ?? ENGINE_DEFAULTS.quality,\n linearLayout: s.linearLayout ?? ENGINE_DEFAULTS.linearLayout,\n bubbleSpread: s.bubbleSpread ?? ENGINE_DEFAULTS.bubbleSpread,\n spacing: s.spacing ?? ENGINE_DEFAULTS.spacing,\n componentSeparation: s.componentSeparation ?? ENGINE_DEFAULTS.componentSeparation,\n showDeletionEdges: s.showDeletionEdges ?? ENGINE_DEFAULTS.showDeletionEdges\n };\n}\nvar COMPONENT_SEPARATION = 15;\nfunction engineRequest(graph, scaling, settings) {\n const anchored = graph.nodes.some(isBackbone);\n const spaced = {\n ...scaling,\n opts: {\n ...scaling.opts,\n edgeLength: scaling.opts.edgeLength * (settings.spacing ?? 1)\n }\n };\n return {\n graph: {\n nodes: anchored ? seededNodes(graph, spaced) : spaced.nodes,\n edges: graph.edges\n },\n options: {\n quality: settings.quality,\n linearLayout: settings.linearLayout,\n ...spaced.opts,\n componentSeparation: COMPONENT_SEPARATION * (settings.componentSeparation ?? 1),\n ...anchored ? { rotateComponents: false } : {},\n engine: settings.engine ?? \"fmmm\"\n }\n };\n}\nfunction engineKey(graph, settings) {\n const anchored = graph.nodes.some(isBackbone);\n return `${settings.engine ?? \"fmmm\"}|${settings.quality}|${settings.linearLayout}|${settings.bubbleSpread}|${settings.spacing ?? 1}|${settings.componentSeparation ?? 1}|${settings.showDeletionEdges !== false}|${anchored}|${graph.referencePath ?? \"\"}`;\n}\nasync function forceLayout(graph, settings, engine) {\n const spread = spreadFor(settings.bubbleSpread);\n const { shown: deletions, hidden: dropped } = deletionDrawing(\n graph,\n deletionEdges(graph),\n settings.showDeletionEdges !== false\n );\n const routed = withDeletionRoutes(graph, deletions, dropped);\n const merged = mergeRuns(routed.graph, routed.ids);\n const runs = {\n ...merged.graph,\n nodes: merged.graph.nodes.filter((n) => !routed.ids.has(n.id))\n };\n const engineScaling = layoutScaling(runs, spread);\n const { result, duration } = await engine(\n engineRequest(\n merged.graph,\n {\n ...engineScaling,\n nodes: [\n ...engineScaling.nodes,\n ...routeNodes(\n graph,\n deletions,\n routed.routes,\n drawnLengthOf(runs, spread),\n engineScaling.opts\n )\n ]\n },\n settings\n )\n );\n const scaling = layoutScaling(graph, spread);\n const drawn = new Map(\n scaling.nodes.map((n) => [n.id, drawnNodeLength(scaling.opts, n.length)])\n );\n const smoothed = Object.fromEntries(\n Object.entries(result.nodePositions).map(([id, line]) => [\n id,\n smoothChain(line)\n ])\n );\n const positions = splitRuns(smoothed, merged.runs, (id) => drawn.get(id) ?? 0);\n const { nodePositions, deletionRoutes } = takeRoutes(\n graph.nodes.some(isBackbone) ? orientToReference(graph, positions) : positions,\n routed.routes\n );\n return {\n result: {\n ...result,\n nodePositions,\n stranded: true,\n ...deletions.length ? { deletionRoutes, extent: layoutExtent(deletionRoutes) } : {}\n },\n duration\n };\n}\nfunction layoutExtent(nodePositions) {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const segments of Object.values(nodePositions)) {\n for (const seg of segments) {\n minX = Math.min(minX, seg.x);\n minY = Math.min(minY, seg.y);\n maxX = Math.max(maxX, seg.x);\n maxY = Math.max(maxY, seg.y);\n }\n }\n return { minX, minY, maxX, maxY };\n}\nvar FIT_PADDING = 40;\nvar MIN_ZOOM = 1e-6;\nvar MAX_ZOOM = 100;\nfunction clampZoom(zoom) {\n return Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, zoom));\n}\nfunction fittedTranslateY(bounds, usableHeight, yScale, padTop = FIT_PADDING) {\n const leftoverY = usableHeight - bounds.h * yScale;\n return padTop - bounds.minY * yScale + Math.max(0, leftoverY) / 2;\n}\nfunction fitTransform(bounds, paneWidth, paneHeight, pixelRows, {\n minScale = 0,\n padLeft = FIT_PADDING,\n padTop = FIT_PADDING,\n padRight = FIT_PADDING,\n padBottom = FIT_PADDING\n} = {}) {\n const usableWidth = paneWidth - padLeft - padRight;\n const usableHeight = paneHeight - padTop - padBottom;\n if (usableWidth <= 0 || usableHeight <= 0 || !(bounds.w > 0 || !pixelRows && bounds.h > 0)) {\n return void 0;\n }\n const fitX = bounds.w > 0 ? usableWidth / bounds.w : Infinity;\n const fitY = bounds.h > 0 ? usableHeight / bounds.h : Infinity;\n const scale = clampZoom(\n Math.max(minScale, pixelRows ? fitX : Math.min(fitX, fitY))\n );\n const leftoverX = usableWidth - bounds.w * scale;\n return {\n scale,\n translateX: padLeft - bounds.minX * scale + Math.max(0, leftoverX) / 2,\n translateY: fittedTranslateY(\n bounds,\n usableHeight,\n pixelRows ? 1 : scale,\n padTop\n )\n };\n}\nfunction drawingBounds(layout, opts = {}) {\n let { minX, minY, maxX, maxY } = layoutExtent(layout.nodePositions);\n const { region } = opts;\n if (layout.referenceAxis && region && region.end > region.start) {\n minX = region.start;\n maxX = region.end;\n }\n const extent = opts.extent ?? layout.extent;\n if (extent) {\n minX = Math.min(minX, extent.minX ?? minX);\n minY = Math.min(minY, extent.minY ?? minY);\n maxX = Math.max(maxX, extent.maxX ?? maxX);\n maxY = Math.max(maxY, extent.maxY ?? maxY);\n }\n return { minX, minY, w: maxX - minX, h: maxY - minY };\n}\n\nexport {\n loadGraph,\n ENGINE_DEFAULTS,\n engineSettingsOf,\n engineRequest,\n engineKey,\n forceLayout,\n layoutExtent,\n FIT_PADDING,\n clampZoom,\n fittedTranslateY,\n fitTransform,\n drawingBounds\n};\n", "import {\n engineKey,\n forceLayout\n} from \"./chunk-2QLLQJ72.js\";\n\n// src/layout/forceCache.ts\nvar DEFAULT_SIZE = 4;\nfunction createForceLayoutCache(size = DEFAULT_SIZE) {\n const caches = /* @__PURE__ */ new WeakMap();\n const cacheOf = (graph) => {\n let cache = caches.get(graph);\n if (!cache) {\n cache = /* @__PURE__ */ new Map();\n caches.set(graph, cache);\n }\n return cache;\n };\n return {\n layout(graph, settings, engine) {\n const cache = cacheOf(graph);\n const key = engineKey(graph, settings);\n const hit = cache.get(key);\n if (hit) {\n return hit.run;\n }\n if (cache.size >= size) {\n cache.delete(cache.keys().next().value);\n }\n const started = performance.now();\n const entry = {\n run: forceLayout(graph, settings, engine).then((r) => {\n entry.done = r.result;\n return { ...r, duration: r.duration || performance.now() - started };\n })\n };\n entry.run.catch(() => {\n if (cache.get(key) === entry) {\n cache.delete(key);\n }\n });\n cache.set(key, entry);\n return entry.run;\n },\n ready(graph, settings) {\n return caches.get(graph)?.get(engineKey(graph, settings))?.done;\n },\n inherit(from, to) {\n const cache = caches.get(from);\n if (cache && from !== to) {\n caches.set(to, cache);\n }\n }\n };\n}\n\nexport {\n createForceLayoutCache\n};\n", "import {\n clampZoom\n} from \"./chunk-2QLLQJ72.js\";\n\n// src/viewport.ts\nfunction axisScaleOf(scale, pixelRows) {\n return { scaleX: scale, scaleY: pixelRows ? 1 : scale, pixelRows };\n}\nfunction viewportOf(t, axis, width, height) {\n return {\n minX: -t.translateX / axis.scaleX,\n minY: -t.translateY / axis.scaleY,\n maxX: (width - t.translateX) / axis.scaleX,\n maxY: (height - t.translateY) / axis.scaleY\n };\n}\nfunction padded(v, panes) {\n const w = (v.maxX - v.minX) * panes;\n const h = (v.maxY - v.minY) * panes;\n return {\n minX: v.minX - w,\n minY: v.minY - h,\n maxX: v.maxX + w,\n maxY: v.maxY + h\n };\n}\nfunction contains(outer, inner) {\n return inner.minX >= outer.minX && inner.maxX <= outer.maxX && inner.minY >= outer.minY && inner.maxY <= outer.maxY;\n}\nfunction zoomAbout(t, factor, centerX, centerY, pixelRows) {\n const scale = clampZoom(t.scale * factor);\n const ratio = scale / t.scale;\n return {\n scale,\n translateX: centerX - (centerX - t.translateX) * ratio,\n translateY: pixelRows ? t.translateY : centerY - (centerY - t.translateY) * ratio\n };\n}\nfunction screenToLayout(x, y, t, axis) {\n return {\n x: (x - t.translateX) / axis.scaleX,\n y: (y - t.translateY) / axis.scaleY\n };\n}\n\nexport {\n axisScaleOf,\n viewportOf,\n padded,\n contains,\n zoomAbout,\n screenToLayout\n};\n", "const host = JBrowseExports[\"@jbrowse/render-core/RenderLifecycleMixin\"]\nconst read = name =>\n host != null && name in Object(host)\n ? host[name]\n : Object.assign(\n function () {\n throw new Error(\n \"This JBrowse does not provide '\" + name + \"' from '\" + \"@jbrowse/render-core/RenderLifecycleMixin\" + \"' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse\",\n )\n },\n { jbrowseHostMissing: name },\n )\nexport const RenderLifecycleMixin = /* @__PURE__ */ read(\"RenderLifecycleMixin\")\nexport default host && host.__esModule ? host.default : host", "import { types } from '@jbrowse/mobx-state-tree'\n\n// Persisted choices that read a value outside `values` as unset. A plain\n// `types.enumeration` throws on one, so a session saved by a build that had an\n// option this one dropped failed to load at all; here it opens on the default.\nfunction knownOrUnset<T extends string>(values: readonly T[]) {\n return (value: string | undefined) =>\n values.includes(value as T) ? (value as T) : undefined\n}\n\nexport function lenientMaybeEnum<T extends string>(values: T[]) {\n return types.snapshotProcessor(types.maybe(types.enumeration(values)), {\n preProcessor: knownOrUnset(values),\n })\n}\n\nexport function lenientOptionalEnum<T extends string>(\n values: T[],\n fallback: T,\n) {\n return types.snapshotProcessor(\n types.optional(types.enumeration(values), fallback),\n { preProcessor: knownOrUnset(values) },\n )\n}\n", "import { lazy } from 'react'\n\nimport { BUBBLE_SPREAD_VALUES } from '@jbrowse/bandage-core/bubbleSpreads'\nimport { createForceLayoutCache } from '@jbrowse/bandage-core/layout/forceCache'\nimport { LAYOUT_ENGINE_VALUES } from '@jbrowse/bandage-core/layoutEngines'\nimport { viewportOf } from '@jbrowse/bandage-core/viewport'\nimport { types } from '@jbrowse/mobx-state-tree'\nimport { RenderLifecycleMixin } from '@jbrowse/render-core/RenderLifecycleMixin'\n\nimport { SEGMENTS_SUFFIX } from '../../locationName.ts'\nimport { lenientOptionalEnum } from '../lenientEnum'\n\nimport type { MorphEntering } from './morph'\nimport type { SubgraphRegion } from '../../GetSubgraph'\nimport type { WalkCut } from '../../RgfaTabixAdapter/walkRowRuns.ts'\nimport type { RepeatArray } from '../repeats/repeatFeatures'\nimport type { PaneLayout } from '../tubeMapPanels'\nimport type { SampleRow } from '../walkRowGroups'\nimport type { MinigraphBubble } from '@jbrowse/bandage-core/bubbles/bubbleLine'\nimport type { GeneModel } from '@jbrowse/bandage-core/genes/genePins'\nimport type { LayoutModeValue } from '@jbrowse/bandage-core/layoutModes'\nimport type { Bounds } from '@jbrowse/bandage-core/pipeline'\nimport type { RenderBatch } from '@jbrowse/bandage-core/renderer/types'\nimport type { TubeMapMismatch } from '@jbrowse/bandage-core/tubeMap/mismatches'\nimport type { Graph } from '@jbrowse/bandage-core/types'\nimport type { AxisScale } from '@jbrowse/bandage-core/util/geometry'\nimport type { WalkLayer } from '@jbrowse/bandage-core/walkEncoding'\nimport type { Feature } from '@jbrowse/core/util'\nimport type { FileLocation } from '@jbrowse/core/util/types'\n\n// Ceiling on the pane, and what it falls back to before there is a layout to\n// size against. A roughly square drawing (FMMM) hits this and keeps the\n// scrollable pane it has always had.\nexport const MAX_CANVAS_HEIGHT = 600\n// Floor, so a window holding only backbone \u2014 one row, no height at all \u2014 still\n// leaves room to hover a node and read its tooltip.\nexport const MIN_CANVAS_HEIGHT = 160\n// The pane's background, as the renderer clears to it and as CSS. It stays\n// white under a dark theme, because Bandage's deletion edges, the deletion\n// labels and the gene ink are near-black.\nexport const PAPER: [number, number, number, number] = [1, 1, 1, 1]\nexport const PAPER_CSS = 'rgb(255, 255, 255)'\n// The thinnest a fit draws a tube map's tubes\nexport const MIN_FIT_TUBE_PX = 5\n\nexport const TUBE_MAP_MODES = new Set<string>(['tubemap', 'tubemapref'])\n\n// the tube the pointer is on, by track id, and the mismatch mark under it\nexport interface HoveredTube {\n track: number\n mismatch?: TubeMapMismatch\n}\n\nexport const ChooseSamplesDialog = lazy(\n () => import('../components/ChooseSamplesDialog'),\n)\nexport const ChooseWalksDialog = lazy(\n () => import('../components/ChooseWalksDialog'),\n)\nexport const HighlightColorDialog = lazy(\n () => import('../components/HighlightColorDialog'),\n)\n\n// Past this many walks the Haplotypes menu lists only the lifted ones and offers a\n// searchable picker\nexport const WALK_MENU_ITEMS = 12\n\n// The sizes a tube map folds variants under. MICB's 22 kb cut draws 475\n// columns whole, 34 under 3 bp and one under 50, where only its structural\n// variants would stand: human windows are mostly SNPs.\nexport const TUBE_MAP_FOLDS = [\n { bp: 0, label: 'None' },\n { bp: 3, label: 'Under 3 bp' },\n { bp: 10, label: 'Under 10 bp' },\n { bp: 50, label: 'Under 50 bp, leaving structural variants' },\n { bp: 1000, label: 'Under 1 kb' },\n]\n\n// The rGFA index prefix an adapter config names, from either spelling the\n// config schema accepts: the `uri` shorthand or an explicit segments location.\nexport function bubblePrefix(adapterConfig: Record<string, unknown>) {\n if (typeof adapterConfig.uri === 'string') {\n return adapterConfig.uri\n }\n const segments = adapterConfig.segmentsLocation as\n { uri?: string } | undefined\n const uri = segments?.uri\n return typeof uri === 'string' && uri.endsWith(SEGMENTS_SUFFIX)\n ? uri.slice(0, -SEGMENTS_SUFFIX.length)\n : undefined\n}\nexport const HOVER_BRIGHTEN = 1.15\nexport const SELECT_BRIGHTEN = 1.6\nexport const VIEWPORT_DEBOUNCE_MS = 150\nexport const VIEWPORT_PANES_BUILT = 1\n// How many walk rows read their haplotype's genes, the first rows down\nexport const WALK_GENE_ROWS = 40\n\n// What the canvas draws under the tube map, whose ink is all TubeMapOverlay's\nexport type TubeMapRoutes = 'each' | 'grouped' | 'bundled'\n\nexport const TUBE_MAP_ROUTES: { value: TubeMapRoutes; label: string }[] = [\n { value: 'each', label: 'A tube per haplotype' },\n { value: 'grouped', label: 'A tube per haplotype, grouped by route' },\n { value: 'bundled', label: 'A tube per route' },\n]\n\nexport const EMPTY_BATCH: RenderBatch = {\n nodeStrokes: [],\n nodeStrokeRuns: new Map(),\n arrows: [],\n arrowRuns: new Map(),\n edgeCurves: [],\n edgeCurveRuns: new Map(),\n}\n\n// MobX tracks every observable read while a computed or autorun runs, so\n// passing values here registers them as dependencies without otherwise using\n// them.\nexport function dependOn(..._values: unknown[]) {}\n\n// Hard size cap for the single-mode graph view. Past it the view declines with a\n// \"zoom in\" message rather than switching to a degraded rendering mode \u2014 one mode\n// only, since the large-region case is a linear synteny view, not a graph.\n// (The `adr-027` citation this used to carry was stale: that number was reused\n// for wheel-input semantics after the large-mode ADR was removed in 9d8102f0b5.)\n//\n// This bounds the *fetch*, and it is the only cap that can be applied before one\n// happens. It is a poor proxy for cost, because cost tracks node count, so the\n// number is chosen against the density of the graphs it can actually guard: a\n// region is fetched through `getSubgraph`, and the rGFA cut is what this number\n// was chosen against (the GBZ cut is base-level and has its own `nodeLimit`,\n// which trips long before 5 Mb). Both measured rGFAs are sparse, and at 5 Mb\n// both land at or under the ~2k nodes that redraw in under 10 ms (see agent-docs/reference/GRAPH_SCALE_AND_LOD.md):\n//\n// HPRC MC GRCh38 ~7,000 bp/segment whole 4.9 Mb MHC 1,173 nodes\n// ecoli minigraph 3,078 bp/segment whole 4.6 Mb genome 2,415 nodes\n//\n// Fetch cost does not scale with the window either: against the hosted HPRC\n// index a 4.9 Mb links query and a 100 kb one both cost ~1.3 s, being dominated\n// by HTTP setup. FMMM is the slowest consumer at this size and stays tolerable,\n// ~0.1-3 s for ~1k nodes depending on layout quality (bandage-layout-js), and it\n// runs off the main thread.\n//\n// A dense graph is what this cannot protect against, because bp per node varies\n// by orders of magnitude between graph types \u2014 a base-level pggb graph runs ~17\n// bp/node, where 5 Mb would be hundreds of thousands. Such a graph has no region\n// query to reach this check with today, and the node budget below is the cap that\n// catches it if one ever does.\nexport const MAX_GRAPH_REGION_BP = 5_000_000\n\n// The cap in a message, in the unit that reads: `5 Mb`, not `5000 kb`.\nexport function formatSpanBp(bp: number) {\n return bp >= 1_000_000\n ? `${+(bp / 1_000_000).toFixed(1)} Mb`\n : `${Math.round(bp / 1000)} kb`\n}\n\n// What the view will actually draw, checked once the graph is parsed and so\n// applying to a whole-file import as much as to a subgraph fetch. Measured on\n// bubble-chain graphs: ~1-2k nodes redraws in under 10 ms, 10k takes ~43 ms of\n// geometry and ~125k canvas draw calls per frame (single-digit fps while\n// panning), and 100k needs 632 ms and 75 MB of vertex buffers. So this is set\n// where the tab stops being usable rather than where it stops being smooth, and\n// it is a view prop rather than a constant so a session can raise it \u2014 the same\n// escape hatch strangepg gives with `-T N`.\nexport const DEFAULT_MAX_GRAPH_NODES = 20_000\n\n// the last segment of a file's path, its query dropped, or a blob's own name\nexport function fileName(location: FileLocation) {\n const path =\n 'uri' in location\n ? location.uri.split(/[?#]/)[0]!\n : 'localPath' in location\n ? location.localPath\n : 'name' in location\n ? location.name\n : ''\n return path.split(/[\\\\/]/).at(-1) ?? ''\n}\n\n// A url bandage-figure can read again, or undefined for a local file\nexport function uriOf(location: FileLocation | undefined) {\n return location && 'uri' in location && location.uri\n ? new URL(location.uri, location.baseUri ?? window.location.href).href\n : undefined\n}\n\ntype ViewportOwner = 'fit' | 'user' | 'host'\n\ninterface BuiltViewport {\n scale: number\n bounds: Bounds\n viewportDirty: number\n}\n\nexport function geometryPainted(model: {\n viewportRebuildPending: boolean\n viewportDirty: number\n builtViewport?: BuiltViewport\n paintedViewport?: BuiltViewport\n}) {\n return (\n model.builtViewport !== undefined &&\n model.paintedViewport === model.builtViewport &&\n model.builtViewport.viewportDirty === model.viewportDirty &&\n !model.viewportRebuildPending\n )\n}\n\n// What the pane shows, in layout units: what each panel shows while faceted\nexport function paneViewportOf(model: {\n translateX: number\n translateY: number\n axisScale: AxisScale\n viewBox: { width: number; height: number }\n}): Bounds {\n const { width, height } = model.viewBox\n return viewportOf(model, model.axisScale, width, height)\n}\n\n// Force layouts already computed for a graph, keyed by the view props the\n// engine reads. Every layout mode is local and costs a millisecond except this\n// one, which is seconds: measured on the committed engine, a 1,201-node bubble\n// chain is 0.6 s proportional, 4.3 s at 'Wide bubbles' and 3.4 s at the highest\n// quality.\n//\n// Worth keeping because a session revisits the same layout. The two drawings\n// answer different questions and the README's own figure is one subgraph in\n// both, so Anchored <-> Force is a round trip a reader makes repeatedly \u2014 and\n// picking a reference path calls `recomputeLayout` whether or not the current\n// mode reads it, which in force mode was a multi-second re-run of an identical\n// layout.\n// Both are hits. The cache itself is core's, which BandageJS keeps too.\nexport const forceLayouts = createForceLayoutCache()\n\nexport const paneBase = types\n .compose(\n 'GraphPane',\n RenderLifecycleMixin(),\n types.model({\n // FMMM's iteration budget, 0-4, the same scale Bandage's own settings\n // dialog exposes: 3+1 iterations at 0, 15+10 at 1, 30+20 at 2, 60+40 at\n // 3, 120+60 at 4 (BandageNG layout/graphlayoutworker.cpp).\n //\n // 2 because that is what the engine we vendor ships as its default\n // (`graphLayoutQuality = IntSetting(2, 0, 4)`, program/settings.cpp).\n // This was 1 for no recorded reason, i.e. one step BELOW upstream, and a\n // first sight of any graph is the default: review kept asking whether\n // the drawing could be iterated more (\"are you sure you can't iterate it\n // more times for better layout?\") of figures that were simply on a lower\n // setting than the tool they come from. Cost at the sizes this view\n // draws is milliseconds, and the header states the layout time so the\n // difference is visible rather than asserted.\n layoutQuality: types.optional(types.number, 2),\n // Which engine draws the force layout: Bandage's FMMM, or the stress\n // layout, which reads the reference straight. See LAYOUT_ENGINES.\n layoutEngine: lenientOptionalEnum(LAYOUT_ENGINE_VALUES, 'fmmm'),\n linearLayout: types.optional(types.boolean, false),\n // How far the force layout opens a bubble, which on a variation graph is\n // the difference between a legible drawing and a rope. See\n // BUBBLE_SPREADS; no effect on the reference-anchored layouts, which\n // place a node from its coordinates rather than from a force sim.\n bubbleSpread: lenientOptionalEnum(BUBBLE_SPREAD_VALUES, 'auto'),\n // Variants under this many bp fold into the reference before a tube map\n // is laid out, each kept as a tick on its walk's tube (coarsen.ts); 0\n // draws every one\n tubeMapFold: types.optional(types.number, 0),\n // A tube per haplotype, or a tube per route the haplotypes take, as\n // wide as how many take it (bundleRoutes)\n tubeMapRoutes: lenientOptionalEnum<TubeMapRoutes>(\n ['each', 'grouped', 'bundled'],\n 'each',\n ),\n // A sample table column whose values colour the tubes, the reference\n // charcoal; empty colours them by role\n tubeMapColorBy: types.optional(types.string, ''),\n // Which track the genes come from; empty picks the assembly's\n // annotation track (pickGeneTrack).\n geneTrackId: types.optional(types.string, ''),\n // Which track the walk rows read tandem repeat arrays from; empty\n // picks a track whose name says repeats (pickRepeatTrack).\n repeatTrackId: types.optional(types.string, ''),\n // The array the walk rows measure between and tile by, as\n // RepeatArray.key; empty measures the whole window untiled.\n repeatKey: types.optional(types.string, ''),\n // Walks lifted out of the drawing, each a layer with a lane of its own\n // and the rest fading, coloured by the encoding it states or by the\n // default one. See walkEncoding.ts. Empty lifts none.\n walkLayers: types.optional(types.frozen<WalkLayer[]>(), []),\n // Which of a general GFA's paths the anchored layouts put on x. A path\n // GFA's names are arbitrary and none of them is marked as the\n // reference, so this is a choice; empty means \"infer\", which is the\n // assembly a subgraph was cut against, and the first path in the file\n // for a whole-file import. No effect on an rGFA, whose segments carry\n // their own coordinates. See pathAnchoring.ts.\n referencePath: types.optional(types.string, ''),\n // Whether the toolbar spells out `fetch 12371ms \u00B7 layout 4ms \u00B7 geom 9ms`.\n // Off by default because it was in the toolbar of every published graph\n // figure, where a machine's fetch time is noise a reader has to skip\n // past. The numbers themselves are always on the element as `data-*`\n // attributes, which is what browser tests assert against, so hiding the\n // text costs no coverage.\n showPerf: types.optional(types.boolean, false),\n connectorThickness: types.optional(types.number, 2),\n scale: types.optional(types.number, 1),\n translateX: types.optional(types.number, 0),\n translateY: types.optional(types.number, 0),\n // Ceiling on the drawing pane, in css px, for a session or a figure that\n // wants a shorter one than the drawing asks for. Unset means the built-in\n // MAX_CANVAS_HEIGHT, which is what every existing session gets.\n //\n // Why this is a knob rather than a smaller default: the pane is as tall\n // as the drawing's own aspect ratio (see canvasHeight), which is right \u2014\n // a graph that is twice as tall as it is wide should not be squeezed\n // into a strip. But one very long node in a cut of short ones makes that\n // aspect ratio all arc: the HPRC CHM13 figure draws a 142 kb allele\n // among sub-kb backbone segments, pins the 600 px ceiling and spends\n // most of it on the loop, with the chain squashed along the bottom edge.\n // Lowering the ceiling there scales the whole drawing down, which is\n // exactly the trade that figure wants and the wrong default for a graph\n // whose height is carrying information.\n paneHeight: types.maybe(types.number),\n // Raise to draw a bigger graph than the default budget allows; see\n // DEFAULT_MAX_GRAPH_NODES for what the numbers cost.\n maxGraphNodes: types.optional(types.number, DEFAULT_MAX_GRAPH_NODES),\n // the linear view a graph of its own is paired with for the hover sync\n connectedViewId: types.maybe(types.string),\n // The bp ceiling on a fine cut, a proxy for node count that only\n // holds at fine granularity; `maxGraphNodes` counts what came back.\n maxRegionBp: types.optional(types.number, MAX_GRAPH_REGION_BP),\n // How far the cut follows links past the region's own segments. At\n // 0 a detour that leaves the backbone before the window and rejoins\n // after it arrives as a fragment, since its interior is indexed only\n // under its own sequence, so one bubble draws as two unrelated\n // insertions. A hop follows alleles only, so it never walks the\n // backbone out of the window.\n subgraphContext: types.optional(types.number, 1),\n // the haplotypes a GBZ or walk-indexed cut is for; unset is\n // trackHaplotypes\n subgraphHaplotypes: types.maybe(types.frozen<string[]>()),\n }),\n )\n .volatile(() => ({\n graph: undefined as Graph | undefined,\n // a walk-rows cut's tables and runs, which draw the rows in place of the\n // graph's walks\n walkCut: undefined as WalkCut | undefined,\n // the reference window the graph on screen was cut for, set with it\n graphRegion: undefined as SubgraphRegion | undefined,\n // The walk the track's graph lies on for the region's assembly, which\n // the track's config declares; x starts along it unless the user chose\n // another. Undefined for an rGFA, whose backbone is fixed, and for a\n // graph with no region.\n loadedReferencePath: undefined as string | undefined,\n layoutResult: undefined as PaneLayout | undefined,\n // the mode that drew layoutResult: force where the chosen one could not\n drawnLayoutMode: undefined as LayoutModeValue | undefined,\n // what the legends in the pane's top-right corner measure, so no label\n // is placed under them\n legendSize: { width: 0, height: 0 },\n // The bubble index rows over the cut window, when the source track has\n // one beside its segments. Undefined for a graph with no index, whose\n // bubbles are `derivedBubbles` instead.\n indexBubbles: undefined as MinigraphBubble[] | undefined,\n // the size under which the graph on screen has variants folded into the\n // reference, by this cut or by the tier it was cut from\n foldedBelowBp: undefined as number | undefined,\n // the gene track's features over the cut window, read once per cut\n geneTrackFeatures: undefined as Feature[] | undefined,\n // each walk row's genes, read from its haplotype's own assembly, by walk\n // name\n walkGeneFeatures: undefined as Map<string, GeneModel[]> | undefined,\n // the source track's samples TSV, which walk rows group by\n walkRowSampleTable: undefined as SampleRow[] | undefined,\n // the tandem repeat arrays over the cut window, from the repeat track\n repeatArrays: undefined as RepeatArray[] | undefined,\n // the layout mode the drawing was last laid out for, so a change from the\n // menu is not laid out a second time by the reaction that catches the rest\n handledLayoutMode: undefined as LayoutModeValue | undefined,\n // The bubbles opened in place, outermost first, each inside the one before\n // it. The drawing keeps the innermost in colour and greys the rest.\n openBubbles: [] as MinigraphBubble[],\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n error: undefined as unknown,\n isLoading: false,\n loadCanceled: false,\n statusMessage: '',\n hoveredNode: null as string | null,\n // where on the pane the pointer hovered it, when the canvas set it\n hoveredAt: null as { x: number; y: number } | null,\n hoveredTube: null as HoveredTube | null,\n // the tube map panel the pointer is over, while the map is split\n hoveredPanel: null as number | null,\n // the walks of the per-sample lane row the linear view's pointer is on\n hoveredRowWalks: [] as string[],\n // the bubble whose label the pointer is on\n hoveredBubble: null as MinigraphBubble | null,\n // whether the pointer is over this pane, whose own hit test then says\n // what it is on\n pointerInPane: false,\n // the strip point the pointer is over, which lights its node above\n stripHover: null as { row: string; offset: number } | null,\n // the walk row the pointer is on, by walk name\n hoveredWalkRow: null as string | null,\n hoveredEdge: null as number | null,\n selectedNode: null as string | null,\n viewportDirty: 0,\n // Bumped when the layout's positions are mutated IN PLACE, which only a\n // node drag does. Separate from `viewportDirty` because that one also\n // fires on pan and zoom, and the things keyed off this \u2014 the two hit\n // indexes and the label placement's per-layout caches \u2014 do not depend on\n // the transform at all. Rebuilding a 12k-edge hit index because the user\n // panned cost ~14 ms of the first mousemove after every gesture.\n positionsVersion: 0,\n // what a morph under way is fading in\n morphEntering: undefined as MorphEntering | undefined,\n // The batch the canvas holds, which the hover layer lights over it\n drawnBatch: EMPTY_BATCH,\n // The zoom and the window the current batch was built for; a pan that\n // stays inside it needs no rebuild.\n builtViewport: undefined as BuiltViewport | undefined,\n // The builtViewport whose batch is on the canvas\n paintedViewport: undefined as BuiltViewport | undefined,\n draggingNode: null as string | null,\n // Dragging the background rather than a node. Lives here beside\n // draggingNode instead of in a component ref+state pair, so the two\n // mutually exclusive drag modes are one piece of state read from one place.\n isPanning: false,\n // Who places the view. 'fit' refits it to every new layout, 'user' leaves\n // it where a gesture or a restored session put it, and 'host' takes x\n // from the linear view the pane sits in. Not derived from\n // `isDefaultViewport`, which zoomToFit itself invalidates on its first\n // run \u2014 that made the fit fire once against not-yet-measured dimensions\n // and then never re-fit.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n viewportOwner: 'fit' as ViewportOwner,\n viewportDirtyTimer: undefined as ReturnType<typeof setTimeout> | undefined,\n // 0 is never a live rAF handle, so it doubles as \"nothing pending\"\n positionsDirtyFrame: 0,\n // Performance instrumentation, surfaced in GraphStats for browser tests\n // to assert against budgets. `fetchMs` is the GetSubgraph RPC round-trip,\n // `layoutMs` is the Bandage FMMM compute time reported by the\n // GraphComputeLayout RPC, `geometryMs` is the main-thread buildGeometry\n // pass and `geometryStrokeCount` the node strokes it produced.\n lastFetchMs: undefined as number | undefined,\n // how many of the cut's reads the tube map was handed, of how many\n readsShown: undefined as { shown: number; total: number } | undefined,\n lastLayoutMs: undefined as number | undefined,\n lastGeometryMs: undefined as number | undefined,\n lastGeometryStrokeCount: undefined as number | undefined,\n viewportRebuildPending: false,\n }))\n", "import { readConfObject } from '@jbrowse/core/configuration'\nimport { getSession } from '@jbrowse/core/util'\n\nimport type { AnyConfigurationModel } from '@jbrowse/core/configuration'\nimport type { IAnyStateTreeNode } from '@jbrowse/mobx-state-tree'\n\nexport interface AssemblyAliases {\n name: string\n aliases: string[]\n}\n\n// Only `sample#haplotype`, the spelling gbz-base gives a walk's prefix. A bare\n// alias is indistinguishable from an ordinary one (hg38's `GRCh38`) and would\n// replace the identity mapping that already resolves an assembly named as its\n// sample; at sample depth it would also claim both of a diploid's walks, since\n// `panSNMatchesPrefix` matches `HG002` against `HG002#1` and `HG002#2`. Three\n// parts name a contig, not a haplotype.\nconst PANSN_HAPLOTYPE = /^[^#]+#\\d+$/\n\n// The config's `assemblyNameToPanSN` with each assembly's PanSN alias added\n// beneath it: an entry wins for its assembly and for its prefix. Unchanged when\n// no alias qualifies, so such a track keeps its adapter cache key.\nexport function withPanSNAliases(\n adapterConfig: Record<string, unknown>,\n assemblies: AssemblyAliases[],\n) {\n const explicit = (adapterConfig.assemblyNameToPanSN ?? {}) as Record<\n string,\n string\n >\n const claimed = new Set(Object.values(explicit))\n const fromAliases: Record<string, string> = {}\n for (const { name, aliases } of assemblies) {\n const prefix = aliases.find(alias => PANSN_HAPLOTYPE.test(alias))\n if (prefix !== undefined && !claimed.has(prefix)) {\n fromAliases[name] = prefix\n }\n }\n return Object.keys(fromAliases).length === 0\n ? adapterConfig\n : {\n ...adapterConfig,\n assemblyNameToPanSN: { ...fromAliases, ...explicit },\n }\n}\n\n// The adapters that declare `headerLanes`, whose lanes are PanSN haplotypes\nconst LANE_ADAPTERS = new Set([\n 'GbzBaseSyntenyAdapter',\n 'WalkTabixSyntenyAdapter',\n])\n\n/**\n * A track's adapter config as its requests carry it. A worker has no assembly\n * manager, so a lane track learns the session's PanSN aliases here.\n */\nexport function trackAdapterConfig(\n node: IAnyStateTreeNode,\n track: AnyConfigurationModel,\n) {\n const adapterConfig = readConfObject(track, 'adapter') as Record<\n string,\n unknown\n >\n return LANE_ADAPTERS.has(adapterConfig.type as string)\n ? withPanSNAliases(\n adapterConfig,\n getSession(node).assemblyManager.assemblyList.map(conf => ({\n name: readConfObject(conf, 'name') as string,\n aliases: (readConfObject(conf, 'aliases') ?? []) as string[],\n })),\n )\n : adapterConfig\n}\n", "import {\n projectAlleles\n} from \"./chunk-RVS2QCOX.js\";\nimport {\n buildNeighbors\n} from \"./chunk-ES2N6V56.js\";\n\n// src/layout/placeOffReference.ts\nvar MIN_DELETION_BP = 1;\nvar MIN_ALLELE_SPAN_FRACTION = 0.015;\nfunction placeOffReference({\n graph,\n span,\n rowY,\n positions\n}) {\n const minSpan = span * MIN_ALLELE_SPAN_FRACTION;\n const alleles = projectAlleles(graph);\n const byId = new Map(graph.nodes.map((n) => [n.id, n]));\n const alleleDeletions = [];\n for (const allele of alleles) {\n const skipped = allele.refSpan - allele.pathLength;\n if (skipped >= MIN_DELETION_BP) {\n alleleDeletions.push({ nodeIds: allele.nodeIds, bp: skipped });\n }\n const drawn = Math.max(allele.refSpan, minSpan);\n const scale = allele.pathLength > 0 ? drawn / allele.pathLength : 0;\n allele.nodeIds.forEach((nodeId, i) => {\n const node = byId.get(nodeId);\n if (node) {\n const offset = allele.nodeOffsets[i];\n const even = drawn / allele.nodeIds.length;\n const at = (bp) => allele.start + bp * scale;\n const y = rowY(node);\n positions[nodeId] = scale ? [\n { x: at(offset), y },\n { x: at(offset + node.length), y }\n ] : [\n { x: allele.start + i * even, y },\n { x: allele.start + (i + 1) * even, y }\n ];\n }\n });\n }\n const neighbors = buildNeighbors(graph);\n const queue = Object.keys(positions);\n for (const fromId of queue) {\n const fromEnd = positions[fromId].at(-1).x;\n for (const nextId of neighbors.get(fromId) ?? []) {\n const next = byId.get(nextId);\n if (next && !(nextId in positions)) {\n const y = rowY(next);\n positions[nextId] = [\n { x: fromEnd, y },\n { x: fromEnd + minSpan, y }\n ];\n queue.push(nextId);\n }\n }\n }\n return alleleDeletions;\n}\n\nexport {\n placeOffReference\n};\n", "import {\n placeOffReference\n} from \"./chunk-TZFWUT2C.js\";\nimport {\n parsePanSN\n} from \"./chunk-RVS2QCOX.js\";\nimport {\n ROW_HEIGHT_PX\n} from \"./chunk-CPMHA4W5.js\";\nimport {\n backboneNodes,\n backbonePositions,\n isOffReference,\n referenceSpan\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layout/sampleRowLayout.ts\nfunction contributingSamples(graph, keep) {\n const carried = /* @__PURE__ */ new Map();\n for (const node of graph.nodes) {\n if (isOffReference(node)) {\n const { sample } = parsePanSN(node.stable.refName);\n carried.set(sample, (carried.get(sample) ?? 0) + node.length);\n }\n }\n const held = new Map(keep.map((sample, row) => [sample, row]));\n return [...carried.keys()].sort(\n (a, b) => (held.get(a) ?? Infinity) - (held.get(b) ?? Infinity) || carried.get(b) - carried.get(a) || a.localeCompare(b)\n );\n}\nfunction sampleRowLayout(graph, region, keep = []) {\n const backbone = backboneNodes(graph);\n const samples = contributingSamples(graph, keep);\n if (backbone.length === 0 || samples.length === 0) {\n return void 0;\n }\n const span = referenceSpan(backbone, region);\n const rowOf = new Map(samples.map((s, i) => [s, i + 1]));\n const nodePositions = backbonePositions(backbone);\n const spareRow = samples.length + 1;\n const alleleDeletions = placeOffReference({\n graph,\n span,\n rowY: (node) => {\n const stable = node.stable;\n const row = stable ? rowOf.get(parsePanSN(stable.refName).sample) : void 0;\n return (row ?? spareRow) * ROW_HEIGHT_PX;\n },\n positions: nodePositions\n });\n const referenceSample = parsePanSN(backbone[0].stable.refName).sample;\n const rowLabels = [\n { label: referenceSample, y: 0 },\n ...samples.map((sample) => ({\n label: sample,\n y: rowOf.get(sample) * ROW_HEIGHT_PX\n }))\n ];\n return {\n nodePositions,\n rowLabels,\n sampleRows: samples,\n referenceAxis: true,\n pixelRows: true,\n alleleDeletions\n };\n}\n\nexport {\n sampleRowLayout\n};\n", "import {\n canonicalStrand,\n stepName,\n tubeMapReads\n} from \"./chunk-CWFNEKST.js\";\nimport {\n pathCssColor,\n pathGreyCssColor\n} from \"./chunk-3XSM4OZU.js\";\nimport {\n pathOrigin\n} from \"./chunk-M6LK4GII.js\";\nimport {\n ownStrand,\n strandSides\n} from \"./chunk-7SRWJLSC.js\";\nimport {\n isBackbone\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layout/tubeMapLayout.ts\nimport { forward, isReverse, layoutTubeMap } from \"@jbrowse/tubemap-core\";\nfunction pathSteps(graph) {\n const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));\n const visits = graph.pathVisits;\n const next = visits?.replay();\n return (graph.paths ?? []).map((path) => {\n const walk = visits?.pathIndex(pathOrigin(path.name).name) ?? -1;\n return path.nodeIds.flatMap((id) => {\n const node = nodeById.get(id);\n if (!node) {\n return [];\n }\n const at = visits && next ? next(visits.slot(node.name), walk) : -1;\n return [\n { node, strand: at >= 0 ? visits.strand(at) : canonicalStrand(node) }\n ];\n });\n });\n}\nfunction tubeMapTracks(graph) {\n const steps = pathSteps(graph);\n const tracks = (graph.paths ?? []).flatMap((path, index) => {\n const sequence = steps[index].map((s) => stepName(s.node, s.strand));\n return sequence.length > 0 ? [\n {\n id: index,\n name: path.name,\n sequence,\n sourceTrackID: 0,\n type: \"haplotype\",\n ...path.members ? { freq: path.members.length } : {}\n }\n ] : [];\n });\n const reference = tracks.findIndex(\n (t) => pathOrigin(t.name).name === graph.referencePath\n );\n if (reference > 0) {\n tracks.unshift(...tracks.splice(reference, 1));\n }\n return tracks;\n}\nfunction tubeMapNodes(graph) {\n return graph.nodes.map((n) => ({\n name: n.id,\n seq: \"\",\n sequenceLength: Math.max(1, n.length)\n }));\n}\nfunction hasTubeMapPaths(graph) {\n return (graph.paths?.length ?? 0) > 0;\n}\nvar STACK_PX = 600;\nvar MIN_TUBE_PX = 3;\nvar MAX_TUBE_PX = 15;\nfunction tubeWidth(trackCount) {\n return Math.max(\n MIN_TUBE_PX,\n Math.min(MAX_TUBE_PX, Math.floor(STACK_PX / Math.max(1, trackCount)))\n );\n}\nfunction straightened(first) {\n const flipped = /* @__PURE__ */ new Set();\n const forwards = /* @__PURE__ */ new Set();\n for (const step of first?.sequence ?? []) {\n if (!isReverse(step)) {\n forwards.add(step);\n } else if (!forwards.has(forward(step))) {\n flipped.add(forward(step));\n }\n }\n return flipped;\n}\nfunction mergedRuns(graph, layout, walks) {\n const flipped = straightened(walks[0]);\n const before = /* @__PURE__ */ new Map();\n for (const { sequence, is_secondary } of walks) {\n if (!is_secondary) {\n sequence.forEach((step, i) => {\n const id = forward(step);\n const against = isReverse(step) !== flipped.has(id);\n const neighbour = against ? sequence[i + 1] : sequence[i - 1];\n if (!layout.nodeMap.has(id) && neighbour !== void 0) {\n before.set(id, forward(neighbour));\n }\n });\n }\n }\n const lengthOf = new Map(graph.nodes.map((n) => [n.id, Math.max(1, n.length)]));\n const after = new Map([...before].map(([node, prev]) => [prev, node]));\n const members = /* @__PURE__ */ new Map();\n for (const head of after.keys()) {\n const index = layout.nodeMap.get(head);\n if (index !== void 0) {\n const run = [head];\n for (let n = after.get(head); n !== void 0; n = after.get(n)) {\n run.push(n);\n }\n const bp = run.reduce((sum, id) => sum + (lengthOf.get(id) ?? 0), 0);\n if (bp === layout.nodes[index].sequenceLength) {\n members.set(head, run);\n }\n }\n }\n return { members, flipped };\n}\nvar opposite = { start: \"end\", end: \"start\" };\nvar otherStrand = { \"+\": \"-\", \"-\": \"+\" };\nfunction boxGraph(graph, { members, flipped }) {\n if (members.size === 0) {\n return graph;\n }\n const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));\n const boxOf = /* @__PURE__ */ new Map();\n const inner = /* @__PURE__ */ new Set();\n const drawn = (id, side) => flipped.has(id) ? opposite[side] : side;\n for (const [box, run] of members) {\n run.forEach((id, i) => {\n boxOf.set(id, box);\n const next = run[i + 1];\n if (next !== void 0) {\n inner.add(`${id}:${drawn(id, \"end\")}\t${next}:${drawn(next, \"start\")}`);\n }\n });\n }\n const absorbed = new Set(\n [...boxOf].filter(([id, box]) => id !== box).map(([id]) => id)\n );\n const nodes = graph.nodes.flatMap((node) => {\n const run = members.get(node.id);\n if (!run) {\n return absorbed.has(node.id) ? [] : [node];\n }\n const parts = run.map((id) => nodeById.get(id));\n const starts = parts.flatMap((p) => p.stable ? [p.stable.start] : []);\n return [\n {\n ...node,\n length: parts.reduce((sum, p) => sum + p.length, 0),\n stable: node.stable && { ...node.stable, start: Math.min(...starts) }\n }\n ];\n });\n const leaving = (id, box, side) => drawn(box, drawn(id, side)) === \"end\" ? ownStrand(box) : otherStrand[ownStrand(box)];\n const edges = graph.edges.flatMap((edge) => {\n const sides = strandSides(edge);\n const from = `${edge.from}:${sides.from}`;\n const to = `${edge.to}:${sides.to}`;\n if (inner.has(`${from}\t${to}`) || inner.has(`${to}\t${from}`)) {\n return [];\n }\n const fromBox = boxOf.get(edge.from);\n const toBox = boxOf.get(edge.to);\n return [\n {\n ...edge,\n ...fromBox === void 0 ? {} : {\n from: fromBox,\n fromStrand: leaving(edge.from, fromBox, sides.from)\n },\n ...toBox === void 0 ? {} : {\n to: toBox,\n toStrand: otherStrand[leaving(edge.to, toBox, sides.to)]\n }\n }\n ];\n });\n const absorbedNames = new Set(\n [...absorbed].map((id) => nodeById.get(id)?.name ?? id)\n );\n return {\n ...graph,\n nodes,\n edges,\n paths: graph.paths?.map((path) => ({\n ...path,\n nodeIds: path.nodeIds.filter((id) => !absorbed.has(id))\n })),\n pathVisits: graph.pathVisits?.filter(\n () => true,\n (segment) => !absorbedNames.has(segment)\n )\n };\n}\nfunction runTubeMap(graph) {\n const paths = graph.paths ?? [];\n const tracks = tubeMapTracks(graph);\n const reads = graph.reads ? tubeMapReads(graph, graph.reads, paths.length) : [];\n const tubeColor = reads.length > 0 ? pathGreyCssColor : pathCssColor;\n const pathColors = paths.map((_, i) => tubeColor(i, paths.length));\n const bundled = paths.some((p) => p.members);\n const walks = paths.reduce((n, p) => n + (p.members?.length ?? 1), 0);\n const layout = layoutTubeMap(tubeMapNodes(graph), tracks, reads, {\n nodeWidthOption: \"compressed\",\n trackWidth: tubeWidth(bundled ? walks : tracks.length),\n ...bundled ? { freqWidth: \"linear\" } : {}\n });\n if (!layout) {\n return void 0;\n }\n const runs = mergedRuns(graph, layout, [...tracks, ...reads]);\n return {\n layout,\n pathColors,\n members: runs.members,\n graph: boxGraph(graph, runs)\n };\n}\nfunction drawnNodes(layout) {\n const nodes = [];\n layout.nodes.forEach((node) => {\n if (node.order >= 0) {\n nodes.push(node);\n }\n });\n return nodes;\n}\nfunction centreline(node, yOffset, x0, x1) {\n const y = node.y + node.contentHeight / 2 - yOffset;\n return [\n { x: x0, y },\n { x: x1, y }\n ];\n}\nfunction extentOf(layout, yOffset) {\n return {\n minY: layout.bounds.minY - yOffset,\n maxY: layout.bounds.maxY - yOffset\n };\n}\nfunction tubeMapLayout(graph) {\n const run = hasTubeMapPaths(graph) ? runTubeMap(graph) : void 0;\n if (!run) {\n return void 0;\n }\n const { layout, ...drawing } = run;\n const yOffset = layout.bounds.minY;\n const nodePositions = {};\n for (const node of drawnNodes(layout)) {\n nodePositions[node.name] = centreline(\n node,\n yOffset,\n node.x,\n node.x + node.pixelWidth\n );\n }\n const { minY, maxY } = extentOf(layout, yOffset);\n return {\n nodePositions,\n tubeMap: { layout, yOffset, ...drawing },\n extent: {\n minX: layout.bounds.minX,\n maxX: layout.bounds.maxX,\n minY,\n maxY\n }\n };\n}\nfunction tubeMapColumns(graph, layout) {\n const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));\n const byOrder = /* @__PURE__ */ new Map();\n for (const node of drawnNodes(layout)) {\n const list = byOrder.get(node.order);\n if (list) {\n list.push(node);\n } else {\n byOrder.set(node.order, [node]);\n }\n }\n const columns = [];\n let end = -Infinity;\n for (const order of [...byOrder.keys()].sort((a, b) => a - b)) {\n const nodes = byOrder.get(order);\n let bp0 = Infinity;\n let bp1 = -Infinity;\n for (const node of nodes) {\n const graphNode = nodeById.get(node.name);\n if (graphNode && isBackbone(graphNode)) {\n bp0 = Math.min(bp0, graphNode.stable.start);\n bp1 = Math.max(bp1, graphNode.stable.start + graphNode.length);\n }\n }\n if (bp0 === Infinity) {\n bp0 = bp1 = end;\n }\n if (bp0 < end) {\n bp0 = end;\n bp1 = Math.max(end, bp1);\n }\n end = Math.max(end, bp1);\n columns.push({\n order,\n x0: Math.min(...nodes.map((n) => n.x)),\n x1: Math.max(...nodes.map((n) => n.x + n.pixelWidth)),\n bp0,\n bp1\n });\n }\n const first = columns.find((c) => c.bp0 !== -Infinity);\n for (const column of columns) {\n if (column.bp0 === -Infinity) {\n column.bp0 = column.bp1 = first?.bp0 ?? 0;\n }\n }\n return columns;\n}\nfunction hasTubeMapBackbone(graph) {\n return hasTubeMapPaths(graph) && graph.nodes.some(isBackbone);\n}\nfunction tubeMapReferenceLayout(graph) {\n const run = hasTubeMapBackbone(graph) ? runTubeMap(graph) : void 0;\n if (!run) {\n return void 0;\n }\n const { layout, ...drawing } = run;\n const columns = tubeMapColumns(drawing.graph, layout);\n const byOrder = new Map(columns.map((c) => [c.order, c]));\n const yOffset = layout.bounds.minY;\n const nodePositions = {};\n for (const node of drawnNodes(layout)) {\n const column = byOrder.get(node.order);\n nodePositions[node.name] = centreline(node, yOffset, column.bp0, column.bp1);\n }\n return {\n nodePositions,\n tubeMap: { layout, yOffset, columns, ...drawing },\n referenceAxis: true,\n pixelRows: true,\n extent: extentOf(layout, yOffset)\n };\n}\n\nexport {\n pathSteps,\n tubeMapTracks,\n hasTubeMapPaths,\n tubeWidth,\n mergedRuns,\n boxGraph,\n tubeMapLayout,\n hasTubeMapBackbone,\n tubeMapReferenceLayout\n};\n", "import {\n placeOffReference\n} from \"./chunk-TZFWUT2C.js\";\nimport {\n ROW_HEIGHT_PX\n} from \"./chunk-CPMHA4W5.js\";\nimport {\n backboneNodes,\n backbonePositions,\n referenceSpan\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layout/anchoredLayout.ts\nfunction rankRows(graph) {\n const present = /* @__PURE__ */ new Set();\n for (const node of graph.nodes) {\n if (node.stable) {\n present.add(node.stable.rank);\n }\n }\n return new Map([...present].sort((a, b) => a - b).map((r, i) => [r, i]));\n}\nfunction anchoredLayout(graph, region) {\n const backbone = backboneNodes(graph);\n if (backbone.length === 0) {\n return void 0;\n }\n const span = referenceSpan(backbone, region);\n const rows = rankRows(graph);\n const nodePositions = backbonePositions(backbone);\n const alleleDeletions = placeOffReference({\n graph,\n span,\n rowY: (node) => (node.stable ? rows.get(node.stable.rank) ?? rows.size : rows.size) * ROW_HEIGHT_PX,\n positions: nodePositions\n });\n const rowLabels = [...rows].map(([rank, row]) => ({\n label: rank === 0 ? \"Reference (rank 0)\" : `Rank ${rank}`,\n y: row * ROW_HEIGHT_PX\n }));\n return {\n nodePositions,\n rowLabels,\n referenceAxis: true,\n pixelRows: true,\n alleleDeletions\n };\n}\n\nexport {\n anchoredLayout\n};\n", "import {\n ROW_HEIGHT_PX\n} from \"./chunk-CPMHA4W5.js\";\nimport {\n isBackbone\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layout/orderedLayout.ts\nvar GUTTER = 12;\nvar LANE_PX = ROW_HEIGHT_PX;\nfunction nodeWidth(node) {\n return 10 + 8 * Math.log2(1 + node.length);\n}\nfunction compare(a, b) {\n return a < b ? -1 : a > b ? 1 : 0;\n}\nfunction compareKeys(a, b) {\n return compare(a.at, b.at) || compare(a.side, b.side) || compare(a.hops, b.hops);\n}\nvar UNREACHED = { at: Infinity, side: 0, hops: 0 };\nfunction referenceOrder(graph) {\n const byId = new Map(graph.nodes.map((n) => [n.id, n]));\n const key = orderKeys(graph);\n return graph.nodes.map((n) => n.id).sort(\n (a, b) => compareKeys(key.get(a) ?? UNREACHED, key.get(b) ?? UNREACHED) || compare(byId.get(a).name, byId.get(b).name) || compare(a, b)\n );\n}\nfunction placeByWalks(graph, backbone) {\n const isNode = new Set(graph.nodes.map((n) => n.id));\n const startOf = new Map(backbone.map((n) => [n.id, n.stable.start]));\n const next = /* @__PURE__ */ new Map();\n const prev = /* @__PURE__ */ new Map();\n backbone.forEach((n, i) => {\n prev.set(n.id, backbone[i - 1]?.id);\n next.set(n.id, backbone[i + 1]?.id);\n });\n let head = backbone[0]?.id;\n const insertAfter = (at, id) => {\n const after = next.get(at);\n next.set(at, id);\n prev.set(id, at);\n next.set(id, after);\n if (after !== void 0) {\n prev.set(after, id);\n }\n };\n const insertBefore = (at, id) => {\n const before = prev.get(at);\n if (before === void 0) {\n head = id;\n prev.set(id, void 0);\n next.set(id, at);\n prev.set(at, id);\n } else {\n insertAfter(before, id);\n }\n };\n for (const path of graph.paths ?? []) {\n let rising = 0;\n let falling = 0;\n let last;\n for (const id of path.nodeIds) {\n const start = startOf.get(id);\n if (start !== void 0) {\n if (last !== void 0 && start !== last) {\n if (start > last) {\n rising++;\n } else {\n falling++;\n }\n }\n last = start;\n }\n }\n const ids = falling > rising ? [...path.nodeIds].reverse() : path.nodeIds;\n let from;\n const leading = /* @__PURE__ */ new Set();\n for (const id of ids) {\n if (next.has(id)) {\n if (from === void 0) {\n for (const lead of leading) {\n insertBefore(id, lead);\n }\n }\n from = id;\n } else if (isNode.has(id)) {\n if (from === void 0) {\n leading.add(id);\n } else {\n insertAfter(from, id);\n from = id;\n }\n }\n }\n }\n const placed = [];\n for (let id = head; id !== void 0; id = next.get(id)) {\n placed.push(id);\n }\n return placed;\n}\nfunction placeBySearch(adjacent, key) {\n const queue = [...key.entries()].sort(([a, ka], [b, kb]) => compareKeys(ka, kb) || compare(a, b)).map(([id]) => id);\n const placed = queue.length;\n for (const id of queue) {\n const from = key.get(id);\n for (const nb of adjacent.get(id) ?? []) {\n if (!key.has(nb)) {\n key.set(nb, { at: from.at, side: 1, hops: from.hops + 1 });\n queue.push(nb);\n }\n }\n }\n const searched = new Set(queue.slice(placed));\n const sided = /* @__PURE__ */ new Set();\n for (const seed of searched) {\n if (sided.has(seed)) {\n continue;\n }\n const { at } = key.get(seed);\n const run = [seed];\n sided.add(seed);\n let farHalf = true;\n for (const id of run) {\n const { hops } = key.get(id);\n let deadEnd = true;\n let touchesLeft = false;\n for (const nb of adjacent.get(id) ?? []) {\n const other = key.get(nb);\n if (other.at === at && searched.has(nb)) {\n deadEnd &&= other.hops <= hops;\n if (!sided.has(nb)) {\n sided.add(nb);\n run.push(nb);\n }\n } else if (other.at !== at) {\n touchesLeft ||= other.at < at;\n farHalf &&= other.at < at;\n }\n }\n farHalf &&= !deadEnd || touchesLeft;\n }\n if (farHalf) {\n for (const id of run) {\n const k = key.get(id);\n key.set(id, { ...k, side: -1, hops: -k.hops });\n }\n }\n }\n}\nfunction orderKeys(graph) {\n const ids = new Set(graph.nodes.map((n) => n.id));\n const adjacent = /* @__PURE__ */ new Map();\n for (const e of graph.edges) {\n if (!ids.has(e.from) || !ids.has(e.to)) {\n continue;\n }\n ;\n (adjacent.get(e.from) ?? adjacent.set(e.from, []).get(e.from)).push(e.to);\n (adjacent.get(e.to) ?? adjacent.set(e.to, []).get(e.to)).push(e.from);\n }\n const backbone = graph.nodes.filter(isBackbone).sort(\n (a, b) => compare(a.stable.start, b.stable.start) || compare(a.name, b.name)\n );\n const key = /* @__PURE__ */ new Map();\n placeByWalks(graph, backbone).forEach((id, rank) => {\n key.set(id, { at: rank, side: 0, hops: 0 });\n });\n placeBySearch(adjacent, key);\n return key;\n}\nfunction layerGraph(graph) {\n const byId = new Map(graph.nodes.map((n) => [n.id, n]));\n const order = referenceOrder(graph);\n const key = new Map(order.map((id, i) => [id, i]));\n const isRef = (id) => isBackbone(byId.get(id));\n const preds = new Map(order.map((id) => [id, []]));\n const succs = new Map(order.map((id) => [id, []]));\n const link = (a, b) => {\n preds.get(b).push(a);\n succs.get(a).push(b);\n };\n for (const e of graph.edges) {\n if (e.from === e.to || !key.has(e.from) || !key.has(e.to)) {\n continue;\n }\n if (key.get(e.from) < key.get(e.to)) {\n link(e.from, e.to);\n } else {\n link(e.to, e.from);\n }\n }\n const backbone = order.filter(isRef);\n for (let i = 1; i < backbone.length; i++) {\n link(backbone[i - 1], backbone[i]);\n }\n const layerOf = /* @__PURE__ */ new Map();\n for (const id of order) {\n let l = 0;\n for (const p of preds.get(id)) {\n l = Math.max(l, layerOf.get(p) + 1);\n }\n layerOf.set(id, l);\n }\n for (let i = order.length - 1; i >= 0; i--) {\n const id = order[i];\n const s = succs.get(id);\n if (isRef(id) || s.length === 0) {\n continue;\n }\n let minSucc = Infinity;\n for (const t of s) {\n minSucc = Math.min(minSucc, layerOf.get(t));\n }\n const lo = layerOf.get(id);\n const hi = Math.max(lo, minSucc - 1);\n layerOf.set(id, Math.floor((lo + hi) / 2));\n }\n const layers = [];\n for (const id of order) {\n ;\n (layers[layerOf.get(id)] ??= []).push(id);\n }\n return { layers, layerOf, preds };\n}\nfunction orderedLayout(graph) {\n if (!graph.nodes.some(isBackbone)) {\n return void 0;\n }\n const byId = new Map(graph.nodes.map((n) => [n.id, n]));\n const isRef = (id) => isBackbone(byId.get(id));\n const { layers, layerOf: layer, preds } = layerGraph(graph);\n const layerWidth = layers.map((ids) => {\n let w = 0;\n for (const id of ids) {\n w = Math.max(w, nodeWidth(byId.get(id)));\n }\n return w;\n });\n const layerX = [];\n let x = 0;\n for (let l = 0; l < layers.length; l++) {\n layerX[l] = x;\n x += layerWidth[l] + GUTTER;\n }\n const y = /* @__PURE__ */ new Map();\n for (const ids of layers) {\n const free = [];\n for (const id of ids) {\n if (isRef(id)) {\n y.set(id, 0);\n continue;\n }\n const placed = preds.get(id).filter((p) => y.has(p));\n let ideal = 0;\n for (const p of placed) {\n ideal += y.get(p) / placed.length;\n }\n free.push({ id, ideal: ideal === 0 ? LANE_PX : ideal });\n }\n free.sort((a, b) => a.ideal - b.ideal);\n const taken = /* @__PURE__ */ new Set([0]);\n for (const { id, ideal } of free) {\n let lane = Math.round(ideal / LANE_PX);\n if (lane === 0) {\n lane = ideal >= 0 ? 1 : -1;\n }\n for (let d = 1; taken.has(lane); d++) {\n if (!taken.has(lane + d)) {\n lane += d;\n } else if (!taken.has(lane - d)) {\n lane -= d;\n }\n }\n taken.add(lane);\n y.set(id, lane * LANE_PX);\n }\n }\n const nodePositions = {};\n for (const n of graph.nodes) {\n const l = layer.get(n.id);\n const w = nodeWidth(n);\n const cx = layerX[l] + layerWidth[l] / 2;\n const ny = y.get(n.id);\n nodePositions[n.id] = [\n { x: cx - w / 2, y: ny },\n { x: cx + w / 2, y: ny }\n ];\n }\n return { nodePositions, referenceAxis: false, pixelRows: true };\n}\n\nexport {\n referenceOrder,\n orderedLayout\n};\n", "import {\n pathOrigin\n} from \"./chunk-M6LK4GII.js\";\nimport {\n panSNContig,\n panSNSample\n} from \"./chunk-BPLIXMH7.js\";\n\n// src/layout/walkRows.ts\nfunction sampleOf(path) {\n return path.sample ?? panSNSample(path.name);\n}\nfunction labelOf(path) {\n return path.haplotype !== void 0 && path.sample !== void 0 ? `${path.sample}#${path.haplotype}` : sampleOf(path);\n}\nvar NodeTable = class {\n constructor(graph) {\n this.index = /* @__PURE__ */ new Map();\n this.lengths = [];\n this.onReference = new Uint8Array(0);\n this.referenceStart = new Float64Array(0);\n this.referenceEnd = new Float64Array(0);\n for (const node of graph.nodes) {\n this.lengths[this.indexOf(node.id)] = node.length;\n }\n }\n indexOf(id) {\n let i = this.index.get(id);\n if (i === void 0) {\n i = this.lengths.length;\n this.index.set(id, i);\n this.lengths.push(0);\n }\n return i;\n }\n nodesOf(path) {\n const nodes = new Int32Array(path.nodeIds.length);\n path.nodeIds.forEach((id, k) => {\n nodes[k] = this.indexOf(id);\n });\n return nodes;\n }\n spanAt(steps, k) {\n const node = k >= 0 && k < steps.length ? steps[k] : -1;\n return node >= 0 && this.onReference[node] ? { start: this.referenceStart[node], end: this.referenceEnd[node] } : void 0;\n }\n};\nfunction stepsOf(pieces, table) {\n const out = [];\n let end;\n for (const piece of pieces) {\n if (end !== void 0 && piece.start !== void 0 && piece.start > end) {\n out.push(end - piece.start);\n }\n let bp = 0;\n for (const node of piece.nodes) {\n out.push(node);\n bp += table.lengths[node];\n }\n end = piece.start === void 0 ? void 0 : piece.start + bp;\n }\n return Float64Array.from(out);\n}\nfunction stepSpan(pieces, table, k) {\n let end;\n let at = 0;\n let found;\n for (const piece of pieces) {\n if (piece.start === void 0 || end !== void 0 && piece.start < end) {\n return void 0;\n }\n if (end !== void 0 && piece.start > end) {\n if (at++ === k) {\n found = { start: end, end: piece.start };\n }\n }\n let pos = piece.start;\n for (const node of piece.nodes) {\n const len = table.lengths[node];\n if (at++ === k) {\n found = { start: pos, end: pos + len };\n }\n pos += len;\n }\n end = pos;\n }\n return found;\n}\nfunction sliceBetween(steps, table, region, flanked = true) {\n if (!region || !flanked) {\n return { ids: steps, complete: true, from: -1, to: -1 };\n }\n const { onReference, referenceStart, referenceEnd } = table;\n let i0 = -1;\n let i1 = -1;\n let bestEnd = -Infinity;\n let bestStart = Infinity;\n for (let i = 0; i < steps.length; i++) {\n const node = steps[i];\n if (node >= 0 && onReference[node]) {\n const end2 = referenceEnd[node];\n const start = referenceStart[node];\n if (end2 <= region.start && end2 > bestEnd) {\n bestEnd = end2;\n i0 = i;\n }\n if (start >= region.end && start < bestStart) {\n bestStart = start;\n i1 = i;\n }\n }\n }\n if (i0 >= 0 && i1 >= 0) {\n const ids2 = steps.slice(Math.min(i0, i1) + 1, Math.max(i0, i1));\n return {\n ids: i0 < i1 ? ids2 : ids2.reverse(),\n complete: true,\n from: i0,\n to: i1\n };\n }\n const spanAt = (k) => table.spanAt(steps, k);\n const flank = i0 >= 0 ? i0 : i1;\n let near = -1;\n for (let d = 1; flank >= 0 && near < 0 && d < steps.length; d++) {\n near = [flank - d, flank + d].find((j) => spanAt(j) !== void 0) ?? -1;\n }\n if (near < 0) {\n return { ids: steps, complete: false, from: -1, to: -1 };\n }\n const forward = near > flank === spanAt(near).start > spanAt(flank).start;\n const after = forward === (flank === i0);\n const ids = after ? steps.slice(flank + 1) : steps.slice(0, flank).reverse();\n const last = ids.length > 0 ? ids.length - 1 : -1;\n const end = last < 0 ? spanAt(flank) : spanAt(after ? flank + 1 + last : 0);\n const stop = {\n contigEnds: end !== void 0,\n shortBp: !end ? 0 : Math.max(0, region.start - end.end, end.start - region.end)\n };\n return {\n ids,\n complete: false,\n from: flank,\n to: after ? steps.length : -1,\n stop\n };\n}\nfunction filterSamples(rows, samples) {\n return samples ? rows.filter((r) => samples.includes(r.sample)).sort(\n (a, b) => samples.indexOf(a.sample) - samples.indexOf(b.sample) || a.label.localeCompare(b.label)\n ) : rows;\n}\nfunction walkRows(graph, region, unit) {\n const paths = graph.paths ?? [];\n const nameOf = (p) => pathOrigin(p.name).name;\n const rankZero = new Set(\n graph.nodes.flatMap((n) => n.stable?.rank === 0 ? [n.stable.refName] : [])\n );\n const names = paths.map(nameOf);\n const referenceName = graph.referencePath !== void 0 && names.includes(graph.referencePath) ? graph.referencePath : names.find((n) => rankZero.has(n)) ?? names[0];\n const referencePieces = paths.filter((p) => nameOf(p) === referenceName).sort((a, b) => (a.start ?? 0) - (b.start ?? 0));\n const first = referencePieces[0];\n const others = paths.filter((p) => !referencePieces.includes(p));\n if (!first || others.length === 0) {\n return void 0;\n }\n const walks = /* @__PURE__ */ new Map();\n for (const path of others) {\n const pieces = walks.get(path.name);\n if (pieces) {\n pieces.push(path);\n } else {\n walks.set(path.name, [path]);\n }\n }\n const table = new NodeTable(graph);\n const referenceStart = first.start ?? 0;\n const cut = region && region.end > region.start ? region : void 0;\n const referenceNodes = referencePieces.map((piece) => table.nodesOf(piece));\n const nodeCount = table.lengths.length;\n table.onReference = new Uint8Array(nodeCount);\n table.referenceStart = new Float64Array(nodeCount);\n table.referenceEnd = new Float64Array(nodeCount);\n let reachesBefore = false;\n let reachesAfter = false;\n for (const [p, piece] of referencePieces.entries()) {\n let pos = piece.start ?? 0;\n for (const node of referenceNodes[p]) {\n const len = table.lengths[node];\n if (!table.onReference[node]) {\n table.onReference[node] = 1;\n table.referenceStart[node] = pos;\n table.referenceEnd[node] = pos + len;\n reachesBefore ||= cut !== void 0 && pos + len <= cut.start;\n reachesAfter ||= cut !== void 0 && pos >= cut.end;\n }\n pos += len;\n }\n }\n const flanked = cut === void 0 || reachesBefore && reachesAfter;\n const rowOf = (paths2, nodes) => {\n const path = paths2[0];\n const pieces = paths2.map((piece, p) => ({\n start: piece.start,\n nodes: nodes?.[p] ?? table.nodesOf(piece)\n })).sort((a, b) => (a.start ?? 0) - (b.start ?? 0));\n const { ids, complete, from, to, stop } = sliceBetween(\n stepsOf(pieces, table),\n table,\n cut,\n flanked\n );\n const contig = path.contig ?? panSNContig(pathOrigin(path.name).name);\n const axisSpan = stepSpan(pieces, table, from < 0 ? 0 : from);\n const axis = !axisSpan ? void 0 : from < 0 ? { contig, start: axisSpan.start, reversed: false } : from < to ? { contig, start: axisSpan.end, reversed: false } : { contig, start: axisSpan.start, reversed: true };\n const { lengths, onReference, referenceStart: referenceStart2, referenceEnd } = table;\n const runs = [];\n let last;\n let bp = 0;\n let offReferenceBp = 0;\n let gapBp = 0;\n let step = 0;\n for (const node of ids) {\n if (node < 0) {\n last = { start: bp, bp: -node, onReference: false, gap: true };\n runs.push(last);\n bp -= node;\n gapBp -= node;\n step = 0;\n continue;\n }\n const len = lengths[node];\n const on = onReference[node] === 1;\n const at = last?.referenceStart;\n const forward = on && at !== void 0 && step >= 0 && at + last.bp === referenceStart2[node];\n const backward = on && at !== void 0 && step <= 0 && referenceEnd[node] === at;\n if (!on && last && !last.onReference && !last.gap) {\n last.bp += len;\n } else if (forward || backward) {\n last.bp += len;\n if (!forward) {\n last.referenceStart = referenceStart2[node];\n last.reversed = true;\n }\n step = forward ? 1 : -1;\n } else {\n last = {\n start: bp,\n bp: len,\n onReference: on,\n referenceStart: on ? referenceStart2[node] : void 0\n };\n runs.push(last);\n step = 0;\n }\n bp += len;\n if (!on) {\n offReferenceBp += len;\n }\n }\n return {\n name: path.name,\n label: labelOf(path),\n sample: sampleOf(path),\n haplotype: path.haplotype,\n bp,\n offReferenceBp,\n gapBp,\n complete,\n stop,\n runs,\n axis\n };\n };\n const origin = cut ? cut.start : referenceStart;\n return {\n origin,\n unit,\n reference: rowOf(referencePieces, referenceNodes),\n rows: [...walks.values()].map((paths2) => rowOf(paths2)).sort(\n (a, b) => Number(b.complete) - Number(a.complete) || b.bp - a.bp || a.label.localeCompare(b.label)\n )\n };\n}\n\nexport {\n filterSamples,\n walkRows\n};\n", "import {\n walkRows\n} from \"./chunk-LKW2TP4N.js\";\nimport {\n ROW_HEIGHT_PX\n} from \"./chunk-CPMHA4W5.js\";\nimport {\n backboneNodes,\n backbonePositions,\n overlapsWindow\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layout/walkRowLayout.ts\nvar READOUT_ROOM = 1.3;\nfunction walkRowsExtent(walks, pitch = {\n rowPx: ROW_HEIGHT_PX,\n readouts: true\n}) {\n let longest = walks.reference.bp;\n for (const row of walks.rows) {\n longest = Math.max(longest, row.bp);\n }\n return {\n maxX: walks.origin + longest * (pitch.readouts ? READOUT_ROOM : 1),\n maxY: walks.rows.length * pitch.rowPx\n };\n}\nfunction walkRowLabels(rows, layout, pitch) {\n if (!rows) {\n return layout?.rowLabels ?? [];\n }\n if (pitch && !pitch.labelled) {\n return [];\n }\n return [rows.reference, ...rows.rows].map((row, i) => ({\n label: row.label,\n y: i * (pitch?.rowPx ?? ROW_HEIGHT_PX)\n }));\n}\nfunction walkRowLayout(graph, region) {\n const backbone = backboneNodes(graph);\n const walks = walkRows(graph, region);\n if (backbone.length === 0 || !walks) {\n return void 0;\n }\n const overWindow = region ? backbone.filter((n) => overlapsWindow(n, region)) : backbone;\n const nodePositions = backbonePositions(\n overWindow.length > 0 ? overWindow : backbone\n );\n return {\n nodePositions,\n rowLabels: walkRowLabels(walks),\n referenceAxis: true,\n pixelRows: true,\n extent: walkRowsExtent(walks)\n };\n}\n\nexport {\n READOUT_ROOM,\n walkRowsExtent,\n walkRowLabels,\n walkRowLayout\n};\n", "import {\n sampleRowLayout\n} from \"./chunk-LOEA5IHZ.js\";\nimport {\n hasTubeMapBackbone,\n hasTubeMapPaths,\n tubeMapLayout,\n tubeMapReferenceLayout\n} from \"./chunk-XI3ZUTWF.js\";\nimport {\n anchoredLayout\n} from \"./chunk-L3O7AWLI.js\";\nimport {\n orderedLayout\n} from \"./chunk-CM6LO6OC.js\";\nimport {\n walkRowLayout\n} from \"./chunk-L2HDM2R3.js\";\nimport {\n isBackbone,\n isOffReference\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/layoutModes.ts\nvar FORCE_LAYOUT_LABEL = \"Force-directed layout\";\nvar hasBackbone = (graph) => graph.nodes.some(isBackbone);\nvar hasWalks = (graph) => hasBackbone(graph) && (graph.paths?.length ?? 0) > 1;\nvar hasAlleles = (graph) => hasBackbone(graph) && graph.nodes.some(isOffReference);\nvar LAYOUT_MODES = [\n {\n value: \"auto\",\n label: \"Anchored\",\n description: \"x is reference bp, one row per stable rank. Needs rGFA tags or a reference path.\",\n run: anchoredLayout,\n cutMargins: true,\n wholeWalks: false,\n available: hasBackbone,\n drawsLocally: hasBackbone,\n drawsNodes: true\n },\n {\n value: \"samplerows\",\n label: \"Sample rows\",\n description: \"x is reference bp, one row per contributing assembly. Needs rGFA tags or a reference path.\",\n run: sampleRowLayout,\n cutMargins: true,\n wholeWalks: false,\n available: hasAlleles,\n drawsLocally: hasAlleles,\n drawsNodes: true\n },\n {\n value: \"walkrows\",\n label: \"Walk rows\",\n description: \"x is each walk's own bp: one bar per haplotype, blue on the reference's path and purple off it, so a repeat expansion reads as bar length, and each bar boxes its haplotype's own genes where the session has them. Needs a reference and two or more walks.\",\n run: walkRowLayout,\n cutMargins: false,\n wholeWalks: true,\n available: hasWalks,\n drawsLocally: hasWalks,\n drawsNodes: false\n },\n {\n value: \"ordered\",\n label: \"Ordered\",\n description: \"x is reference order, not bp: every node gets room, bubbles read as lenses. Needs rGFA tags or a reference path.\",\n run: orderedLayout,\n cutMargins: false,\n wholeWalks: false,\n available: hasBackbone,\n drawsLocally: hasBackbone,\n drawsNodes: true\n },\n {\n value: \"tubemap\",\n label: \"Tube map\",\n description: \"sequenceTubeMap: every path a coloured tube through boxed nodes, columns in node order and node widths log-scaled. Needs P or W lines.\",\n run: tubeMapLayout,\n cutMargins: false,\n wholeWalks: false,\n available: hasTubeMapPaths,\n drawsLocally: hasTubeMapPaths,\n drawsNodes: false\n },\n {\n value: \"tubemapref\",\n label: \"Tube map on reference\",\n description: \"The tube map with each column at the reference bp it covers, so the tubes line up with the tracks around them. Needs P or W lines and a reference path.\",\n run: tubeMapReferenceLayout,\n cutMargins: true,\n wholeWalks: false,\n available: hasTubeMapBackbone,\n drawsLocally: hasTubeMapBackbone,\n drawsNodes: false\n },\n {\n value: \"force\",\n label: FORCE_LAYOUT_LABEL,\n description: \"OGDF FMMM (wasm) or stress, whichever engine is chosen.\",\n run: () => void 0,\n cutMargins: false,\n wholeWalks: false,\n available: () => true,\n drawsLocally: () => false,\n drawsNodes: true\n }\n];\nvar LAYOUT_MODE_VALUES = LAYOUT_MODES.map((m) => m.value);\nfunction modeUsesLayoutEngine(value, graph) {\n return !layoutModeByValue(value).drawsLocally(graph);\n}\nfunction layoutModeByValue(value) {\n return LAYOUT_MODES.find((m) => m.value === value) ?? LAYOUT_MODES[0];\n}\n\nexport {\n FORCE_LAYOUT_LABEL,\n LAYOUT_MODES,\n LAYOUT_MODE_VALUES,\n modeUsesLayoutEngine,\n layoutModeByValue\n};\n", "import {\n alongRow,\n boxesGenes,\n rowPitch\n} from \"./chunk-EFQLEGWM.js\";\nimport {\n el\n} from \"./chunk-H2H4Y3TV.js\";\nimport {\n READOUT_ROOM\n} from \"./chunk-L2HDM2R3.js\";\nimport {\n pathOrigin\n} from \"./chunk-M6LK4GII.js\";\nimport {\n LABEL_CHAR_PX\n} from \"./chunk-AB35TJST.js\";\n\n// src/layout/walkStrip.ts\nfunction walkStripApplies(o) {\n return o.walkStrip && o.mode.drawsNodes && !o.drawsPicture && !o.popped && !o.host && o.walks > 1;\n}\nfunction cutsWholeWalks(mode, o) {\n return mode.wholeWalks || o.walkStrip && !o.host;\n}\nvar PAD_PX = 6;\nvar WALK_STRIP_CEILING_PX = 260;\nvar LABEL_FONT_PX = 11;\nvar MIN_ROW_PX = 3;\nvar MARK_INK = \"#111\";\nvar TICK_PX = 3;\nfunction stripMarks(graph, rows, node) {\n const visits = graph.pathVisits?.get(node.name) ?? [];\n const marks = [];\n for (const row of rows) {\n const axis = row.axis;\n if (!axis) {\n continue;\n }\n const path = pathOrigin(row.name).name;\n for (const v of visits) {\n if (v.path !== path) {\n continue;\n }\n const { start, end } = alongRow(axis, v.start, v.start + node.length);\n if (end > 0 && start < row.bp) {\n marks.push({ row: row.name, start, bp: end - start });\n }\n }\n }\n return marks;\n}\nvar spanCache = /* @__PURE__ */ new WeakMap();\nfunction spansOf(graph, name) {\n let byName = spanCache.get(graph);\n if (!byName) {\n byName = /* @__PURE__ */ new Map();\n spanCache.set(graph, byName);\n }\n if (byName.has(name)) {\n return byName.get(name);\n }\n const lengthOf = new Map(graph.nodes.map((n) => [n.id, n.length]));\n const origin = pathOrigin(name).name;\n const pieces = (graph.paths ?? []).filter(\n (p) => origin === graph.referencePath ? pathOrigin(p.name).name === origin : p.name === name\n );\n let spans;\n if (pieces.every((p) => p.start !== void 0)) {\n spans = { ids: [], starts: [], ends: [] };\n for (const piece of [...pieces].sort((a, b) => a.start - b.start)) {\n let pos = piece.start;\n for (const id of piece.nodeIds) {\n const len = lengthOf.get(id) ?? 0;\n spans.ids.push(id);\n spans.starts.push(pos);\n spans.ends.push(pos + len);\n pos += len;\n }\n }\n }\n byName.set(name, spans);\n return spans;\n}\nfunction segmentAt(graph, row, offset, pxPerBp) {\n const axis = row.axis;\n const spans = axis && spansOf(graph, row.name);\n if (!axis || !spans || offset < 0 || offset > row.bp) {\n return void 0;\n }\n const at = axis.reversed ? axis.start - offset : axis.start + offset;\n const tol = 0.5 / pxPerBp;\n const bar = axis.reversed ? { start: axis.start - row.bp, end: axis.start } : { start: axis.start, end: axis.start + row.bp };\n const from = Math.max(at - tol, bar.start);\n const to = Math.min(at + tol, bar.end);\n let lo = 0;\n let hi = spans.starts.length;\n while (lo < hi) {\n const mid = lo + hi >> 1;\n if (spans.ends[mid] <= from) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n let best;\n let bestLen = -1;\n let bestHolds = false;\n for (let i = lo; i < spans.starts.length && spans.starts[i] < to; i++) {\n const len = spans.ends[i] - spans.starts[i];\n const holds = spans.starts[i] <= at && at < spans.ends[i];\n if (len > bestLen || len === bestLen && holds && !bestHolds) {\n bestLen = len;\n best = spans.ids[i];\n bestHolds = holds;\n }\n }\n return best;\n}\nfunction walkStripFrame(bars, o) {\n const maxHeight = o.maxHeight ?? WALK_STRIP_CEILING_PX;\n const labelPx = o.labelPx ?? Math.max(...[bars.reference, ...bars.rows].map((r) => r.label.length)) * LABEL_CHAR_PX + 16;\n const count = bars.rows.length + 1;\n const { rowPx, barPx, labelled, readouts } = rowPitch(\n count,\n maxHeight - 2 * PAD_PX,\n MIN_ROW_PX\n );\n const longest = Math.max(bars.reference.bp, ...bars.rows.map((r) => r.bp), 1);\n const left = labelled ? labelPx : PAD_PX;\n const usable = Math.max(1, o.width - left - PAD_PX);\n const scaleX = usable / (longest * (readouts ? READOUT_ROOM : 1));\n return {\n scaleX,\n scaleY: 1,\n translateX: left - bars.origin * scaleX,\n translateY: PAD_PX + rowPx / 2,\n width: o.width,\n height: count * rowPx + 2 * PAD_PX,\n rowPx,\n barPx,\n readouts,\n labelled,\n boxesGenes: boxesGenes(rowPx, barPx)\n };\n}\nfunction stripRowAt(bars, frame, x, y) {\n const i = Math.round((y - frame.translateY) / frame.rowPx);\n const row = [bars.reference, ...bars.rows][i];\n const offset = (x - frame.translateX) / frame.scaleX - bars.origin;\n return row && i >= 0 && offset >= 0 && offset <= row.bp ? { index: i, row, offset } : void 0;\n}\nfunction walkMarksTree(bars, frame, marks) {\n const index = new Map(\n [bars.reference, ...bars.rows].map((row, i) => [row.name, i])\n );\n const X = (offset) => (bars.origin + offset) * frame.scaleX + frame.translateX;\n return el(\n \"g\",\n { \"data-testid\": \"graph-walk-marks\" },\n ...marks.flatMap((m) => {\n const i = index.get(m.row);\n if (i === void 0) {\n return [];\n }\n const y = i * frame.rowPx + frame.translateY;\n const x = X(m.start);\n const w = Math.max(2, m.bp * frame.scaleX);\n const tick = (top) => el(\"rect\", { x, y: top, width: w, height: TICK_PX, fill: MARK_INK });\n return [\n tick(y - frame.barPx / 2 - TICK_PX - 1),\n tick(y + frame.barPx / 2 + 1)\n ];\n })\n );\n}\nfunction walkStripLabelsTree(bars, frame, bold = /* @__PURE__ */ new Set()) {\n return el(\n \"g\",\n { \"font-family\": \"sans-serif\", \"font-size\": LABEL_FONT_PX, fill: \"#333\" },\n ...(frame.labelled ? [bars.reference, ...bars.rows] : []).map(\n (row, i) => el(\n \"text\",\n {\n x: 6,\n y: i * frame.rowPx + frame.translateY + 4,\n \"font-weight\": bold.has(row.name) ? 600 : void 0\n },\n row.label\n )\n )\n );\n}\nfunction stripGeneGaps(frame, rowGenes, gaps) {\n if (!rowGenes?.size) {\n return void 0;\n }\n return frame.boxesGenes ? gaps : { untracked: 0, unread: 0, ...gaps, crowded: true };\n}\n\nexport {\n walkStripApplies,\n cutsWholeWalks,\n WALK_STRIP_CEILING_PX,\n stripMarks,\n segmentAt,\n walkStripFrame,\n stripRowAt,\n walkMarksTree,\n walkStripLabelsTree,\n stripGeneGaps\n};\n", "// src/hoverText.ts\nfunction regionLabel(loc) {\n return `${loc.refName}:${(loc.start + 1).toLocaleString()}-${loc.end.toLocaleString()}`;\n}\nfunction edgeHoverText(edge, deletion, nameOf = (id) => id) {\n return deletion ? {\n deletion: {\n bp: `${deletion.bp.toLocaleString()} bp`,\n where: regionLabel(deletion)\n }\n } : {\n ends: `${nameOf(edge.from)}${edge.fromStrand ?? \"\"} \\u2192 ${nameOf(edge.to)}${edge.toStrand ?? \"\"}`\n };\n}\n\nexport {\n regionLabel,\n edgeHoverText\n};\n", "import { isAnchored } from '@jbrowse/bandage-core/anchoredNodes'\nimport {\n panSNContig,\n panSNHaplotype,\n panSNSample,\n} from '@jbrowse/bandage-core/pansn'\n\nimport type { AnchoredNode } from '@jbrowse/bandage-core/anchoredNodes'\nimport type { Graph, GraphNode } from '@jbrowse/bandage-core/types'\n\nexport interface GraphLocation {\n // PanSN sample name off the node's own stable sequence. The assembly that\n // contributed the sequence, which is a *name*, not a resolved assembly \u2014 see\n // resolveContributors.\n sample: string\n // `sample#hap` where the stable name states a haplotype (HPRC release 2.1\n // names every node `NA20809#2#CM094351.1`), so a sample loaded as two\n // assemblies opens the right one; undefined where it states none\n haplotype: string | undefined\n refName: string\n start: number\n end: number\n}\n\n// Where a node's own sequence lives, in the coordinates of the assembly that\n// contributed it. rGFA states this on every segment: SN names the stable\n// sequence and SO the offset on it, so this is exact at every rank.\n//\n// It is the other question from nodeReferenceSpan, which asks where a node sits\n// on the *reference* axis and can only approximate that off the backbone. A\n// rank>0 node has an exact coordinate of its own; what it has no coordinate for\n// is the reference.\nexport function nodeOwnLocation(node: GraphNode): GraphLocation | undefined {\n return isAnchored(node) ? anchoredNodeLocation(node) : undefined\n}\n\nfunction anchoredNodeLocation(node: AnchoredNode): GraphLocation {\n return {\n sample: panSNSample(node.stable.refName),\n haplotype: panSNHaplotype(node.stable.refName),\n refName: panSNContig(node.stable.refName),\n start: node.stable.start,\n end: node.stable.start + node.length,\n }\n}\n\nexport interface Contributor extends GraphLocation {\n // lowest rank this assembly holds here: 0 means it is the reference backbone\n rank: number\n nodeCount: number\n}\n\ninterface Span {\n start: number\n end: number\n}\n\n// The widest run of spans with no gap larger than `maxGap`, which is the locus\n// this assembly contributes *here*. A bare union of every span would be wrong\n// on a graph where a sample also contributes sequence from a distant\n// duplication: the union then reads as a multi-megabase locus, and a linear view\n// launched at it shows neither end.\nfunction widestCluster(spans: Span[], maxGap: number) {\n const sorted = [...spans].sort((a, b) => a.start - b.start)\n let best: Span | undefined\n let current: Span | undefined\n for (const span of sorted) {\n current =\n current && span.start - current.end <= maxGap\n ? { start: current.start, end: Math.max(current.end, span.end) }\n : { start: span.start, end: span.end }\n if (!best || current.end - current.start > best.end - best.start) {\n best = current\n }\n }\n return best\n}\n\ninterface Group {\n sample: string\n haplotype: string | undefined\n refName: string\n rank: number\n spans: Span[]\n}\n\nfunction groupKey(loc: GraphLocation) {\n return `${loc.haplotype ?? loc.sample}\\u0000${loc.refName}`\n}\n\n// Every assembly with a segment in this graph, and the locus each one covers on\n// its own coordinates.\n//\n// This is what makes a launch out of the graph possible at all: the graph names\n// its contributors in the data (rGFA's SN tag), so a node, a row and the graph\n// as a whole can each say which assembly they belong to without consulting an\n// alignment.\n//\n// Ordered reference-first, then by name, so the row order matches\n// sampleRowLayout's and neither reshuffles as the window moves.\nexport function contributingAssemblies(\n graph: Graph,\n { maxGap = Infinity }: { maxGap?: number } = {},\n): Contributor[] {\n const groups = new Map<string, Group>()\n for (const node of graph.nodes) {\n if (isAnchored(node)) {\n const loc = anchoredNodeLocation(node)\n const key = groupKey(loc)\n const group = groups.get(key)\n if (group) {\n group.spans.push({ start: loc.start, end: loc.end })\n group.rank = Math.min(group.rank, node.stable.rank)\n } else {\n groups.set(key, {\n sample: loc.sample,\n haplotype: loc.haplotype,\n refName: loc.refName,\n rank: node.stable.rank,\n spans: [{ start: loc.start, end: loc.end }],\n })\n }\n }\n }\n\n // One entry per assembly (a haplotype where the names state one, else the\n // sample): an assembly contributing on several contigs is launched at the\n // contig it contributes most of, since a linear view opens on one region.\n const bySample = new Map<string, Contributor>()\n for (const group of groups.values()) {\n const span = widestCluster(group.spans, maxGap)\n if (span) {\n const candidate = {\n sample: group.sample,\n haplotype: group.haplotype,\n refName: group.refName,\n start: span.start,\n end: span.end,\n rank: group.rank,\n nodeCount: group.spans.length,\n }\n const key = group.haplotype ?? group.sample\n const existing = bySample.get(key)\n if (!existing || candidate.nodeCount > existing.nodeCount) {\n bySample.set(key, candidate)\n }\n }\n }\n\n // Reference first, then by name: the same order sampleRowLayout gives its\n // rows, so the menu lists the assemblies in the order they are stacked on\n // screen. Sorting by rank instead would order them by minigraph's build\n // order, which is not what the labels beside the drawing say.\n return [...bySample.values()].sort(\n (a, b) =>\n Number(a.rank !== 0) - Number(b.rank !== 0) ||\n a.sample.localeCompare(b.sample) ||\n (a.haplotype ?? '').localeCompare(b.haplotype ?? ''),\n )\n}\n\n// The assembly a location opens on: its haplotype's where the name states one\n// and the session holds it, else its sample's. A session holding both\n// haplotypes of a sample opens the right one; one holding a haplotype under\n// the bare sample name still opens it.\nexport function resolveLocationAssembly(\n resolve: (sample: string) => string | undefined,\n loc: Pick<GraphLocation, 'sample' | 'haplotype'>,\n) {\n const byHaplotype =\n loc.haplotype === undefined ? undefined : resolve(loc.haplotype)\n return byHaplotype ?? resolve(loc.sample)\n}\n\n// Contributors that name an assembly this session has loaded, which are the\n// only ones a linear or synteny view can open on.\n//\n// The two cases this filters apart are both normal. An E. coli pangenome demo\n// loads every strain as its own assembly, so every contributor resolves and the\n// whole graph is navigable. An HPRC graph names hundreds of haplotypes that no\n// session would ever load as assemblies, so only the reference resolves \u2014\n// there the reference projection (nodeReferenceSpan) is the way back to a\n// coordinate, not this.\n//\n// `resolve` is a name lookup rather than a list of names, because a PanSN sample\n// is the *graph's* spelling and need not be the assembly's. HPRC's graph writes\n// `CHM13`, and the assembly holding that sequence is UCSC's `hs1`, with CHM13\n// among its aliases; matching on names alone leaves that donor unopenable unless\n// the reader renames their assembly after the graph. The resolved (canonical)\n// name replaces the sample, so a launch opens the assembly the session knows.\nexport function resolveContributors(\n contributors: Contributor[],\n resolve: (sample: string) => string | undefined,\n) {\n return contributors.flatMap(c => {\n const sample = resolveLocationAssembly(resolve, c)\n return sample === undefined ? [] : [{ ...c, sample }]\n })\n}\n\n// 1-based inclusive, which is what a locstring means. Unformatted digits: this\n// is parsed, not read. bandage-core's regionLabel is the one people read.\nexport function locString(loc: GraphLocation) {\n return `${loc.refName}:${loc.start + 1}-${loc.end}`\n}\n", "import type { SubgraphRegion } from '../GetSubgraph'\n\n// The members of a LinearGenomeView a hosted pane reads and drives.\n// Structural, because this plugin takes no runtime dependency on the LGV\n// plugin (see hoverSync/index.tsx).\ninterface HostBlock {\n refName: string\n assemblyName: string\n start: number\n end: number\n offsetPx: number\n reversed?: boolean\n displayedRegionIndex?: number\n}\n\nexport interface LinearHost {\n id: string\n initialized: boolean\n bpPerPx: number\n offsetPx: number\n width: number\n displayedRegions: readonly { start: number; end: number }[]\n dynamicBlocks: { contentBlocks: readonly HostBlock[] }\n coarseDynamicBlocks: readonly HostBlock[]\n horizontalScroll: (distance: number) => number\n zoomTo: (bpPerPx: number, offset?: number) => number\n // whether the view's body is mounted, which an off-screen view's is not\n effectiveBodyMounted?: boolean\n hasVisibleContent?: boolean\n}\n\nexport function isLinearHost(view: unknown): view is LinearHost {\n if (typeof view !== 'object' || view === null) {\n return false\n }\n const v = view as Record<string, unknown>\n return (\n typeof v.horizontalScroll === 'function' &&\n typeof v.zoomTo === 'function' &&\n 'coarseDynamicBlocks' in v &&\n 'dynamicBlocks' in v\n )\n}\n\nfunction widest(blocks: readonly HostBlock[]) {\n return blocks.reduce<HostBlock | undefined>(\n (best, b) => (best && best.end - best.start >= b.end - b.start ? best : b),\n undefined,\n )\n}\n\nexport interface HostWindow {\n refName: string\n assemblyName: string\n start: number\n end: number\n bpPerPx: number\n // the view's width in bp, which the margin is sized by: a block at a contig\n // end is clipped, the zoom is not\n span: number\n regionStart: number\n regionEnd: number\n}\n\n// x is reference bp on an anchored layout, so the graph shows what the linear\n// view shows when one bp is as many px in both and the cut's refName sits at\n// the same screen x. Undefined when the linear view shows no block of that\n// refName, which is a re-cut's job rather than the frame's. A reversed block\n// runs bp right to left, which only the tube map's connectors can draw.\nexport function hostFrame(view: LinearHost, region: SubgraphRegion) {\n const block = widest(\n view.dynamicBlocks.contentBlocks.filter(\n b =>\n b.refName === region.refName && b.assemblyName === region.assemblyName,\n ),\n )\n const { bpPerPx } = view\n if (!block || !(bpPerPx > 0)) {\n return undefined\n }\n const left = block.offsetPx - view.offsetPx\n return block.reversed\n ? { scale: -1 / bpPerPx, translateX: left + block.end / bpPerPx }\n : { scale: 1 / bpPerPx, translateX: left - block.start / bpPerPx }\n}\n\n// Read off the LIVE blocks even when the coarse ones woke the caller: those\n// name where the window was half a second ago (SyntenyFollow/CLAUDE.md).\nexport function hostWindow(view: LinearHost): HostWindow | undefined {\n const block = widest(view.dynamicBlocks.contentBlocks)\n const displayed =\n block?.displayedRegionIndex === undefined\n ? undefined\n : view.displayedRegions[block.displayedRegionIndex]\n return block && view.bpPerPx > 0\n ? {\n refName: block.refName,\n assemblyName: block.assemblyName,\n start: block.start,\n end: block.end,\n bpPerPx: view.bpPerPx,\n span: view.bpPerPx * view.width,\n regionStart: displayed?.start ?? block.start,\n regionEnd: displayed?.end ?? block.end,\n }\n : undefined\n}\n\n// The window plus one window-width each side, clamped to the displayed\n// region, with the margins narrowed until the whole cut fits under `capBp`.\nexport function hostCut(\n window: HostWindow,\n capBp: number,\n margins = true,\n): SubgraphRegion {\n const visible = window.end - window.start\n const margin = margins\n ? Math.max(0, Math.min(window.span, (capBp - visible) / 2))\n : 0\n let start = Math.max(window.regionStart, Math.floor(window.start - margin))\n let end = Math.min(window.regionEnd, Math.ceil(window.end + margin))\n // Rounding outward can put a cut a base or two past the cap, which the load\n // refuses whole; trim it back rather than lose the cut.\n const over = end - start - capBp\n if (over > 0) {\n start += Math.floor(over / 2)\n end -= Math.ceil(over / 2)\n }\n return {\n refName: window.refName,\n assemblyName: window.assemblyName,\n start,\n end,\n }\n}\n\n// With margins, a cut holds while the window is inside it; without, only the\n// window itself does, since the drawing is the window.\nexport function cutHolds(\n cut: SubgraphRegion | undefined,\n window: HostWindow,\n margins = true,\n) {\n if (\n cut?.refName !== window.refName ||\n cut.assemblyName !== window.assemblyName\n ) {\n return false\n }\n // to the base, since a cut trimmed to its cap can end a base inside the window\n if (margins) {\n return cut.start <= window.start + 1 && window.end <= cut.end + 1\n }\n const exact = hostCut(window, Infinity, false)\n return (\n Math.abs(cut.start - exact.start) < 1 && Math.abs(cut.end - exact.end) < 1\n )\n}\n", "import {\n polylineSlice\n} from \"./chunk-N73TI3VG.js\";\nimport {\n svgPath\n} from \"./chunk-7SRWJLSC.js\";\nimport {\n firstNodeAtOrAfter,\n isAnchored\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/genes/genePins.ts\nfunction genePins(graph, genes, positions) {\n const byRefName = /* @__PURE__ */ new Map();\n for (const node of graph.nodes) {\n if (isAnchored(node)) {\n const { refName } = node.stable;\n if (positions[node.id]?.length) {\n const entry = byRefName.get(refName) ?? byRefName.set(refName, { nodes: [], reach: 0 }).get(refName);\n entry.nodes.push(node);\n entry.reach = Math.max(entry.reach, node.length);\n }\n }\n }\n for (const { nodes } of byRefName.values()) {\n nodes.sort((a, b) => a.stable.start - b.stable.start);\n }\n const pins = [];\n for (const gene of genes) {\n const onRefName = byRefName.get(gene.refName);\n if (!onRefName) {\n continue;\n }\n const parts = [];\n const exonsByNode = [];\n const nodeIds = /* @__PURE__ */ new Set();\n let at;\n let atDistance = Infinity;\n let covered = 0;\n const mid = (gene.start + gene.end) / 2;\n const { nodes, reach } = onRefName;\n for (let i = firstNodeAtOrAfter(nodes, gene.start - reach); i < nodes.length && nodes[i].stable.start < gene.end; i++) {\n const node = nodes[i];\n const nodeStart = node.stable.start;\n const nodeEnd = nodeStart + node.length;\n if (nodeEnd <= gene.start) {\n continue;\n }\n const line = positions[node.id];\n nodeIds.add(node.id);\n covered += Math.min(nodeEnd, gene.end) - Math.max(nodeStart, gene.start);\n const nodeParts = [];\n for (const exon of gene.exons) {\n const a = Math.max(exon.start, nodeStart);\n const b = Math.min(exon.end, nodeEnd);\n if (b <= a) {\n continue;\n }\n const stretch = polylineSlice(\n line,\n (a - nodeStart) / node.length,\n (b - nodeStart) / node.length\n );\n if (stretch.length === 1) {\n stretch.push({ ...stretch[0] });\n }\n nodeParts.push(svgPath(stretch));\n }\n if (nodeParts.length > 0) {\n parts.push(...nodeParts);\n exonsByNode.push({ nodeId: node.id, d: nodeParts.join(\"\") });\n }\n const pinBp = Math.min(Math.max(mid, nodeStart), nodeEnd);\n const distance = Math.abs(pinBp - mid);\n if (distance < atDistance) {\n atDistance = distance;\n const along = node.length ? (pinBp - nodeStart) / node.length : 0;\n at = polylineSlice(line, along, along)[0];\n }\n }\n if (at) {\n pins.push({\n gene,\n exons: parts.join(\"\"),\n exonsByNode,\n nodeIds,\n at,\n covered: covered / (gene.end - gene.start)\n });\n }\n }\n return pins;\n}\n\nexport {\n genePins\n};\n", "// src/version.ts\nvar version = \"10.2.6\";\n\nexport {\n version\n};\n", "// src/renderer/geometryInputs.ts\nfunction layoutGeometryInputs(layout, drawing, o = {}) {\n return {\n nodePositions: o.drawsRows ? {} : layout.nodePositions,\n deletions: drawing.bypassed,\n deletionRoutes: layout.deletionRoutes,\n stranded: layout.stranded,\n hiddenEdges: drawing.hidden\n };\n}\n\nexport {\n layoutGeometryInputs\n};\n", "import {\n encodedColor,\n resolveEncoding\n} from \"./chunk-VQC7KELB.js\";\nimport {\n pathOrigin\n} from \"./chunk-M6LK4GII.js\";\nimport {\n panSNContig\n} from \"./chunk-BPLIXMH7.js\";\n\n// src/walkHighlight.ts\nvar isReference = (graph, name) => !!graph.referencePath && pathOrigin(name).name === graph.referencePath;\nfunction piecesOf(graph, name) {\n return (graph.paths ?? []).filter((p) => p.name === name).sort((a, b) => (a.start ?? 0) - (b.start ?? 0));\n}\nfunction walkHighlight(graph, name) {\n const pieces = piecesOf(graph, name);\n const first = pieces[0];\n if (!first) {\n return void 0;\n }\n const byId = new Map(graph.nodes.map((n) => [n.id, n]));\n const edgeAt = /* @__PURE__ */ new Map();\n graph.edges.forEach((e, i) => {\n edgeAt.set(`${e.from}>${e.to}`, i);\n });\n const lengthOf = (id) => byId.get(id)?.length ?? 0;\n const bpOf = (path) => path.nodeIds.reduce((sum, id) => sum + lengthOf(id), 0);\n const bp = pieces.reduce((sum, piece) => sum + bpOf(piece), 0);\n const extentOf = (ps) => {\n const start = Math.min(...ps.map((p) => p.start ?? Infinity));\n return Number.isFinite(start) ? { start, end: Math.max(...ps.map((p) => (p.start ?? 0) + bpOf(p))) } : void 0;\n };\n const extent = extentOf(pieces);\n const range = extent && {\n contig: first.contig ?? panSNContig(pathOrigin(name).name),\n ...extent\n };\n const span = range ? range.end - range.start : bp;\n const nodeIds = /* @__PURE__ */ new Set();\n const edgeIndexes = /* @__PURE__ */ new Set();\n const progress = /* @__PURE__ */ new Map();\n let before = 0;\n for (const piece of pieces) {\n if (range) {\n before = Math.max(before, (piece.start ?? 0) - range.start);\n }\n piece.nodeIds.forEach((id, i) => {\n nodeIds.add(id);\n if (i > 0) {\n const a = piece.nodeIds[i - 1];\n const index = edgeAt.get(`${a}>${id}`) ?? edgeAt.get(`${id}>${a}`);\n if (index !== void 0) {\n edgeIndexes.add(index);\n }\n }\n const length = lengthOf(id);\n if (!progress.has(id)) {\n progress.set(id, span > 0 ? (before + length / 2) / span : 0);\n }\n before += length;\n });\n }\n const reference = isReference(graph, name);\n const referenceSpan = () => {\n const referencePieces = reference ? [] : (graph.paths ?? []).filter((p) => isReference(graph, p.name));\n if (referencePieces.length === 0) {\n return void 0;\n }\n const e = extentOf(referencePieces);\n return e ? e.end - e.start : referencePieces.reduce((sum, piece) => sum + bpOf(piece), 0);\n };\n return {\n name,\n reference,\n range,\n nodeIds,\n edgeIndexes,\n progress,\n steps: pieces.reduce((sum, piece) => sum + piece.nodeIds.length, 0),\n bp,\n referenceBp: referenceSpan()\n };\n}\nfunction laneColors(graph, walk, encoding, ramp) {\n const byId = new Map(graph.nodes.map((n) => [n.id, n]));\n const colors = /* @__PURE__ */ new Map();\n for (const [id, progress] of walk.progress) {\n const node = byId.get(id);\n const mid = ramp?.midpoints.get(id);\n const t = encoding.field === \"progress\" ? progress : ramp && mid !== void 0 && !(node?.stable && node.stable.rank > 0) ? (mid - ramp.start) / ramp.span : void 0;\n colors.set(id, encodedColor(encoding, t));\n }\n return colors;\n}\nfunction reversedNodes(graph, walk) {\n const reversed = /* @__PURE__ */ new Set();\n let bp = 0;\n const referencePath = graph.referencePath;\n if (!referencePath || walk.reference) {\n return { reversed, bp };\n }\n const visits = graph.pathVisits;\n if (!visits) {\n return { reversed, bp };\n }\n const own = visits.pathIndex(pathOrigin(walk.name).name);\n const theirs = visits.pathIndex(referencePath);\n const byId = new Map(graph.nodes.map((n) => [n.id, n]));\n for (const id of walk.progress.keys()) {\n const node = byId.get(id);\n const slot = node ? visits.slot(node.name) : -1;\n const a = slot < 0 ? -1 : visits.firstBy(slot, own);\n const b = slot < 0 ? -1 : visits.firstBy(slot, theirs);\n if (a >= 0 && b >= 0 && visits.reversed[a] !== visits.reversed[b]) {\n reversed.add(id);\n bp += node.length;\n }\n }\n return { reversed, bp };\n}\nfunction walkLift(graph, layers, ramp) {\n const seen = /* @__PURE__ */ new Set();\n const lifted = layers.filter((layer) => !seen.has(layer.walk) && seen.add(layer.walk)).flatMap((layer) => {\n const walk = walkHighlight(graph, layer.walk);\n return walk ? [{ walk, layer }] : [];\n }).sort((a, b) => Number(b.walk.reference) - Number(a.walk.reference));\n if (lifted.length === 0) {\n return void 0;\n }\n let picked = 0;\n const walks = lifted.map(({ walk, layer }) => {\n const encoding = resolveEncoding(\n layer,\n walk.reference,\n walk.reference ? 0 : picked++,\n lifted.length === 1\n );\n const { reversed, bp } = reversedNodes(graph, walk);\n return {\n ...walk,\n encoding,\n colors: laneColors(graph, walk, encoding, ramp),\n reversed,\n reversedBp: bp\n };\n });\n return liftOf(walks, ramp);\n}\nvar FACET_COLOR = { field: \"progress\", scheme: \"red\" };\nfunction facetLifts(graph, lift, layers, ramp) {\n return lift.walks.map((walk) => {\n const stated = layers.find((l) => l.walk === walk.name)?.color;\n const encoding = resolveEncoding(\n { walk: walk.name, color: { ...FACET_COLOR, ...stated } },\n walk.reference,\n 0\n );\n return liftOf(\n [\n {\n ...walk,\n encoding,\n colors: laneColors(graph, walk, encoding, ramp)\n }\n ],\n ramp\n );\n });\n}\nfunction liftOf(walks, ramp) {\n return {\n walks,\n referenceDomain: ramp ? { start: ramp.start, end: ramp.start + ramp.span } : void 0,\n nodeIds: new Set(walks.flatMap((w) => [...w.nodeIds])),\n edgeIndexes: new Set(walks.flatMap((w) => [...w.edgeIndexes])),\n names: new Set(walks.map((w) => w.name))\n };\n}\n\nexport {\n walkHighlight,\n walkLift,\n facetLifts\n};\n", "import {\n ENGINE_DEFAULTS\n} from \"./chunk-2QLLQJ72.js\";\n\n// src/figureSettings.ts\nvar FIGURE_DEFAULTS = {\n ...ENGINE_DEFAULTS,\n colorScheme: \"auto\",\n nodeWidth: \"depth\",\n contigThickness: 6,\n connectorThickness: 2\n};\nfunction figureSpecSettings(s) {\n const defaults = FIGURE_DEFAULTS;\n const out = {};\n for (const [k, v] of Object.entries(s)) {\n if (v !== void 0 && v !== defaults[k]) {\n out[k] = v;\n }\n }\n return out;\n}\n\nexport {\n FIGURE_DEFAULTS,\n figureSpecSettings\n};\n", "// src/colorSchemes.ts\nvar COLOR_SCHEMES = [\n // Mirrors `layoutModes`' 'auto': a value the model resolves rather than a\n // colour of its own. It exists because 'uniform' was the default, so a\n // launched graph opened flat grey and both tutorials spent a step saying \"now\n // pick a colour\" \u2014 one figure literally drives that click. A graph with\n // reference coordinates resolves to 'reference-position', which is the one\n // ramp a linear track beside it can be painted with too; a graph with none\n // keeps 'uniform', because there the ramp would be a hue nothing earned.\n //\n // Resolve through `effectiveColorScheme`; the dropdown reads the raw prop, so\n // \"Auto\" stays selectable and visible as what it is.\n { value: \"auto\", label: \"Auto\" },\n { value: \"uniform\", label: \"Uniform\" },\n { value: \"random\", label: \"Random\" },\n { value: \"rainbow\", label: \"Rainbow\" },\n { value: \"depth\", label: \"Depth\" },\n { value: \"node-length\", label: \"Node length\" },\n { value: \"stable-rank\", label: \"Stable rank\" },\n { value: \"reference-position\", label: \"Reference position\" },\n { value: \"grey\", label: \"Grey\" }\n];\nvar COLOR_SCHEME_VALUES = COLOR_SCHEMES.map((s) => s.value);\nfunction resolveColorScheme(scheme, graph) {\n return scheme !== \"auto\" ? scheme : graph?.anchoredBy ? \"reference-position\" : \"uniform\";\n}\n\nexport {\n COLOR_SCHEMES,\n COLOR_SCHEME_VALUES,\n resolveColorScheme\n};\n", "import {\n layoutGeometryInputs\n} from \"./chunk-LOCJN3BZ.js\";\nimport {\n facetLifts,\n walkLift\n} from \"./chunk-CU6P5RUG.js\";\nimport {\n buildGeometry,\n computeReferenceRamp\n} from \"./chunk-A4PFFC4Q.js\";\nimport {\n walkRowsExtent\n} from \"./chunk-L2HDM2R3.js\";\nimport {\n pathLegend,\n walkLabelsOf\n} from \"./chunk-3XSM4OZU.js\";\nimport {\n FIGURE_DEFAULTS\n} from \"./chunk-HNCXR2VS.js\";\nimport {\n drawingBounds\n} from \"./chunk-2QLLQJ72.js\";\nimport {\n referenceLabel\n} from \"./chunk-RAKOB6IV.js\";\nimport {\n resolveColorScheme\n} from \"./chunk-JKJWSY4V.js\";\nimport {\n deletionDrawing,\n deletionEdges\n} from \"./chunk-24WITXQY.js\";\nimport {\n facetSettingOf\n} from \"./chunk-XV4P5KEQ.js\";\n\n// src/figureScene.ts\nfunction figureScene(graph, layout, o) {\n const region = o.region;\n const rampDomain = o.colorDomain ?? region;\n const rows = o.walkRows;\n const bounds = drawingBounds(layout, {\n region: o.fitToDrawing ? void 0 : region,\n extent: rows && layout.extent ? walkRowsExtent(rows, o.walkRowPitch) : void 0\n });\n const nodeById = new Map(graph.nodes.map((node) => [node.id, node]));\n const colorScheme = resolveColorScheme(\n o.colorScheme ?? FIGURE_DEFAULTS.colorScheme,\n graph\n );\n const referenceRamp = colorScheme === \"reference-position\" && !layout.tubeMap ? computeReferenceRamp(graph, rampDomain) : void 0;\n const drawnDeletions = deletionDrawing(\n graph,\n layout.tubeMap ? [] : deletionEdges(graph),\n o.showDeletionEdges\n );\n const layers = o.walks ?? [];\n const walkRamp = layers.some((l) => l.color?.field === \"reference\") ? referenceRamp ?? computeReferenceRamp(graph, rampDomain) : void 0;\n const lift = layers.length > 0 && !layout.tubeMap ? walkLift(graph, layers, walkRamp) : void 0;\n const facet = facetSettingOf(o.facet);\n const panels = facet.field && lift && lift.walks.length > 1 ? facetLifts(graph, lift, layers, walkRamp) : void 0;\n const labels = walkLabelsOf(\n graph.paths?.length ? pathLegend(graph.paths) : []\n );\n const referenceName = o.referenceName ?? referenceLabel(graph, region);\n const contigThickness = o.contigThickness ?? FIGURE_DEFAULTS.contigThickness;\n const nodeWidth = o.nodeWidth ?? FIGURE_DEFAULTS.nodeWidth;\n return {\n bounds,\n nodeById,\n colorScheme,\n referenceRamp,\n drawnDeletions,\n layers,\n lift,\n facet,\n panels,\n labelOf: (name) => labels.get(name) ?? name,\n referenceName,\n reference: lift?.referenceDomain && {\n ...lift.referenceDomain,\n name: referenceName\n },\n contigThickness,\n nodeWidth,\n geometry: (highlight, axis) => buildGeometry({\n ...layoutGeometryInputs(layout, drawnDeletions, { drawsRows: !!rows }),\n graph,\n nodeById,\n colorScheme,\n contigThickness,\n connectorThickness: o.connectorThickness ?? FIGURE_DEFAULTS.connectorThickness,\n drawPaths: false,\n nodeWidth,\n linearLayout: o.linearLayout,\n highlight,\n axis,\n referenceRamp\n })\n };\n}\n\nexport {\n figureScene\n};\n", "import {\n svgCanvas\n} from \"./chunk-RUCH6ZFL.js\";\nimport {\n stripGeneGaps,\n walkStripFrame,\n walkStripLabelsTree\n} from \"./chunk-WBSWROE6.js\";\nimport {\n walkRowsKey,\n walkRowsKeyTree,\n walkRowsTree\n} from \"./chunk-EFQLEGWM.js\";\nimport {\n Canvas2DRenderer\n} from \"./chunk-QLWI2PZ3.js\";\nimport {\n EXON_COLOR,\n exonOutlineTree,\n exonStretches\n} from \"./chunk-JSUCGZ6K.js\";\nimport {\n genePins\n} from \"./chunk-RPRHR56C.js\";\nimport {\n geneLabelCandidates\n} from \"./chunk-KC7T5RWG.js\";\nimport {\n nodesUnderBox\n} from \"./chunk-4HWM3FNK.js\";\nimport {\n escapeAttr,\n serializeEl\n} from \"./chunk-H2H4Y3TV.js\";\nimport {\n version\n} from \"./chunk-YYMW5XOF.js\";\nimport {\n axisScaleOf\n} from \"./chunk-BS4UZ44I.js\";\nimport {\n rangeText,\n walkKey\n} from \"./chunk-4ETPXDO6.js\";\nimport {\n figureScene\n} from \"./chunk-HFVGGB3U.js\";\nimport {\n encodingStops\n} from \"./chunk-VQC7KELB.js\";\nimport {\n walkRowLabels\n} from \"./chunk-L2HDM2R3.js\";\nimport {\n nodeInk\n} from \"./chunk-JBCZIBFC.js\";\nimport {\n FIT_PADDING,\n fitTransform\n} from \"./chunk-2QLLQJ72.js\";\nimport {\n LABEL_CHAR_PX,\n LABEL_PAD,\n LABEL_PX,\n occupancy,\n placeLabels\n} from \"./chunk-AB35TJST.js\";\nimport {\n FACET_GAP_PX,\n FACET_PAD_PX,\n FACET_TITLE_PX,\n facetCells,\n facetGrid\n} from \"./chunk-XV4P5KEQ.js\";\n\n// src/figure.ts\nvar FONT = 'font-family=\"Helvetica, Arial, sans-serif\" font-size=\"11\"';\nvar BAR_PX = 48;\nvar SWATCH_PX = 18;\nvar KEY_GAP_PX = 16;\nvar STRIP_KEY_PX = 22;\nvar FADED = \"rgb(160,160,160)\";\nvar GENE_INK = \"#1c1c22\";\nfunction keySvg(id, x, y, stops, label, after, under, opacity = 1) {\n const bar = stops.length > 1 ? BAR_PX : SWATCH_PX;\n const fill = stops.length > 1 ? `fill=\"url(#${id})\"` : `fill=\"${stops[0].color}\"${opacity < 1 ? ` fill-opacity=\"${opacity}\"` : \"\"}`;\n const defs = stops.length > 1 ? `<linearGradient id=\"${id}\">${stops.map((s) => `<stop offset=\"${s.offset}\" stop-color=\"${s.color}\"/>`).join(\"\")}</linearGradient>` : \"\";\n const width = Math.max(\n bar + 5 + (label.length + after.length) * LABEL_CHAR_PX,\n (under?.length ?? 0) * LABEL_CHAR_PX\n );\n return {\n width,\n markup: `${defs}<g transform=\"translate(${x} ${y})\" ${FONT}><rect y=\"5\" width=\"${bar}\" height=\"8\" rx=\"2\" ${fill}/><text x=\"${bar + 5}\" y=\"13\"><tspan font-weight=\"bold\">${escapeAttr(label)}</tspan>${escapeAttr(after)}</text>${under ? `<text y=\"28\">${escapeAttr(under)}</text>` : \"\"}</g>`\n };\n}\nfunction exonKeySvg(x, y) {\n return {\n width: SWATCH_PX + 5 + 4 * LABEL_CHAR_PX,\n markup: `<g transform=\"translate(${x} ${y})\" ${FONT}><rect x=\"1\" y=\"4\" width=\"${SWATCH_PX - 2}\" height=\"10\" rx=\"4\" fill=\"none\" stroke=\"${EXON_COLOR}\" stroke-width=\"2\"/><text x=\"${SWATCH_PX + 5}\" y=\"13\">exon</text></g>`\n };\n}\nfunction walkKeySvg(id, x, y, walk, label, reference) {\n const key = walkKey(walk, reference);\n return keySvg(\n id,\n x,\n y,\n encodingStops(walk.encoding),\n label,\n key.delta + key.outside + key.reversed,\n key.scale\n );\n}\nfunction screenPath(d, t) {\n return d.replaceAll(\n /([ML])(-?[\\d.e-]+),(-?[\\d.e-]+)/g,\n (_, cmd, x, y) => `${cmd}${+(Number(x) * t.scaleX + t.translateX).toFixed(1)},${+(Number(y) * t.scaleY + t.translateY).toFixed(1)}`\n );\n}\nfunction chip(x, y, w, name, note) {\n return `<rect x=\"${x - w / 2}\" y=\"${y - LABEL_PX - LABEL_PAD + 2}\" width=\"${w}\" height=\"${LABEL_PX + LABEL_PAD * 2 - 2}\" rx=\"3\" fill=\"#fff\" fill-opacity=\"0.85\" stroke=\"${EXON_COLOR}\"/><text x=\"${x}\" y=\"${y}\" font-family=\"Helvetica, Arial, sans-serif\" font-size=\"${LABEL_PX}\" fill=\"${GENE_INK}\" text-anchor=\"middle\"><tspan font-style=\"italic\" font-weight=\"600\">${escapeAttr(name)}</tspan>${note ? escapeAttr(note) : \"\"}</text>`;\n}\nfunction figureSvg(graph, layout, o = {}) {\n const width = o.width ?? 1200;\n const room = o.height ?? 800;\n const rows = o.walkRows;\n const {\n bounds,\n nodeById,\n referenceRamp,\n layers,\n lift,\n facet,\n panels,\n labelOf,\n referenceName,\n reference,\n contigThickness,\n nodeWidth,\n geometry\n } = figureScene(graph, layout, o);\n const pixelRows = layout.pixelRows ?? false;\n const rampInterval = referenceRamp && {\n start: referenceRamp.start,\n end: referenceRamp.start + referenceRamp.span\n };\n const pins = o.genes?.length && !layout.tubeMap && !rows ? genePins(graph, o.genes, layout.nodePositions) : [];\n const ink = nodeInk(graph, nodeById, contigThickness, nodeWidth);\n let masks = 0;\n function overlays(highlight, t, w, h) {\n const out = [];\n const outlines = exonOutlineTree(\n exonStretches(pins, ink.halfWidthPx, highlight, (d) => screenPath(d, t)),\n { id: `exons${masks++}`, width: w, height: h }\n );\n if (outlines) {\n out.push(serializeEl(outlines));\n }\n const screen = (p) => ({\n x: p.x * t.scaleX + t.translateX,\n y: p.y * t.scaleY + t.translateY\n });\n const frame = { width: w, height: h };\n for (const { item: pin, x, y, w: cw, text } of placeLabels(\n geneLabelCandidates(\n pins,\n screen,\n contigThickness,\n nodesUnderBox(layout.nodePositions, t)\n ),\n frame,\n occupancy(frame)\n )) {\n const pinY = screen(pin.at).y + contigThickness / 2;\n out.push(\n `<line x1=\"${x}\" x2=\"${x}\" y1=\"${y - LABEL_PX - 2}\" y2=\"${pinY}\" stroke=\"${GENE_INK}\" stroke-width=\"0.8\" stroke-opacity=\"0.6\"/>`,\n chip(x, y, cw, pin.gene.name, text.slice(pin.gene.name.length))\n );\n }\n if (rows) {\n out.push(\n serializeEl(\n walkRowsTree(\n rows,\n { ...t, width: w, height: h, ...o.walkRowPitch },\n {\n ramp: rampInterval,\n rowGenes: o.rowGenes\n }\n )\n )\n );\n }\n const rowLabels = walkRowLabels(rows, layout, o.walkRowPitch);\n for (const { label, y } of rowLabels) {\n const sy = y * t.scaleY + t.translateY;\n if (sy >= 0 && sy <= h) {\n out.push(\n `<text x=\"6\" y=\"${sy + 4}\" ${FONT} stroke=\"#fff\" stroke-width=\"3\" paint-order=\"stroke\">${escapeAttr(label)}</text>`\n );\n }\n }\n return out.join(\"\");\n }\n function drawing(highlight, w, h) {\n const fit = fitTransform(\n bounds,\n w,\n h,\n pixelRows,\n panels ? {\n padLeft: FACET_PAD_PX,\n padTop: FACET_PAD_PX,\n padRight: FACET_PAD_PX,\n padBottom: FACET_PAD_PX\n } : {}\n );\n if (!fit) {\n return \"\";\n }\n const axis = axisScaleOf(fit.scale, pixelRows);\n const { canvas, markup } = svgCanvas(w, h);\n const renderer = new Canvas2DRenderer(canvas);\n renderer.uploadGeometry(geometry(highlight, axis));\n const t = {\n scaleX: axis.scaleX,\n scaleY: axis.scaleY,\n translateX: fit.translateX,\n translateY: fit.translateY\n };\n renderer.updateTransform({ ...t, dpr: 1 });\n renderer.render([1, 1, 1, 1]);\n return markup() + overlays(highlight, t, w, h);\n }\n const parts = [];\n let height;\n if (panels) {\n const place = facetCells(\n panels.map((p) => p.walks[0].name),\n facet.field || \"walk\",\n facet.domain\n );\n const grid = facetGrid({\n count: place.count,\n bounds,\n pixelRows,\n width,\n room,\n columns: place.columns ?? facet.columns\n });\n panels.forEach((panel, i) => {\n const cell = place.cells[i];\n const x = cell % grid.columns * (grid.width + FACET_GAP_PX);\n const y = Math.floor(cell / grid.columns) * (grid.height + FACET_TITLE_PX + FACET_GAP_PX);\n const walk = panel.walks[0];\n parts.push(\n walkKeySvg(`key${i}`, x + 6, y + 2, walk, labelOf(walk.name), reference).markup,\n `<svg x=\"${x}\" y=\"${y + FACET_TITLE_PX}\" width=\"${grid.width}\" height=\"${grid.height}\">${drawing(panel, grid.width, grid.height)}</svg>`\n );\n });\n height = grid.total;\n } else {\n let x = 6;\n const push = (key) => {\n parts.push(key.markup);\n x += key.width + KEY_GAP_PX;\n };\n if (lift) {\n lift.walks.forEach((walk, i) => {\n push(walkKeySvg(`key${i}`, x, 2, walk, labelOf(walk.name), reference));\n });\n push(\n keySvg(\n \"faded\",\n x,\n 2,\n [{ offset: 0, color: FADED }],\n \"\",\n `not on ${lift.walks.length === 1 ? labelOf(lift.walks[0].name) : \"these walks\"}`,\n void 0,\n 0.3\n )\n );\n }\n if (rows) {\n const key = walkRowsKeyTree(\n walkRowsKey(rows, {\n ramp: rampInterval,\n genes: o.rowGenes?.size ? o.rowGeneGaps : void 0\n }),\n x,\n 2,\n \"rows-key\"\n );\n push({ width: key.width, markup: serializeEl(key.tree) });\n } else if (!lift && referenceRamp) {\n push(\n keySvg(\n \"ramp\",\n x,\n 2,\n encodingStops({ field: \"reference\", scheme: \"rainbow\" }),\n referenceName ? `${referenceName} position` : \"Reference position\",\n \"\",\n rangeText(\n referenceName,\n referenceRamp.start,\n referenceRamp.start + referenceRamp.span\n )\n )\n );\n }\n if (pins.some((pin) => pin.exonsByNode.length > 0)) {\n push(exonKeySvg(x, 2));\n }\n const header = parts.length > 0 ? FACET_TITLE_PX : 0;\n const usable = width - 2 * FIT_PADDING;\n const drawn = pixelRows || !(bounds.w > 0) ? bounds.h : bounds.h * usable / bounds.w;\n const h = Math.max(\n 160,\n Math.min(room - header, Math.ceil(drawn + 2 * FIT_PADDING))\n );\n parts.push(\n `<svg y=\"${header}\" width=\"${width}\" height=\"${h}\">${drawing(lift, width, h)}</svg>`\n );\n height = header + h;\n }\n const strip = o.walkStrip;\n if (strip && !rows && !layout.tubeMap) {\n const frame = walkStripFrame(strip.rows, { width });\n const key = walkRowsKeyTree(\n walkRowsKey(strip.rows, {\n ramp: rampInterval,\n genes: stripGeneGaps(frame, strip.rowGenes, strip.rowGeneGaps)\n }),\n 6,\n height + frame.height,\n \"strip-key\"\n );\n parts.push(\n `<line x1=\"0\" x2=\"${width}\" y1=\"${height + 0.5}\" y2=\"${height + 0.5}\" stroke=\"#ddd\"/>`,\n `<svg y=\"${height}\" width=\"${width}\" height=\"${frame.height}\">${serializeEl(\n walkRowsTree(strip.rows, frame, {\n ramp: rampInterval,\n rowGenes: strip.rowGenes,\n idPrefix: \"strip\"\n })\n )}${serializeEl(\n walkStripLabelsTree(\n strip.rows,\n frame,\n new Set(layers.map((l) => l.walk))\n )\n )}</svg>`,\n serializeEl(key.tree)\n );\n height += frame.height + STRIP_KEY_PX;\n }\n const metadata = JSON.stringify({\n generator: `@jbrowse/bandage-core@${version}`,\n ...o.spec === void 0 ? {} : { spec: o.spec }\n });\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\"><metadata>${escapeAttr(metadata)}</metadata><rect width=\"${width}\" height=\"${height}\" fill=\"#fff\"/>${parts.join(\"\")}</svg>\n`;\n}\n\nexport {\n figureSvg\n};\n", "import {\n bubbleSegmentIds,\n classifyBubble\n} from \"./chunk-URZ3CH2R.js\";\nimport {\n svgPath\n} from \"./chunk-7SRWJLSC.js\";\nimport {\n isBackbone\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/bubbles/bubbleHalos.ts\nvar WHOLE_FRACTION = 0.9;\nfunction coversGraph(members, nodes) {\n return members + 2 >= nodes || members >= WHOLE_FRACTION * nodes;\n}\nvar SMALL_VARIANT_BP = 50;\nfunction bubbleHalos(graph, bubbles, positions, repeats = []) {\n const byName = new Map(graph.nodes.map((n) => [n.name, n]));\n const halos = [];\n for (const bubble of bubbles) {\n const parts = [];\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n const nodeIds = [];\n const names = bubbleSegmentIds(bubble);\n for (const [i, name] of names.entries()) {\n const node = byName.get(name);\n const line = node && positions[node.id];\n if (!node || !line?.length) {\n continue;\n }\n if (bubble.key ? i === 0 || i === names.length - 1 : isBackbone(node) && (node.stable.start < bubble.start || node.stable.start >= bubble.end)) {\n continue;\n }\n nodeIds.push(node.id);\n parts.push(svgPath(line.length === 1 ? [line[0], line[0]] : line));\n for (const p of line) {\n minX = Math.min(minX, p.x);\n maxX = Math.max(maxX, p.x);\n minY = Math.min(minY, p.y);\n }\n }\n if (nodeIds.length === 0) {\n continue;\n }\n const labelAt = { x: (minX + maxX) / 2, y: minY };\n const whole = bubble.covering === true || coversGraph(nodeIds.length, graph.nodes.length);\n halos.push({\n bubble,\n ...classifyBubble(bubble, repeats),\n path: parts.join(\"\"),\n labelAt,\n members: nodeIds.length,\n nodeIds,\n whole,\n // The drawing's own bubble keeps its name however small. A partial\n // bubble's lengths are a floor, so it may be no small variant.\n tick: !whole && !bubble.partial && bubble.longestAlleleLength < SMALL_VARIANT_BP\n });\n }\n return halos;\n}\n\nexport {\n WHOLE_FRACTION,\n coversGraph,\n SMALL_VARIANT_BP,\n bubbleHalos\n};\n", "import {\n trimOrigins\n} from \"./chunk-M6LK4GII.js\";\n\n// src/bubbles/popBubble.ts\nfunction bubbleSubgraph(graph, segmentIds) {\n const keep = new Set(segmentIds);\n const nodes = graph.nodes.filter((n) => keep.has(n.name));\n const ids = new Set(nodes.map((n) => n.id));\n const lengthOf = new Map(graph.nodes.map((n) => [n.id, n.length]));\n const kept = /* @__PURE__ */ new Map();\n const paths = graph.paths?.flatMap((p) => {\n const first = p.nodeIds.findIndex((id) => ids.has(id));\n if (first < 0) {\n return [];\n }\n const nodeIds = p.nodeIds.filter((id) => ids.has(id));\n kept.set(p.name, { first, nodeIds });\n const before = p.nodeIds.slice(0, first).reduce((sum, id) => sum + (lengthOf.get(id) ?? 0), 0);\n return [\n {\n ...p,\n nodeIds,\n ...p.start === void 0 ? {} : { start: p.start + before }\n }\n ];\n });\n return {\n name: graph.name,\n nodes,\n edges: graph.edges.filter((e) => ids.has(e.from) && ids.has(e.to)),\n ...paths?.length ? { paths } : {},\n anchorPaths: trimOrigins(graph, kept),\n pathVisits: graph.pathVisits,\n anchoredBy: graph.anchoredBy,\n referencePath: graph.referencePath\n };\n}\n\nexport {\n bubbleSubgraph\n};\n", "import {\n SATURATED_PATH_COUNT\n} from \"./chunk-FX4RDMDN.js\";\nimport {\n referenceOrder\n} from \"./chunk-CM6LO6OC.js\";\nimport {\n isBackbone\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/bubbles/bubblesFromGraph.ts\nfunction relax(best, to, cur, add) {\n const prev = best.get(to);\n best.set(to, {\n min: Math.min(prev?.min ?? Infinity, cur.min + add),\n max: Math.max(prev?.max ?? -Infinity, cur.max + add),\n n: Math.min(SATURATED_PATH_COUNT, cur.n + (prev?.n ?? 0))\n });\n}\nfunction bubblesFromGraph(graph) {\n if (!graph.nodes.some(isBackbone)) {\n return [];\n }\n const byId = new Map(graph.nodes.map((n) => [n.id, n]));\n const order = referenceOrder(graph);\n const indexOf = new Map(order.map((id, i) => [id, i]));\n const reach = new Int32Array(order.length + 1);\n const succ = /* @__PURE__ */ new Map();\n const linked = /* @__PURE__ */ new Set();\n for (const e of graph.edges) {\n const a = indexOf.get(e.from);\n const b = indexOf.get(e.to);\n if (a === void 0 || b === void 0 || a === b) {\n continue;\n }\n linked.add(`${e.from}>${e.to}`).add(`${e.to}>${e.from}`);\n const [lo, hi] = a < b ? [a, b] : [b, a];\n reach[lo + 1]++;\n reach[hi]--;\n const [from, to] = a < b ? [e.from, e.to] : [e.to, e.from];\n (succ.get(from) ?? succ.set(from, /* @__PURE__ */ new Set()).get(from)).add(to);\n }\n for (let i = 1; i < reach.length; i++) {\n reach[i] += reach[i - 1];\n }\n const backbone = graph.nodes.filter(isBackbone).sort((a, b) => a.stable.start - b.stable.start);\n const ends = /* @__PURE__ */ new Set([backbone[0].id, backbone.at(-1).id]);\n const boundaries = backbone.map((node) => [node, indexOf.get(node.id)]).filter(([node, i]) => ends.has(node.id) || reach[i] === 0).sort(([a, ia], [b, ib]) => ia - ib || a.stable.start - b.stable.start);\n const walkIndex = walkIndexOf(\n graph,\n boundaries.map(([node]) => node.id)\n );\n const bubbles = [];\n for (let i = 0; i + 1 < boundaries.length; i++) {\n const [start, i0] = boundaries[i];\n const [end, i1] = boundaries[i + 1];\n const interior = order.slice(i0 + 1, i1);\n if (interior.length === 0) {\n continue;\n }\n const best = /* @__PURE__ */ new Map([[start.id, { min: 0, max: 0, n: 1 }]]);\n for (const id of [start.id, ...interior]) {\n const cur = best.get(id);\n if (!cur) {\n continue;\n }\n for (const t of succ.get(id) ?? []) {\n const ti = indexOf.get(t);\n if (ti > i1) {\n continue;\n }\n relax(best, t, cur, t === end.id ? 0 : byId.get(t).length);\n }\n }\n const walked = walkIndex && walkRoutes(graph, byId, walkIndex, start.id, end.id);\n const crossed = walked?.n ? walked : void 0;\n const routes = crossed ?? best.get(end.id) ?? { min: 0, max: 0, n: 0 };\n const walksLeave = walked !== void 0 && walked.left > 0;\n const refStart = start.stable.start + start.length;\n const refEnd = end.stable.start;\n const chain = [\n start.id,\n ...interior.filter((id) => isBackbone(byId.get(id))),\n end.id\n ];\n const chainBroken = chain.some(\n (id, k) => k > 0 && !linked.has(`${chain[k - 1]}>${id}`)\n );\n const partial = chainBroken || walksLeave;\n const fallback = chainBroken && !crossed;\n bubbles.push({\n refName: start.stable.refName,\n start: refStart,\n end: refEnd,\n segmentCount: interior.length + 2,\n pathCount: routes.n,\n // a real inversion test needs each walk's direction relative to the\n // reference; the first visit's strand is just whichever path anchored the\n // node\n inversion: false,\n shortestAlleleLength: fallback ? refEnd - refStart : routes.min,\n longestAlleleLength: fallback ? refEnd - refStart : routes.max,\n segments: [start, ...interior.map((id) => byId.get(id)), end].map((n) => n.name).join(\",\"),\n shortestAllele: void 0,\n longestAllele: void 0,\n partial,\n routes: crossed?.routes\n });\n }\n return bubbles;\n}\nfunction walkIndexOf(graph, ids) {\n const paths = graph.paths;\n if (!paths) {\n return void 0;\n }\n const index = /* @__PURE__ */ new Map();\n for (const id of ids) {\n index.set(id, new Int32Array(paths.length).fill(-1));\n }\n paths.forEach((p, k) => {\n const steps = p.nodeIds;\n for (let i = 0; i < steps.length; i++) {\n const at = index.get(steps[i]);\n if (at?.[k] === -1) {\n at[k] = i;\n }\n }\n });\n return index;\n}\nfunction walkRoutes(graph, byId, walkIndex, startId, endId) {\n const routes = [];\n let min = Infinity;\n let max = -Infinity;\n let left = 0;\n const at0 = walkIndex.get(startId);\n const at1 = walkIndex.get(endId);\n graph.paths.forEach((p, k) => {\n const i0 = at0[k];\n const i1 = at1[k];\n if (i0 < 0 || i1 < 0) {\n if (i0 >= 0 || i1 >= 0) {\n left++;\n }\n return;\n }\n const ids = p.nodeIds;\n const lo = Math.min(i0, i1) + 1;\n const hi = Math.max(i0, i1);\n const step = i1 < i0 ? (j) => ids[hi - 1 - j] : (j) => ids[lo + j];\n let route = routes.find(\n (r) => r.steps.length === hi - lo && r.steps.every((id, j) => id === step(j))\n );\n if (!route) {\n const steps = Array.from({ length: hi - lo }, (_, j) => step(j));\n let bp = 0;\n for (const id of steps) {\n bp += byId.get(id)?.length ?? 0;\n }\n route = { steps, bp, walks: [] };\n routes.push(route);\n }\n route.walks.push(p.name);\n min = Math.min(min, route.bp);\n max = Math.max(max, route.bp);\n });\n return routes.length || left ? { min, max, n: routes.length, left, routes } : void 0;\n}\n\nexport {\n relax,\n bubblesFromGraph,\n walkIndexOf,\n walkRoutes\n};\n", "import {\n bubblesFromGraph,\n relax,\n walkIndexOf,\n walkRoutes\n} from \"./chunk-CQHUZHET.js\";\nimport {\n bubbleSubgraph\n} from \"./chunk-T6V4KI2L.js\";\nimport {\n coversGraph\n} from \"./chunk-JA2HJIYS.js\";\nimport {\n bubbleSegmentIds\n} from \"./chunk-URZ3CH2R.js\";\nimport {\n strandSides\n} from \"./chunk-7SRWJLSC.js\";\nimport {\n isBackbone\n} from \"./chunk-FYQWPEEY.js\";\n\n// src/bubbles/superbubbles.ts\nfunction slotGraph(graph, index) {\n const slots = graph.nodes.length * 2;\n const seen = /* @__PURE__ */ new Set();\n const pairs = [];\n const degree = new Int32Array(slots);\n for (const e of graph.edges) {\n const a = index.get(e.from);\n const b = index.get(e.to);\n if (a === void 0 || b === void 0) {\n continue;\n }\n const sides = strandSides(e);\n const ka = a * 2 + (sides.from === \"end\" ? 1 : 0);\n const kb = b * 2 + (sides.to === \"end\" ? 1 : 0);\n const id = Math.min(ka, kb) * slots + Math.max(ka, kb);\n if (seen.has(id)) {\n continue;\n }\n seen.add(id);\n pairs.push(ka, kb);\n degree[ka]++;\n if (ka !== kb) {\n degree[kb]++;\n }\n }\n const offset = new Int32Array(slots + 1);\n for (let k = 0; k < slots; k++) {\n offset[k + 1] = offset[k] + degree[k];\n }\n const next = new Int32Array(offset[slots]);\n const fill = offset.slice(0, slots);\n for (let i = 0; i < pairs.length; i += 2) {\n const ka = pairs[i];\n const kb = pairs[i + 1];\n next[fill[ka]++] = kb;\n if (ka !== kb) {\n next[fill[kb]++] = ka;\n }\n }\n return { offset, next };\n}\nfunction searcher(nodes, offset, next) {\n const visited = new Int32Array(nodes);\n const pending = new Uint8Array(nodes * 2);\n const stack = new Int32Array(nodes * 2);\n const inside = new Int32Array(nodes);\n const touched = [];\n let stamp = 0;\n return (start) => {\n const s = start >> 1;\n stamp++;\n touched.length = 0;\n let open = 0;\n let top = 0;\n let count = 0;\n let found;\n const expect = (k) => {\n if (!pending[k]) {\n pending[k] = 1;\n open++;\n touched.push(k);\n }\n };\n expect(start);\n stack[top++] = start;\n search: while (top > 0) {\n const k = stack[--top];\n const v = k >> 1;\n visited[v] = stamp;\n if (v !== s) {\n inside[count++] = k;\n }\n if (pending[k]) {\n pending[k] = 0;\n open--;\n }\n if (offset[k] === offset[k + 1]) {\n break;\n }\n for (let p = offset[k]; p < offset[k + 1]; p++) {\n const entry = next[p];\n const u = entry >> 1;\n if (u === s) {\n break search;\n }\n expect(entry ^ 1);\n if (visited[u] === stamp) {\n continue;\n }\n let ready = true;\n for (let q = offset[entry]; q < offset[entry + 1]; q++) {\n if (visited[next[q] >> 1] !== stamp) {\n ready = false;\n break;\n }\n }\n if (ready) {\n stack[top++] = entry ^ 1;\n }\n }\n if (top === 1 && open === 1) {\n if (count > 0) {\n found = {\n source: start,\n sink: stack[0],\n inside: inside.slice(0, count)\n };\n }\n break;\n }\n }\n for (const k of touched) {\n pending[k] = 0;\n }\n return found;\n };\n}\nfunction reversed(f) {\n return {\n source: f.sink ^ 1,\n sink: f.source ^ 1,\n inside: f.inside.map((k) => k ^ 1).reverse()\n };\n}\nvar collator = new Intl.Collator(void 0, { numeric: true });\nfunction onReference(a, b) {\n return isBackbone(a) && isBackbone(b) && a.stable.refName === b.stable.refName;\n}\nfunction forward(f, nodes) {\n const a = nodes[f.source >> 1];\n const b = nodes[f.sink >> 1];\n const byRef = onReference(a, b) ? a.stable.start - b.stable.start : 0;\n const bySide = ((f.sink ^ 1) & 1) - (f.source & 1);\n return (byRef || bySide || collator.compare(a.name, b.name)) < 0;\n}\nfunction nodesOf(f) {\n return [f.source >> 1, ...Array.from(f.inside, (k) => k >> 1), f.sink >> 1];\n}\nfunction allSuperbubbles(graph) {\n const { nodes } = graph;\n const index = new Map(nodes.map((n, i) => [n.id, i]));\n const { offset, next } = slotGraph(graph, index);\n const find = searcher(nodes.length, offset, next);\n const byEnds = /* @__PURE__ */ new Map();\n for (let k = 0; k < nodes.length * 2; k++) {\n const hit = find(k);\n if (!hit) {\n continue;\n }\n const a = hit.source >> 1;\n const b = hit.sink >> 1;\n const id = Math.min(a, b) * nodes.length + Math.max(a, b);\n if (forward(hit, nodes) || !byEnds.has(id)) {\n byEnds.set(id, hit);\n }\n }\n const found = [...byEnds.values()].map(\n (f) => forward(f, nodes) ? f : reversed(f)\n );\n return { found, offset, next };\n}\nfunction routesThrough(nodes, offset, next, f) {\n const sink = f.sink >> 1;\n const best = /* @__PURE__ */ new Map([\n [f.source >> 1, { min: 0, max: 0, n: 1 }]\n ]);\n for (const k of [f.source, ...f.inside]) {\n const cur = best.get(k >> 1);\n if (!cur) {\n continue;\n }\n for (let p = offset[k]; p < offset[k + 1]; p++) {\n const u = next[p] >> 1;\n relax(best, u, cur, u === sink ? 0 : nodes[u].length);\n }\n }\n return best.get(sink) ?? { min: 0, max: 0, n: 0 };\n}\nfunction superbubblesFromGraph(graph, span) {\n const { nodes } = graph;\n const { found, offset, next } = allSuperbubbles(graph);\n const covers = found.map((f) => coversGraph(f.inside.length, nodes.length));\n const members = found.map(nodesOf);\n const holders = /* @__PURE__ */ new Map();\n members.forEach((vs, i) => {\n for (const v of vs) {\n ;\n (holders.get(v) ?? holders.set(v, []).get(v)).push(i);\n }\n });\n const nested = (f, i) => holders.get(f.inside[0] >> 1).some(\n (j) => j !== i && !covers[j] && members[j].length > members[i].length && members[i].every((v) => holders.get(v).includes(j))\n );\n const placed = (f) => span !== void 0 || onReference(nodes[f.source >> 1], nodes[f.sink >> 1]);\n const outermost = found.filter(\n (f, i) => !covers[i] && placed(f) && !nested(f, i)\n );\n const byId = new Map(nodes.map((n) => [n.id, n]));\n const walkIndex = walkIndexOf(\n graph,\n outermost.flatMap((f) => [nodes[f.source >> 1].id, nodes[f.sink >> 1].id])\n );\n return outermost.map((f) => {\n const source = nodes[f.source >> 1];\n const sink = nodes[f.sink >> 1];\n const walked = walkIndex && walkRoutes(graph, byId, walkIndex, source.id, sink.id);\n const crossed = walked?.n ? walked : void 0;\n const routes = crossed ?? routesThrough(nodes, offset, next, f);\n const placedOn = onReference(source, sink);\n return {\n refName: placedOn ? source.stable.refName : span.refName,\n start: placedOn ? source.stable.start + source.length : span.start,\n end: placedOn ? sink.stable.start : span.end,\n segmentCount: f.inside.length + 2,\n pathCount: routes.n,\n inversion: false,\n shortestAlleleLength: routes.min,\n longestAlleleLength: routes.max,\n segments: nodesOf(f).map((v) => nodes[v].name).join(\",\"),\n shortestAllele: void 0,\n longestAllele: void 0,\n partial: walked !== void 0 && walked.left > 0,\n routes: crossed?.routes,\n key: `${source.name}>${sink.name}`,\n ...placedOn ? {} : { offReference: true }\n };\n }).sort(\n (a, b) => a.start - b.start || a.end - b.end || collator.compare(a.key, b.key)\n );\n}\nfunction graphBubbles(graph, span) {\n const n = graph.nodes.length;\n const reach = bubblesFromGraph(graph);\n if (reach.length === 0) {\n const inside = superbubblesFromGraph(graph, span);\n return span ? [...inside, { ...span, covering: true }] : inside;\n }\n return reach.flatMap(\n (b) => coversGraph(b.segmentCount - 2, n) ? [\n ...superbubblesFromGraph(\n b.segmentCount === n ? graph : bubbleSubgraph(graph, bubbleSegmentIds(b)),\n b\n ),\n { ...b, covering: true }\n ] : [b]\n );\n}\n\nexport {\n superbubblesFromGraph,\n graphBubbles\n};\n", "import {\n computeColorSchemeRange,\n getNodeColor\n} from \"./chunk-A4PFFC4Q.js\";\nimport {\n abgrToCssRgba\n} from \"./chunk-G2FD7S3C.js\";\n\n// src/tubeMap/nodeColors.ts\nfunction tubeMapNodeColors(graph, colorScheme, referenceRamp) {\n if (colorScheme === \"uniform\" || colorScheme === \"grey\") {\n return void 0;\n }\n const range = { ...computeColorSchemeRange(graph), referenceRamp };\n return new Map(\n graph.nodes.map((node, index) => [\n node.id,\n abgrToCssRgba(getNodeColor(node, index, colorScheme, range))\n ])\n );\n}\n\nexport {\n tubeMapNodeColors\n};\n", "const host = JBrowseExports[\"@jbrowse/core/pluggableElementTypes/renderers/util/serializableFilterChain\"]\nconst read = name =>\n host != null && name in Object(host)\n ? host[name]\n : Object.assign(\n function () {\n throw new Error(\n \"This JBrowse does not provide '\" + name + \"' from '\" + \"@jbrowse/core/pluggableElementTypes/renderers/util/serializableFilterChain\" + \"' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse\",\n )\n },\n { jbrowseHostMissing: name },\n )\nexport default host && host.__esModule ? host.default : host", "// `session.views`, `session.hovered` and a display's members are read\n// structurally, their types being the host's rather than this plugin's\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n", "import { isRecord } from '../isRecord'\n\nexport interface NavigableLinearView {\n id: string\n assemblyNames: string[]\n navToLocString: (locString: string, assemblyName?: string) => unknown\n}\n\n// Reads `session.views` structurally, the same way graphViewHighlights does: the\n// members needed here are declared by LinearGenomeView, not by the\n// AbstractViewModel the session array is typed as.\nfunction isLinearView(view: unknown): view is NavigableLinearView {\n return (\n isRecord(view) &&\n view.type === 'LinearGenomeView' &&\n typeof view.id === 'string' &&\n typeof view.navToLocString === 'function' &&\n Array.isArray(view.assemblyNames)\n )\n}\n\n// The view a graph was launched from is not always in `session.views`: a row of\n// a LinearSyntenyView, LinearComparativeView or BreakpointSplitView sits in\n// that view's own `views[]`, so the candidates are the session's views plus one\n// level of rows.\nexport function withRows(views: unknown[]) {\n return views.flatMap(view =>\n isRecord(view) && Array.isArray(view.views)\n ? [view, ...view.views]\n : [view],\n )\n}\n\n// The linear view a \"show me this\" from the graph should move, rather than\n// opening a pane beside it. Three cases, in order:\n//\n// - the view this graph is paired with (`connectedViewId`), which is either\n// the view the graph was launched from or the one it later opened itself.\n// Explicit, so it wins.\n// - failing that, the only linear view in the session showing this assembly.\n// The pangenome sessions this view ships in are a linear view above a graph\n// with no pairing recorded, and there \"the linear view\" is unambiguous \u2014 the\n// same reasoning hoverSync's isConnected already applies to highlights.\n// - two or more candidates and no pairing: nothing. Guessing which of the\n// user's views to scroll is worse than opening one that is ours to move.\n//\n// Assembly-gated throughout: a linear view on a different assembly cannot show\n// this location at all.\nexport function linearViewTarget({\n views,\n connectedViewId,\n assemblyName,\n}: {\n views: unknown[]\n connectedViewId: string | undefined\n assemblyName: string\n}) {\n const candidates = withRows(views)\n .filter(view => isLinearView(view))\n .filter(view => view.assemblyNames.includes(assemblyName))\n const connected = candidates.find(view => view.id === connectedViewId)\n return connected ?? (candidates.length === 1 ? candidates[0] : undefined)\n}\n", "import { regionLabel } from '@jbrowse/bandage-core/hoverText'\nimport { readConfObject } from '@jbrowse/core/configuration'\n\nimport { locString } from './contributors'\nimport { linearViewTarget } from './linearViewTarget'\n\nimport type { Contributor, GraphLocation } from './contributors'\nimport type { SubgraphRegion } from '../GetSubgraph'\nimport type { AnyConfigurationModel } from '@jbrowse/core/configuration'\n\nexport interface TrackScanSession {\n tracks: AnyConfigurationModel[]\n // core's getTrackName reads these\n assemblies: AnyConfigurationModel[]\n // optional, as a hand-built session in a test has none\n assemblyManager?: {\n has: (name: string) => boolean\n get: (name: string) => { name: string } | undefined\n }\n}\n\n// A track may name an assembly by an alias, and contributors are resolved to\n// canonical names. `has` before `get`, as assemblyResolver does: `get` asks\n// every plugin to go supply a name it does not know.\nexport function canonicalAssemblyName(session: TrackScanSession, name: string) {\n const manager = session.assemblyManager\n return manager?.has(name) ? (manager.get(name)?.name ?? name) : name\n}\n\n// The assemblies a track config covers, by canonical name\nexport function trackAssemblies(\n session: TrackScanSession,\n track: AnyConfigurationModel,\n) {\n const names: unknown = readConfObject(track, 'assemblyNames')\n return Array.isArray(names)\n ? names\n .filter(n => typeof n === 'string')\n .map(n => canonicalAssemblyName(session, n))\n : []\n}\n\nexport interface GraphLaunchSession extends TrackScanSession {\n addView: (type: string, snapshot?: Record<string, unknown>) => { id: string }\n // The session's own loader for a view whose state model is registered\n // lazily (JBrowse 4's LinearSyntenyView); absent on an older core, where\n // addView is enough\n launchView?: (\n type: string,\n snapshot?: Record<string, unknown>,\n ) => Promise<{ id: string }>\n views: unknown[]\n // optional, as a hand-built session in a test has none\n notifyError?: (message: string, error?: unknown) => void\n // a highlight every linear view on its assembly draws\n addHighlight?: (highlight: SubgraphRegion) => void\n}\n\n// A launch is a promise nothing waits on. Let go, a refusal moved nothing and\n// said nothing; this is where it is told to the user instead.\nfunction reportFailure(\n session: GraphLaunchSession,\n what: string,\n launch: Promise<unknown>,\n) {\n launch.catch((error: unknown) => {\n console.error(`[GraphGenomeView] ${what}`, error)\n session.notifyError?.(`${what}: ${error}`, error)\n })\n}\n\n// A node is often shorter than a line of text \u2014 a base-level allele can be a\n// handful of bp \u2014 and a linear view opened on exactly that span shows the span\n// and no context at all. Padding to a minimum window puts the node in the middle\n// of something readable.\nconst MIN_LAUNCH_SPAN_BP = 1000\n\nexport function paddedLocation(\n loc: GraphLocation,\n minSpan = MIN_LAUNCH_SPAN_BP,\n): GraphLocation {\n const pad = Math.max(0, Math.ceil((minSpan - (loc.end - loc.start)) / 2))\n return { ...loc, start: Math.max(0, loc.start - pad), end: loc.end + pad }\n}\n\n// Restate the rank-0 contributor in the terms of the region the graph was cut\n// from. Two separate corrections, both required:\n//\n// - the *assembly*. A backbone segment's SN is the graph's own spelling of the\n// reference, which need not be the name of any loaded assembly: the HPRC\n// graph says `GRCh38#0#chr6` in a session whose assembly is `hg38`. Taking\n// the PanSN sample there resolves to nothing and the graph offers no way out\n// at all. The cut region is authoritative \u2014 the adapter resolved that\n// assembly to that stable sequence to cut the subgraph in the first place.\n// The backbone's `haplotype` (`GRCh38#0`) goes with it, since\n// resolveLocationAssembly tries that before the sample.\n// - the *locus*. The cut region is what the user framed in the linear view, and\n// it is the span every other panel of a synteny launch is compared against;\n// the union of backbone segments differs from it whenever the window ends\n// inside a bubble.\n//\n// A subgraph is cut on one reference, so there is at most one rank-0\n// contributor. Must run before contributors are resolved against the session's\n// assemblies, or the reference is filtered out by the name this replaces.\nexport function withReferenceRegion(\n contributors: Contributor[],\n region: SubgraphRegion | undefined,\n): Contributor[] {\n return region\n ? contributors.map(c =>\n c.rank === 0\n ? {\n ...c,\n sample: region.assemblyName,\n haplotype: undefined,\n refName: region.refName,\n start: region.start,\n end: region.end,\n }\n : c,\n )\n : contributors\n}\n\n// Show a location in a linear view: move the one already on screen if there is\n// one to move, open a pane only if there isn't.\n//\n// This is the difference between \"flip to the linear view\" and \"accumulate\n// panes\". The pangenome sessions this ships in are a linear view above a graph,\n// and there the answer to \"where is this node?\" should be that the linear view\n// scrolls to it \u2014 see linearViewTarget for which view counts as the one to move.\n//\n// `tracks` is only applied to a view being created; a view already open keeps\n// whatever the user has turned on. Returns the id of the view that ended up\n// showing the location, so the graph can pair with it for the hover sync.\nexport function showInLinearView({\n session,\n location,\n assembly,\n connectedViewId,\n tracks = [],\n}: {\n session: GraphLaunchSession\n location: GraphLocation\n assembly: string\n connectedViewId?: string\n tracks?: string[]\n}) {\n const existing = linearViewTarget({\n views: session.views,\n connectedViewId,\n assemblyName: assembly,\n })\n let viewId: string\n if (existing) {\n reportFailure(\n session,\n `Could not show ${assembly} ${regionLabel(location)}`,\n Promise.resolve(existing.navToLocString(locString(location), assembly)),\n )\n viewId = existing.id\n } else {\n viewId = session.addView('LinearGenomeView', {\n displayName: `${assembly} \u2014 ${regionLabel(location)}`,\n init: { assembly, loc: locString(location), tracks },\n }).id\n }\n return viewId\n}\n\n// Mark where a node sits on the reference, in the linear view already on\n// screen, instead of scrolling that view to it. Review: \"need to be able to\n// just highlight lineargenomeview coords\".\n//\n// The other half of the pair above, and the half that survives being let go of:\n// hover sync draws a band for as long as the pointer is over the node, where a\n// highlight is written into the session's list and stays until it is removed.\n// It also keeps the reader's frame \u2014 the interesting comparison at a pangenome\n// locus is usually the whole window, not the 200 bp the node occupies.\n//\n// Nothing to mark when no linear view on that assembly is ours to move (see\n// linearViewTarget); the caller offers the item only when there is.\nexport function highlightInLinearView({\n session,\n location,\n assembly,\n connectedViewId,\n}: {\n session: GraphLaunchSession\n location: GraphLocation\n assembly: string\n connectedViewId?: string\n}) {\n const target = linearViewTarget({\n views: session.views,\n connectedViewId,\n assemblyName: assembly,\n })\n if (target) {\n session.addHighlight?.({\n refName: location.refName,\n start: location.start,\n end: location.end,\n assemblyName: assembly,\n })\n }\n return target !== undefined\n}\n\n// Which assemblies a track covers, for deciding whether a panel can draw it at\n// all. A trackId naming nothing in the session reads as covering nothing, so a\n// stale id drops the lane rather than adding one the panel would fail to load.\nfunction assemblyNamesOfTrack(\n session: GraphLaunchSession,\n trackId: string | undefined,\n) {\n const track =\n trackId === undefined\n ? undefined\n : session.tracks.find(t => readConfObject(t, 'trackId') === trackId)\n return track ? trackAssemblies(session, track) : []\n}\n\n// One panel per contributing assembly, each framed on the locus that assembly\n// contributes here, with the graph's own reference panel on top.\n//\n// The panel loci come from the graph rather than from the synteny track: rGFA\n// states where each contributor's sequence sits on its own coordinates, so the\n// launch needs no mate discovery, no PAF lookup and no dialog. That is the whole\n// point of launching from the graph instead of from a linear view.\n//\n// Panels carry THE GRAPH'S OWN TRACK and nothing else, which is a narrower rule\n// than the single-view launch's (see launchTracks, which scans the session for\n// the assembly's annotation). Tried that here: a gene track per panel takes\n// about 160px of a row that is otherwise a ruler, so on five strains the\n// annotation is most of the viewport and the ribbons \u2014 the thing the launch\n// exists to draw \u2014 are squeezed into the gaps, and `collapseEmptyRows` is here\n// to prevent exactly that.\n//\n// The graph's own track does not have that shape. It goes only in the panels\n// whose assembly its config declares, which is where the graph HAS coordinates:\n// the HPRC segments track names two, so both its panels get one lane, while the\n// E. coli one names K12 alone and a five-strain launch adds a single lane rather\n// than five. And it is the lane that makes the band readable, since the ribbons\n// otherwise connect two bare rulers and the reader has nothing to match across\n// them.\nexport function launchSyntenyView({\n session,\n contributors,\n trackId,\n graphTrackId,\n}: {\n session: GraphLaunchSession\n contributors: Contributor[]\n trackId?: string\n graphTrackId?: string\n}) {\n const graphTrackAssemblies = assemblyNamesOfTrack(session, graphTrackId)\n // The panels the chosen track aligns, in the order given. A pairwise track is\n // offered beside an all-vs-all, two assemblies being a synteny view, and over\n // every contributor it sat on each level and could draw on one at most. A\n // track that states no assemblies keeps them all.\n const aligned = assemblyNamesOfTrack(session, trackId)\n const covered = contributors.filter(c => aligned.includes(c.sample))\n const panels = covered.length >= 2 ? covered : contributors\n const snapshot = {\n init: {\n views: panels.map(c => ({\n assembly: c.sample,\n loc: locString(c),\n ...(graphTrackId !== undefined &&\n graphTrackAssemblies.includes(c.sample)\n ? { tracks: [graphTrackId] }\n : {}),\n })),\n // One entry per LEVEL, not one for the track. `init.tracks` is 2D \u2014 the\n // gap between views[i] and views[i+1] \u2014 and a flat `[trackId]` is read as\n // the level-0 shorthand, so on a five-strain launch only the top band got\n // the alignment and the four below it opened as bare rulers. The same\n // all-vs-all track fills every level: it carries all the pairs.\n tracks: trackId ? panels.slice(1).map(() => [trackId]) : [],\n collapseEmptyRows: true,\n },\n }\n // launchView where the session has it: a synteny view's state model is\n // loaded on demand and addView throws until it is\n if (session.launchView) {\n reportFailure(\n session,\n 'Could not open the synteny view',\n session.launchView('LinearSyntenyView', snapshot),\n )\n } else {\n session.addView('LinearSyntenyView', snapshot)\n }\n}\n", "// src/genes/geneFiles.ts\nvar GENE_TYPE = /(gene|gene_segment|RNA|transcript)$/i;\nvar isGene = (type) => GENE_TYPE.test(type) || type === \"CDS\" || type === \"exon\";\nfunction mergedIntervals(intervals) {\n const out = [];\n for (const iv of [...intervals].sort((a, b) => a.start - b.start)) {\n const last = out.at(-1);\n if (last && iv.start <= last.end) {\n last.end = Math.max(last.end, iv.end);\n } else {\n out.push({ ...iv });\n }\n }\n return out;\n}\nfunction strandOf(s) {\n return s === \"+\" ? 1 : s === \"-\" ? -1 : 0;\n}\nfunction unescape(value) {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\nfunction attributes(column) {\n const out = /* @__PURE__ */ new Map();\n for (const pair of column.split(\";\")) {\n const eq = pair.indexOf(\"=\");\n if (eq > 0) {\n out.set(pair.slice(0, eq).trim(), unescape(pair.slice(eq + 1).trim()));\n }\n }\n return out;\n}\nfunction gff3Row(line) {\n const cols = line.split(\"\t\");\n const start = Number(cols[3]);\n const end = Number(cols[4]);\n if (cols.length < 9 || !Number.isInteger(start) || !Number.isInteger(end)) {\n return void 0;\n }\n return {\n refName: cols[0],\n type: cols[2],\n start: start - 1,\n end,\n strand: strandOf(cols[6]),\n attrs: attributes(cols[8])\n };\n}\nfunction genesFromGff3Lines(lines) {\n const rows = [];\n for (const line of lines) {\n if (line.startsWith(\"##FASTA\")) {\n break;\n }\n const row = line.startsWith(\"#\") ? void 0 : gff3Row(line);\n if (row) {\n rows.push(row);\n }\n }\n const parentOf = /* @__PURE__ */ new Map();\n for (const { attrs } of rows) {\n const id = attrs.get(\"ID\");\n const parent = attrs.get(\"Parent\")?.split(\",\")[0];\n if (id && parent) {\n parentOf.set(id, parent);\n }\n }\n const rootOf = (row) => {\n let id = row.attrs.get(\"Parent\")?.split(\",\")[0] ?? row.attrs.get(\"ID\");\n if (!id) {\n return row.attrs.get(\"gene_id\");\n }\n const seen = /* @__PURE__ */ new Set();\n while (id && parentOf.has(id) && !seen.has(id)) {\n seen.add(id);\n id = parentOf.get(id);\n }\n return id;\n };\n const groups = /* @__PURE__ */ new Map();\n rows.forEach((row, i) => {\n const root = rootOf(row) ?? `#${i}`;\n const key = `${row.refName}\t${root}`;\n const group = groups.get(key) ?? groups.set(key, { rows: [] }).get(key);\n group.rows.push(row);\n if (!row.attrs.has(\"Parent\") && !group.top) {\n group.top = row;\n }\n });\n const genes = [];\n for (const [key, { top, rows: rows2 }] of groups) {\n if (top && !isGene(top.type)) {\n continue;\n }\n const first = top ?? rows2[0];\n const start = top?.start ?? Math.min(...rows2.map((r) => r.start));\n const end = top?.end ?? Math.max(...rows2.map((r) => r.end));\n const a = first.attrs;\n const spans = (type) => rows2.filter((r) => r.type === type).map((r) => ({ start: r.start, end: r.end }));\n const exons = spans(\"exon\");\n const coding = spans(\"CDS\");\n const transcribed = rows2.some(\n (r) => r !== top && r.type !== \"exon\" && r.type !== \"CDS\"\n );\n genes.push({\n name: a.get(\"Name\") ?? a.get(\"gene_name\") ?? a.get(\"gene\") ?? a.get(\"gene_id\") ?? key.split(\"\t\")[1],\n refName: first.refName,\n start,\n end,\n strand: first.strand,\n // A range read holds only the rows over its window, so a gene with\n // transcripts but no exon or CDS there is intronic in it. Only a gene\n // with no transcripts, as a bacterium's gene and CDS, is one exon.\n exons: exons.length ? mergedIntervals(exons) : transcribed ? mergedIntervals(coding) : [{ start, end }]\n });\n }\n return genes;\n}\nfunction mergeOverlappingByName(genes) {\n const out = [];\n const open = /* @__PURE__ */ new Map();\n for (const g of [...genes].sort((a, b) => a.start - b.start)) {\n const key = `${g.refName}\t${g.strand}\t${g.name}`;\n const last = open.get(key);\n if (last && g.start < last.end) {\n last.end = Math.max(last.end, g.end);\n last.exons = mergedIntervals([...last.exons, ...g.exons]);\n } else {\n const gene = { ...g, exons: mergedIntervals(g.exons) };\n out.push(gene);\n open.set(key, gene);\n }\n }\n return out;\n}\nfunction genesFromBed(text) {\n const rows = [];\n for (const line of text.split(\"\\n\")) {\n const cols = line.replace(/\\r$/, \"\").split(\"\t\");\n const start = Number(cols[1]);\n const end = Number(cols[2]);\n if (/^(#|track|browser)/.test(line) || cols.length < 3 || !Number.isInteger(start) || !(end > start)) {\n continue;\n }\n const refName = cols[0];\n const name = cols[3] && cols[3] !== \".\" ? cols[3] : `${refName}:${start + 1}-${end}`;\n const sizes = cols[10]?.split(\",\").filter((s) => s !== \"\").map(Number);\n const starts = cols[11]?.split(\",\").filter((s) => s !== \"\").map(Number);\n const blocks = sizes?.length && sizes.length === starts?.length ? sizes.map((size, i) => ({\n start: start + starts[i],\n end: start + starts[i] + size\n })) : [{ start, end }];\n rows.push({\n name,\n refName,\n start,\n end,\n strand: strandOf(cols[5]),\n exons: blocks\n });\n }\n return mergeOverlappingByName(rows);\n}\nfunction sniffedFormat(text) {\n const first = text.split(\"\\n\", 1e3).find((l) => l.trim() !== \"\" && !/^(#|track|browser)/.test(l));\n const cols = first?.split(\"\t\") ?? [];\n return /^\\d+$/.test(cols[1] ?? \"\") && /^\\d+$/.test(cols[2] ?? \"\") ? \"bed\" : \"gff3\";\n}\nfunction genesFromText(text, format = sniffedFormat(text)) {\n return format === \"bed\" ? genesFromBed(text) : genesFromGff3Lines(text.split(/\\r?\\n/));\n}\n\nexport {\n mergedIntervals,\n genesFromGff3Lines,\n mergeOverlappingByName,\n genesFromBed,\n genesFromText\n};\n", "import type { Feature } from '@jbrowse/core/util'\n\nexport type FeatureLike = Feature | Record<string, unknown>\n\nexport function ownField(f: FeatureLike, name: string): unknown {\n return typeof (f as Feature).get === 'function'\n ? (f as Feature).get(name)\n : (f as Record<string, unknown>)[name]\n}\n\nexport interface TrackChoice {\n trackId: string\n name?: string\n adapterType: string\n}\n\nexport function namedTrack<T extends TrackChoice>(tracks: T[], named: string) {\n return tracks.find(t => t.trackId === named)\n}\n\n// what a track-name hint such as /repeat|tandem/ is matched against\nexport function trackLabel(t: TrackChoice) {\n return `${t.trackId} ${t.name ?? ''}`\n}\n", "import { namedTrack, ownField, trackLabel } from '../trackFeatures'\n\nimport type { FeatureLike, TrackChoice } from '../trackFeatures'\n\nexport interface RepeatCall {\n bp: number\n // TRGT's `SD`. Zero means the allele is a copy of the one the reads did\n // support, so its length states nothing about a second haplotype; absent\n // where the genotyper writes no such field.\n spanningReads?: number\n // the PanSN haplotype a phased genotype puts this allele on\n haplotype?: number\n}\n\n// A tandem repeat array as the walk rows need it: its span on the reference,\n// which is what the bars measure between, and its unit length, which is what\n// they tile by. Read off whatever repeat annotation the session has, since the\n// tools all state the same two facts under different names: VCF 4.5's\n// `<CNV:TR>` allele gives `RUL` and `RUS` (one entry per repeat sequence,\n// grouped by `RN`), UCSC simpleRepeat and TRF give `period` and the consensus\n// `sequence`, TRGT gives `MOTIFS` and `TRID`, ExpansionHunter `RU` and `REPID`,\n// HipSTR and GangSTR `PERIOD`, vamos its `motifs`. A VCF record's INFO is\n// searched as well as its top level, and a list's first entry is the unit the\n// bars tile by: for a compound array that is the first repeat sequence, which\n// is the expanding one at every such locus in the common catalogues.\nexport interface RepeatArray {\n key: string\n name: string\n refName: string\n start: number\n end: number\n unit: number\n motif?: string\n // Each sample's genotyped alleles, from a genotyper's per-sample `AL`\n // (TRGT) or a genotype over VCF 4.5 <CNV:TR> alleles; absent from a\n // catalogue.\n calls?: Record<string, RepeatCall[]>\n}\n\nexport const REPEAT_ADAPTER_TYPES = new Set([\n 'BedAdapter',\n 'BedTabixAdapter',\n 'BigBedAdapter',\n 'VcfAdapter',\n 'VcfTabixAdapter',\n])\n\nexport const REPEAT_TRACK_HINT =\n /repeat|tandem|\\bstr\\b|vntr|trf|trgt|vamos|expansion|microsat/i\n\nexport function pickRepeatTrack<T extends TrackChoice>(\n tracks: T[],\n named: string,\n) {\n if (named) {\n return namedTrack(tracks, named)\n }\n const candidates = tracks.filter(t => REPEAT_ADAPTER_TYPES.has(t.adapterType))\n return candidates.find(t => REPEAT_TRACK_HINT.test(trackLabel(t)))\n}\n\n// A TRGT repeat catalogue is a BED whose name column packs the record:\n// `ID=HTT;MOTIFS=CAG,CCG;STRUC=(CAG)nCAACAG(CCG)n`. Read as fields when it\n// has that shape.\nconst PACKED_NAME = /^\\w+=[^;]*(;\\w+=[^;]*)*$/\n\nfunction packedName(f: FeatureLike) {\n const name = ownField(f, 'name')\n if (typeof name !== 'string' || !PACKED_NAME.test(name)) {\n return undefined\n }\n return Object.fromEntries(\n name.split(';').map(pair => {\n const i = pair.indexOf('=')\n return [pair.slice(0, i), pair.slice(i + 1)]\n }),\n )\n}\n\n// A field at the feature's top level, in a VCF record's INFO, or in a packed\n// name column, in that order.\nfunction field(f: FeatureLike, name: string): unknown {\n const top = ownField(f, name)\n if (top !== undefined) {\n return top\n }\n const info = ownField(f, 'INFO') as Record<string, unknown> | undefined\n return info?.[name] ?? packedName(f)?.[name]\n}\n\nconst MOTIF_FIELDS = [\n 'RUS',\n 'MOTIFS',\n 'RU',\n 'motifs',\n 'motif',\n 'sequence',\n 'consensus',\n]\nconst PERIOD_FIELDS = [\n 'RUL',\n 'period',\n 'PERIOD',\n 'consensusSize',\n 'unit',\n 'unitLength',\n]\nconst NAME_FIELDS = ['TRID', 'REPID', 'VARID', 'ID', 'name', 'id']\n\n// The first entry of a list-valued field, whether it arrived parsed or as\n// the comma-joined text a VCF INFO or a BED column holds; VCF's missing \".\"\n// counts as absent.\nfunction first(f: FeatureLike, names: string[]) {\n for (const name of names) {\n const value = field(f, name)\n const one = String((Array.isArray(value) ? value[0] : value) ?? '')\n .split(',')[0]!\n .trim()\n if (one !== '' && one !== '.') {\n return one\n }\n }\n return undefined\n}\n\nconst IUPAC = /^[ACGTURYSWKMBDHVN]+$/i\n\n// The unit in bp: a stated period, else the length of the first motif.\nexport function repeatUnitOf(f: FeatureLike) {\n const period = Number(first(f, PERIOD_FIELDS))\n if (Number.isFinite(period) && period > 0) {\n return Math.round(period)\n }\n const motif = first(f, MOTIF_FIELDS)\n return motif && IUPAC.test(motif) ? motif.length : undefined\n}\n\n// A per-sample list field, parsed or as the comma-joined text a VCF column\n// holds. A missing entry stays missing: read as 0, an absent `SD` would make\n// every allele of every genotyper that writes no such field unspanned.\nfunction numbers(value: unknown) {\n const raw: unknown[] = Array.isArray(value)\n ? value\n : String(value ?? '').split(',')\n return raw.map(one => {\n const n =\n one === '' || one === null || one === undefined ? NaN : Number(one)\n return Number.isFinite(n) ? n : undefined\n })\n}\n\nfunction strings(value: unknown) {\n const raw: unknown[] = Array.isArray(value)\n ? value\n : String(value ?? '').split(',')\n return raw.map(one => {\n const text = String(one ?? '').trim()\n return text === '' || text === '.' ? undefined : text\n })\n}\n\nconst TANDEM_REPEAT = '<CNV:TR>'\n\n// Each ALT allele's length, off VCF 4.5's flattened list-of-lists: RN says how\n// many RUS/RUL/RUC/RB entries each allele takes, and the allele's bases are\n// its runs' RB, or unit length times count where RB is missing. An allele that\n// is not <CNV:TR>, or has a run stating neither, has none.\nfunction tandemAlleleBp(f: FeatureLike) {\n const alts = strings(ownField(f, 'ALT'))\n if (!alts.includes(TANDEM_REPEAT)) {\n return undefined\n }\n const rn = numbers(field(f, 'RN'))\n const rus = strings(field(f, 'RUS'))\n const rul = numbers(field(f, 'RUL'))\n const ruc = numbers(field(f, 'RUC'))\n const rb = numbers(field(f, 'RB'))\n let k = 0\n return alts.map((alt, i) => {\n const n = rn[i] ?? (alt === TANDEM_REPEAT ? 1 : 0)\n let bp = 0\n let known = 0\n for (let j = 0; j < n; j++, k++) {\n const motif = rus[k]\n const unitLength =\n rul[k] ?? (motif && IUPAC.test(motif) ? motif.length : undefined)\n const count = ruc[k]\n const runBp =\n rb[k] ??\n (unitLength && count !== undefined\n ? Math.round(unitLength * count)\n : undefined)\n if (runBp !== undefined) {\n bp += runBp\n known++\n }\n }\n return alt === TANDEM_REPEAT && n > 0 && known === n ? bp : undefined\n })\n}\n\n// A sample's alleles through its genotype: 0 is the reference's, an index\n// past it the ALT allele's. A phased genotype's k-th allele is PanSN\n// haplotype k, the order vg deconstruct writes an assembly's haplotypes in.\nfunction genotyped(\n gt: string | undefined,\n alleleBp: (number | undefined)[],\n referenceBp: number,\n) {\n const phased = gt?.includes('|')\n return (gt ?? '').split(/[/|]/).flatMap((index, k): RepeatCall[] => {\n const i = index === '' ? NaN : Number(index)\n const bp = i > 0 ? alleleBp[i - 1] : referenceBp\n if (!Number.isInteger(i) || bp === undefined) {\n return []\n }\n return [{ bp, ...(phased ? { haplotype: k + 1 } : {}) }]\n })\n}\n\nfunction callsOf(\n f: FeatureLike,\n alleleBp: (number | undefined)[] | undefined,\n referenceBp: number,\n) {\n const samples = ownField(f, 'samples') as\n Record<string, Record<string, unknown>> | undefined\n const called: Record<string, RepeatCall[]> = {}\n for (const [sample, fields] of Object.entries(samples ?? {})) {\n const reads = numbers(fields.SD)\n const lengths = numbers(fields.AL).flatMap((bp, i) =>\n bp !== undefined && bp > 0\n ? [reads[i] === undefined ? { bp } : { bp, spanningReads: reads[i] }]\n : [],\n )\n const calls =\n lengths.length > 0 || !alleleBp\n ? lengths\n : genotyped(strings(fields.GT)[0], alleleBp, referenceBp)\n if (calls.length > 0) {\n called[sample] = calls\n }\n }\n return Object.keys(called).length > 0 ? called : undefined\n}\n\n// A <CNV:TR> record's POS is the base before the array and SVLEN the\n// reference allele's length, while a VCF feature starts at that padding base.\nfunction spanOf(f: FeatureLike, tandem: boolean) {\n const start = field(f, 'start') as number\n const end = field(f, 'end') as number\n const svlen = numbers(field(f, 'SVLEN'))[0]\n return tandem && svlen !== undefined\n ? { start: start + 1, end: start + 1 + svlen }\n : { start, end }\n}\n\nexport function repeatArraysFrom(features: FeatureLike[]): RepeatArray[] {\n const arrays: RepeatArray[] = []\n for (const f of features) {\n const alleleBp = tandemAlleleBp(f)\n const { start, end } = spanOf(f, alleleBp !== undefined)\n const unit = repeatUnitOf(f)\n if (!(end > start) || unit === undefined) {\n continue\n }\n const refName = field(f, 'refName') as string\n const motif = first(f, MOTIF_FIELDS)\n const stated = first(f, NAME_FIELDS)\n arrays.push({\n key: `${refName}:${start}-${end}`,\n name:\n (stated && !PACKED_NAME.test(stated) ? stated : undefined) ??\n (motif && motif.length <= 12\n ? `(${motif})n`\n : `${refName}:${(start + 1).toLocaleString('en-US')}-${end.toLocaleString('en-US')}`),\n refName,\n start,\n end,\n unit,\n motif,\n calls: callsOf(f, alleleBp, end - start),\n })\n }\n return arrays.sort((a, b) => a.start - b.start)\n}\n", "import {\n mergeOverlappingByName,\n mergedIntervals,\n} from '@jbrowse/bandage-core/genes/geneFiles'\nimport { readConfObject } from '@jbrowse/core/configuration'\n\nimport { REPEAT_TRACK_HINT } from '../repeats/repeatFeatures'\nimport { namedTrack, ownField, trackLabel } from '../trackFeatures'\n\nimport type { FeatureLike, TrackChoice } from '../trackFeatures'\nimport type { GeneModel } from '@jbrowse/bandage-core/genes/genePins'\nimport type { AnyConfigurationModel } from '@jbrowse/core/configuration'\n\n// The adapters whose tracks hold gene models, in the order the session's\n// tracks are searched when no track is named.\nexport const GENE_ADAPTER_TYPES = new Set([\n 'Gff3TabixAdapter',\n 'Gff3Adapter',\n 'BedTabixAdapter',\n 'BedAdapter',\n 'GtfTabixAdapter',\n 'GtfAdapter',\n 'BigBedAdapter',\n 'NCListAdapter',\n])\n\nconst GENE_TRACK_HINT = /gene|refseq|gencode|ensembl|annotation/i\n\n// A BED track is as often peaks or repeats as genes, so one counts only where\n// its name says it is annotation\nconst BED_ADAPTER_TYPES = new Set(['BedTabixAdapter', 'BedAdapter'])\n\n// Which of the session's tracks to read genes from: the named one, else the\n// first gene-bearing track on the assembly whose name says it is annotation,\n// else the first non-BED gene-bearing track. A track whose name says repeats is\n// never picked unnamed, as \"RepeatMasker annotation\" would be.\nexport function pickGeneTrack<T extends TrackChoice>(\n tracks: T[],\n named: string,\n) {\n if (named) {\n return namedTrack(tracks, named)\n }\n const candidates = tracks.filter(\n t =>\n GENE_ADAPTER_TYPES.has(t.adapterType) &&\n !REPEAT_TRACK_HINT.test(trackLabel(t)),\n )\n return (\n candidates.find(t => GENE_TRACK_HINT.test(trackLabel(t))) ??\n candidates.find(t => !BED_ADAPTER_TYPES.has(t.adapterType))\n )\n}\n\ninterface LaneView {\n tracks?: readonly {\n configuration: AnyConfigurationModel\n displays: readonly { configuration: AnyConfigurationModel }[]\n }[]\n}\n\n// The `filter` of the gene track's lane in the view the graph is drawn in, so\n// the chips name what the lane draws. None where the view shows no such lane,\n// or has no tracks, as a graph genome view of its own.\nexport function laneFilters(view: object, trackId: string | undefined) {\n const lane = (view as LaneView).tracks?.find(\n t => readConfObject(t.configuration, 'trackId') === trackId,\n )?.displays[0]\n return lane\n ? ((readConfObject(lane.configuration, 'filter') as string[] | undefined) ??\n [])\n : []\n}\n\n// Records spanning a whole sequence, the types the GFF3 adapter declines to\n// widen a fetch for. RefSeq opens every molecule with a `region` named\n// ANONYMOUS.\nconst WHOLE_SEQUENCE_TYPES = new Set([\n 'chromosome',\n 'region',\n 'contig',\n 'supercontig',\n 'scaffold',\n])\n\n// JBrowse's BED parser splits a coding BED12 block into CDS and UTR parts and\n// keeps `exon` for non-coding ones, so all of them are exon\nconst EXON_PARTS = new Set([\n 'exon',\n 'CDS',\n 'five_prime_UTR',\n 'three_prime_UTR',\n 'UTR',\n])\n\nfunction exonsOf(f: FeatureLike, into: { start: number; end: number }[]) {\n const type = ownField(f, 'type')\n if (typeof type === 'string' && EXON_PARTS.has(type)) {\n into.push({\n start: ownField(f, 'start') as number,\n end: ownField(f, 'end') as number,\n })\n }\n const children = ownField(f, 'subfeatures') as FeatureLike[] | undefined\n for (const child of children ?? []) {\n exonsOf(child, into)\n }\n}\n\n// Genes from a track's features: every top-level feature but a whole-sequence\n// record, named by the first of gene_name, name, gene and gene_id it carries,\n// with the exons found anywhere under it merged. A feature with no exons is one exon,\n// its whole span. A BED track gives one feature per transcript, so a name's\n// overlapping features merge, while its copies down the contig stay apart.\n// UCSC's ncbiRefSeq.gff gene records carry their symbol only as gene_id. A\n// feature with none of those names is left out: its raw ID, RefSeq's\n// `id-NC_000913.3:1978503..1979270`, only restates where it is.\nexport function geneModelsFrom(features: FeatureLike[]): GeneModel[] {\n const genes: GeneModel[] = []\n for (const f of features) {\n const name =\n (ownField(f, 'gene_name') as string | undefined) ??\n (ownField(f, 'name') as string | undefined) ??\n (ownField(f, 'gene') as string | undefined) ??\n (ownField(f, 'gene_id') as string | undefined)\n const start = ownField(f, 'start') as number\n const end = ownField(f, 'end') as number\n if (\n !name ||\n !(end > start) ||\n WHOLE_SEQUENCE_TYPES.has(ownField(f, 'type') as string)\n ) {\n continue\n }\n const exons: { start: number; end: number }[] = []\n exonsOf(f, exons)\n genes.push({\n name,\n refName: ownField(f, 'refName') as string,\n start,\n end,\n strand: (ownField(f, 'strand') as number | undefined) ?? 0,\n exons: exons.length ? mergedIntervals(exons) : [{ start, end }],\n })\n }\n return mergeOverlappingByName(genes)\n}\n", "import { isRecord } from '../isRecord'\n\n// What a drawing adds over its nodes and edges:\n// - `paths`: a ribbon per walk\n// - `bubbles`: a halo along each bubble's nodes, with a label that opens it.\n// Off by default, since on a base-level cut every SNP's halo is a blob\n// - `deletions`: an edge for each walk that skips reference\n// - `genes`: the session's genes, exons along the nodes that carry them\n// - `referenceStrip`: reference segments at their bp, over a drawing in its\n// own coordinates inside a linear view\n// - `walkStrip`: walk rows under a node layout, linked to the drawing\nexport type GraphLayer =\n 'paths' | 'bubbles' | 'deletions' | 'genes' | 'referenceStrip' | 'walkStrip'\n\nconst DEFAULTS: Record<GraphLayer, boolean> = {\n paths: false,\n bubbles: false,\n deletions: true,\n genes: true,\n referenceStrip: true,\n walkStrip: false,\n}\n\n// A config or session states only what differs from the defaults, as\n// `{ bubbles: true, genes: false }`, so a default a later release adds still\n// reaches it\nexport type GraphLayers = Partial<Record<GraphLayer, boolean>>\n\nexport function layersOf(layers: unknown) {\n const stated = (isRecord(layers) ? layers : {}) as GraphLayers\n return new Set(\n (Object.keys(DEFAULTS) as GraphLayer[]).filter(\n layer => stated[layer] ?? DEFAULTS[layer],\n ),\n )\n}\n\nexport function withLayer(layers: unknown, layer: GraphLayer, on: boolean) {\n const { [layer]: _was, ...rest } = (\n isRecord(layers) ? layers : {}\n ) as GraphLayers\n return on === DEFAULTS[layer] ? rest : { ...rest, [layer]: on }\n}\n", "import { isRecord } from '../isRecord'\n\nimport type { ColorScheme } from '@jbrowse/bandage-core/colorSchemes'\n\ninterface Span {\n start: number\n end: number\n}\n\n// The node color as a config or session writes it, in core's color-object\n// members (ADR-131, ADR-151): a named constant, or the field the nodes are\n// colored by. `{}` or unset picks by the graph, reference position on an\n// anchored one. Translated here because Bandage's painter takes its own\n// schemes, which BandageJS shares.\nexport type NodeColor =\n | 'grey'\n | 'uniform'\n | {\n field?: 'depth' | 'length' | 'rank' | 'position' | 'id'\n scale?: 'categorical'\n scheme?: 'rainbow'\n domainMin?: number\n domainMax?: number\n }\n\nconst SCHEME_OF_FIELD = {\n depth: 'depth',\n length: 'node-length',\n rank: 'stable-rank',\n position: 'reference-position',\n} as const\n\nconst FIELD_OF_SCHEME = Object.fromEntries(\n Object.entries(SCHEME_OF_FIELD).map(([field, scheme]) => [scheme, field]),\n) as Record<string, keyof typeof SCHEME_OF_FIELD>\n\nexport function schemeOfColor(color: unknown): ColorScheme {\n if (color === 'grey' || color === 'uniform') {\n return color\n }\n if (isRecord(color)) {\n const { field, scheme } = color\n if (field === 'id') {\n return scheme === 'rainbow' ? 'rainbow' : 'random'\n }\n if (typeof field === 'string' && field in SCHEME_OF_FIELD) {\n return SCHEME_OF_FIELD[field as keyof typeof SCHEME_OF_FIELD]\n }\n }\n return 'auto'\n}\n\nexport function domainOfColor(color: unknown): Span | undefined {\n return isRecord(color) &&\n typeof color.domainMin === 'number' &&\n typeof color.domainMax === 'number'\n ? { start: color.domainMin, end: color.domainMax }\n : undefined\n}\n\nexport function colorOfScheme(scheme: ColorScheme, domain?: Span): NodeColor {\n if (scheme === 'grey' || scheme === 'uniform') {\n return scheme\n }\n return scheme === 'random'\n ? { field: 'id', scale: 'categorical' }\n : scheme === 'rainbow'\n ? { field: 'id', scheme: 'rainbow' }\n : scheme === 'reference-position' && domain\n ? {\n field: 'position',\n domainMin: domain.start,\n domainMax: domain.end,\n }\n : FIELD_OF_SCHEME[scheme]\n ? { field: FIELD_OF_SCHEME[scheme] }\n : {}\n}\n", "import { isRecord } from '../isRecord'\n\nimport type { NodeWidth } from '@jbrowse/bandage-core/nodeWidths'\n\n// The node thickness as a config or session writes it: a px number draws every\n// node that thick; `{ field: 'depth', value }` thickens a node the more paths\n// carry it, around `value` px. Unset is by depth around 6.\nexport type NodeSize = number | { field?: 'depth'; value?: number }\n\nconst DEFAULT_PX = 6\n\nexport function nodeSizeOf(size: unknown): { width: NodeWidth; px: number } {\n return typeof size === 'number'\n ? { width: 'uniform', px: size }\n : isRecord(size)\n ? {\n width: size.field === 'depth' ? 'depth' : 'uniform',\n px: typeof size.value === 'number' ? size.value : DEFAULT_PX,\n }\n : { width: 'depth', px: DEFAULT_PX }\n}\n\nexport function sizeOfNodeWidth(width: NodeWidth, px: number): NodeSize {\n return width === 'depth' ? { field: 'depth', value: px } : px\n}\n", "import { bubbleHalos } from '@jbrowse/bandage-core/bubbles/bubbleHalos'\nimport { bubbleKey, sameBubble } from '@jbrowse/bandage-core/bubbles/bubbleLine'\nimport { bubbleSegmentIds } from '@jbrowse/bandage-core/bubbles/classifyBubble'\nimport { bubbleSubgraph } from '@jbrowse/bandage-core/bubbles/popBubble'\nimport { graphBubbles } from '@jbrowse/bandage-core/bubbles/superbubbles'\nimport { resolveColorScheme } from '@jbrowse/bandage-core/colorSchemes'\nimport {\n deletionDrawing,\n deletionEdges,\n} from '@jbrowse/bandage-core/deletionEdges'\nimport { facetSettingOf } from '@jbrowse/bandage-core/facetGrid'\nimport { genePins } from '@jbrowse/bandage-core/genes/genePins'\nimport { formatBp } from '@jbrowse/bandage-core/graphLabels'\nimport { filterSamples, walkRows } from '@jbrowse/bandage-core/layout/walkRows'\nimport {\n layoutModeByValue,\n modeUsesLayoutEngine,\n} from '@jbrowse/bandage-core/layoutModes'\nimport { nodeInk } from '@jbrowse/bandage-core/nodeWidths'\nimport { pathOrigin } from '@jbrowse/bandage-core/pathAnchoring'\nimport {\n pathColorsLegible,\n pathLegend,\n walkLabelsOf,\n} from '@jbrowse/bandage-core/pathColors'\nimport {\n backboneAssembly,\n featuresOnBackbone,\n graphBackbone,\n} from '@jbrowse/bandage-core/reference'\nimport {\n buildNeighbors,\n nodeReferenceSpan,\n} from '@jbrowse/bandage-core/referenceSpan'\nimport {\n LIFT_BACKDROP_CSS,\n computeReferenceRamp,\n} from '@jbrowse/bandage-core/renderer/GeometryBuilder'\nimport { tubeMapNodeColors } from '@jbrowse/bandage-core/tubeMap/nodeColors'\nimport { axisScaleOf } from '@jbrowse/bandage-core/viewport'\nimport { NO_VALUE_COLOR } from '@jbrowse/bandage-core/walkEncoding'\nimport { facetLifts, walkLift } from '@jbrowse/bandage-core/walkHighlight'\nimport { readConfObject } from '@jbrowse/core/configuration'\nimport SerializableFilterChain from '@jbrowse/core/pluggableElementTypes/renderers/util/serializableFilterChain'\nimport {\n getContainingTrack,\n getContainingView,\n getEnv,\n getSession,\n} from '@jbrowse/core/util'\nimport { computed } from 'mobx'\n\nimport { TUBE_MAP_MODES, dependOn, geometryPainted, paneBase } from './paneBase'\nimport { walkRowRuns, walkRowsOf } from '../../RgfaTabixAdapter/walkRowRuns.ts'\nimport {\n canonicalAssemblyName,\n trackAssemblies,\n} from '../../launchFromGraph/launchFromGraph'\nimport { locationIsSet } from '../../locationName.ts'\nimport { trackAdapterConfig } from '../../panSNAliases/trackAdapterConfig'\nimport {\n GENE_ADAPTER_TYPES,\n geneModelsFrom,\n laneFilters,\n pickGeneTrack,\n} from '../genes/geneFeatures'\nimport { layersOf } from '../graphLayers'\nimport { domainOfColor, schemeOfColor } from '../nodeColor'\nimport { nodeSizeOf } from '../nodeSize'\nimport {\n REPEAT_ADAPTER_TYPES,\n pickRepeatTrack,\n} from '../repeats/repeatFeatures'\nimport { withCalls } from '../repeats/walkCalls'\nimport {\n TINTED_TUBES,\n columnKeyOf,\n roleTubeColors,\n valueTubeColors,\n valueTubePalette,\n} from '../tubeMapPanels'\nimport { groupByOf, groupWalkRows, metadataColumns } from '../walkRowGroups'\n\nimport type { ScreenTransform } from './keepInView'\nimport type { WalkCut } from '../../RgfaTabixAdapter/walkRowRuns.ts'\nimport type { GraphLayers } from '../graphLayers'\nimport type { HoverHighlight } from '../hoverHighlight'\nimport type { NodeColor } from '../nodeColor'\nimport type { NodeSize } from '../nodeSize'\nimport type { TubeMapPanelSplit } from '../tubeMapPanels'\nimport type { WalkRowGroupBy } from '../walkRowGroups'\nimport type { MinigraphBubble } from '@jbrowse/bandage-core/bubbles/bubbleLine'\nimport type {\n ColorScheme,\n ResolvedColorScheme,\n} from '@jbrowse/bandage-core/colorSchemes'\nimport type { FacetInput, FacetSetting } from '@jbrowse/bandage-core/facetGrid'\nimport type { LayoutModeValue } from '@jbrowse/bandage-core/layoutModes'\nimport type { NodeWidth } from '@jbrowse/bandage-core/nodeWidths'\nimport type { AssemblyNames } from '@jbrowse/bandage-core/reference'\nimport type { Graph, GraphNode } from '@jbrowse/bandage-core/types'\nimport type { NodeInk } from '@jbrowse/bandage-core/util/hitDetection'\nimport type { WalkLayer } from '@jbrowse/bandage-core/walkEncoding'\nimport type { WalkLift } from '@jbrowse/bandage-core/walkHighlight'\nimport type { AnyConfigurationModel } from '@jbrowse/core/configuration'\nimport type { FileLocation } from '@jbrowse/core/util/types'\n\n// A repeat pick slices the cut's walks again, by the repeat's own array\nfunction walkRowsFromCut(\n cut: WalkCut,\n region: { start: number; end: number },\n unit?: number,\n) {\n const runs = walkRowRuns(cut, region)\n return runs ? walkRowsOf(runs, unit) : undefined\n}\n\n// undefined for a pane outside any track or view, as a test makes one\nfunction orUndefined<T>(get: () => T) {\n try {\n return get()\n } catch {\n return undefined\n }\n}\n\nfunction nodeMapOf(graph: Graph) {\n const m = new Map<string, GraphNode>()\n for (const n of graph.nodes) {\n m.set(n.id, n)\n }\n return m\n}\n\n// A node's reference interval, an allele's between its flanks\nfunction spanIn(\n nodeId: string,\n nodeById: Map<string, GraphNode> | undefined,\n neighbors: ReturnType<typeof buildNeighbors> | undefined,\n) {\n return nodeById && neighbors\n ? nodeReferenceSpan({ nodeId, nodeById, neighbors })\n : undefined\n}\n\n// The layout, node color and hover as a host stores them: a view of its own\n// as props, a track display in its config\nexport interface GraphGrammar {\n layoutMode?: LayoutModeValue\n color?: NodeColor\n size?: NodeSize\n layers?: GraphLayers\n facet?: FacetInput\n rows?: GraphRows\n hover?: HoverHighlight\n}\n\ntype TubeColorKind = 'value' | 'tinted' | 'role' | 'path'\n\n// The rows walk rows draw: `kept` names the samples whose walks show, by the\n// name before the haplotype number; unset shows every walk the cut holds\nexport interface GraphRows {\n kept?: string[]\n}\n\nexport const withGraphViews = paneBase\n .views(self => ({\n get grammar(): GraphGrammar {\n return {}\n },\n // a source declared but not yet loaded\n get hasPendingSource() {\n return false\n },\n get canRetryLoad() {\n return false\n },\n // the track the graph is cut from: the one the pane is a display of\n get sourceTrack(): AnyConfigurationModel | undefined {\n return orUndefined(() => getContainingTrack(self).configuration)\n },\n get containingView(): object | undefined {\n return orUndefined(() => getContainingView(self))\n },\n }))\n .views(self => {\n // `grammar` is a new object whenever any setting changes, so what is\n // derived as an object compares by value, or a hover toggle would\n // recompute the reference ramp and regroup the walk rows\n const byValue = <T>(derive: () => T) =>\n computed(derive, {\n equals: (a, b) => JSON.stringify(a) === JSON.stringify(b),\n })\n const colorDomain = byValue(() => domainOfColor(self.grammar.color))\n const facet = byValue(() => facetSettingOf(self.grammar.facet))\n const groupBy = byValue(() => {\n const g = groupByOf(self.grammar.facet)\n return g && g.field !== 'walk' && g.field !== 'sample' ? g : undefined\n })\n return {\n get chosenLayoutMode(): LayoutModeValue {\n return self.grammar.layoutMode ?? 'force'\n },\n get chosenColorScheme(): ColorScheme {\n return schemeOfColor(self.grammar.color)\n },\n // the reference span the reference-position ramp runs over, for a graph\n // with no region of its own to span it\n get statedColorDomain() {\n return colorDomain.get()\n },\n get chosenHover(): HoverHighlight {\n return self.grammar.hover ?? 'nodes'\n },\n // Node thickness by depth, Bandage's own device; see NODE_WIDTHS\n get nodeWidth(): NodeWidth {\n return nodeSizeOf(self.grammar.size).width\n },\n get contigThickness() {\n return nodeSizeOf(self.grammar.size).px\n },\n get layerSet() {\n return layersOf(self.grammar.layers)\n },\n get drawPaths() {\n return this.layerSet.has('paths')\n },\n get showBubbles() {\n return this.layerSet.has('bubbles')\n },\n get showDeletionEdges() {\n return this.layerSet.has('deletions')\n },\n get showGenes() {\n return this.layerSet.has('genes')\n },\n get showReferenceStrip() {\n return this.layerSet.has('referenceStrip')\n },\n get walkStrip() {\n return this.layerSet.has('walkStrip')\n },\n // One section per value of a field, as a grammar of graphics splits a\n // plot. A node layout draws a panel per `walk` (each lifted walk alone,\n // on the same layout) or per `sample` (a sample's haplotypes in a row);\n // `domain` orders the panels and `columns` fixes how many go across.\n // See facetPanels and facetCells.\n get facetSetting(): FacetSetting {\n return facet.get()\n },\n // Walk rows stack into a section per value of a sample table column,\n // read from the source track's samplesTsvLocation\n get walkRowGroupBy(): WalkRowGroupBy | undefined {\n return groupBy.get()\n },\n get walkRowSamples() {\n const kept = self.grammar.rows?.kept\n return Array.isArray(kept) ? kept : undefined\n },\n get hoverLightsEverything() {\n return this.chosenHover === 'everything'\n },\n // the hovered node, where hovering is to light it\n get litNode() {\n return this.chosenHover === 'off' ? null : self.hoveredNode\n },\n }\n })\n .views(self => ({\n get paneWidth() {\n return getContainingView(self).width\n },\n // a linear view knows its width before its tracks draw\n get paneMeasured() {\n return true\n },\n // The graph the drawing's node ids address: a tube map's, which is the\n // window it drew with each merged run one node, the cut otherwise. Hover,\n // details and labels read it, so a box reports its own span and length.\n get drawnGraph() {\n return self.layoutResult?.tubeMap?.graph ?? self.graph\n },\n }))\n .views(self => ({\n get nodeById() {\n return self.drawnGraph && nodeMapOf(self.drawnGraph)\n },\n // bp per node id, which is all the label overlay needs of a GraphNode.\n // Held here rather than rebuilt in the component: that render runs on\n // every pan, and the map is a fact about the graph (measured 6.9 ms an\n // allocation on a 30k-node cut).\n get nodeLengths() {\n const m = new Map<string, number>()\n for (const n of self.drawnGraph?.nodes ?? []) {\n m.set(n.id, n.length)\n }\n return m\n },\n get nodeCount() {\n return self.graph?.nodes.length ?? 0\n },\n get edgeCount() {\n return self.graph?.edges.length ?? 0\n },\n get pathCount() {\n return self.graph?.paths?.length ?? 0\n },\n get hasGraph() {\n return self.graph !== undefined\n },\n get geometryPainted() {\n return geometryPainted(self)\n },\n // The app-wide readiness contract (AppReadyMarker, @jbrowse/capture)\n // reads this: a declared source still fetching, or a graph whose\n // settled geometry is not on the canvas yet.\n get showLoading() {\n return (\n self.error === undefined &&\n (self.isLoading ||\n self.hasPendingSource ||\n (self.graph !== undefined && !this.geometryPainted))\n )\n },\n // Only before anything is drawn: past that point a reload is superseded\n // by the next setting change, and stopping one midway would leave a new\n // graph under the previous graph's layout.\n get canCancelLoad() {\n return self.isLoading && !self.layoutResult\n },\n // Whether the drawing on screen is the FMMM engine's. False before there\n // is a graph, since nothing is drawn by anything yet.\n //\n // Read by the settings that only the engine looks at: the layout quality\n // and the bubble spread do nothing at all to an anchored drawing, which\n // places a node from its coordinates, and the guide says so in prose\n // precisely because the dialog did not. A control that silently does\n // nothing is worse than one that says it cannot \u2014 the same rule the\n // `drawPaths` switch already follows.\n get usesLayoutEngine() {\n return self.graph\n ? modeUsesLayoutEngine(self.chosenLayoutMode, self.graph)\n : false\n },\n // The paths this graph could be anchored on, for the picker. Empty for an\n // rGFA, which has no P/W records and needs none.\n get anchorPaths() {\n return self.graph?.anchorPaths ?? []\n },\n // Every walk the graph carries, named for a picker, whatever the count.\n get walkChoices() {\n const paths = self.graph?.paths\n return paths?.length ? pathLegend(paths) : []\n },\n // Whether the drawing is actually painted per path, which is not the same\n // question as whether the user asked for it: past MAX_PATH_COLORS the\n // colours say nothing and cost a stroke per path per edge. A bare getter\n // returning a resolved value, the same shape and for the same reason as\n // `effectiveColorScheme` \u2014 every consumer of a path colour reads this\n // one, so the geometry, the hit index and the key cannot disagree about\n // whether there are any. The switch in the settings dialog reads the raw\n // `drawPaths`, so the user's choice stays visible as the choice it is.\n get effectiveDrawPaths() {\n return self.drawPaths && pathColorsLegible(self.graph?.paths?.length ?? 0)\n },\n // The path x is currently drawn on, which is not necessarily the one\n // `referencePath` asked for: an unmatched name falls back rather than\n // leaving the graph unanchored, and the picker has to show what happened.\n get activeReferencePath() {\n return self.graph?.referencePath\n },\n // An open bubble on the reference spans the ramp, so its own nodes take\n // every hue while the rest is grey. Undefined for a graph with neither,\n // where the ramp spans the drawn extent (computeReferenceRamp)\n get rampDomain() {\n const open = self.openBubbles.at(-1)\n return open && !open.offReference && open.end > open.start\n ? { start: open.start, end: open.end }\n : (self.statedColorDomain ?? self.graphRegion)\n },\n // Every node's midpoint on the reference plus the interval the hue ramps\n // over, on the drawn graph, whose ids a folded tube map's boxes carry.\n // Deriving it is a bounded neighbour walk per node (referenceMidpoints):\n // 1.6 ms at 1.5k nodes, 45 ms at 30k. It depends on nothing the\n // transform touches, so a pan or drag frame reuses it, and the nodes and\n // the lanes share it. Read only behind walkRamp's and referenceRamp's\n // gates, so a colouring that ignores it never runs the walk.\n get drawnReferenceRamp() {\n const graph = self.drawnGraph\n return graph ? computeReferenceRamp(graph, this.rampDomain) : undefined\n },\n // the ramp a lane coloured by reference position reads\n get walkRamp() {\n return self.walkLayers.some(layer => layer.color?.field === 'reference')\n ? this.drawnReferenceRamp\n : undefined\n },\n // Whether the chosen layout draws the graph's nodes, which a facet\n // splits and a hovered lane row's walk is lifted over\n get modeDrawsNodes() {\n return layoutModeByValue(self.chosenLayoutMode).drawsNodes\n },\n // The walks picked, or while none is, those of the lane row hovered\n get liftedWalkLayers(): WalkLayer[] {\n return self.walkLayers.length > 0 || !this.modeDrawsNodes\n ? self.walkLayers\n : self.hoveredRowWalks.map(walk => ({ walk }))\n },\n // The lifted walks the graph on screen carries, or undefined when none\n // is named or it carries none of those that were\n get walkLift() {\n const { graph } = self\n const layers = this.liftedWalkLayers\n return graph &&\n !self.walkCut &&\n layers.length > 0 &&\n !self.layoutResult?.tubeMap\n ? walkLift(graph, layers, this.walkRamp)\n : undefined\n },\n // One panel per lifted walk while the pane is faceted by walk, each a\n // lift of that walk alone, on a layout whose nodes the panels can split.\n // See facetLifts.\n get facetPanels() {\n const { graph } = self\n const lift = this.walkLift\n return self.facetSetting.field !== '' &&\n this.modeDrawsNodes &&\n graph &&\n lift &&\n self.walkLayers.length > 1 &&\n lift.walks.length > 1\n ? facetLifts(graph, lift, self.walkLayers, this.walkRamp)\n : undefined\n },\n // The lifted walks as drawn, each panel's own while faceted\n get drawnWalks() {\n return (\n this.facetPanels?.map(panel => panel.walks[0]!) ??\n this.walkLift?.walks ??\n []\n )\n },\n // A tube map draws every walk as a tube of its own\n get liftsWalks() {\n return !TUBE_MAP_MODES.has(self.chosenLayoutMode)\n },\n // The window a lane coloured by reference position spans, by name\n get walkReference() {\n const domain = this.walkLift?.referenceDomain\n return domain && { ...domain, name: self.graphRegion?.refName }\n },\n // A label per walk, which the pickers, the keys and a bubble's label all\n // read, so a walk name repeated across records reads the same everywhere\n get walkLabels() {\n return walkLabelsOf(this.walkChoices)\n },\n walkLabel(name: string) {\n return this.walkLabels.get(name) ?? name\n },\n // Whether a lifted lane paints a node charcoal, the colour a lane coloured\n // by reference position gives what is off the reference\n get liftPaintsOffReference() {\n for (const w of this.walkLift?.walks ?? []) {\n if (w.encoding.field !== 'walk') {\n for (const color of w.colors.values()) {\n if (color === NO_VALUE_COLOR) {\n return true\n }\n }\n }\n }\n return false\n },\n // what the faded rest of the drawing is not on\n get liftedWalksLabel() {\n const walks = this.walkLift?.walks ?? []\n return walks.length === 1 ? this.walkLabel(walks[0]!.name) : 'these walks'\n },\n // The scheme the renderer actually paints with, which is the raw prop\n // unless it is 'auto'. A bare getter returns a resolved value (root\n // CLAUDE.md): every consumer of a colour reads this one, and the two\n // dropdowns read `colorScheme` so \"Auto\" stays visible as the choice it\n // is.\n //\n // 'auto' asks the GRAPH, not the layout. A hue along the reference is\n // meaningful whenever the segments have reference coordinates \u2014\n // `anchoredBy` is exactly that question \u2014 and a force-directed drawing of\n // an rGFA is the case that proves it: the layout has no reference axis and\n // the ramp still says where on the reference each node came from, which is\n // the only quantity a linear track beside it can be painted with too.\n //\n // A tube map tells its paths apart by their tubes' hues, so there 'auto'\n // leaves the boxes clear and a node scheme is the user's pick. Beside\n // reads, which take the reds and the blues, the boxes stay clear\n // whatever was picked.\n get effectiveColorScheme(): ResolvedColorScheme {\n return self.layoutResult?.tubeMap &&\n (this.tubeMapReads || self.chosenColorScheme === 'auto')\n ? 'uniform'\n : resolveColorScheme(self.chosenColorScheme, self.graph)\n },\n // Panels lay their walks out without the reads\n get tubeMapReads() {\n const layout = self.layoutResult\n return (\n !layout?.tubeMapPanels &&\n (layout?.tubeMap?.layout.reads.length ?? 0) > 0\n )\n },\n // Why no node scheme is on screen to pick, for every control that\n // offers one: lifted walks colour their own lanes and grey the rest,\n // and reads take a tube map's reds and blues\n get colorSchemeLock() {\n return this.walkLift\n ? {\n value: 'By walk',\n why: 'Each highlighted haplotype colours its own lane: set it under Haplotypes, Color highlighted...',\n }\n : this.tubeMapReads\n ? {\n value: 'By strand',\n why: 'Reads take the reds and blues, so the tube map leaves its nodes clear',\n }\n : undefined\n },\n get nodePositions() {\n return self.layoutResult?.nodePositions\n },\n // a length label would sit on the lanes of lifted walks\n get labelsNodeSizes() {\n return !self.layoutResult?.tubeMap && !this.walkLift\n },\n // Deletions the layout found inside an allele, empty rather than\n // undefined: a layout drawn at sequence scale states none, because there\n // a node's drawn extent already IS its length. `deletions` beside\n // this one is the bare-edge kind, which every layout has.\n get alleleDeletions() {\n return self.layoutResult?.alleleDeletions ?? []\n },\n get deletionRoutes() {\n return self.layoutResult?.deletionRoutes\n },\n get stranded() {\n return self.layoutResult?.stranded\n },\n // Whether the current layout states y in screen px rather than in the same\n // units as x (LayoutResult.pixelRows). Everything that has to put the two\n // axes in one expression reads this through scaleX/scaleY.\n get pixelRows() {\n return self.layoutResult?.pixelRows ?? false\n },\n get zoomPercent() {\n return `${(self.scale * 100).toFixed(1)}%`\n },\n // True while the persisted transform is still the schema default, i.e.\n // neither a restored session nor the user has positioned this view yet,\n // so an incoming layout is free to zoom-to-fit.\n get isDefaultViewport() {\n return self.scale === 1 && self.translateX === 0 && self.translateY === 0\n },\n }))\n .views(self => ({\n // The bubbles the graph itself states, for a graph with no index: a GBZ\n // cut or a pggb file\n get derivedBubbles() {\n return self.graph ? graphBubbles(self.graph) : []\n },\n // The bubbles inside each open one, derived from its segments alone, so a\n // superbubble opens level by level\n get openBubbleInsides() {\n const { graph } = self\n return graph\n ? self.openBubbles.map(open =>\n graphBubbles(\n bubbleSubgraph(graph, bubbleSegmentIds(open)),\n open,\n ).filter(b => !b.covering),\n )\n : []\n },\n get openBubble() {\n return self.openBubbles.at(-1)\n },\n // The open bubble's segments and the links among them, which keep their\n // colour while the rest of the drawing greys: a lift with no walks\n get openBubbleFocus(): WalkLift | undefined {\n const open = this.openBubble\n const { graph } = self\n if (!open || !graph) {\n return undefined\n }\n const names = new Set(bubbleSegmentIds(open))\n const nodeIds = new Set(\n graph.nodes.filter(n => names.has(n.name)).map(n => n.id),\n )\n const edgeIndexes = new Set<number>()\n graph.edges.forEach((e, i) => {\n if (nodeIds.has(e.from) && nodeIds.has(e.to)) {\n edgeIndexes.add(i)\n }\n })\n return { walks: [], nodeIds, edgeIndexes, names: new Set() }\n },\n bubbleIsOpen(bubble: MinigraphBubble) {\n return self.openBubbles.some(o => sameBubble(o, bubble))\n },\n // Whether a bubble's halo and name fade: lifted walks fade those none of\n // them enters, and an open bubble those outside it other than the open\n bubbleFaded({\n bubble,\n nodeIds,\n }: {\n bubble: MinigraphBubble\n nodeIds: string[]\n }) {\n const lift = self.walkLift\n const focus = this.openBubbleFocus\n return lift\n ? !nodeIds.some(id => lift.nodeIds.has(id))\n : !!focus &&\n !this.bubbleIsOpen(bubble) &&\n !nodeIds.every(id => focus.nodeIds.has(id))\n },\n }))\n .views(self => ({\n // The bubbles halos draw and labels open: the window's, and those inside\n // each open one. Index rows win where both exist: gfatools measured every\n // allele, the layered order only bounds them.\n get bubbles() {\n const base = self.indexBubbles?.length\n ? self.indexBubbles\n : self.derivedBubbles\n const seen = new Set(base.map(bubbleKey))\n return [\n ...base,\n ...self.openBubbleInsides\n .flat()\n .filter(b => !seen.has(bubbleKey(b)) && seen.add(bubbleKey(b))),\n ]\n },\n // what the legend says the drawing leaves out, when it was folded\n get foldNote() {\n const bp = self.foldedBelowBp\n return bp === undefined\n ? undefined\n : `variants under ${formatBp(bp)} folded into the reference`\n },\n }))\n .views(self => ({\n // the haplotypes the graph on screen was cut for, where a host says\n get cutHaplotypes(): string[] | undefined {\n return undefined\n },\n // the GFA the graph on screen was read from, where a host says\n get sourceGfaLocation(): FileLocation | undefined {\n return undefined\n },\n get sourceAdapter() {\n const track = self.sourceTrack\n return track ? trackAdapterConfig(self, track) : undefined\n },\n get sourceTrackId() {\n const track = self.sourceTrack\n return track ? (readConfObject(track, 'trackId') as string) : undefined\n },\n // The session's tracks, each with the assemblies it covers by canonical\n // name, since a track may name one by an alias\n get sessionTracks() {\n const session = getSession(self)\n return session.tracks.map(t => ({\n trackId: t.trackId as string,\n name: readConfObject(t, 'name') as string,\n adapterType: (readConfObject(t, 'adapter') as { type: string }).type,\n assemblies: trackAssemblies(session, t),\n }))\n },\n }))\n .views(self => ({\n get assemblyTrackChoices() {\n const region = self.graphRegion\n const assembly =\n region && canonicalAssemblyName(getSession(self), region.assemblyName)\n return assembly\n ? self.sessionTracks.filter(t => t.assemblies.includes(assembly))\n : []\n },\n }))\n .views(self => ({\n get geneTrackChoices() {\n return self.assemblyTrackChoices.filter(t =>\n GENE_ADAPTER_TYPES.has(t.adapterType),\n )\n },\n // The session's feature tracks a repeat annotation could be, for the\n // picker; which one is read is pickRepeatTrack's choice.\n get repeatTrackChoices() {\n return self.assemblyTrackChoices.filter(t =>\n REPEAT_ADAPTER_TYPES.has(t.adapterType),\n )\n },\n // The arrays over the window that state a unit, for the Repeat picker.\n get repeatChoices() {\n return self.repeatArrays ?? []\n },\n }))\n .views(self => ({\n get repeatTrack() {\n return pickRepeatTrack(self.repeatTrackChoices, self.repeatTrackId)\n },\n get geneTrack() {\n return pickGeneTrack(self.geneTrackChoices, self.geneTrackId)\n },\n get selectedRepeat() {\n return self.repeatChoices.find(r => r.key === self.repeatKey)\n },\n get backbone() {\n return self.graph ? graphBackbone(self.graph) : undefined\n },\n // Each walk sliced to the window, for walk rows and the strip; a repeat\n // pick slices again by its own array\n get cutWalkRows() {\n const runs = self.walkCut?.walkRowRuns\n return runs\n ? walkRowsOf(runs)\n : self.graph\n ? walkRows(self.graph, self.graphRegion)\n : undefined\n },\n // An assembly by each name a backbone may spell it with: the session's\n // name and aliases, and the PanSN prefix the source track maps each of\n // those to.\n assemblySpellings(assemblyName: string): AssemblyNames {\n const { assemblyManager } = getSession(self)\n const assembly = assemblyManager.has(assemblyName)\n ? assemblyManager.get(assemblyName)\n : undefined\n const panSN = (self.sourceAdapter?.assemblyNameToPanSN ?? {}) as Record<\n string,\n string\n >\n const names = [\n assemblyName,\n ...(assembly ? [assembly.name, ...assembly.aliases] : []),\n ]\n return {\n name: assemblyName,\n aliases: [...names, ...names.flatMap(n => panSN[n] ?? [])],\n }\n },\n // Whether x lies along the reference the track's graph came with, not a\n // walk \"Draw x along\" picked. An rGFA's backbone is fixed.\n get drawsLoadedReference() {\n const graph = self.graph\n return (\n graph?.anchoredBy === 'tags' ||\n (graph?.referencePath !== undefined &&\n graph.referencePath === self.loadedReferencePath)\n )\n },\n }))\n .views(self => ({\n // the assembly the genes were read for\n get geneAssembly() {\n const region = self.graphRegion\n return region ? self.assemblySpellings(region.assemblyName) : undefined\n },\n // the filter of the gene track's lane in the view the pane draws in\n get geneLaneFilter() {\n const view = self.containingView\n if (!view) {\n return undefined\n }\n const filters = laneFilters(view, self.geneTrack?.trackId)\n return filters.length\n ? new SerializableFilterChain({\n filters,\n jexl: getEnv(self).pluginManager.jexl,\n })\n : undefined\n },\n // the genes over the cut that the lane admits\n get geneFeatures() {\n const features = self.geneTrackFeatures\n const lane = this.geneLaneFilter\n return features\n ? geneModelsFrom(lane ? features.filter(f => lane.passes(f)) : features)\n : undefined\n },\n // The genes on the drawn backbone under its own refNames. The track's\n // config puts its reference on the cut's assembly, whatever the walk's\n // name. After \"Draw x along\" another walk, the backbone takes the genes\n // only where its PanSN prefix names their assembly.\n get backboneGenes() {\n const { backbone } = self\n const { geneAssembly, geneFeatures } = this\n const binds =\n self.drawsLoadedReference ||\n (geneAssembly !== undefined &&\n backboneAssembly(backbone, [geneAssembly]) !== undefined)\n return backbone && geneFeatures && binds\n ? featuresOnBackbone(geneFeatures, backbone)\n : undefined\n },\n }))\n .views(self => ({\n get nodeNeighbors() {\n return self.drawnGraph ? buildNeighbors(self.drawnGraph) : undefined\n },\n get nodeInk(): NodeInk {\n return nodeInk(\n self.drawnGraph,\n self.nodeById,\n self.contigThickness,\n self.nodeWidth,\n )\n },\n // Links that skip reference sequence, i.e. the deletions this graph\n // holds. Computed once per graph rather than per geometry rebuild: it is\n // a pass over the edges and the drawing rebuilds on every pan.\n // Walk rows state what each walk skips as its own bar length, so the arcs\n // over the backbone would only say it again, across the bars.\n get allDeletions() {\n return self.graph && this.drawsNodes ? deletionEdges(self.graph) : []\n },\n // One bar per haplotype walk on its own bp axis, each with the allele\n // the picked repeat called for it, before the sample filter. Empty under\n // every other layout.\n get cohortWalkRows() {\n if (self.chosenLayoutMode !== 'walkrows' || !self.graph) {\n return undefined\n }\n const repeat = self.selectedRepeat\n const cut = self.walkCut\n const bars = repeat\n ? cut\n ? walkRowsFromCut(cut, repeat, repeat.unit)\n : walkRows(self.graph, repeat, repeat.unit)\n : self.cutWalkRows\n if (!bars) {\n return undefined\n }\n const [reference, ...rows] = withCalls(\n [bars.reference, ...bars.rows],\n repeat?.calls,\n )\n return { ...bars, reference: reference!, rows }\n },\n // The samples walk rows can show, by name, and those with a walk its\n // call disagrees with, longest walk first\n get walkRowSampleChoices() {\n const rows = this.cohortWalkRows?.rows ?? []\n return {\n samples: [...new Set(rows.map(r => r.sample))].sort(),\n disagreeing: [\n ...new Set(\n rows.filter(r => r.call?.agrees === false).map(r => r.sample),\n ),\n ],\n }\n },\n // The source track's samples TSV, where its adapter names one\n get walkRowSamplesTsv(): FileLocation | undefined {\n const location = self.sourceAdapter?.samplesTsvLocation as\n FileLocation | undefined\n return location && locationIsSet(location) ? location : undefined\n },\n // The sample table's columns walk rows can group by\n get walkRowGroupFields() {\n return metadataColumns(self.walkRowSampleTable)\n },\n // The column colouring a tube map's tubes, once the table is read: each\n // walk's value, and a hue per value across every walk of the cut, so\n // the panels and the key agree\n get tubeMapColoring() {\n const field = self.tubeMapColorBy\n const table = self.walkRowSampleTable\n if (!field || !table || !this.walkRowGroupFields.includes(field)) {\n return undefined\n }\n const valueOf = columnKeyOf(field, table)\n const walks = (self.graph?.paths ?? [])\n .map(p => pathOrigin(p.name).name)\n .filter(w => w !== self.graph?.referencePath)\n return {\n field,\n valueOf,\n palette: valueTubePalette(walks.map(valueOf)),\n unvalued: walks.some(w => valueOf(w) === ''),\n }\n },\n // The grouping by a sample table column, once the table is read and\n // has that column\n get tableGroupBy() {\n const groupBy = self.walkRowGroupBy\n const table = self.walkRowSampleTable\n return groupBy && table && this.walkRowGroupFields.includes(groupBy.field)\n ? { groupBy, table }\n : undefined\n },\n // How a tube map splits into panels: by sample or walk, or by a sample\n // table column\n get tubeMapPanelSplit(): TubeMapPanelSplit | undefined {\n const { field, domain } = self.facetSetting\n const grouped = this.tableGroupBy\n return field !== ''\n ? { by: field, domain }\n : grouped\n ? { by: 'column', ...grouped.groupBy, table: grouped.table }\n : undefined\n },\n // the cohort's rows the sample filter keeps\n get keptCohortRows() {\n const bars = this.cohortWalkRows\n return bars && filterSamples(bars.rows, self.walkRowSamples)\n },\n // The kept rows in a section per value of the grouped column, or\n // undefined while ungrouped or the table lacks that column\n get walkRowGroups() {\n const rows = this.keptCohortRows\n const grouped = this.tableGroupBy\n return rows && grouped\n ? groupWalkRows(rows, grouped.table, grouped.groupBy)\n : undefined\n },\n // The bars the overlay draws: the cohort's, narrowed by the sample\n // filter, and stacked section by section while grouped\n get walkRowBars() {\n const bars = this.cohortWalkRows\n const rows = this.keptCohortRows\n return bars && rows\n ? { ...bars, rows: this.walkRowGroups?.rows ?? rows }\n : undefined\n },\n // Whether the canvas draws the graph's nodes. A tube map and walk rows\n // draw a picture of their own over it, so what sits on nodes (genes,\n // bubble halos, deletion arcs, the reference strip) has nowhere to go.\n // Read off the mode that drew the layout on screen, not the one asked\n // for: that one falls back to force on a graph it cannot draw, and its\n // layout may still be on its way.\n get drawsNodes() {\n return layoutModeByValue(self.drawnLayoutMode ?? self.chosenLayoutMode)\n .drawsNodes\n },\n // Exons and names on the nodes that carry them, in layout units. Reads\n // positionsVersion so a dragged node takes its exons with it.\n get genePins() {\n dependOn(self.positionsVersion)\n const positions = self.layoutResult?.nodePositions\n return self.showGenes &&\n this.drawsNodes &&\n self.graph &&\n self.backboneGenes &&\n positions\n ? genePins(self.graph, self.backboneGenes, positions)\n : []\n },\n // The bubbles as halos along their nodes.\n // Reads positionsVersion so a dragged node takes its halo with it.\n get bubbleHalos() {\n dependOn(self.positionsVersion)\n const positions = self.layoutResult?.nodePositions\n if (!self.showBubbles || !this.drawsNodes || !self.graph || !positions) {\n return []\n }\n return bubbleHalos(self.graph, self.bubbles, positions, self.repeatArrays)\n },\n // What `reference-position` paints from, which is also what `auto`\n // resolves to on any anchored graph\n get referenceRamp() {\n return self.effectiveColorScheme === 'reference-position'\n ? self.drawnReferenceRamp\n : undefined\n },\n // The assemblies this view is showing, which is the interface every\n // assembly-aware piece of the app looks for \u2014 `viewTitle` first among\n // them, which falls back through it and otherwise names the view\n // \"Untitled view\". Every published HPRC figure showed that.\n // `launchSubgraphView` only avoids it by writing `displayName`, so a\n // declaratively-instantiated view (a session snapshot, a figure spec) got\n // the fallback.\n //\n // A whole-file import has none: its stable names are a GFA's business and\n // need not name anything the session has loaded. Empty rather than\n // undefined, matching what an LGV with no displayed regions reports.\n get assemblyNames() {\n const region = self.graphRegion\n return region ? [region.assemblyName] : []\n },\n // Screen px per layout unit, per axis. `scale` is the x zoom and the whole\n // of what a user's wheel moves; y is a second question the layout answers\n // for itself.\n //\n // On a row layout the pitch is already in screen px (rowSpacing.ts), so\n // scaleY is 1 and stays 1: rows are a track's row height, unchanged by\n // zoom, and the backbone under them zooms the way the ruler above it does.\n // On an isotropic layout (FMMM) x and y are one simulation space and one\n // number scales both, exactly as before.\n //\n // Everything that mixes the two axes takes their ratio as `yToX`\n // (scaleY / scaleX) \u2014 see computeEdgeCurves.\n //\n // The pair, for everything that draws or hit-tests. Handed over as one\n // value on purpose: every consumer needs both, and passing them separately\n // let a caller supply the x scale and default y, which compiles and draws\n // a wrong picture. See AxisScale.\n get axisScale() {\n return axisScaleOf(self.scale, self.pixelRows)\n },\n get scaleX() {\n return this.axisScale.scaleX\n },\n get scaleY() {\n return this.axisScale.scaleY\n },\n }))\n .views(self => ({\n // layout units to pane px\n get screenTransform(): ScreenTransform {\n return {\n scaleX: self.scaleX,\n scaleY: self.scaleY,\n translateX: self.translateX,\n translateY: self.translateY,\n }\n },\n toScreen(p: { x: number; y: number }) {\n return {\n x: p.x * self.scaleX + self.translateX,\n y: p.y * self.scaleY + self.translateY,\n }\n },\n get deletionDrawing() {\n return self.graph\n ? deletionDrawing(self.graph, self.allDeletions, self.showDeletionEdges)\n : undefined\n },\n // the deletions drawn, which their labels and hover name\n get deletions() {\n return this.deletionDrawing?.shown ?? []\n },\n get deletionEdgeIndexes() {\n return this.deletionDrawing?.bypassed\n },\n get hiddenEdgeIndexes() {\n return this.deletionDrawing?.hidden\n },\n // The interval the reference-position ramp runs over, for the key beside\n // the drawing, and undefined when no key should be drawn. Two tutorials\n // carry \"red to magenta is left to right of the cut window\" as a sentence\n // in prose because nothing on screen said it.\n //\n // Read off the ramp the drawing is actually painted with rather than\n // re-derived from the domain, so the key cannot come to describe a\n // different interval from the hues beside it \u2014 and so a graph that states\n // no domain, whose interval has to be measured, does not pay for a second\n // neighbour walk to say what the first one already worked out.\n get referenceRampDomain() {\n const ramp = self.referenceRamp\n return ramp\n ? { start: ramp.start, end: ramp.start + ramp.span }\n : undefined\n },\n // The ramp's two colours for nodes off it, as getNodeColor paints them:\n // charcoal where an rGFA rank puts a node off the reference, grey where\n // a node has no reference position at all. A tube map draws the window\n // alone (trimToWindow), so there only the boxes it drew count.\n get referenceRampOffKeys() {\n const ramp = self.referenceRamp\n const layout = self.layoutResult\n const drawn = layout?.tubeMap ? layout.nodePositions : undefined\n let offReference = false\n let unplaced = false\n if (ramp && self.drawnGraph) {\n for (const node of self.drawnGraph.nodes) {\n if (drawn && !drawn[node.id]) {\n continue\n }\n if (!ramp.midpoints.has(node.id)) {\n unplaced = true\n } else if (node.stable && node.stable.rank > 0) {\n offReference = true\n }\n }\n }\n return { offReference, unplaced }\n },\n // Each tube map box in its node's colour, where the scheme paints one\n get tubeMapNodeColors() {\n const graph = self.drawnGraph\n return self.layoutResult?.tubeMap && graph\n ? tubeMapNodeColors(\n graph,\n self.effectiveColorScheme,\n self.referenceRamp,\n )\n : undefined\n },\n // How a tube map colours its tubes: a hue per value of the column\n // picked; grey by role beside tinted boxes, which a hue per walk would\n // share; the reference charcoal and the haplotypes blue in a panel, whose\n // title names its walks, and past the walks a key can name; else a hue\n // per walk. Beside reads, which take the reds and blues, that hue is grey.\n get tubeColorKind(): TubeColorKind | undefined {\n const layout = self.layoutResult\n const paths = self.drawnGraph?.paths ?? []\n const reads = self.tubeMapReads\n return !layout?.tubeMap\n ? undefined\n : self.tubeMapColoring && !reads\n ? 'value'\n : layout.tubeMapPanels\n ? 'role'\n : this.tubeMapNodeColors\n ? 'tinted'\n : !reads &&\n (!pathColorsLegible(paths.length) ||\n paths.some(p => p.members))\n ? 'role'\n : 'path'\n },\n // `graph`'s tubes as tubeColorKind colours them, `pathColors` being\n // its drawing's hue per walk\n tubeColorsOf(graph: Graph, pathColors: readonly string[]) {\n const paths = graph.paths ?? []\n const kind = this.tubeColorKind\n const coloring = self.tubeMapColoring\n return kind === 'value' && coloring\n ? valueTubeColors(\n paths,\n graph.referencePath,\n coloring.valueOf,\n coloring.palette,\n )\n : kind === 'tinted'\n ? roleTubeColors(paths, graph.referencePath, TINTED_TUBES)\n : kind === 'role'\n ? roleTubeColors(paths, graph.referencePath)\n : pathColors\n },\n // While a lane row is hovered, every tube but its walks' and `kept`'s\n // fades. A panel keeps its reference to compare against; the unsplit map\n // fades it with the rest.\n fadeUnhovered(\n colors: readonly string[],\n paths: readonly { name: string }[],\n kept?: string,\n ) {\n const hovered = new Set(self.hoveredRowWalks)\n return hovered.size > 0\n ? colors.map((color, i) => {\n const name = paths[i]?.name ?? ''\n return hovered.has(name) ||\n (kept !== undefined && pathOrigin(name).name === kept)\n ? color\n : LIFT_BACKDROP_CSS\n })\n : colors\n },\n get tubeMapTubeColors() {\n const drawing = self.layoutResult?.tubeMap\n const graph = self.drawnGraph\n return drawing && graph\n ? this.fadeUnhovered(\n this.tubeColorsOf(graph, drawing.pathColors),\n graph.paths ?? [],\n )\n : undefined\n },\n nodeSpan(nodeId: string) {\n return spanIn(nodeId, self.nodeById, self.nodeNeighbors)\n },\n // The drawing the pointer is over: its panel's while a tube map is split,\n // each panel laid out alone and merging its own runs\n get hoverDrawing() {\n const i = self.hoveredPanel\n return (\n (i === null\n ? undefined\n : self.layoutResult?.tubeMapPanels?.[i]?.result.tubeMap) ??\n self.layoutResult?.tubeMap\n )\n },\n // the graph whose ids the hover names\n get hoverGraph() {\n return this.hoverDrawing?.graph ?? self.drawnGraph\n },\n get hoverNodeById() {\n const graph = this.hoverGraph\n return graph === self.drawnGraph\n ? self.nodeById\n : graph && nodeMapOf(graph)\n },\n get hoverNeighbors() {\n const graph = this.hoverGraph\n return graph === self.drawnGraph\n ? self.nodeNeighbors\n : graph && buildNeighbors(graph)\n },\n }))\n .views(self => ({\n // Which haplotype each ribbon colour belongs to, in the order the file\n // states the paths \u2014 the same list and the same order the geometry keys\n // its colours off, so the key cannot name a colour that is not drawn.\n // Empty unless the ribbons are actually on: a colour key beside a drawing\n // with no colours in it is a legend for nothing.\n // The tube map colours its tubes whether or not paths are drawn on the\n // nodes, so under it the key follows the tubes: walk by walk where each\n // has a hue, and otherwise the tube map's own key names the colours.\n get pathLegend() {\n const paths = self.drawnGraph?.paths\n const keyed = self.layoutResult?.tubeMap\n ? self.tubeColorKind === 'path'\n : self.drawPaths\n return keyed &&\n paths &&\n pathColorsLegible(paths.length) &&\n !paths.some(p => p.members)\n ? pathLegend(paths, self.tubeMapTubeColors)\n : []\n },\n // The reference interval under the pointer: the hovered node's, or the\n // hovered bubble's where it has one of its own\n get hoveredSpan() {\n const nodeId = self.hoveredNode\n const bubble = self.hoveredBubble\n return nodeId !== null\n ? spanIn(nodeId, self.hoverNodeById, self.hoverNeighbors)\n : bubble && !bubble.offReference\n ? { start: bubble.start, end: bubble.end }\n : undefined\n },\n // The hovered span, for a connected linear view to highlight. Only a\n // graph cut from a track has one: a whole-file import has no region, and\n // its stable names need not name anything in a loaded assembly.\n get hoverHighlight() {\n const region = self.graphRegion\n const span = this.hoveredSpan\n return region && span && self.chosenHover !== 'off'\n ? {\n refName: region.refName,\n assemblyName: region.assemblyName,\n ...span,\n }\n : undefined\n },\n }))\n", "import {\n backboneNodes,\n backboneSpan,\n} from '@jbrowse/bandage-core/anchoredNodes'\nimport { getSession } from '@jbrowse/core/util'\n\nimport { withGraphViews } from './graphViews'\nimport {\n contributingAssemblies,\n nodeOwnLocation,\n resolveContributors,\n resolveLocationAssembly,\n} from '../../launchFromGraph/contributors'\nimport {\n paddedLocation,\n withReferenceRegion,\n} from '../../launchFromGraph/launchFromGraph'\nimport { linearViewTarget } from '../../launchFromGraph/linearViewTarget'\nimport { GENE_ADAPTER_TYPES, pickGeneTrack } from '../genes/geneFeatures'\nimport { isLinearHost } from '../host'\n\nimport type { LinearHost } from '../host'\n\nexport const withLaunchViews = withGraphViews\n .views(self => ({\n // The linear view this pane draws inside, when a display hosts it: x is\n // that view's window and the cut is re-made when the window leaves it.\n // A pane that is a view of its own has none.\n get host(): LinearHost | undefined {\n const view = self.containingView\n return isLinearHost(view) ? view : undefined\n },\n }))\n .views(self => ({\n // the linear view a node's \"show\" and \"highlight\" move: the host, else\n // the view a graph of its own is paired with\n get pairedViewId() {\n return self.host?.id ?? self.connectedViewId\n },\n }))\n .views(self => ({\n // Every assembly this graph names a segment from, with the locus each one\n // contributes here. rGFA's SN tag is what makes this knowable: the graph\n // states its own contributors, so the view can offer a way out to each of\n // them without consulting an alignment.\n //\n // Gaps larger than the backbone span split a contributor's segments into\n // separate loci and the widest wins, so a sample that also contributes\n // sequence from a distant duplication is launched at the locus on screen\n // rather than at the union of the two.\n get contributingAssemblies() {\n const graph = self.graph\n const backbone = graph ? backboneNodes(graph) : []\n return graph\n ? contributingAssemblies(graph, {\n maxGap: backbone.length > 0 ? backboneSpan(backbone) : Infinity,\n })\n : []\n },\n }))\n .views(self => ({\n // A node's PanSN sample as an assembly this session can open, or\n // undefined. The graph's spelling and the assembly's need not agree:\n // HPRC writes `CHM13` where the assembly is UCSC's `hs1`. The track the\n // graph was cut from states that pairing in its `assemblyNameToPanSN`,\n // so its map is read first, then `assemblyManager`'s names and aliases.\n //\n // `has` before `get`, deliberately: `get` reports an unknown name to\n // `Core-handleUnrecognizedAssembly`, which asks every installed plugin to\n // go supply it, and this is a probe run for hundreds of haplotypes per\n // graph.\n get assemblyResolver() {\n const { assemblyManager } = getSession(self)\n const panSN = self.sourceAdapter?.assemblyNameToPanSN as\n Record<string, string> | undefined\n const byPrefix = new Map(\n Object.entries(panSN ?? {}).map(([asm, prefix]) => [prefix, asm]),\n )\n const loaded = (name: string | undefined) =>\n name !== undefined && assemblyManager.has(name)\n ? (assemblyManager.get(name)?.name ?? name)\n : undefined\n return (sample: string) => loaded(byPrefix.get(sample)) ?? loaded(sample)\n },\n // Each assembly's gene track among the session's tracks, picked as the\n // backbone's is, so a walk row can read its haplotype's own annotation.\n // One pass over the tracks, not one per row.\n get geneTracksByAssembly() {\n const byAssembly = new Map<string, typeof self.sessionTracks>()\n for (const track of self.sessionTracks) {\n if (GENE_ADAPTER_TYPES.has(track.adapterType)) {\n for (const asm of track.assemblies) {\n byAssembly.set(asm, [...(byAssembly.get(asm) ?? []), track])\n }\n }\n }\n return new Map(\n [...byAssembly].flatMap(([asm, tracks]) => {\n const picked = pickGeneTrack(tracks, '')\n return picked ? [[asm, picked] as const] : []\n }),\n )\n },\n }))\n .views(self => ({\n // The contributors a view can actually be opened on: those naming an\n // assembly this session has loaded. Every strain of an E. coli pangenome\n // demo is its own assembly, so all of them resolve; an HPRC graph names\n // hundreds of haplotypes that no session loads, so only the reference\n // does.\n get launchableAssemblies() {\n return resolveContributors(\n withReferenceRegion(self.contributingAssemblies, self.graphRegion),\n self.assemblyResolver,\n )\n },\n // Whether there is a linear view this graph may draw a highlight into \u2014\n // the paired one, or the session's only one on the reference assembly.\n // Read by the node menu, which offers the item only when it would land\n // somewhere.\n get canHighlightInLinearView() {\n const region = self.graphRegion\n return (\n region !== undefined &&\n linearViewTarget({\n views: [...getSession(self).views],\n connectedViewId: self.pairedViewId,\n assemblyName: region.assemblyName,\n }) !== undefined\n )\n },\n // Where one node can be opened: on its own assembly, and on the reference\n // the graph was cut against. Both are padded to a readable window \u2014 a\n // base-level allele is a few bp, and a linear view framed on exactly that\n // shows no context at all.\n nodeLaunchTargets(nodeId: string) {\n const node = self.nodeById?.get(nodeId)\n const own = node ? nodeOwnLocation(node) : undefined\n const ownAssembly = own\n ? resolveLocationAssembly(self.assemblyResolver, own)\n : undefined\n const region = self.graphRegion\n const span = region ? self.nodeSpan(nodeId) : undefined\n const onReference =\n region && span\n ? {\n sample: region.assemblyName,\n haplotype: undefined,\n refName: region.refName,\n ...span,\n }\n : undefined\n return {\n own:\n own && ownAssembly\n ? { location: paddedLocation(own), assembly: ownAssembly }\n : undefined,\n reference:\n region && onReference\n ? {\n location: paddedLocation(onReference),\n assembly: region.assemblyName,\n }\n : undefined,\n // Unpadded: a mark is of the node, the same span its hover band\n // draws. The padding above is room to read a view opened on it.\n highlight:\n region && onReference\n ? { location: onReference, assembly: region.assemblyName }\n : undefined,\n }\n },\n }))\n", "import {\n placeRowGenes,\n rowSpan,\n} from '@jbrowse/bandage-core/layout/walkRowDraw'\nimport { filterSamples } from '@jbrowse/bandage-core/layout/walkRows'\nimport {\n cutsWholeWalks as wholeWalksRule,\n stripMarks,\n walkStripApplies,\n walkStripFrame,\n} from '@jbrowse/bandage-core/layout/walkStrip'\nimport { layoutModeByValue } from '@jbrowse/bandage-core/layoutModes'\nimport { nodeAnchor } from '@jbrowse/bandage-core/referenceStrip'\n\nimport { withLaunchViews } from './launchViews'\nimport { WALK_GENE_ROWS } from './paneBase'\nimport { resolveLocationAssembly } from '../../launchFromGraph/contributors'\n\nimport type { SubgraphRegion } from '../../GetSubgraph'\nimport type { WalkAxis, WalkRow } from '@jbrowse/bandage-core/layout/walkRows'\n\nexport const withWalkRowViews = withLaunchViews\n .views(self => ({\n // Whether the strip of walk rows sits under the drawing: asked for, on a\n // standalone view whose layout draws nodes, for a graph with walks\n get walkStripShown() {\n return walkStripApplies({\n walkStrip: self.walkStrip,\n mode: { drawsNodes: self.modeDrawsNodes },\n drawsPicture: !!self.layoutResult?.tubeMap || !!self.walkRowBars,\n walks: self.graph?.paths?.length ?? 0,\n host: !!self.host,\n })\n },\n // The strip's rows: the cut's, with the sample filter and no repeat\n // pick, which the Repeat menu only offers in walk rows\n get walkStripRows() {\n const bars = this.walkStripShown ? self.cutWalkRows : undefined\n return bars\n ? { ...bars, rows: filterSamples(bars.rows, self.walkRowSamples) }\n : undefined\n },\n get walkStripFrame() {\n const bars = this.walkStripRows\n if (!bars) {\n return undefined\n }\n return walkStripFrame(bars, { width: self.paneWidth })\n },\n // Whether a cut must follow every snarl a walk leaves the window by, so\n // walks come back whole: walk rows measure them, and so does the strip\n get cutsWholeWalks() {\n return wholeWalksRule(layoutModeByValue(self.chosenLayoutMode), {\n walkStrip: self.walkStrip,\n host: !!self.host,\n })\n },\n // Where each walk passes the hovered node, or the selected one\n get walkStripMarks() {\n const bars = this.walkStripRows\n const id = self.hoveredNode ?? self.selectedNode\n const node = id === null ? undefined : self.nodeById?.get(id)\n return bars && node && self.graph\n ? stripMarks(self.graph, [bars.reference, ...bars.rows], node)\n : []\n },\n // Where a row's bar lies on its contig, and the session assembly its\n // haplotype (`HG00097#1`) or else its sample names\n rowLocation(row: WalkRow, axis: WalkAxis) {\n const named = {\n sample: row.sample,\n haplotype:\n row.haplotype === undefined\n ? undefined\n : `${row.sample}#${row.haplotype}`,\n }\n return {\n ...named,\n assembly: resolveLocationAssembly(self.assemblyResolver, named),\n span: { refName: axis.contig, ...rowSpan(axis, row.bp) },\n }\n },\n // Where the drawing has the node a strip point lights, for the ring\n // that finds it in a hairball\n get walkStripLocator() {\n const id = self.stripHover ? self.hoveredNode : null\n return id === null\n ? undefined\n : nodeAnchor(self.nodePositions?.[id], self.toScreen)\n },\n }))\n .views(self => ({\n // The gene reads walk rows need, as the layout or the strip: for each row whose haplotype\n // (`HG00097#1`) names an assembly with a gene track, that track over the\n // span of its own contig the row's bar covers. The first WALK_GENE_ROWS\n // such rows are read, and the rest counted for the key.\n get walkGeneReads() {\n const bars = self.walkRowBars ?? self.walkStripRows\n if (!bars || !self.showGenes) {\n return undefined\n }\n const reads: {\n row: string\n trackId: string\n region: SubgraphRegion\n }[] = []\n let untrackedRows = 0\n let unplaced = 0\n for (const row of bars.rows) {\n if (!row.axis) {\n unplaced++\n continue\n }\n const { assembly, span } = self.rowLocation(row, row.axis)\n const track = assembly\n ? self.geneTracksByAssembly.get(assembly)\n : undefined\n if (!assembly || !track) {\n untrackedRows++\n continue\n }\n reads.push({\n row: row.name,\n trackId: track.trackId,\n region: { assemblyName: assembly, ...span },\n })\n }\n return {\n reads: reads.slice(0, WALK_GENE_ROWS),\n gaps: {\n untracked: untrackedRows,\n unplaced,\n unread: Math.max(0, reads.length - WALK_GENE_ROWS),\n },\n }\n },\n get walkRowGeneGaps() {\n return this.walkGeneReads?.gaps\n },\n // Where a walk row's bar lies in its own assembly, for a linear view to\n // open: the span of its contig the bar covers, on the session assembly\n // its haplotype names (the cut's own assembly for the reference row).\n // The label names the haplotype when no assembly is loaded for it.\n walkRowLaunchTarget(index: number, bars = self.walkRowBars) {\n const row = bars ? [bars.reference, ...bars.rows][index] : undefined\n if (!row?.axis) {\n return undefined\n }\n const { sample, haplotype, assembly, span } = self.rowLocation(\n row,\n row.axis,\n )\n return {\n label: row.label,\n assembly: index === 0 ? self.graphRegion?.assemblyName : assembly,\n location: { sample, haplotype, ...span },\n }\n },\n // Each row's genes as offsets along its bar: the reference row's from\n // the backbone's gene track, every other row's from its own assembly\n get walkRowGenes() {\n const bars = self.walkRowBars ?? self.walkStripRows\n if (!bars || !self.showGenes) {\n return undefined\n }\n const byRow = new Map(self.walkGeneFeatures ?? [])\n if (self.geneFeatures) {\n byRow.set(bars.reference.name, self.geneFeatures)\n }\n return byRow.size\n ? placeRowGenes([bars.reference, ...bars.rows], byRow)\n : undefined\n },\n }))\n", "import { sameBubble } from '@jbrowse/bandage-core/bubbles/bubbleLine'\nimport { layoutModeByValue } from '@jbrowse/bandage-core/layoutModes'\nimport {\n REFERENCE_STRIP_ZONE_PX,\n nodeAnchor,\n referenceStripBlocks,\n stripBlockAt,\n stripOverhang,\n} from '@jbrowse/bandage-core/referenceStrip'\nimport { LIFT_BACKDROP_CSS } from '@jbrowse/bandage-core/renderer/GeometryBuilder'\nimport { referenceBoxes } from '@jbrowse/bandage-core/tubeMap/axis'\nimport { deviationMarks } from '@jbrowse/bandage-core/tubeMap/deviations'\nimport { tubeMapPicture } from '@jbrowse/bandage-core/tubeMap/draw'\nimport { tubeMapGenes } from '@jbrowse/bandage-core/tubeMap/genes'\n\nimport { hostFrame } from '../host'\nimport { withWalkRowViews } from './walkRowViews'\n\nexport const withHostViews = withWalkRowViews\n .views(self => ({\n // Whether the drawing's x is reference bp a host can place. Walk rows\n // put the backbone at its bp too, but their bars are lengths, so the\n // mode's `cutMargins` is what says the drawing is a picture.\n get xIsReferenceBp() {\n return (\n self.layoutResult?.referenceAxis === true &&\n layoutModeByValue(self.drawnLayoutMode ?? self.chosenLayoutMode)\n .cutMargins\n )\n },\n }))\n .views(self => ({\n // Whether the host places x. Only a layout whose x is reference bp can\n // take the window's transform; force, ordered and walk rows draw in\n // their own coordinates inside the track.\n get hostPlacesX() {\n const { host, graphRegion: region } = self\n return (\n host !== undefined &&\n host.initialized &&\n region !== undefined &&\n self.xIsReferenceBp &&\n !host.dynamicBlocks.contentBlocks.some(\n b => b.refName === region.refName && b.reversed,\n )\n )\n },\n }))\n .views(self => ({\n // The linear view's bp to screen x over the cut, read off its live\n // blocks so it follows every frame of a pan\n get hostBpFrame() {\n const { host, graphRegion } = self\n return host?.initialized && graphRegion\n ? hostFrame(host, graphRegion)\n : undefined\n },\n }))\n .views(self => ({\n get hostFrame() {\n return self.hostPlacesX ? self.hostBpFrame : undefined\n },\n get tubeMapPicture() {\n const drawing = self.layoutResult?.tubeMap\n return drawing ? tubeMapPicture(drawing) : undefined\n },\n get tubeMapReference() {\n const drawing = self.layoutResult?.tubeMap\n return drawing ? referenceBoxes(drawing) : undefined\n },\n // the folded variants, as ticks on the tubes of the walks carrying them\n get tubeMapDeviations() {\n const drawing = self.layoutResult?.tubeMap\n return drawing?.coarse\n ? deviationMarks(drawing, drawing.coarse.deviations)\n : []\n },\n // the reference boxes a linear view's connectors tie to its bp, which\n // the reference axis already puts under that bp\n get tubeMapConnectedBoxes() {\n const reference = this.tubeMapReference\n const { layoutResult } = self\n return reference &&\n !layoutResult?.referenceAxis &&\n !layoutResult?.tubeMapPanels\n ? [...reference.values()].flat()\n : undefined\n },\n }))\n .views(self => ({\n // A linear view has the genes in a track of their own, at their bp\n get tubeMapGenes() {\n const reference = self.tubeMapReference\n return self.showGenes &&\n !self.host &&\n reference &&\n self.backboneGenes &&\n !self.layoutResult?.tubeMapPanels\n ? tubeMapGenes(reference, self.backboneGenes)\n : []\n },\n // A drawing of nodes in its own coordinates inside a linear view, whose\n // reference segments the strip can put back at their bp\n get referenceStripApplies() {\n return (\n !!self.host?.initialized &&\n !!self.layoutResult &&\n self.drawsNodes &&\n !self.hostPlacesX &&\n !self.facetPanels\n )\n },\n }))\n .views(self => ({\n // greyed outside an open bubble, as the drawing is\n get referenceStripBlocks() {\n const { graph } = self\n if (!self.showReferenceStrip || !self.referenceStripApplies || !graph) {\n return []\n }\n const blocks = referenceStripBlocks(graph, {\n colorScheme: self.effectiveColorScheme,\n referenceRamp: self.referenceRamp,\n walks: self.walkLift?.walks,\n })\n const focus = self.walkLift ? undefined : self.openBubbleFocus\n return focus\n ? blocks.map(b =>\n focus.nodeIds.has(b.node)\n ? b\n : { ...b, colors: [LIFT_BACKDROP_CSS], faded: true },\n )\n : blocks\n },\n }))\n .views(self => ({\n get referenceStripShown() {\n return (\n self.referenceStripBlocks.length > 0 && self.hostBpFrame !== undefined\n )\n },\n // Whether the graph draws reference past the window's edges. A boolean\n // rather than the bp, which moves on every frame of a pan and would\n // resize the legend with it.\n get referenceStripOverhangs() {\n const frame = self.hostBpFrame\n if (!frame || self.referenceStripBlocks.length === 0) {\n return false\n }\n const { left, right } = stripOverhang(\n self.referenceStripBlocks,\n frame,\n self.paneWidth,\n )\n return left > 0 || right > 0\n },\n get referenceStripFaded() {\n return self.referenceStripBlocks.some(b => b.faded)\n },\n }))\n .views(self => ({\n // The lit span on the strip, and where the graph drew what it is of:\n // the hovered node, the hovered bubble's name, or the selected node\n get referenceStripLit() {\n if (!self.referenceStripShown) {\n return undefined\n }\n const bubble = self.hoveredNode === null ? self.hoveredBubble : null\n if (bubble && !bubble.offReference) {\n const halo = self.bubbleHalos.find(h => sameBubble(h.bubble, bubble))\n return {\n start: bubble.start,\n end: bubble.end,\n anchor: halo ? self.toScreen(halo.labelAt) : undefined,\n }\n }\n const nodeId = self.hoveredNode ?? self.selectedNode\n const span = nodeId === null ? undefined : self.nodeSpan(nodeId)\n return span && nodeId !== null\n ? {\n ...span,\n anchor: nodeAnchor(self.nodePositions?.[nodeId], self.toScreen),\n }\n : undefined\n },\n referenceStripNodeAt(sx: number, sy: number) {\n const frame = self.hostBpFrame\n return self.referenceStripShown && frame\n ? stripBlockAt(self.referenceStripBlocks, frame, sx, sy)\n : undefined\n },\n // the strip, and the gap the fit leaves under it\n get referenceStripZonePx() {\n return self.referenceStripShown ? REFERENCE_STRIP_ZONE_PX : 0\n },\n }))\n", "import { fadeAbgr } from '@jbrowse/bandage-core/renderer/colorBits'\nimport { strandSides } from '@jbrowse/bandage-core/util/geometry'\n\nimport type { ScreenTransform } from './keepInView'\nimport type { RenderBatch, Run } from '@jbrowse/bandage-core/renderer/types'\nimport type { Graph, NodeSegment } from '@jbrowse/bandage-core/types'\nimport type { EdgeSides } from '@jbrowse/bandage-core/util/geometry'\n\ntype Positions = Record<string, NodeSegment[]>\n\n// a link as one of its nodes sees it: the node at its other end, and which\n// end of that node it attaches to\ninterface Attachment {\n id: string\n side: EdgeSides['from']\n}\n\n// Morphs above this many nodes snap instead: each frame rebuilds the\n// geometry, which past it no longer fits a frame (GRAPH_SCALE_AND_LOD.md)\nexport const MORPH_MAX_NODES = 3000\nexport const MORPH_MS = 350\n// the most of the morph one frame may take, so a busy main thread delays\n// the motion rather than skipping it\nexport const MORPH_MAX_STEP_MS = 34\n\nfunction arcPrefix(line: NodeSegment[]) {\n const arc = [0]\n for (let i = 1; i < line.length; i++) {\n arc.push(\n arc[i - 1]! +\n Math.hypot(line[i]!.x - line[i - 1]!.x, line[i]!.y - line[i - 1]!.y),\n )\n }\n return arc\n}\n\n// `line` as `count` points spaced evenly along its length\nfunction resample(line: NodeSegment[], count: number): NodeSegment[] {\n if (line.length === 1 || count === 1) {\n return Array.from({ length: count }, () => ({ ...line[0]! }))\n }\n const arc = arcPrefix(line)\n const total = arc.at(-1)!\n const out: NodeSegment[] = []\n let j = 1\n for (let k = 0; k < count; k++) {\n const at = (total * k) / (count - 1)\n while (j < line.length - 1 && arc[j]! < at) {\n j++\n }\n const span = arc[j]! - arc[j - 1]!\n const f = span > 0 ? (at - arc[j - 1]!) / span : 0\n const a = line[j - 1]!\n const b = line[j]!\n out.push({ x: a.x + (b.x - a.x) * f, y: a.y + (b.y - a.y) * f })\n }\n return out\n}\n\n// The relaxation that places nodes new to a cut stops once no node moves a\n// tenth of a pixel, or at the sweep cap. Over-relaxed, a 3,000-node chain\n// shared every 30th node settles in 44 sweeps (~20 ms), where plain\n// Gauss-Seidel had not settled at 400; with only its two ends shared it runs\n// to the cap in ~50 ms.\nconst RELAX_SWEEPS = 400\nconst RELAX_OMEGA = 1.8\nconst RELAX_TOLERANCE_PX = 0.1\n\n// Where each node of `next` starts a morph from the drawing `prev` left on\n// screen. A node both share starts where it was drawn, carried through the\n// old transform onto the screen and back through the new one. A node new to\n// the drawing starts collapsed on one point, the mean of where its links\n// attach to its neighbours, so a new flank grows out of the node it hangs\n// from and a new allele out of the line between its two ends. Collapsing on\n// one neighbour stretched the link to the other across the pane: 289 px on\n// the first frame of a 2x bovine zoom-out, against 162 px this way.\n// Anything no shared node reaches starts where it ends. Each start has its\n// end's point count, so a frame is a pointwise blend.\nexport function morphStarts(\n prev: Positions,\n prevTransform: ScreenTransform,\n next: Positions,\n nextTransform: ScreenTransform,\n edges: Graph['edges'],\n): Positions {\n const toNext = (p: NodeSegment) => ({\n x:\n (p.x * prevTransform.scaleX +\n prevTransform.translateX -\n nextTransform.translateX) /\n nextTransform.scaleX,\n y:\n (p.y * prevTransform.scaleY +\n prevTransform.translateY -\n nextTransform.translateY) /\n nextTransform.scaleY,\n })\n const starts: Positions = {}\n for (const [id, line] of Object.entries(next)) {\n const before = prev[id]\n if (before?.length && line.length) {\n starts[id] = resample(before.map(toNext), line.length)\n }\n }\n\n const neighbours = new Map<string, Attachment[]>()\n const link = (id: string, other: Attachment) => {\n const list = neighbours.get(id)\n if (list) {\n list.push(other)\n } else {\n neighbours.set(id, [other])\n }\n }\n for (const edge of edges) {\n const { from, to } = edge\n if (from !== to && next[from]?.length && next[to]?.length) {\n const sides = strandSides(edge)\n link(from, { id: to, side: sides.to })\n link(to, { id: from, side: sides.from })\n }\n }\n\n const point = new Map<string, NodeSegment>()\n const attachedAt = (n: Attachment) =>\n point.get(n.id) ??\n (n.side === 'start' ? starts[n.id]![0]! : starts[n.id]!.at(-1)!)\n const queue = Object.keys(starts)\n const placed: string[] = []\n for (const id of queue) {\n for (const n of neighbours.get(id) ?? []) {\n if (starts[n.id] || point.has(n.id)) {\n continue\n }\n const back = neighbours.get(n.id)!.find(m => m.id === id)!\n point.set(n.id, { ...attachedAt(back) })\n queue.push(n.id)\n placed.push(n.id)\n }\n }\n // the sweep reads arrays: what the shared neighbours pull with is summed\n // once, and each placed node keeps the placed ones it links to by index\n const index = new Map(placed.map((id, i) => [id, i]))\n const px = new Float64Array(placed.map(id => point.get(id)!.x))\n const py = new Float64Array(placed.map(id => point.get(id)!.y))\n const pullX = new Float64Array(placed.length)\n const pullY = new Float64Array(placed.length)\n const links = placed.map((id, i) =>\n neighbours.get(id)!.flatMap(n => {\n const j = index.get(n.id)\n if (j === undefined) {\n const p = attachedAt(n)\n pullX[i]! += p.x\n pullY[i]! += p.y\n return []\n }\n return [j]\n }),\n )\n const degree = placed.map(id => neighbours.get(id)!.length)\n for (let sweep = 0; sweep < RELAX_SWEEPS; sweep++) {\n let moved = 0\n for (let i = 0; i < placed.length; i++) {\n let x = pullX[i]!\n let y = pullY[i]!\n for (const j of links[i]!) {\n x += px[j]!\n y += py[j]!\n }\n const dx = RELAX_OMEGA * (x / degree[i]! - px[i]!)\n const dy = RELAX_OMEGA * (y / degree[i]! - py[i]!)\n moved = Math.max(\n moved,\n Math.abs(dx * nextTransform.scaleX) +\n Math.abs(dy * nextTransform.scaleY),\n )\n px[i]! += dx\n py[i]! += dy\n }\n if (moved < RELAX_TOLERANCE_PX) {\n break\n }\n }\n placed.forEach((id, i) => {\n starts[id] = next[id]!.map(() => ({ x: px[i]!, y: py[i]! }))\n })\n for (const [id, line] of Object.entries(next)) {\n starts[id] ??= line.map(p => ({ ...p }))\n }\n return starts\n}\n\nfunction nearest(line: NodeSegment[], p: NodeSegment) {\n let best = 0\n let bestDistance = Infinity\n line.forEach((q, k) => {\n const d = (q.x - p.x) ** 2 + (q.y - p.y) ** 2\n if (d < bestDistance) {\n bestDistance = d\n best = k\n }\n })\n return best\n}\n\n// Where each deletion route starts: its end shape moved as its two nodes\n// move, each point by the blend of the displacements at the node points its\n// ends attach to. Routes are keyed by their link's index into `edges`.\nexport function routeStarts(\n routes: Record<number, NodeSegment[]>,\n edges: Graph['edges'],\n nodeStarts: Positions,\n nodeEnds: Positions,\n): Positions {\n const shift = (id: string, at: NodeSegment) => {\n const a = nodeStarts[id]\n const b = nodeEnds[id]\n if (!a || !b || b.length === 0) {\n return { x: 0, y: 0 }\n }\n const k = nearest(b, at)\n return { x: a[k]!.x - b[k]!.x, y: a[k]!.y - b[k]!.y }\n }\n return Object.fromEntries(\n Object.entries(routes).map(([key, line]) => {\n const edge = edges[Number(key)]\n const d0 = shift(edge?.from ?? '', line[0]!)\n const d1 = shift(edge?.to ?? '', line.at(-1)!)\n return [\n key,\n line.map((p, k) => {\n const f = line.length > 1 ? k / (line.length - 1) : 0\n return {\n x: p.x + d0.x + (d1.x - d0.x) * f,\n y: p.y + d0.y + (d1.y - d0.y) * f,\n }\n }),\n ]\n }),\n )\n}\n\n// The nodes a morph brings into the drawing, and how far they have faded in.\n// `layout` is the layout they are new to, so a frame left over from a morph\n// cut short fades nothing in the next.\nexport interface MorphEntering {\n layout: object\n ids: ReadonlySet<string>\n alpha: number\n}\n\n// Fades the strokes of entering nodes and of every link touching one, so a\n// link that starts long, from a new node to a far neighbour, is not seen\n// until the morph has drawn it in. The batch is built fresh each frame, so\n// its colours are rewritten in place.\nexport function fadeEntering(\n batch: RenderBatch,\n edges: Graph['edges'],\n { ids, alpha }: MorphEntering,\n) {\n const fade = (items: { color: number }[], run: Run | undefined) => {\n for (let k = 0; run && k < run.count; k++) {\n const item = items[run.start + k]!\n item.color = fadeAbgr(item.color, alpha)\n }\n }\n for (const id of ids) {\n fade(batch.nodeStrokes, batch.nodeStrokeRuns.get(id))\n }\n edges.forEach(({ from, to }, i) => {\n if (ids.has(from) || ids.has(to)) {\n fade(batch.edgeCurves, batch.edgeCurveRuns.get(i))\n fade(batch.arrows, batch.arrowRuns.get(i))\n }\n })\n}\n\nexport function easeInOut(t: number) {\n return t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2\n}\n\n// Writes the blend of `starts` and `ends` at `t` into `into` IN PLACE, the\n// way a node drag moves positions (settingActions' moveNode)\nexport function blendInto(\n into: Positions,\n starts: Positions,\n ends: Positions,\n t: number,\n) {\n for (const [id, line] of Object.entries(into)) {\n const a = starts[id]\n const b = ends[id]\n if (!a || !b) {\n continue\n }\n line.forEach((p, k) => {\n p.x = t === 1 ? b[k]!.x : a[k]!.x + (b[k]!.x - a[k]!.x) * t\n p.y = t === 1 ? b[k]!.y : a[k]!.y + (b[k]!.y - a[k]!.y) * t\n })\n }\n}\n", "import {\n FACET_GAP_PX,\n FACET_PAD_PX,\n facetCells,\n facetGrid,\n} from '@jbrowse/bandage-core/facetGrid'\nimport { figureSvg } from '@jbrowse/bandage-core/figure'\nimport { figureSpecSettings } from '@jbrowse/bandage-core/figureSettings'\nimport { rowLabelBox } from '@jbrowse/bandage-core/graphLabels'\nimport {\n LEGEND_INSET_PX,\n layoutLabels,\n} from '@jbrowse/bandage-core/labelLayout'\nimport {\n boxesGenes,\n rowPitch,\n walkRowReadout,\n} from '@jbrowse/bandage-core/layout/walkRowDraw'\nimport {\n walkRowLabels,\n walkRowsExtent,\n} from '@jbrowse/bandage-core/layout/walkRowLayout'\nimport { layoutModeByValue } from '@jbrowse/bandage-core/layoutModes'\nimport {\n FIT_PADDING,\n drawingBounds,\n fitTransform,\n} from '@jbrowse/bandage-core/pipeline'\nimport { buildGeometry } from '@jbrowse/bandage-core/renderer/GeometryBuilder'\nimport { getDpr } from '@jbrowse/bandage-core/renderer/canvas'\nimport { layoutGeometryInputs } from '@jbrowse/bandage-core/renderer/geometryInputs'\nimport {\n GENE_ROW_PX,\n tubeMapGeneRows,\n} from '@jbrowse/bandage-core/tubeMap/genes'\nimport { padded } from '@jbrowse/bandage-core/viewport'\nimport { walkPosition } from '@jbrowse/bandage-core/walkKey'\nimport {\n expandTabixShorthand,\n readConfObject,\n} from '@jbrowse/core/configuration'\nimport { getSession } from '@jbrowse/core/util'\nimport { untracked } from 'mobx'\n\nimport { SECTION_HEADER_PX, sectionPlacement } from '../walkRowGroups'\nimport { withHostViews } from './hostViews'\nimport { fadeEntering } from './morph'\nimport {\n MAX_CANVAS_HEIGHT,\n MIN_CANVAS_HEIGHT,\n MIN_FIT_TUBE_PX,\n PAPER,\n SELECT_BRIGHTEN,\n VIEWPORT_PANES_BUILT,\n dependOn,\n paneViewportOf,\n uriOf,\n} from './paneBase'\n\nimport type { FacetGrid, FacetSetting } from '@jbrowse/bandage-core/facetGrid'\nimport type {\n GeneGaps,\n RowPitch,\n} from '@jbrowse/bandage-core/layout/walkRowDraw'\nimport type { Renderer } from '@jbrowse/bandage-core/renderer/types'\nimport type { LiftedWalk, WalkLift } from '@jbrowse/bandage-core/walkHighlight'\nimport type { FileLocation } from '@jbrowse/core/util/types'\n\nexport const TOOLTIP_INSET_PX = 8\nexport const FACET_KEY_ROW_PX = 19\n// the facet key line and the grid gap above it\nexport const FACET_KEY_PX = FACET_GAP_PX + FACET_KEY_ROW_PX\n// a two-line tooltip and its inset\nconst TOOLTIP_ROOM_PX = 48\n\nexport function walkRowGeneKey(\n pitch: RowPitch | undefined,\n hasGenes: boolean,\n gaps: GeneGaps | undefined,\n): GeneGaps | undefined {\n if (!pitch || !hasGenes) {\n return undefined\n }\n return boxesGenes(pitch.rowPx, pitch.barPx)\n ? gaps\n : { untracked: 0, unread: 0, ...gaps, crowded: true }\n}\n\nexport const withFitViews = withHostViews\n .views(self => ({\n // `paneHeight` replaces the built-in ceiling rather than adding a second\n // clamp under it, and the floor still wins: a pane shorter than\n // MIN_CANVAS_HEIGHT leaves no room to hover a node and read its tooltip,\n // which is the reason that floor exists.\n get paneCeiling(): number {\n return Math.max(MIN_CANVAS_HEIGHT, self.paneHeight ?? MAX_CANVAS_HEIGHT)\n },\n // the height a fit fills: a track's own, or the pane's ceiling\n get fitRoom(): number {\n return self.host ? this.canvasHeight : this.paneCeiling\n },\n // Walk rows pack to fill the pane, as the strip does, so every walk of a\n // cohort is on screen; rows too thin to letter put their names and\n // readouts on hover\n get walkRowPitch(): RowPitch | undefined {\n const bars = self.walkRowBars\n if (!bars) {\n return undefined\n }\n const room = this.fitRoom\n const headersPx =\n (self.walkRowGroups?.sections.length ?? 0) * SECTION_HEADER_PX\n return rowPitch(\n bars.rows.length + 1,\n room - this.fitPadTopBase - FIT_PADDING - headersPx,\n )\n },\n // Where each walk row and section header sits at the rows' pitch\n get walkRowPlacement() {\n const pitch = this.walkRowPitch\n return pitch\n ? sectionPlacement(self.walkRowGroups?.sections ?? [], pitch.rowPx)\n : undefined\n },\n // What the walk-rows key says of genes: where they went unread, or one\n // note that rows this thin box none, as the walk strip's key says\n get walkRowGeneKey() {\n return walkRowGeneKey(\n this.walkRowPitch,\n !!self.walkRowGenes?.size,\n self.walkRowGeneGaps,\n )\n },\n // Walk rows label from the bars themselves, which follow the selected\n // repeat and sample filter that the layout, run once per cut, cannot\n get drawnRowLabels() {\n const place = this.walkRowPlacement\n const labels = walkRowLabels(\n self.walkRowBars,\n self.layoutResult,\n this.walkRowPitch,\n )\n return self.walkRowBars && place\n ? labels.map((l, i) => ({ ...l, y: place.rowY(i) }))\n : labels\n },\n // The row labels on the canvas, each at its pane px `top`. A row scrolled\n // out is dropped rather than clamped to the edge, so a label never points\n // at a row that is not there.\n get visibleRowLabels() {\n return this.drawnRowLabels.flatMap(({ label, y }) => {\n const top = self.toScreen({ x: 0, y }).y\n return top >= 0 && top <= this.canvasHeight ? [{ label, y, top }] : []\n })\n },\n // The row labels are pinned to the pane's left edge, so the fit starts\n // the drawing past the widest one.\n get fitPadLeft() {\n return Math.max(\n FIT_PADDING,\n ...this.drawnRowLabels.map(r => rowLabelBox(r.label, 0).x1 + 6),\n )\n },\n // Extent of the drawing in layout units, shared by the pane height and\n // zoomToFit. On a reference-bp layout x is the cut window rather than\n // how far the drawing reaches: an allele anchored far outside it is a\n // fact about the graph, not a reason to draw the window at 6% of the\n // frame. Walk rows reach as far as\n // the bars on screen, which a repeat pick or a sample filter narrows\n // after the layout ran.\n get layoutBounds() {\n const layout = self.layoutResult\n const bars = self.walkRowBars\n const rowsExtent =\n bars && layout?.extent\n ? walkRowsExtent(bars, this.walkRowPitch)\n : undefined\n return layout\n ? drawingBounds(layout, {\n region: self.graphRegion,\n extent: rowsExtent && {\n ...rowsExtent,\n maxY: rowsExtent.maxY + (this.walkRowPlacement?.headersPx ?? 0),\n },\n })\n : undefined\n },\n // What a hovered row's label and readout would say, while its rows are\n // too thin to draw them\n get hoveredWalkRowText() {\n const bars = self.walkRowBars\n const name = self.hoveredWalkRow\n if (!bars || name === null || this.walkRowPitch?.readouts !== false) {\n return undefined\n }\n const isReference = bars.reference.name === name\n const row = isReference\n ? bars.reference\n : bars.rows.find(r => r.name === name)\n return row\n ? {\n label: row.label,\n readout: walkRowReadout(\n row,\n isReference ? undefined : bars.reference,\n bars.unit,\n row.call,\n ),\n }\n : undefined\n },\n // The walk row under a pane point, as its index among the reference row\n // and the rows below it, where the point is on its bar\n walkRowAt(screenX: number, screenY: number) {\n const bars = self.walkRowBars\n const pitch = this.walkRowPitch\n const place = this.walkRowPlacement\n if (!bars || !pitch || !place) {\n return undefined\n }\n const i = place.rowAt(\n (screenY - self.translateY) / self.scaleY,\n bars.rows.length + 1,\n )\n const row = [bars.reference, ...bars.rows][i]\n const y = place.rowY(i) * self.scaleY + self.translateY\n const bp = (screenX - self.translateX) / self.scaleX - bars.origin\n return row &&\n Math.abs(screenY - y) <= pitch.barPx / 2 + 2 &&\n bp >= 0 &&\n bp <= row.bp\n ? i\n : undefined\n },\n // Room over a tube map for the rows its genes need, one inside the\n // padding and one more for each further gene that overlaps it, and\n // room for the reference strip\n get fitPadTopBase() {\n const rows = tubeMapGeneRows(self.tubeMapGenes)\n return (\n FIT_PADDING +\n Math.max(0, rows - 1) * GENE_ROW_PX +\n self.referenceStripZonePx\n )\n },\n // The fit draws nothing under the legend. It leaves the legend room on\n // the side that costs the drawing less scale: beside a tall drawing,\n // which has width to spare, or above a wide flat one, which takes the\n // height instead. A drawing whose x the host places can only move down.\n // Reads get no room: their letters, and the legend row naming them, come\n // and go with the fit's scale.\n get legendRoom(): 'right' | 'top' | undefined {\n const bounds = this.layoutBounds\n const { width, height } = self.legendSize\n if (\n !bounds ||\n bounds.w <= 0 ||\n width === 0 ||\n self.facetPanels ||\n self.tubeMapReads\n ) {\n return undefined\n }\n if (self.hostPlacesX) {\n return 'top'\n }\n const base = this.fitPadTopBase\n const room = this.fitRoom\n const across = (padRight: number) =>\n (self.paneWidth - this.fitPadLeft - padRight) / bounds.w\n const down = (padTop: number) =>\n self.pixelRows\n ? bounds.h + padTop + FIT_PADDING <= room\n ? Infinity\n : 0\n : (room - padTop - FIT_PADDING) / bounds.h\n const beside = Math.min(across(width + 2 * LEGEND_INSET_PX), down(base))\n const above = Math.min(\n across(FIT_PADDING),\n down(base + height + LEGEND_INSET_PX),\n )\n return above >= beside ? 'top' : 'right'\n },\n get fitPadTop() {\n return (\n this.fitPadTopBase +\n (this.legendRoom === 'top'\n ? self.legendSize.height + LEGEND_INSET_PX\n : 0)\n )\n },\n get fitPadRight() {\n return this.legendRoom === 'right'\n ? Math.max(FIT_PADDING, self.legendSize.width + 2 * LEGEND_INSET_PX)\n : FIT_PADDING\n },\n // A tube map on its own axis reads by panning along it, as in\n // sequenceTubeMap. Rather than shrink a long cut to a strip, the fit\n // stops where its tubes are MIN_FIT_TUBE_PX wide, or at whatever fits\n // the tallest pane, with the cut's left end on screen.\n get minFitScale() {\n const bounds = this.layoutBounds\n const layout = self.layoutResult\n const tubePx = layout?.tubeMap?.layout.tracks[0]?.width\n return bounds && bounds.h > 0 && tubePx && !layout.referenceAxis\n ? Math.min(\n MIN_FIT_TUBE_PX / tubePx,\n (this.paneCeiling - this.fitPadTop - FIT_PADDING) / bounds.h,\n )\n : 0\n },\n // The facet as a spec writes it: the bare field while nothing else is\n // written, the whole setting otherwise, and nothing while off\n get facetSpec(): string | FacetSetting | undefined {\n const { field, domain, columns } = self.facetSetting\n return field === ''\n ? undefined\n : domain.length === 0 && columns === undefined\n ? field\n : {\n field,\n domain: [...domain],\n ...(columns === undefined ? {} : { columns }),\n }\n },\n // Which grid cell each panel takes; see facetCells\n get facetPlacement() {\n const panels = self.facetPanels\n const { field, domain } = self.facetSetting\n return panels\n ? facetCells(\n panels.map(p => p.walks[0]!.name),\n self.hostPlacesX || field === '' ? 'walk' : field,\n domain,\n )\n : undefined\n },\n // How the facet panels tile the pane in `room` px. A track whose x the\n // linear view places stacks full-width panels so each keeps that x.\n facetGridIn(room: number): FacetGrid | undefined {\n const place = this.facetPlacement\n const bounds = this.layoutBounds\n return place && bounds && bounds.w > 0\n ? facetGrid({\n count: place.count,\n bounds,\n pixelRows: self.pixelRows,\n width: self.paneWidth,\n room,\n columns: self.hostPlacesX\n ? 1\n : (place.columns ?? self.facetSetting.columns),\n })\n : undefined\n },\n // the facet grid's room leaves the key line under it\n get facetGrid() {\n return this.facetGridIn(this.fitRoom - FACET_KEY_PX)\n },\n // The hover tooltip's distance from the pane's right edge: in the corner,\n // unless the legend reaches down into its room, and then beside it. A\n // faceted pane mounts no legend, so its last measured size is stale.\n get tooltipRightPx() {\n const { width, height } = self.legendSize\n const legendBottom = LEGEND_INSET_PX + self.referenceStripZonePx + height\n return !self.facetPanels &&\n width > 0 &&\n legendBottom > this.canvasHeight - TOOLTIP_ROOM_PX\n ? width + 2 * LEGEND_INSET_PX\n : TOOLTIP_INSET_PX\n },\n // The pane is as tall as the drawing, rather than a fixed box the drawing\n // floats in. A row layout's rows are px, so its height is a sum; an\n // isotropic layout has no height of its own and takes its aspect ratio\n // at the width's fit. Neither reads `scale`, so the fit reads this\n // without feeding back into it.\n get canvasHeight(): number {\n const bounds = this.layoutBounds\n const ceiling = this.paneCeiling\n if (!bounds) {\n return ceiling\n }\n const grid = this.facetGrid\n if (grid) {\n return Math.max(MIN_CANVAS_HEIGHT, grid.total + FACET_KEY_PX)\n }\n // never shorter than the legend, which a flat drawing would clip\n const floor = Math.max(\n MIN_CANVAS_HEIGHT,\n self.legendSize.height +\n 2 * LEGEND_INSET_PX +\n self.referenceStripZonePx,\n )\n const pads = this.fitPads\n const padsY = pads.top + pads.bottom\n if (self.pixelRows) {\n return Math.min(ceiling, Math.max(floor, bounds.h + padsY))\n }\n const usableWidth = self.paneWidth - pads.left - pads.right\n return bounds.w > 0 && usableWidth > 0\n ? Math.min(\n ceiling,\n Math.max(\n floor,\n bounds.h * Math.max(usableWidth / bounds.w, this.minFitScale) +\n padsY,\n ),\n )\n : ceiling\n },\n // What the transform maps the drawing into: one facet panel while the\n // pane is faceted, since every panel shares it, else the pane\n get viewBox() {\n const grid = this.facetGrid\n return grid\n ? { width: grid.width, height: grid.height }\n : { width: self.paneWidth, height: this.canvasHeight }\n },\n // The fit's margins: a facet panel's all round, else room for the row\n // labels, the genes and strip above, and the legend where legendRoom\n // puts it\n get fitPads() {\n return this.facetGrid\n ? {\n left: FACET_PAD_PX,\n top: FACET_PAD_PX,\n right: FACET_PAD_PX,\n bottom: FACET_PAD_PX,\n }\n : {\n left: this.fitPadLeft,\n top: this.fitPadTop,\n right: this.fitPadRight,\n bottom: FIT_PADDING,\n }\n },\n // the view box's height inside the fit's margins\n get usableHeight() {\n const { top, bottom } = this.fitPads\n return this.viewBox.height - top - bottom\n },\n // Where the fit puts the drawing, or undefined until there is a layout\n // and a measured canvas to fit it into\n get fittedTransform() {\n const bounds = this.layoutBounds\n const { width, height } = this.viewBox\n const pads = this.fitPads\n return bounds\n ? fitTransform(bounds, width, height, self.pixelRows, {\n minScale: this.facetGrid ? 0 : this.minFitScale,\n padLeft: pads.left,\n padTop: pads.top,\n padRight: pads.right,\n padBottom: pads.bottom,\n })\n : undefined\n },\n }))\n .views(self => ({\n // The window the transform shows plus a pane of overscan all round,\n // which a pan inside needs no rebuild for\n viewportToBuild() {\n return padded(paneViewportOf(self), VIEWPORT_PANES_BUILT)\n },\n // The selection as a draw-time colour override, keyed by node so it\n // survives a rebuild renumbering the batch. The hover is paintHover's,\n // on a layer of its own.\n applySelection(b: Renderer) {\n const id = self.selectedNode\n b.setNodeHighlights(\n id === null ? new Map() : new Map([[id, SELECT_BRIGHTEN]]),\n )\n },\n // the hovered node, unless the selection already lights it\n get hoverLayerNode() {\n const { litNode, selectedNode } = self\n return litNode === selectedNode ? null : litNode\n },\n // getDpr(), never a bare `devicePixelRatio`: it is capped at MAX_DPR so\n // this canvas costs what every other canvas in the app costs on a 3x\n // display, and it is the same read `syncCanvasSize` sizes the backing\n // store with \u2014 two call sites reading the global separately can\n // disagree, and then the geometry lands at a different scale from the\n // canvas under it.\n get paintTransform() {\n const dpr = getDpr()\n return {\n scaleX: self.scaleX * dpr,\n scaleY: self.scaleY * dpr,\n translateX: self.translateX * dpr,\n translateY: self.translateY * dpr,\n // the thicknesses in the vertex buffer are css px, expanded after\n // this transform, so they need the same ratio\n dpr,\n }\n },\n }))\n .views(self => ({\n // Draws the uploaded batch through the pane's transform\n paint(b: Renderer) {\n b.updateTransform(self.paintTransform)\n // Clear under a reference strip: GraphCanvas lays the paper below the\n // strip, so the linear view's gridlines show through between its blocks\n b.render(self.referenceStripShown ? [0, 0, 0, 0] : PAPER)\n },\n }))\n .views(self => ({\n // The drawing's batch with `highlight`'s walks lifted, for the window\n // the transform shows. A caller's autorun rebuilds it when the window\n // settles after a pan or zoom, when a drag moves the positions, and when\n // any display option read here changes.\n buildDrawing(highlight: WalkLift | undefined, drawPaths: boolean) {\n const { graph, nodeById, layoutResult, deletionDrawing } = self\n if (!graph || !nodeById || !layoutResult || !deletionDrawing) {\n return undefined\n }\n dependOn(self.viewportDirty, self.positionsVersion)\n const viewportBounds = untracked(() => self.viewportToBuild())\n const batch = buildGeometry({\n // walk rows' overlay draws every bar, the reference's among them;\n // its nodes stay in the hit index, so hovering the bar finds them\n ...layoutGeometryInputs(layoutResult, deletionDrawing, {\n drawsRows: !!self.walkRowBars,\n }),\n graph,\n nodeById,\n colorScheme: self.effectiveColorScheme,\n contigThickness: self.contigThickness,\n connectorThickness: self.connectorThickness,\n drawPaths,\n nodeWidth: self.nodeWidth,\n highlight,\n // Untracked, so a zoom does not eagerly rebuild geometry \u2014 the\n // debounced viewportDirty bump drives the scale-dependent rebuild\n // (flatness, arrow visibility, viewport culling), same as pan.\n axis: untracked(() => self.axisScale),\n linearLayout: self.linearLayout,\n viewportBounds,\n // Held against the graph rather than derived here, the same way the\n // deletion drawing is and for the same reason \u2014 see `drawnReferenceRamp`.\n referenceRamp: self.referenceRamp,\n // passed so the shared edge-curve cache can tell a drag from a pan\n version: self.positionsVersion,\n })\n const entering = self.morphEntering\n if (entering?.layout === layoutResult) {\n fadeEntering(batch, graph.edges, entering)\n }\n return { batch, viewportBounds }\n },\n get overlayLabels() {\n return layoutLabels(self)\n },\n // where the hovered node sits on a lifted walk, while one is hovered\n hoveredOn(walk: LiftedWalk) {\n const id = self.hoveredNode\n const node = id ? self.nodeById?.get(id) : undefined\n return node\n ? (walkPosition(walk, node.id, node.length) ?? 'not on this walk')\n : undefined\n },\n // The spec bandage-figure makes this drawing from with no browser, or\n // undefined for a graph it cannot read again: one cut from a gbz-base\n // track or read from a GFA url, with the genes of a GFF3 tabix track\n figureSpec() {\n const region = self.graphRegion\n const adapter = self.sourceAdapter\n const panSN = adapter?.assemblyNameToPanSN as\n Record<string, string> | undefined\n const window = region && `${region.refName}:${region.start}-${region.end}`\n const gfa = uriOf(self.sourceGfaLocation)\n const db =\n adapter?.type === 'GbzBaseSyntenyAdapter'\n ? uriOf(adapter.gbzDbLocation as FileLocation)\n : undefined\n const source = gfa\n ? { gfa, region: window }\n : db && region && window\n ? {\n gbz: {\n db,\n index: uriOf(adapter!.haplotypeIndexLocation as FileLocation),\n region: window,\n // the adapter cuts a lane by its PanSN prefix\n haplotypes: self.cutHaplotypes?.map(\n lane => panSN?.[lane] ?? lane,\n ),\n referenceSample:\n (adapter!.referenceSample as string | undefined) ||\n panSN?.[region.assemblyName] ||\n region.assemblyName,\n context: adapter!.context as number | undefined,\n snarls: self.cutsWholeWalks\n ? 'overlapping'\n : (adapter!.subgraphSnarls as string | undefined),\n },\n }\n : undefined\n if (!source) {\n return undefined\n }\n const geneTrack = self.showGenes ? self.geneTrack : undefined\n const geneConf = geneTrack\n ? getSession(self).tracks.find(t => t.trackId === geneTrack.trackId)\n : undefined\n const geneAdapter = geneConf\n ? expandTabixShorthand(\n readConfObject(geneConf, 'adapter') as Record<string, unknown>,\n 'gffGzLocation',\n )\n : undefined\n const genes =\n geneAdapter?.type === 'Gff3TabixAdapter'\n ? {\n file: uriOf(geneAdapter.gffGzLocation as FileLocation),\n index: uriOf(\n (geneAdapter.index as { location?: FileLocation } | undefined)\n ?.location,\n ),\n format: 'gff3',\n }\n : undefined\n return JSON.parse(\n JSON.stringify({\n ...source,\n genes: genes?.file && genes.index ? genes : undefined,\n referencePath: self.referencePath || undefined,\n layout: self.chosenLayoutMode,\n ...figureSpecSettings({\n engine: self.layoutEngine,\n quality: self.layoutQuality,\n linearLayout: self.linearLayout,\n bubbleSpread: self.bubbleSpread,\n showDeletionEdges: self.showDeletionEdges,\n colorScheme: self.chosenColorScheme,\n nodeWidth: self.nodeWidth,\n contigThickness: self.contigThickness,\n connectorThickness: self.connectorThickness,\n colorDomain: self.statedColorDomain,\n }),\n walks: self.walkLayers.length\n ? self.walkLayers.map(l => (l.color ? l : l.walk))\n : undefined,\n facet: self.walkLayers.length > 1 ? self.facetSpec : undefined,\n walkStrip: self.walkStripShown || undefined,\n walkRowSamples: self.walkStripShown ? self.walkRowSamples : undefined,\n width: self.paneWidth,\n height: self.paneCeiling,\n }),\n ) as Record<string, unknown>\n },\n // Why the drawing cannot be written as SVG, which draws the canvas's\n // nodes, or walk rows' bars\n get figureUnavailable() {\n return !self.layoutResult\n ? 'Nothing is drawn yet'\n : self.walkRowGroups\n ? 'The SVG export cannot group walk rows yet: set Group by... to None first'\n : self.drawsNodes || self.walkRowBars\n ? undefined\n : `${layoutModeByValue(self.chosenLayoutMode).label} draws a picture of its own, which the SVG export does not`\n },\n // Why bandage-figure can't make this drawing again: it draws only\n // layouts with nodes, from a graph it can read for itself\n get figureSpecUnavailable() {\n return !self.drawsNodes\n ? `bandage-figure draws no ${layoutModeByValue(self.chosenLayoutMode).label} layout`\n : this.figureSpec()\n ? undefined\n : 'bandage-figure reads a graph cut from a gbz-base track or a GFA url'\n },\n // The drawing as a standalone SVG, fitted, with its genes, its lifted\n // walks' keys, facet panels and the strip of walk rows; see figureSvg\n figure() {\n const { graph, layoutResult } = self\n return graph && layoutResult && !this.figureUnavailable\n ? figureSvg(graph, layoutResult, {\n width: self.paneWidth,\n height: self.paneCeiling,\n walks: self.walkLayers,\n facet: self.facetSpec,\n colorScheme: self.effectiveColorScheme,\n nodeWidth: self.nodeWidth,\n showDeletionEdges: self.showDeletionEdges,\n linearLayout: self.linearLayout,\n contigThickness: self.contigThickness,\n connectorThickness: self.connectorThickness,\n region: self.graphRegion,\n colorDomain: self.statedColorDomain,\n genes: self.showGenes ? self.backboneGenes : undefined,\n walkRows: self.walkRowBars,\n walkRowPitch: self.walkRowPitch,\n rowGenes: self.walkRowGenes,\n rowGeneGaps: self.walkRowGeneGaps,\n walkStrip: self.walkStripRows && {\n rows: self.walkStripRows,\n rowGenes: self.walkRowGenes,\n rowGeneGaps: self.walkRowGeneGaps,\n },\n // the SVG carries the spec only where the spec draws this same\n // picture: one of nodes (figureSpecUnavailable)\n spec: self.drawsNodes ? this.figureSpec() : undefined,\n })\n : undefined\n },\n }))\n", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M3 16h5v-2H3zm6.5 0h5v-2h-5zm6.5 0h5v-2h-5zM3 20h2v-2H3zm4 0h2v-2H7zm4 0h2v-2h-2zm4 0h2v-2h-2zm4 0h2v-2h-2zM3 12h8v-2H3zm10 0h8v-2h-8zM3 4v4h18V4z\"\n}), 'LineStyle');", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M9.01 14H2v2h7.01v3L13 15l-3.99-4zm5.98-1v-3H22V8h-7.01V5L11 9z\"\n}), 'CompareArrows');", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M17 5h-2V3h2zm-2 16h2v-2.59L19.59 21 21 19.59 18.41 17H21v-2h-6zm4-12h2V7h-2zm0 4h2v-2h-2zm-8 8h2v-2h-2zM7 5h2V3H7zM3 17h2v-2H3zm2 4v-2H3c0 1.1.9 2 2 2M19 3v2h2c0-1.1-.9-2-2-2m-8 2h2V3h-2zM3 9h2V7H3zm4 12h2v-2H7zm-4-8h2v-2H3zm0-8h2V3c-1.1 0-2 .9-2 2\"\n}), 'HighlightAlt');", "import { regionLabel } from '@jbrowse/bandage-core/hoverText'\nimport CompareArrowsIcon from '@mui/icons-material/CompareArrows'\nimport HighlightAltIcon from '@mui/icons-material/HighlightAlt'\nimport LineStyleIcon from '@mui/icons-material/LineStyle'\n\nimport type { Contributor, GraphLocation } from './contributors'\nimport type { LaunchableSyntenyTrack } from './syntenyTracks'\nimport type { MenuItem } from '@jbrowse/core/ui'\n\nconst LINEAR_LABEL = 'Linear genome view'\nconst SYNTENY_LABEL = 'Linear synteny view'\nconst NO_SYNTENY_TRACK =\n 'No synteny track in this session aligns these assemblies'\n\nexport interface LinearTarget {\n location: GraphLocation\n assembly: string\n}\n\n// One flat item when there is one thing to open, a submenu when there is a\n// choice. Same shape as subgraphMenuItems uses in the other direction, so the\n// two ends of the graph <-> linear trip read the same way.\nfunction oneOrMany<T>({\n label,\n icon,\n entries,\n entryLabel,\n onSelect,\n disabledHelpText,\n nameTheOnlyEntry = true,\n}: {\n label: string\n icon: React.ElementType\n entries: T[]\n entryLabel: (entry: T) => string\n onSelect: (entry: T) => () => void\n disabledHelpText?: string\n // Whether a lone entry's name is worth appending to the item. It is when the\n // entry is where you land (`GRCh38 chr6:31,980,000-32,050,000`) and not when\n // it is the ingredient used to get there \u2014 a synteny track's name says\n // nothing the item does not already say, and reading it costs the width of\n // `pggb graph: all-vs-all synteny (wfmash)`.\n nameTheOnlyEntry?: boolean\n}): MenuItem[] {\n const [first] = entries\n // Nothing to open: a *disabled* item with the reason in its tooltip, when\n // there is a reason worth reading. An item that vanishes teaches nobody that\n // the session is one synteny track short of a multi-genome view.\n const empty: MenuItem[] = disabledHelpText\n ? [{ label, icon, disabled: true, disabledHelpText, onClick: () => {} }]\n : []\n return entries.length === 0\n ? empty\n : entries.length === 1 && first\n ? [\n {\n label: nameTheOnlyEntry ? `${label} \u2014 ${entryLabel(first)}` : label,\n icon,\n onClick: onSelect(first),\n },\n ]\n : [\n {\n label,\n icon,\n type: 'subMenu',\n subMenu: entries.map(entry => ({\n label: entryLabel(entry),\n onClick: onSelect(entry),\n })),\n },\n ]\n}\n\n// The graph's way out: a linear view of any assembly the graph names here, and a\n// synteny view of all of them at once. Until this existed the triangle had two\n// edges \u2014 a linear view could open a graph or a synteny view of a locus, and the\n// graph could open nothing at all.\n//\n// `contributors` are already resolved against the session's assemblies. On an\n// E. coli pangenome every strain is its own assembly, so all of them appear and\n// the synteny item is the interesting one; on an HPRC graph the 400-odd\n// contributing haplotypes are not loaded assemblies and only the reference\n// appears, which is the honest answer rather than a missing feature.\nexport function graphLaunchMenuItems({\n contributors,\n syntenyTracks,\n onShowLinear,\n onShowSynteny,\n}: {\n contributors: Contributor[]\n syntenyTracks: LaunchableSyntenyTrack[]\n onShowLinear: (target: LinearTarget) => void\n onShowSynteny: (trackId: string) => void\n}): MenuItem[] {\n // sorted widest first\n const widest = syntenyTracks[0]?.coverage ?? contributors.length\n return [\n ...oneOrMany({\n label: LINEAR_LABEL,\n icon: LineStyleIcon,\n entries: contributors,\n entryLabel: c => `${c.sample} ${regionLabel(c)}`,\n onSelect: c => () => {\n onShowLinear({ location: c, assembly: c.sample })\n },\n }),\n ...(contributors.length >= 2\n ? oneOrMany({\n // the count the launch opens, which is what the widest track aligns\n // and not always every contributor; see launchSyntenyView\n label: `${SYNTENY_LABEL} (${widest} assemblies)`,\n icon: CompareArrowsIcon,\n entries: syntenyTracks,\n entryLabel: track =>\n track.coverage < widest\n ? `${track.name} (${track.coverage} of ${widest})`\n : track.name,\n nameTheOnlyEntry: false,\n disabledHelpText: NO_SYNTENY_TRACK,\n onSelect: track => () => {\n onShowSynteny(track.trackId)\n },\n })\n : []),\n ]\n}\n\n// A single node's way out, for the node context menu. Two different questions,\n// both worth offering:\n//\n// - the node's own coordinates, on the assembly that contributed it. Exact,\n// from the node's SN/SO, and available at every rank \u2014 but only openable\n// when that assembly is loaded, which for an HPRC haplotype it is not.\n// - where the node sits on the reference the graph was cut against. Always\n// openable, and off the backbone it is the flanking projection rather than\n// an exact span (see nodeReferenceSpan), so it is labelled as the region\n// around the node rather than as the node.\n//\n// Labels are verbs. Review: \"the lineargenomeview menu item should say launch\n// if that is what it does\" \u2014 a bare `Linear genome view \u2014 hg38 chr6:\u2026` names a\n// place and leaves the reader to guess whether clicking scrolls the view beside\n// the graph or opens a new one. It does the first when there is one to scroll\n// (see showInLinearView), so \"Open in\" covers both without claiming a launch.\n//\n// Verb, assembly, and where \u2014 nothing else. Every word here is read inside a\n// menu opened on a node, so \"this node in the hg38 view\" and \"in linear view\"\n// restate the context they are already in; what a coordinate opens in is not in\n// question, and the assembly name is.\n//\n// Flat, not under a \"Launch view\" submenu: this menu is a handful of items and\n// every one is contextual to the node just clicked.\nexport function nodeLaunchMenuItems({\n own,\n reference,\n highlight,\n onShowLinear,\n onHighlight,\n}: {\n own: LinearTarget | undefined\n reference: LinearTarget | undefined\n // the node's exact reference span, where `reference` is padded to open on\n highlight: LinearTarget | undefined\n onShowLinear: (target: LinearTarget) => void\n // absent when no linear view in the session is this graph's to mark\n onHighlight?: (target: LinearTarget) => void\n}): MenuItem[] {\n const entries = [\n own\n ? {\n label: `Open in ${own.assembly} \u2014 ${regionLabel(own.location)}`,\n target: own,\n }\n : undefined,\n // Only when it says something the item above doesn't. A backbone segment on\n // a loaded reference answers both questions with the same assembly and\n // nearly the same span, and offering that twice reads as two different\n // places to go.\n reference && reference.assembly !== own?.assembly\n ? {\n label: `Open in ${reference.assembly} \u2014 around this node`,\n target: reference,\n }\n : undefined,\n ].filter(entry => entry !== undefined)\n\n // The reference projection, not the node's own coordinates: a highlight is\n // drawn in the linear view already on screen, and that view is on the\n // reference the subgraph was cut from.\n return [\n ...(onHighlight && highlight\n ? [\n {\n label: `Highlight in ${highlight.assembly}`,\n icon: HighlightAltIcon,\n onClick: () => {\n onHighlight(highlight)\n },\n },\n ]\n : []),\n ...entries.map(({ label, target }) => ({\n label,\n icon: LineStyleIcon,\n onClick: () => {\n onShowLinear(target)\n },\n })),\n ]\n}\n", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M19 15.18V7c0-2.21-1.79-4-4-4s-4 1.79-4 4v10c0 1.1-.9 2-2 2s-2-.9-2-2V8.82C8.16 8.4 9 7.3 9 6c0-1.66-1.34-3-3-3S3 4.34 3 6c0 1.3.84 2.4 2 2.82V17c0 2.21 1.79 4 4 4s4-1.79 4-4V7c0-1.1.9-2 2-2s2 .9 2 2v8.18c-1.16.41-2 1.51-2 2.82 0 1.66 1.34 3 3 3s3-1.34 3-3c0-1.3-.84-2.4-2-2.82\"\n}), 'Route');", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6\"\n}), 'Settings');", "\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5M12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5m0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3\"\n}), 'Visibility');"],
5
+ "mappings": "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",
6
+ "names": ["host", "read", "name", "createSvgIcon", "SvgIcon_default", "orientToReference", "graph", "positions", "backbone", "node", "isBackbone", "points", "segments", "mid", "weight", "sum", "p", "cx", "cy", "cr", "sxr", "syr", "angle", "c", "s", "out", "id", "x", "y", "below", "above", "LANE_GAP", "referenceSeeds", "graph", "scaling", "opts", "drawn", "node", "drawnNodeLength", "drawnOf", "id", "backbone", "isBackbone", "a", "b", "seeds", "x", "adjacent", "buildNeighbors", "depth", "queue", "at", "next", "neighbour", "unreached", "seededNodes", "STEP_TURN", "turnAt", "line", "i", "a", "b", "c", "t", "centripetal", "p0", "p1", "p2", "p3", "u", "knot", "t1", "t2", "t3", "lerp", "ta", "tb", "f", "a1", "a2", "a3", "reflect", "p", "about", "smoothChain", "out", "steps", "s", "ROUTE_FRACTION", "withDeletionRoutes", "graph", "deletions", "dropped", "routes", "d", "ROUTE_ID", "edges", "edge", "ei", "id", "fromStrand", "toStrand", "routeNodes", "drawnOf", "opts", "lengths", "n", "skipped", "sum", "id2", "drawn", "takeRoutes", "positions", "nodePositions", "deletionRoutes", "edgeIndex", "route", "parseTag", "tag", "tags", "nameEnd", "typeEnd", "name", "type", "val", "parseTags", "fields", "field", "stableCoordinate", "node", "SN", "SO", "SR", "GT", "LT", "parseWalkBody", "body", "segments", "strand", "start", "push", "end", "i", "ch", "parseGFA", "file", "graph", "rawLine", "line", "rest", "len", "seq", "tagfields", "gfa1", "first", "source", "target", "cigar", "strand1", "strand2", "sample", "hap", "contig", "path", "surveySegments", "gfaGraph", "canonical", "traversals", "claim", "id", "strand", "traverse", "seen", "link", "gfaPath", "segment", "walk", "seg", "walkStart", "w", "stranded", "s", "anchorablePaths", "p", "pathOrigin", "carriedSamples", "gfaNode", "sm", "samples", "positive", "v", "statedDepth", "tags", "length", "count", "makeNode", "depth", "stableCoordinate", "convertGFAToGraph", "name", "nodes", "edges", "nodeIds", "nodeId", "segmentId", "declared", "paths", "pathsByPair", "pairPaths", "a", "b", "addPair", "set", "to", "edgePaths", "edge", "recordPathEdges", "nodeIds2", "name2", "i", "pathIds", "lengths", "n", "anchoring", "surveyPaths", "walkFields", "panSN", "sample", "haplotype", "contig", "namesByList", "lists", "names", "listCount", "pathNames", "starts", "list", "i", "fill", "grouped", "listed", "_", "out", "k", "graphFromTables", "n", "l", "w", "name", "count", "declared", "canonical", "claim", "node", "reversed", "drawnWalks", "p", "traversals", "s", "ids", "segment", "nodes", "ref", "edges", "neighbours", "pairList", "a", "b", "near", "j", "addPair", "edgeLists", "adjacency", "adjacentNode", "adjacentList", "listOf", "nameIndex", "crossedList", "crossedName", "crossings", "lastWalk", "paths", "anchorPaths", "totalSteps", "visitPath", "visitStart", "visitReversed", "visitOrder", "blocks", "pathSamples", "pathName", "named", "panSNSample", "start", "visitSample", "first", "nodeIds", "pos", "prev", "at", "listNames", "edge", "walked", "PathVisits", "graphOf", "source", "name", "graphFromTables", "tables", "gfaTables", "convertGFAToGraph", "parseGFA", "loadGraph", "opts", "graph", "anchorGraph", "ENGINE_DEFAULTS", "engineSettingsOf", "s", "COMPONENT_SEPARATION", "engineRequest", "scaling", "settings", "anchored", "isBackbone", "spaced", "seededNodes", "engineKey", "forceLayout", "engine", "spread", "spreadFor", "deletions", "dropped", "deletionDrawing", "deletionEdges", "routed", "withDeletionRoutes", "merged", "mergeRuns", "runs", "n", "engineScaling", "layoutScaling", "result", "duration", "routeNodes", "drawnLengthOf", "drawn", "drawnNodeLength", "smoothed", "id", "line", "smoothChain", "positions", "splitRuns", "nodePositions", "deletionRoutes", "takeRoutes", "orientToReference", "layoutExtent", "minX", "minY", "maxX", "maxY", "segments", "seg", "FIT_PADDING", "MIN_ZOOM", "MAX_ZOOM", "clampZoom", "zoom", "fittedTranslateY", "bounds", "usableHeight", "yScale", "padTop", "leftoverY", "fitTransform", "paneWidth", "paneHeight", "pixelRows", "minScale", "padLeft", "padRight", "padBottom", "usableWidth", "fitX", "fitY", "scale", "leftoverX", "drawingBounds", "layout", "region", "extent", "DEFAULT_SIZE", "createForceLayoutCache", "size", "caches", "cacheOf", "graph", "cache", "settings", "engine", "key", "engineKey", "hit", "started", "entry", "forceLayout", "r", "from", "to", "axisScaleOf", "scale", "pixelRows", "viewportOf", "t", "axis", "width", "height", "padded", "v", "panes", "w", "h", "contains", "outer", "inner", "zoomAbout", "factor", "centerX", "centerY", "clampZoom", "ratio", "screenToLayout", "x", "y", "host", "read", "name", "RenderLifecycleMixin", "RenderLifecycleMixin_default", "knownOrUnset", "values", "value", "lenientMaybeEnum", "types", "lenientOptionalEnum", "fallback", "MAX_CANVAS_HEIGHT", "MIN_CANVAS_HEIGHT", "PAPER", "PAPER_CSS", "MIN_FIT_TUBE_PX", "TUBE_MAP_MODES", "ChooseSamplesDialog", "lazy", "ChooseWalksDialog", "HighlightColorDialog", "WALK_MENU_ITEMS", "TUBE_MAP_FOLDS", "bubblePrefix", "adapterConfig", "uri", "SEGMENTS_SUFFIX", "HOVER_BRIGHTEN", "SELECT_BRIGHTEN", "VIEWPORT_DEBOUNCE_MS", "VIEWPORT_PANES_BUILT", "WALK_GENE_ROWS", "TUBE_MAP_ROUTES", "EMPTY_BATCH", "dependOn", "_values", "MAX_GRAPH_REGION_BP", "formatSpanBp", "bp", "DEFAULT_MAX_GRAPH_NODES", "fileName", "location", "uriOf", "geometryPainted", "model", "paneViewportOf", "width", "height", "viewportOf", "forceLayouts", "createForceLayoutCache", "paneBase", "types", "RenderLifecycleMixin", "lenientOptionalEnum", "LAYOUT_ENGINE_VALUES", "BUBBLE_SPREAD_VALUES", "PANSN_HAPLOTYPE", "withPanSNAliases", "adapterConfig", "assemblies", "explicit", "claimed", "fromAliases", "name", "aliases", "prefix", "alias", "LANE_ADAPTERS", "trackAdapterConfig", "node", "track", "readConfObject", "getSession", "conf", "MIN_DELETION_BP", "MIN_ALLELE_SPAN_FRACTION", "placeOffReference", "graph", "span", "rowY", "positions", "minSpan", "alleles", "projectAlleles", "byId", "n", "alleleDeletions", "allele", "skipped", "drawn", "scale", "nodeId", "i", "node", "offset", "even", "at", "bp", "y", "neighbors", "buildNeighbors", "queue", "fromId", "fromEnd", "nextId", "next", "contributingSamples", "graph", "keep", "carried", "node", "isOffReference", "sample", "parsePanSN", "held", "row", "a", "b", "sampleRowLayout", "region", "backbone", "backboneNodes", "samples", "span", "referenceSpan", "rowOf", "s", "i", "nodePositions", "backbonePositions", "spareRow", "alleleDeletions", "placeOffReference", "stable", "ROW_HEIGHT_PX", "rowLabels", "pathSteps", "graph", "nodeById", "n", "visits", "next", "path", "walk", "pathOrigin", "id", "node", "at", "canonicalStrand", "tubeMapTracks", "steps", "tracks", "index", "sequence", "s", "stepName", "reference", "t", "tubeMapNodes", "hasTubeMapPaths", "STACK_PX", "MIN_TUBE_PX", "MAX_TUBE_PX", "tubeWidth", "trackCount", "straightened", "first", "flipped", "forwards", "step", "isReverse", "forward", "mergedRuns", "layout", "walks", "before", "is_secondary", "i", "neighbour", "lengthOf", "after", "prev", "members", "head", "run", "sum", "opposite", "otherStrand", "boxGraph", "boxOf", "inner", "drawn", "side", "box", "absorbed", "nodes", "parts", "starts", "p", "leaving", "ownStrand", "edges", "edge", "sides", "strandSides", "from", "to", "fromBox", "toBox", "absorbedNames", "segment", "runTubeMap", "paths", "reads", "tubeMapReads", "tubeColor", "pathGreyCssColor", "pathCssColor", "pathColors", "_", "bundled", "layoutTubeMap", "runs", "drawnNodes", "centreline", "yOffset", "x0", "x1", "y", "extentOf", "tubeMapLayout", "drawing", "nodePositions", "minY", "maxY", "tubeMapColumns", "byOrder", "list", "columns", "end", "order", "a", "b", "bp0", "bp1", "graphNode", "isBackbone", "c", "column", "hasTubeMapBackbone", "tubeMapReferenceLayout", "rankRows", "graph", "present", "node", "a", "b", "r", "i", "anchoredLayout", "region", "backbone", "backboneNodes", "span", "referenceSpan", "rows", "nodePositions", "backbonePositions", "alleleDeletions", "placeOffReference", "ROW_HEIGHT_PX", "rowLabels", "rank", "row", "GUTTER", "LANE_PX", "ROW_HEIGHT_PX", "nodeWidth", "node", "compare", "a", "b", "compareKeys", "UNREACHED", "referenceOrder", "graph", "byId", "n", "key", "orderKeys", "placeByWalks", "backbone", "isNode", "startOf", "next", "prev", "i", "head", "insertAfter", "at", "id", "after", "insertBefore", "before", "path", "rising", "falling", "last", "start", "ids", "from", "leading", "lead", "placed", "placeBySearch", "adjacent", "queue", "ka", "kb", "nb", "searched", "sided", "seed", "run", "farHalf", "hops", "deadEnd", "touchesLeft", "other", "k", "e", "isBackbone", "rank", "layerGraph", "order", "isRef", "preds", "succs", "link", "layerOf", "l", "p", "s", "minSucc", "t", "lo", "hi", "layers", "orderedLayout", "layer", "layerWidth", "w", "layerX", "x", "y", "free", "ideal", "taken", "lane", "d", "nodePositions", "cx", "ny", "sampleOf", "path", "panSNSample", "labelOf", "NodeTable", "graph", "node", "id", "i", "nodes", "k", "steps", "stepsOf", "pieces", "table", "out", "end", "piece", "bp", "stepSpan", "at", "found", "pos", "len", "sliceBetween", "region", "flanked", "onReference", "referenceStart", "referenceEnd", "i0", "i1", "bestEnd", "bestStart", "end2", "start", "ids2", "spanAt", "flank", "near", "d", "j", "after", "ids", "last", "stop", "filterSamples", "rows", "samples", "r", "a", "b", "walkRows", "unit", "paths", "nameOf", "p", "pathOrigin", "rankZero", "n", "names", "referenceName", "referencePieces", "first", "others", "walks", "cut", "referenceNodes", "nodeCount", "reachesBefore", "reachesAfter", "rowOf", "paths2", "complete", "from", "to", "contig", "panSNContig", "axisSpan", "axis", "lengths", "referenceStart2", "runs", "offReferenceBp", "gapBp", "step", "on", "forward", "backward", "READOUT_ROOM", "walkRowsExtent", "walks", "pitch", "ROW_HEIGHT_PX", "longest", "row", "walkRowLabels", "rows", "layout", "i", "walkRowLayout", "graph", "region", "backbone", "backboneNodes", "walkRows", "overWindow", "n", "overlapsWindow", "backbonePositions", "FORCE_LAYOUT_LABEL", "hasBackbone", "graph", "isBackbone", "hasWalks", "hasAlleles", "isOffReference", "LAYOUT_MODES", "anchoredLayout", "sampleRowLayout", "walkRowLayout", "orderedLayout", "tubeMapLayout", "hasTubeMapPaths", "tubeMapReferenceLayout", "hasTubeMapBackbone", "LAYOUT_MODE_VALUES", "m", "modeUsesLayoutEngine", "value", "layoutModeByValue", "walkStripApplies", "o", "cutsWholeWalks", "mode", "PAD_PX", "WALK_STRIP_CEILING_PX", "LABEL_FONT_PX", "MIN_ROW_PX", "MARK_INK", "TICK_PX", "stripMarks", "graph", "rows", "node", "visits", "marks", "row", "axis", "path", "pathOrigin", "v", "start", "end", "alongRow", "spanCache", "spansOf", "name", "byName", "lengthOf", "n", "origin", "pieces", "p", "spans", "piece", "a", "b", "pos", "id", "len", "segmentAt", "offset", "pxPerBp", "at", "tol", "bar", "from", "to", "lo", "hi", "mid", "best", "bestLen", "bestHolds", "i", "holds", "walkStripFrame", "bars", "maxHeight", "labelPx", "r", "LABEL_CHAR_PX", "count", "rowPx", "barPx", "labelled", "readouts", "rowPitch", "longest", "left", "scaleX", "READOUT_ROOM", "boxesGenes", "stripRowAt", "frame", "x", "y", "walkMarksTree", "index", "X", "el", "m", "w", "tick", "top", "walkStripLabelsTree", "bold", "stripGeneGaps", "rowGenes", "gaps", "regionLabel", "loc", "edgeHoverText", "edge", "deletion", "nameOf", "id", "nodeOwnLocation", "node", "isAnchored", "anchoredNodeLocation", "panSNSample", "panSNHaplotype", "panSNContig", "widestCluster", "spans", "maxGap", "sorted", "a", "b", "best", "current", "span", "groupKey", "loc", "contributingAssemblies", "graph", "groups", "key", "group", "bySample", "candidate", "existing", "resolveLocationAssembly", "resolve", "resolveContributors", "contributors", "c", "sample", "locString", "isLinearHost", "view", "v", "widest", "blocks", "best", "b", "hostFrame", "region", "block", "bpPerPx", "left", "hostWindow", "displayed", "hostCut", "window", "capBp", "margins", "visible", "margin", "start", "end", "over", "cutHolds", "cut", "exact", "genePins", "graph", "genes", "positions", "byRefName", "node", "isAnchored", "refName", "entry", "nodes", "b", "pins", "gene", "onRefName", "parts", "exonsByNode", "nodeIds", "at", "atDistance", "covered", "mid", "reach", "i", "firstNodeAtOrAfter", "nodeStart", "nodeEnd", "line", "nodeParts", "exon", "a", "stretch", "polylineSlice", "svgPath", "pinBp", "distance", "along", "version", "layoutGeometryInputs", "layout", "drawing", "o", "isReference", "graph", "name", "pathOrigin", "piecesOf", "p", "a", "b", "walkHighlight", "pieces", "first", "byId", "n", "edgeAt", "e", "i", "lengthOf", "id", "bpOf", "path", "sum", "bp", "piece", "extentOf", "ps", "start", "extent", "range", "panSNContig", "span", "nodeIds", "edgeIndexes", "progress", "before", "index", "length", "reference", "referenceSpan", "referencePieces", "laneColors", "walk", "encoding", "ramp", "colors", "node", "mid", "t", "encodedColor", "reversedNodes", "reversed", "referencePath", "visits", "own", "theirs", "slot", "walkLift", "layers", "seen", "lifted", "layer", "picked", "walks", "resolveEncoding", "liftOf", "FACET_COLOR", "facetLifts", "lift", "stated", "l", "w", "FIGURE_DEFAULTS", "ENGINE_DEFAULTS", "figureSpecSettings", "s", "defaults", "out", "k", "v", "COLOR_SCHEMES", "COLOR_SCHEME_VALUES", "s", "resolveColorScheme", "scheme", "graph", "figureScene", "graph", "layout", "o", "region", "rampDomain", "rows", "bounds", "drawingBounds", "walkRowsExtent", "nodeById", "node", "colorScheme", "resolveColorScheme", "FIGURE_DEFAULTS", "referenceRamp", "computeReferenceRamp", "drawnDeletions", "deletionDrawing", "deletionEdges", "layers", "walkRamp", "l", "lift", "walkLift", "facet", "facetSettingOf", "panels", "facetLifts", "labels", "walkLabelsOf", "pathLegend", "referenceName", "referenceLabel", "contigThickness", "nodeWidth", "name", "highlight", "axis", "buildGeometry", "layoutGeometryInputs", "FONT", "BAR_PX", "SWATCH_PX", "KEY_GAP_PX", "STRIP_KEY_PX", "FADED", "GENE_INK", "keySvg", "id", "x", "y", "stops", "label", "after", "under", "opacity", "bar", "fill", "defs", "s", "LABEL_CHAR_PX", "escapeAttr", "exonKeySvg", "EXON_COLOR", "walkKeySvg", "walk", "reference", "key", "walkKey", "encodingStops", "screenPath", "d", "_", "cmd", "chip", "w", "name", "note", "LABEL_PX", "LABEL_PAD", "figureSvg", "graph", "layout", "o", "width", "room", "rows", "bounds", "nodeById", "referenceRamp", "layers", "lift", "facet", "panels", "labelOf", "referenceName", "contigThickness", "nodeWidth", "geometry", "figureScene", "pixelRows", "rampInterval", "pins", "genePins", "ink", "nodeInk", "masks", "overlays", "highlight", "t", "h", "out", "outlines", "exonOutlineTree", "exonStretches", "serializeEl", "screen", "p", "frame", "pin", "cw", "text", "placeLabels", "geneLabelCandidates", "nodesUnderBox", "occupancy", "pinY", "walkRowsTree", "rowLabels", "walkRowLabels", "sy", "drawing", "fit", "fitTransform", "FACET_PAD_PX", "axis", "axisScaleOf", "canvas", "markup", "svgCanvas", "renderer", "Canvas2DRenderer", "parts", "height", "place", "facetCells", "grid", "facetGrid", "panel", "i", "cell", "FACET_GAP_PX", "FACET_TITLE_PX", "push", "walkRowsKeyTree", "walkRowsKey", "rangeText", "header", "usable", "FIT_PADDING", "drawn", "strip", "walkStripFrame", "stripGeneGaps", "walkStripLabelsTree", "l", "metadata", "version", "WHOLE_FRACTION", "coversGraph", "members", "nodes", "SMALL_VARIANT_BP", "bubbleHalos", "graph", "bubbles", "positions", "repeats", "byName", "n", "halos", "bubble", "parts", "minX", "maxX", "minY", "nodeIds", "names", "bubbleSegmentIds", "i", "name", "node", "line", "isBackbone", "svgPath", "p", "labelAt", "whole", "classifyBubble", "bubbleSubgraph", "graph", "segmentIds", "keep", "nodes", "n", "ids", "lengthOf", "kept", "paths", "p", "first", "id", "nodeIds", "before", "sum", "e", "trimOrigins", "relax", "best", "to", "cur", "add", "prev", "SATURATED_PATH_COUNT", "bubblesFromGraph", "graph", "isBackbone", "byId", "n", "order", "referenceOrder", "indexOf", "id", "i", "reach", "succ", "linked", "e", "a", "b", "lo", "hi", "from", "backbone", "ends", "boundaries", "node", "ia", "ib", "walkIndex", "walkIndexOf", "bubbles", "start", "i0", "end", "i1", "interior", "t", "walked", "walkRoutes", "crossed", "routes", "walksLeave", "refStart", "refEnd", "chain", "chainBroken", "k", "partial", "fallback", "ids", "paths", "index", "p", "steps", "at", "startId", "endId", "min", "max", "left", "at0", "at1", "step", "j", "route", "r", "_", "bp", "slotGraph", "graph", "index", "slots", "seen", "pairs", "degree", "e", "a", "b", "sides", "strandSides", "ka", "kb", "id", "offset", "k", "next", "fill", "i", "searcher", "nodes", "visited", "pending", "stack", "inside", "touched", "stamp", "start", "s", "open", "top", "count", "found", "expect", "search", "v", "p", "entry", "u", "ready", "q", "reversed", "f", "collator", "onReference", "isBackbone", "forward", "byRef", "bySide", "nodesOf", "allSuperbubbles", "n", "find", "byEnds", "hit", "routesThrough", "sink", "best", "cur", "relax", "superbubblesFromGraph", "span", "covers", "coversGraph", "members", "holders", "vs", "nested", "j", "placed", "outermost", "byId", "walkIndex", "walkIndexOf", "source", "walked", "walkRoutes", "crossed", "routes", "placedOn", "graphBubbles", "reach", "bubblesFromGraph", "bubbleSubgraph", "bubbleSegmentIds", "tubeMapNodeColors", "graph", "colorScheme", "referenceRamp", "range", "computeColorSchemeRange", "node", "index", "abgrToCssRgba", "getNodeColor", "host", "serializableFilterChain_default", "host", "isRecord", "value", "isLinearView", "view", "isRecord", "withRows", "views", "linearViewTarget", "connectedViewId", "assemblyName", "candidates", "canonicalAssemblyName", "session", "name", "manager", "trackAssemblies", "track", "names", "readConfObject", "n", "reportFailure", "what", "launch", "error", "MIN_LAUNCH_SPAN_BP", "paddedLocation", "loc", "minSpan", "pad", "withReferenceRegion", "contributors", "region", "c", "showInLinearView", "location", "assembly", "connectedViewId", "tracks", "existing", "linearViewTarget", "viewId", "regionLabel", "locString", "highlightInLinearView", "target", "assemblyNamesOfTrack", "trackId", "t", "launchSyntenyView", "graphTrackId", "graphTrackAssemblies", "aligned", "covered", "panels", "snapshot", "mergedIntervals", "intervals", "out", "iv", "a", "b", "last", "mergeOverlappingByName", "genes", "out", "open", "g", "a", "b", "key", "last", "mergedIntervals", "gene", "ownField", "f", "name", "namedTrack", "tracks", "named", "t", "trackLabel", "REPEAT_ADAPTER_TYPES", "REPEAT_TRACK_HINT", "pickRepeatTrack", "tracks", "named", "namedTrack", "t", "trackLabel", "PACKED_NAME", "packedName", "f", "name", "ownField", "pair", "i", "field", "top", "MOTIF_FIELDS", "PERIOD_FIELDS", "NAME_FIELDS", "first", "names", "value", "one", "IUPAC", "repeatUnitOf", "period", "motif", "numbers", "n", "strings", "text", "TANDEM_REPEAT", "tandemAlleleBp", "alts", "rn", "rus", "rul", "ruc", "rb", "k", "alt", "bp", "known", "j", "unitLength", "count", "runBp", "genotyped", "gt", "alleleBp", "referenceBp", "phased", "index", "callsOf", "samples", "called", "sample", "fields", "reads", "lengths", "calls", "spanOf", "tandem", "start", "end", "svlen", "repeatArraysFrom", "features", "arrays", "unit", "refName", "stated", "a", "b", "GENE_ADAPTER_TYPES", "GENE_TRACK_HINT", "BED_ADAPTER_TYPES", "pickGeneTrack", "tracks", "named", "namedTrack", "candidates", "t", "REPEAT_TRACK_HINT", "trackLabel", "laneFilters", "view", "trackId", "lane", "readConfObject", "WHOLE_SEQUENCE_TYPES", "EXON_PARTS", "exonsOf", "f", "into", "type", "ownField", "children", "child", "geneModelsFrom", "features", "genes", "name", "start", "end", "exons", "mergedIntervals", "mergeOverlappingByName", "DEFAULTS", "layersOf", "layers", "stated", "isRecord", "layer", "withLayer", "on", "_was", "rest", "SCHEME_OF_FIELD", "FIELD_OF_SCHEME", "field", "scheme", "schemeOfColor", "color", "isRecord", "domainOfColor", "colorOfScheme", "domain", "DEFAULT_PX", "nodeSizeOf", "size", "isRecord", "sizeOfNodeWidth", "width", "px", "walkRowsFromCut", "cut", "region", "unit", "runs", "walkRowRuns", "walkRowsOf", "orUndefined", "get", "nodeMapOf", "graph", "m", "spanIn", "nodeId", "nodeById", "neighbors", "nodeReferenceSpan", "withGraphViews", "paneBase", "self", "getContainingTrack", "getContainingView", "byValue", "derive", "computed", "b", "colorDomain", "domainOfColor", "facet", "facetSettingOf", "groupBy", "g", "groupByOf", "schemeOfColor", "nodeSizeOf", "layersOf", "kept", "geometryPainted", "modeUsesLayoutEngine", "paths", "pathLegend", "pathColorsLegible", "open", "computeReferenceRamp", "layer", "layoutModeByValue", "walk", "layers", "walkLift", "lift", "facetLifts", "panel", "TUBE_MAP_MODES", "domain", "walkLabelsOf", "name", "w", "color", "NO_VALUE_COLOR", "walks", "resolveColorScheme", "layout", "graphBubbles", "bubbleSubgraph", "bubbleSegmentIds", "names", "nodeIds", "n", "edgeIndexes", "e", "bubble", "o", "sameBubble", "focus", "id", "base", "seen", "bubbleKey", "bp", "formatBp", "track", "trackAdapterConfig", "readConfObject", "session", "getSession", "t", "trackAssemblies", "assembly", "canonicalAssemblyName", "GENE_ADAPTER_TYPES", "REPEAT_ADAPTER_TYPES", "pickRepeatTrack", "pickGeneTrack", "r", "graphBackbone", "walkRows", "assemblyName", "assemblyManager", "panSN", "view", "filters", "laneFilters", "serializableFilterChain_default", "getEnv", "features", "lane", "geneModelsFrom", "f", "backbone", "geneAssembly", "geneFeatures", "binds", "backboneAssembly", "featuresOnBackbone", "buildNeighbors", "nodeInk", "deletionEdges", "repeat", "bars", "reference", "rows", "withCalls", "location", "locationIsSet", "metadataColumns", "field", "table", "valueOf", "columnKeyOf", "p", "pathOrigin", "valueTubePalette", "grouped", "filterSamples", "groupWalkRows", "dependOn", "positions", "genePins", "bubbleHalos", "axisScaleOf", "deletionDrawing", "ramp", "drawn", "offReference", "unplaced", "node", "tubeMapNodeColors", "reads", "pathColors", "kind", "coloring", "valueTubeColors", "roleTubeColors", "TINTED_TUBES", "colors", "hovered", "i", "LIFT_BACKDROP_CSS", "drawing", "span", "withLaunchViews", "withGraphViews", "self", "view", "isLinearHost", "graph", "backbone", "backboneNodes", "contributingAssemblies", "backboneSpan", "assemblyManager", "getSession", "panSN", "byPrefix", "asm", "prefix", "loaded", "name", "sample", "byAssembly", "track", "GENE_ADAPTER_TYPES", "tracks", "picked", "pickGeneTrack", "resolveContributors", "withReferenceRegion", "region", "linearViewTarget", "nodeId", "node", "own", "nodeOwnLocation", "ownAssembly", "resolveLocationAssembly", "span", "onReference", "paddedLocation", "withWalkRowViews", "withLaunchViews", "self", "walkStripApplies", "bars", "filterSamples", "walkStripFrame", "cutsWholeWalks", "layoutModeByValue", "id", "node", "stripMarks", "row", "axis", "named", "resolveLocationAssembly", "rowSpan", "nodeAnchor", "reads", "untrackedRows", "unplaced", "assembly", "span", "track", "WALK_GENE_ROWS", "index", "sample", "haplotype", "byRow", "placeRowGenes", "withHostViews", "withWalkRowViews", "self", "layoutModeByValue", "host", "region", "b", "graphRegion", "hostFrame", "drawing", "tubeMapPicture", "referenceBoxes", "deviationMarks", "reference", "layoutResult", "tubeMapGenes", "graph", "blocks", "referenceStripBlocks", "focus", "LIFT_BACKDROP_CSS", "frame", "left", "right", "stripOverhang", "bubble", "halo", "h", "sameBubble", "nodeId", "span", "nodeAnchor", "sx", "sy", "stripBlockAt", "REFERENCE_STRIP_ZONE_PX", "MORPH_MAX_NODES", "MORPH_MS", "MORPH_MAX_STEP_MS", "arcPrefix", "line", "arc", "i", "resample", "count", "total", "out", "j", "k", "at", "span", "f", "a", "b", "RELAX_SWEEPS", "RELAX_OMEGA", "RELAX_TOLERANCE_PX", "morphStarts", "prev", "prevTransform", "next", "nextTransform", "edges", "toNext", "p", "starts", "id", "before", "neighbours", "link", "other", "list", "edge", "from", "to", "sides", "strandSides", "point", "attachedAt", "n", "queue", "placed", "back", "m", "index", "px", "py", "pullX", "pullY", "links", "degree", "sweep", "moved", "x", "y", "dx", "dy", "nearest", "best", "bestDistance", "q", "d", "routeStarts", "routes", "nodeStarts", "nodeEnds", "shift", "key", "d0", "d1", "fadeEntering", "batch", "ids", "alpha", "fade", "items", "run", "item", "fadeAbgr", "easeInOut", "t", "blendInto", "into", "ends", "TOOLTIP_INSET_PX", "FACET_KEY_ROW_PX", "FACET_KEY_PX", "FACET_GAP_PX", "TOOLTIP_ROOM_PX", "walkRowGeneKey", "pitch", "hasGenes", "gaps", "boxesGenes", "withFitViews", "withHostViews", "self", "MIN_CANVAS_HEIGHT", "MAX_CANVAS_HEIGHT", "bars", "room", "headersPx", "SECTION_HEADER_PX", "rowPitch", "FIT_PADDING", "sectionPlacement", "place", "labels", "walkRowLabels", "l", "i", "label", "y", "top", "r", "rowLabelBox", "layout", "rowsExtent", "walkRowsExtent", "drawingBounds", "name", "isReference", "row", "walkRowReadout", "screenX", "screenY", "bp", "rows", "tubeMapGeneRows", "GENE_ROW_PX", "bounds", "width", "height", "base", "across", "padRight", "down", "padTop", "beside", "LEGEND_INSET_PX", "tubePx", "MIN_FIT_TUBE_PX", "field", "domain", "columns", "panels", "facetCells", "p", "facetGrid", "legendBottom", "ceiling", "grid", "floor", "pads", "padsY", "usableWidth", "FACET_PAD_PX", "bottom", "fitTransform", "padded", "paneViewportOf", "VIEWPORT_PANES_BUILT", "b", "id", "SELECT_BRIGHTEN", "litNode", "selectedNode", "dpr", "getDpr", "PAPER", "highlight", "drawPaths", "graph", "nodeById", "layoutResult", "deletionDrawing", "dependOn", "viewportBounds", "untracked", "batch", "buildGeometry", "layoutGeometryInputs", "entering", "fadeEntering", "layoutLabels", "walk", "node", "walkPosition", "region", "adapter", "panSN", "window", "gfa", "uriOf", "db", "source", "lane", "geneTrack", "geneConf", "getSession", "t", "geneAdapter", "expandTabixShorthand", "readConfObject", "genes", "figureSpecSettings", "layoutModeByValue", "figureSvg", "LineStyle_default", "createSvgIcon", "jsx", "CompareArrows_default", "createSvgIcon", "jsx", "HighlightAlt_default", "createSvgIcon", "jsx", "LINEAR_LABEL", "SYNTENY_LABEL", "NO_SYNTENY_TRACK", "oneOrMany", "label", "icon", "entries", "entryLabel", "onSelect", "disabledHelpText", "nameTheOnlyEntry", "first", "empty", "entry", "graphLaunchMenuItems", "contributors", "syntenyTracks", "onShowLinear", "onShowSynteny", "widest", "LineStyle_default", "c", "regionLabel", "CompareArrows_default", "track", "nodeLaunchMenuItems", "own", "reference", "highlight", "onHighlight", "HighlightAlt_default", "target", "Route_default", "createSvgIcon", "jsx", "Settings_default", "createSvgIcon", "jsx", "Visibility_default", "createSvgIcon", "jsx"]
7
+ }