@jbrowse/core 5.0.0-beta.1 → 5.0.0-beta.11

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 (637) hide show
  1. package/README.md +1709 -390
  2. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
  3. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -5
  4. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
  5. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
  6. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
  7. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
  8. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +37 -14
  9. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
  10. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
  11. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
  12. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
  13. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
  14. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
  15. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
  16. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
  17. package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
  18. package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
  19. package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
  20. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
  21. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
  22. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
  23. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
  24. package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
  25. package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +49 -0
  26. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
  27. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
  28. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
  29. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
  30. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
  31. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
  32. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
  33. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
  34. package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.js +8 -5
  35. package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
  36. package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
  37. package/esm/BaseFeatureWidget/formatDetails.js +62 -83
  38. package/esm/BaseFeatureWidget/index.d.ts +2 -1
  39. package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
  40. package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
  41. package/esm/BaseFeatureWidget/types.d.ts +12 -6
  42. package/esm/BaseFeatureWidget/util.d.ts +0 -10
  43. package/esm/BaseFeatureWidget/util.js +0 -17
  44. package/esm/CorePlugin.js +34 -3
  45. package/esm/PluginLoader.d.ts +24 -13
  46. package/esm/PluginLoader.js +167 -51
  47. package/esm/PluginManager.d.ts +130 -24
  48. package/esm/PluginManager.js +180 -32
  49. package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
  50. package/esm/ReExports/MuiDataGridReExports.js +2 -2
  51. package/esm/ReExports/coreModules.generated.d.ts +2 -0
  52. package/esm/ReExports/coreModules.generated.js +530 -0
  53. package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
  54. package/esm/ReExports/coreWorkerModules.generated.js +490 -0
  55. package/esm/ReExports/frameworkModules.d.ts +2 -0
  56. package/esm/ReExports/frameworkModules.js +68 -0
  57. package/esm/ReExports/frameworkShared.d.ts +12 -0
  58. package/esm/ReExports/frameworkShared.js +16 -0
  59. package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
  60. package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
  61. package/esm/ReExports/list.js +528 -79
  62. package/esm/ReExports/modules.d.ts +1 -1
  63. package/esm/ReExports/modules.js +10 -165
  64. package/esm/ReExports/registry.d.ts +1 -0
  65. package/esm/ReExports/registry.js +23 -5
  66. package/esm/ReExports/uiStub.d.ts +3 -0
  67. package/esm/ReExports/uiStub.js +33 -0
  68. package/esm/ReExports/workerModules.d.ts +2 -0
  69. package/esm/ReExports/workerModules.js +11 -0
  70. package/esm/TextSearch/TextSearchManager.d.ts +27 -13
  71. package/esm/TextSearch/TextSearchManager.js +77 -36
  72. package/esm/TextSearch/places.d.ts +12 -0
  73. package/esm/TextSearch/places.js +94 -0
  74. package/esm/assemblyManager/assembly.d.ts +21 -19
  75. package/esm/assemblyManager/assembly.js +28 -26
  76. package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
  77. package/esm/assemblyManager/assemblyAdapters.js +8 -2
  78. package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
  79. package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
  80. package/esm/assemblyManager/assemblyManager.d.ts +35 -180
  81. package/esm/assemblyManager/assemblyManager.js +47 -51
  82. package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
  83. package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
  84. package/esm/assemblyManager/geneticCodes.js +2 -5
  85. package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
  86. package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
  87. package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
  88. package/esm/assemblyManager/indexAssemblyNames.js +22 -0
  89. package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
  90. package/esm/assemblyManager/loadRefNameMap.js +4 -9
  91. package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
  92. package/esm/assemblyManager/refNameMapKey.js +12 -0
  93. package/esm/checkPlugins.d.ts +2 -0
  94. package/esm/checkPlugins.js +38 -17
  95. package/esm/configuration/bamIndexFields.d.ts +49 -0
  96. package/esm/configuration/bamIndexFields.js +41 -0
  97. package/esm/configuration/configurationSchema.d.ts +101 -71
  98. package/esm/configuration/configurationSchema.js +207 -134
  99. package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
  100. package/esm/configuration/configurationSchemaUnion.js +56 -0
  101. package/esm/configuration/configurationSlot.d.ts +150 -60
  102. package/esm/configuration/configurationSlot.js +103 -75
  103. package/esm/configuration/fillLocations.d.ts +14 -0
  104. package/esm/configuration/fillLocations.js +14 -0
  105. package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
  106. package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
  107. package/esm/configuration/formatDetailsConfigSchema.js +10 -13
  108. package/esm/configuration/fullConfSnapshot.d.ts +4 -19
  109. package/esm/configuration/fullConfSnapshot.js +30 -52
  110. package/esm/configuration/getConf.d.ts +45 -41
  111. package/esm/configuration/getConf.js +111 -44
  112. package/esm/configuration/index.d.ts +26 -11
  113. package/esm/configuration/index.js +16 -7
  114. package/esm/configuration/indexType.d.ts +26 -0
  115. package/esm/configuration/indexType.js +38 -0
  116. package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
  117. package/esm/configuration/mergeFormatCallbacks.js +13 -10
  118. package/esm/configuration/plot.d.ts +61 -0
  119. package/esm/configuration/plot.js +142 -0
  120. package/esm/configuration/readConfObject.d.ts +2 -24
  121. package/esm/configuration/readConfObject.js +20 -63
  122. package/esm/configuration/requirements.d.ts +37 -0
  123. package/esm/configuration/requirements.js +88 -0
  124. package/esm/configuration/schemaRegistry.d.ts +32 -15
  125. package/esm/configuration/schemaRegistry.js +33 -35
  126. package/esm/configuration/schemaTypes.d.ts +21 -5
  127. package/esm/configuration/schemaTypes.js +66 -55
  128. package/esm/configuration/slotFacade.d.ts +12 -29
  129. package/esm/configuration/slotFacade.js +44 -23
  130. package/esm/configuration/snapshotPreprocess.d.ts +43 -0
  131. package/esm/configuration/snapshotPreprocess.js +161 -0
  132. package/esm/configuration/tabixIndexFields.d.ts +30 -4
  133. package/esm/configuration/tabixIndexFields.js +21 -4
  134. package/esm/configuration/tabixShorthand.d.ts +34 -17
  135. package/esm/configuration/tabixShorthand.js +49 -22
  136. package/esm/configuration/types.d.ts +182 -43
  137. package/esm/configuration/uriShorthand.d.ts +9 -0
  138. package/esm/configuration/uriShorthand.js +16 -0
  139. package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
  140. package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
  141. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
  142. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
  143. package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
  144. package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
  145. package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
  146. package/esm/data_adapters/BaseAdapter/index.js +1 -0
  147. package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
  148. package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
  149. package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
  150. package/esm/data_adapters/BaseAdapter/stats.js +52 -13
  151. package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
  152. package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
  153. package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
  154. package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
  155. package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
  156. package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
  157. package/esm/data_adapters/dataAdapterCache.js +44 -10
  158. package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
  159. package/esm/data_adapters/getFeatureAdapter.js +8 -8
  160. package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
  161. package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
  162. package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
  163. package/esm/pluggableElementTypes/AdapterType.js +1 -1
  164. package/esm/pluggableElementTypes/DisplayType.d.ts +53 -16
  165. package/esm/pluggableElementTypes/DisplayType.js +28 -12
  166. package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
  167. package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
  168. package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
  169. package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
  170. package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
  171. package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
  172. package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
  173. package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
  174. package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
  175. package/esm/pluggableElementTypes/ViewType.js +32 -4
  176. package/esm/pluggableElementTypes/WidgetType.d.ts +6 -0
  177. package/esm/pluggableElementTypes/WidgetType.js +6 -0
  178. package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
  179. package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
  180. package/esm/pluggableElementTypes/extendElementType.js +9 -5
  181. package/esm/pluggableElementTypes/index.d.ts +2 -1
  182. package/esm/pluggableElementTypes/index.js +2 -9
  183. package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
  184. package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +122 -28
  185. package/esm/pluggableElementTypes/models/BaseDisplayModel.js +155 -11
  186. package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
  187. package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
  188. package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +87 -18
  189. package/esm/pluggableElementTypes/models/BaseViewModel.js +54 -11
  190. package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
  191. package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
  192. package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
  193. package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
  194. package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
  195. package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
  196. package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
  197. package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
  198. package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
  199. package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
  200. package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
  201. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
  202. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
  203. package/esm/pluggableElementTypes/models/index.d.ts +2 -3
  204. package/esm/pluggableElementTypes/models/index.js +2 -3
  205. package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
  206. package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
  207. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
  208. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
  209. package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
  210. package/esm/pluginDefinitions.d.ts +34 -7
  211. package/esm/pluginDefinitions.js +54 -20
  212. package/esm/rpc/BaseRpcDriver.d.ts +2 -2
  213. package/esm/rpc/BaseRpcDriver.js +25 -30
  214. package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
  215. package/esm/rpc/MainThreadRpcDriver.js +13 -8
  216. package/esm/rpc/RpcClient.d.ts +18 -6
  217. package/esm/rpc/RpcClient.js +51 -16
  218. package/esm/rpc/RpcManager.d.ts +14 -10
  219. package/esm/rpc/RpcManager.js +11 -1
  220. package/esm/rpc/RpcRegistry.d.ts +40 -7
  221. package/esm/rpc/RpcServer.d.ts +3 -1
  222. package/esm/rpc/RpcServer.js +19 -12
  223. package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
  224. package/esm/rpc/WebWorkerRpcDriver.js +64 -68
  225. package/esm/rpc/byteBudget.d.ts +20 -5
  226. package/esm/rpc/byteBudget.js +16 -5
  227. package/esm/rpc/configSchema.d.ts +7 -21
  228. package/esm/rpc/coreRpcMethods.d.ts +4 -0
  229. package/esm/rpc/coreRpcMethods.js +4 -0
  230. package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
  231. package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
  232. package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
  233. package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
  234. package/esm/rpc/methods/CoreGetExportData.js +3 -4
  235. package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
  236. package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
  237. package/esm/rpc/methods/CoreGetFeatures.js +3 -5
  238. package/esm/rpc/methods/CoreGetRefNames.js +2 -12
  239. package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
  240. package/esm/rpc/methods/CoreGetSequence.js +2 -2
  241. package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
  242. package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
  243. package/esm/rpc/methods/layerFeatures.d.ts +33 -0
  244. package/esm/rpc/methods/layerFeatures.js +29 -0
  245. package/esm/svg/SvgExport.js +6 -7
  246. package/esm/svg/SvgThemeProviders.d.ts +12 -0
  247. package/esm/svg/SvgThemeProviders.js +15 -0
  248. package/esm/svg/exportViewSvg.d.ts +28 -0
  249. package/esm/svg/exportViewSvg.js +13 -0
  250. package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
  251. package/esm/svg/normalizeSvgMarkup.js +99 -0
  252. package/esm/svg/serializeSvg.d.ts +7 -0
  253. package/esm/svg/serializeSvg.js +11 -0
  254. package/esm/svg/svgId.d.ts +1 -1
  255. package/esm/svg/svgId.js +1 -1
  256. package/esm/svg/svgReady.d.ts +9 -7
  257. package/esm/svg/svgReady.js +8 -7
  258. package/esm/svg/trackNames.d.ts +7 -5
  259. package/esm/svg/trackNames.js +12 -9
  260. package/esm/svg/wrapSvgExport.js +6 -74
  261. package/esm/ui/AddCustomPluginDialog.js +3 -8
  262. package/esm/ui/AppReadyMarker.d.ts +45 -0
  263. package/esm/ui/AppReadyMarker.js +89 -0
  264. package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
  265. package/esm/ui/CascadingMenu.js +181 -104
  266. package/esm/ui/DropDownMenu.js +2 -1
  267. package/esm/ui/ErrorBanner.js +1 -1
  268. package/esm/ui/ErrorBoundary.d.ts +2 -2
  269. package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
  270. package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
  271. package/esm/ui/ExportSvgDialog.d.ts +1 -1
  272. package/esm/ui/FileDropZone.js +2 -1
  273. package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
  274. package/esm/ui/HoverMenu.d.ts +1 -2
  275. package/esm/ui/HoverMenu.js +6 -3
  276. package/esm/ui/JexlFilterDialog.d.ts +13 -10
  277. package/esm/ui/JexlFilterDialog.js +122 -50
  278. package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
  279. package/esm/ui/JexlFilterRowEditors.js +90 -0
  280. package/esm/ui/LazyBaseTooltip.d.ts +4 -0
  281. package/esm/ui/LazyBaseTooltip.js +9 -0
  282. package/esm/ui/LegendSwatchGlyph.js +26 -21
  283. package/esm/ui/LoadingOverlay.d.ts +14 -0
  284. package/esm/ui/LoadingOverlay.js +4 -2
  285. package/esm/ui/MenuTypes.d.ts +23 -53
  286. package/esm/ui/MenuTypes.js +3 -0
  287. package/esm/ui/MonospaceTextField.d.ts +2 -1
  288. package/esm/ui/MonospaceTextField.js +23 -20
  289. package/esm/ui/PaletteContext.d.ts +10 -5
  290. package/esm/ui/PaletteContext.js +44 -6
  291. package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
  292. package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
  293. package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
  294. package/esm/ui/RefNameAutocomplete/index.js +8 -2
  295. package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
  296. package/esm/ui/RefNameAutocomplete/util.js +42 -1
  297. package/esm/ui/ResizeHandle.d.ts +3 -1
  298. package/esm/ui/ResizeHandle.js +44 -11
  299. package/esm/ui/ScrollChrome.d.ts +13 -0
  300. package/esm/ui/ScrollChrome.js +11 -0
  301. package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
  302. package/esm/ui/ScrollEdgeShadow.js +14 -35
  303. package/esm/ui/ScrollZoomToggle.d.ts +4 -27
  304. package/esm/ui/ScrollZoomToggle.js +34 -51
  305. package/esm/ui/SessionJsonPanel.d.ts +3 -0
  306. package/esm/ui/SessionJsonPanel.js +14 -0
  307. package/esm/ui/SettingsChangesTable.d.ts +1 -0
  308. package/esm/ui/SettingsChangesTable.js +49 -11
  309. package/esm/ui/ShareLinkField.d.ts +1 -3
  310. package/esm/ui/ShareLinkField.js +13 -40
  311. package/esm/ui/SizeSliderRow.d.ts +1 -3
  312. package/esm/ui/SizeSliderRow.js +4 -6
  313. package/esm/ui/SnackbarModel.js +79 -67
  314. package/esm/ui/StatusProgressBar.js +2 -2
  315. package/esm/ui/SvgColorLegend.d.ts +9 -4
  316. package/esm/ui/SvgColorLegend.js +82 -41
  317. package/esm/ui/VerticalScrollbar.d.ts +13 -34
  318. package/esm/ui/VerticalScrollbar.js +29 -83
  319. package/esm/ui/ViewLoadingScreen.d.ts +5 -4
  320. package/esm/ui/ViewLoadingScreen.js +8 -32
  321. package/esm/ui/colorScale.d.ts +92 -0
  322. package/esm/ui/colorScale.js +72 -0
  323. package/esm/ui/colors.d.ts +64 -0
  324. package/esm/ui/colors.js +230 -1
  325. package/esm/ui/hoverBoxStyle.d.ts +14 -2
  326. package/esm/ui/hoverBoxStyle.js +17 -2
  327. package/esm/ui/index.d.ts +12 -12
  328. package/esm/ui/index.js +14 -22
  329. package/esm/ui/launchViewMenu.js +15 -5
  330. package/esm/ui/legendMenuItem.d.ts +10 -32
  331. package/esm/ui/legendMenuItem.js +9 -36
  332. package/esm/ui/legendSpec.d.ts +15 -8
  333. package/esm/ui/legendSpec.js +14 -23
  334. package/esm/ui/makeSizeMenu.d.ts +0 -6
  335. package/esm/ui/makeSizeMenu.js +6 -30
  336. package/esm/ui/measureLegendText.js +1 -1
  337. package/esm/ui/menuItemAdornment.d.ts +9 -20
  338. package/esm/ui/menuItemAdornment.js +10 -32
  339. package/esm/ui/menuItems.d.ts +2 -7
  340. package/esm/ui/menuItems.js +1 -6
  341. package/esm/ui/multiTrackMenuItems.d.ts +6 -0
  342. package/esm/ui/palette.d.ts +118 -116
  343. package/esm/ui/palette.js +114 -75
  344. package/esm/ui/replaceViewAction.d.ts +1 -1
  345. package/esm/ui/replaceViewAction.js +1 -1
  346. package/esm/ui/theme.d.ts +43 -119
  347. package/esm/ui/theme.js +62 -78
  348. package/esm/ui/toggleMenuItems.d.ts +1 -3
  349. package/esm/ui/toggleMenuItems.js +6 -5
  350. package/esm/ui/useAssemblySelection.d.ts +4 -4
  351. package/esm/ui/viewHeaderHeight.d.ts +1 -0
  352. package/esm/ui/viewHeaderHeight.js +1 -0
  353. package/esm/util/Base1DUtils.d.ts +5 -3
  354. package/esm/util/Base1DUtils.js +14 -6
  355. package/esm/util/Base1DViewModel.d.ts +2 -1
  356. package/esm/util/Base1DViewModel.js +3 -2
  357. package/esm/util/SvgCanvas.d.ts +15 -13
  358. package/esm/util/SvgCanvas.js +76 -56
  359. package/esm/util/TimeTraveller.d.ts +3 -0
  360. package/esm/util/TimeTraveller.js +34 -2
  361. package/esm/util/aborting.d.ts +39 -0
  362. package/esm/util/aborting.js +88 -6
  363. package/esm/util/adapterMetadata.d.ts +1 -1
  364. package/esm/util/adapterMetadata.js +6 -5
  365. package/esm/util/addAndShowTrack.d.ts +2 -5
  366. package/esm/util/addAndShowTrack.js +5 -1
  367. package/esm/util/addRelativeUris.d.ts +17 -5
  368. package/esm/util/addRelativeUris.js +46 -10
  369. package/esm/util/addTrackFromWidget.d.ts +2 -5
  370. package/esm/util/addTrackFromWidget.js +5 -4
  371. package/esm/util/aggregateFieldName.d.ts +10 -0
  372. package/esm/util/aggregateFieldName.js +8 -0
  373. package/esm/util/analytics.js +46 -13
  374. package/esm/util/animationAllowed.d.ts +9 -0
  375. package/esm/util/animationAllowed.js +13 -0
  376. package/esm/util/applyRowResizeWheel.d.ts +10 -5
  377. package/esm/util/applyRowResizeWheel.js +10 -21
  378. package/esm/util/bandHeight.d.ts +10 -0
  379. package/esm/util/bandHeight.js +29 -0
  380. package/esm/util/bandLayout.d.ts +4 -4
  381. package/esm/util/bandLayout.js +4 -4
  382. package/esm/util/baseDisplayConfig.d.ts +8 -0
  383. package/esm/util/baseDisplayConfig.js +27 -0
  384. package/esm/util/bezierConnector.d.ts +4 -3
  385. package/esm/util/bezierConnector.js +38 -45
  386. package/esm/util/bgzfWorkerPool.d.ts +20 -74
  387. package/esm/util/bgzfWorkerPool.js +20 -74
  388. package/esm/util/binnedAggregate.d.ts +17 -0
  389. package/esm/util/binnedAggregate.js +275 -0
  390. package/esm/util/cacheBudgets.d.ts +22 -19
  391. package/esm/util/cacheBudgets.js +22 -19
  392. package/esm/util/cachedSetup.d.ts +16 -6
  393. package/esm/util/cachedSetup.js +108 -38
  394. package/esm/util/categoricalField.d.ts +56 -0
  395. package/esm/util/categoricalField.js +73 -0
  396. package/esm/util/cellMatches.d.ts +23 -0
  397. package/esm/util/cellMatches.js +264 -0
  398. package/esm/util/cellsStep.d.ts +29 -0
  399. package/esm/util/cellsStep.js +437 -0
  400. package/esm/util/clampToContig.d.ts +17 -0
  401. package/esm/util/clampToContig.js +19 -0
  402. package/esm/util/coarseStripHTML.js +1 -2
  403. package/esm/util/color/cssColorsLevel4.d.ts +1 -0
  404. package/esm/util/color/cssColorsLevel4.js +1 -0
  405. package/esm/util/color/index.d.ts +5 -3
  406. package/esm/util/color/index.js +7 -4
  407. package/esm/util/colorBits.d.ts +3 -3
  408. package/esm/util/colorBits.js +19 -44
  409. package/esm/util/colorRamp.d.ts +49 -5
  410. package/esm/util/colorRamp.js +169 -18
  411. package/esm/util/colorScale.d.ts +156 -0
  412. package/esm/util/colorScale.js +243 -0
  413. package/esm/util/colorSchemes.d.ts +21 -0
  414. package/esm/util/colorSchemes.js +30 -0
  415. package/esm/util/copyToClipboard.js +8 -1
  416. package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
  417. package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
  418. package/esm/util/createSvgRasterCanvas.d.ts +10 -0
  419. package/esm/util/cssColorParse.d.ts +15 -0
  420. package/esm/util/cssColorParse.js +53 -0
  421. package/esm/util/diagonalizeRegions.d.ts +2 -3
  422. package/esm/util/diagonalizeRegions.js +8 -13
  423. package/esm/util/expandLooseSearchIndex.d.ts +19 -0
  424. package/esm/util/expandLooseSearchIndex.js +29 -0
  425. package/esm/util/featureTable.d.ts +224 -0
  426. package/esm/util/featureTable.js +366 -0
  427. package/esm/util/featureTransforms.d.ts +81 -0
  428. package/esm/util/featureTransforms.js +1231 -0
  429. package/esm/util/featureTypes.d.ts +24 -0
  430. package/esm/util/featureTypes.js +35 -0
  431. package/esm/util/fetchAndMaybeUnzip.js +16 -9
  432. package/esm/util/fetchContext.d.ts +7 -8
  433. package/esm/util/fetchContext.js +3 -3
  434. package/esm/util/fetchHub.d.ts +4 -2
  435. package/esm/util/fetchHub.js +2 -2
  436. package/esm/util/fetchPhases.d.ts +10 -10
  437. package/esm/util/fetchSeq.d.ts +2 -3
  438. package/esm/util/fetchSeq.js +2 -2
  439. package/esm/util/fieldReader.d.ts +17 -0
  440. package/esm/util/fieldReader.js +62 -0
  441. package/esm/util/formatBytes.js +1 -1
  442. package/esm/util/formatGuessers.d.ts +25 -14
  443. package/esm/util/formatGuessers.js +42 -27
  444. package/esm/util/formatRelativeTime.js +1 -1
  445. package/esm/util/freezeDeep.d.ts +8 -10
  446. package/esm/util/freezeDeep.js +8 -10
  447. package/esm/util/getLocationUri.d.ts +2 -1
  448. package/esm/util/getLocationUri.js +8 -2
  449. package/esm/util/groupKeys.d.ts +76 -0
  450. package/esm/util/groupKeys.js +156 -0
  451. package/esm/util/highlights.d.ts +10 -6
  452. package/esm/util/highlights.js +12 -25
  453. package/esm/util/hooks.d.ts +31 -2
  454. package/esm/util/hooks.js +72 -3
  455. package/esm/util/index.d.ts +11 -11
  456. package/esm/util/index.js +11 -10
  457. package/esm/util/indexCandidates.d.ts +1 -31
  458. package/esm/util/indexCandidates.js +5 -63
  459. package/esm/util/installFetch.d.ts +77 -37
  460. package/esm/util/installFetch.js +65 -38
  461. package/esm/util/installInitAutorun.d.ts +14 -13
  462. package/esm/util/installInitAutorun.js +17 -17
  463. package/esm/util/installPrerequisiteFetch.d.ts +115 -0
  464. package/esm/util/installPrerequisiteFetch.js +111 -0
  465. package/esm/util/intervals.js +9 -4
  466. package/esm/util/io/index.js +22 -15
  467. package/esm/util/isDataCurrent.d.ts +7 -5
  468. package/esm/util/isDataCurrent.js +9 -6
  469. package/esm/util/isTextEntryFocused.d.ts +7 -0
  470. package/esm/util/isTextEntryFocused.js +16 -0
  471. package/esm/util/jexl.js +24 -21
  472. package/esm/util/jexlFilterRows.d.ts +89 -0
  473. package/esm/util/jexlFilterRows.js +252 -0
  474. package/esm/util/jexlFilters.d.ts +32 -57
  475. package/esm/util/jexlFilters.js +31 -29
  476. package/esm/util/jexlStrings.d.ts +3 -4
  477. package/esm/util/jexlStrings.js +2 -3
  478. package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
  479. package/esm/util/layouts/GranularRectLayout.js +25 -8
  480. package/esm/util/lazyAfterAttach.d.ts +13 -0
  481. package/esm/util/lazyAfterAttach.js +31 -0
  482. package/esm/util/lazyWithPreload.d.ts +19 -0
  483. package/esm/util/lazyWithPreload.js +27 -0
  484. package/esm/util/legendCandidates.d.ts +72 -0
  485. package/esm/util/legendCandidates.js +138 -0
  486. package/esm/util/locString.js +5 -2
  487. package/esm/util/localStorage.js +4 -4
  488. package/esm/util/markEncoding.d.ts +150 -0
  489. package/esm/util/markEncoding.js +885 -0
  490. package/esm/util/markEncodingTypes.d.ts +595 -0
  491. package/esm/util/markEncodingTypes.js +8 -0
  492. package/esm/util/mst-reflection.d.ts +2 -20
  493. package/esm/util/mst-reflection.js +3 -53
  494. package/esm/util/mstUtils.d.ts +31 -23
  495. package/esm/util/mstUtils.js +39 -24
  496. package/esm/util/numericUtils.d.ts +7 -0
  497. package/esm/util/numericUtils.js +16 -0
  498. package/esm/util/numericValue.d.ts +14 -0
  499. package/esm/util/numericValue.js +34 -0
  500. package/esm/util/openFeatureWidget.d.ts +5 -0
  501. package/esm/util/openFeatureWidget.js +2 -2
  502. package/esm/util/openViews.d.ts +17 -0
  503. package/esm/util/openViews.js +22 -0
  504. package/esm/util/parentWalk.d.ts +1 -1
  505. package/esm/util/parentWalk.js +1 -1
  506. package/esm/util/parseLineByLine.d.ts +4 -5
  507. package/esm/util/parseLineByLine.js +8 -14
  508. package/esm/util/pluginStore.d.ts +6 -8
  509. package/esm/util/pluginStore.js +17 -16
  510. package/esm/util/preloadComponent.d.ts +5 -0
  511. package/esm/util/preloadComponent.js +11 -0
  512. package/esm/util/progress.d.ts +22 -22
  513. package/esm/util/progress.js +27 -26
  514. package/esm/util/quantileExtent.d.ts +49 -0
  515. package/esm/util/quantileExtent.js +162 -0
  516. package/esm/util/range.d.ts +13 -9
  517. package/esm/util/range.js +17 -8
  518. package/esm/util/renameRegions.d.ts +26 -6
  519. package/esm/util/renameRegions.js +68 -54
  520. package/esm/util/renderToStaticMarkup.js +24 -14
  521. package/esm/util/rxjs.d.ts +23 -8
  522. package/esm/util/rxjs.js +61 -15
  523. package/esm/util/samplesTsv.d.ts +49 -0
  524. package/esm/util/samplesTsv.js +86 -0
  525. package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
  526. package/esm/util/scheduleDetachedDestroy.js +24 -0
  527. package/esm/util/scrollLatch.d.ts +1 -0
  528. package/esm/util/scrollLatch.js +8 -0
  529. package/esm/util/selectEncodedFeature.d.ts +16 -0
  530. package/esm/util/selectEncodedFeature.js +34 -0
  531. package/esm/util/sessionSharing.d.ts +7 -5
  532. package/esm/util/sessionSharing.js +23 -23
  533. package/esm/util/shapeNameList.d.ts +2 -0
  534. package/esm/util/shapeNameList.js +6 -0
  535. package/esm/util/shapeNames.d.ts +7 -0
  536. package/esm/util/shapeNames.js +11 -0
  537. package/esm/util/simpleFeature.d.ts +0 -1
  538. package/esm/util/springAnimate.js +1 -1
  539. package/esm/util/starFusion.d.ts +26 -0
  540. package/esm/util/starFusion.js +37 -0
  541. package/esm/util/stepTables.d.ts +96 -0
  542. package/esm/util/stepTables.js +277 -0
  543. package/esm/util/svAlt.d.ts +145 -0
  544. package/esm/util/svAlt.js +364 -0
  545. package/esm/util/svgColorProps.d.ts +11 -0
  546. package/esm/util/svgColorProps.js +28 -1
  547. package/esm/util/systemColorScheme.d.ts +12 -0
  548. package/esm/util/systemColorScheme.js +27 -0
  549. package/esm/util/tabix.d.ts +19 -10
  550. package/esm/util/tabix.js +19 -14
  551. package/esm/util/thresholdScale.d.ts +91 -0
  552. package/esm/util/thresholdScale.js +166 -0
  553. package/esm/util/timeGate.d.ts +4 -5
  554. package/esm/util/timeGate.js +4 -5
  555. package/esm/util/trackConfigDelta.d.ts +26 -26
  556. package/esm/util/trackConfigDelta.js +63 -47
  557. package/esm/util/tracks.d.ts +120 -66
  558. package/esm/util/tracks.js +501 -151
  559. package/esm/util/translateTranscript.d.ts +44 -0
  560. package/esm/util/translateTranscript.js +102 -0
  561. package/esm/util/types/data.d.ts +0 -2
  562. package/esm/util/types/index.d.ts +121 -22
  563. package/esm/util/types/index.js +9 -0
  564. package/esm/util/types/mst.d.ts +3 -0
  565. package/esm/util/types/mst.js +4 -0
  566. package/esm/util/types/renameIds.d.ts +1 -0
  567. package/esm/util/types/renameIds.js +29 -0
  568. package/esm/util/types/services.d.ts +1 -1
  569. package/esm/util/unknownSnapshotKeys.d.ts +53 -0
  570. package/esm/util/unknownSnapshotKeys.js +76 -0
  571. package/esm/util/useFeatureSequence.js +5 -5
  572. package/esm/util/useFetch.d.ts +3 -4
  573. package/esm/util/useFetch.js +19 -10
  574. package/esm/util/useFetchPlugins.d.ts +6 -2
  575. package/esm/util/useFetchPlugins.js +7 -3
  576. package/esm/util/usePanZoom.js +10 -3
  577. package/esm/util/usePanelVirtualScroll.d.ts +7 -35
  578. package/esm/util/usePanelVirtualScroll.js +9 -36
  579. package/esm/util/useRafCommit.js +1 -0
  580. package/esm/util/useRowVirtualScroll.d.ts +6 -29
  581. package/esm/util/useRowVirtualScroll.js +8 -49
  582. package/esm/util/useVirtualScrollWheel.d.ts +20 -4
  583. package/esm/util/useVirtualScrollWheel.js +40 -74
  584. package/esm/util/viewHighlights.d.ts +3 -0
  585. package/esm/util/viewHighlights.js +5 -0
  586. package/esm/util/viewStatus.d.ts +47 -15
  587. package/esm/util/viewStatus.js +34 -0
  588. package/esm/util/wheelZoom.d.ts +7 -1
  589. package/esm/util/wheelZoom.js +85 -19
  590. package/esm/util/whenViewSettled.d.ts +55 -8
  591. package/esm/util/whenViewSettled.js +56 -7
  592. package/esm/util/withFeatureDetails.js +4 -0
  593. package/esm/util/withLaunchInput.d.ts +174 -0
  594. package/esm/util/withLaunchInput.js +274 -0
  595. package/package.json +75 -24
  596. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
  597. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
  598. package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
  599. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
  600. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
  601. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
  602. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
  603. package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
  604. package/esm/ReExports/BaseFeatureDetails.js +0 -10
  605. package/esm/ReExports/index.d.ts +0 -1
  606. package/esm/ReExports/index.js +0 -1
  607. package/esm/ReExports/publicUtil.d.ts +0 -1
  608. package/esm/ReExports/publicUtil.js +0 -28
  609. package/esm/configuration/promotableDefaults.d.ts +0 -199
  610. package/esm/configuration/promotableDefaults.js +0 -326
  611. package/esm/configuration/promotablePin.d.ts +0 -55
  612. package/esm/configuration/promotablePin.js +0 -1
  613. package/esm/configuration/promotableResolve.d.ts +0 -108
  614. package/esm/configuration/promotableResolve.js +0 -117
  615. package/esm/configuration/promotableSlots.d.ts +0 -12
  616. package/esm/configuration/promotableSlots.js +0 -45
  617. package/esm/configuration/slotShape.d.ts +0 -12
  618. package/esm/configuration/slotShape.js +0 -84
  619. package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
  620. package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
  621. package/esm/ui/PinAdornment.d.ts +0 -5
  622. package/esm/ui/PinAdornment.js +0 -79
  623. package/esm/ui/SvgGradientLegend.d.ts +0 -26
  624. package/esm/ui/SvgGradientLegend.js +0 -26
  625. package/esm/ui/highlightChipReveal.d.ts +0 -32
  626. package/esm/ui/highlightChipReveal.js +0 -39
  627. package/esm/ui/promotableMenuItems.d.ts +0 -19
  628. package/esm/ui/promotableMenuItems.js +0 -89
  629. package/esm/ui/promotablePinCoverage.d.ts +0 -44
  630. package/esm/ui/promotablePinCoverage.js +0 -87
  631. package/esm/util/applyInitSettings.d.ts +0 -79
  632. package/esm/util/applyInitSettings.js +0 -91
  633. package/esm/util/openDisplays.d.ts +0 -23
  634. package/esm/util/openDisplays.js +0 -79
  635. package/esm/util/stopToken.d.ts +0 -211
  636. package/esm/util/stopToken.js +0 -438
  637. /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
@@ -1,9 +1,14 @@
1
1
  /**
2
- * Stamp `baseUri` next to every `uri` in a config so relative URIs resolve
3
- * against the location the config itself was loaded from. jbrowse-web runs this
4
- * when it fetches a config.json from a URL; anything that injects a fetched
5
- * config as an object (a hub, a track hub connection, a headless render) has to
6
- * run it too, or the config's relative data URIs resolve against the page.
2
+ * Stamp `baseUri` next to every `uri` in a config, and beside a MultiWiggle
3
+ * `bigWigs` array of bare URI strings, so relative URIs resolve against the
4
+ * location the config itself was loaded from. A file written as a bare string
5
+ * where a location object can go (a search index, `refNameAliases`,
6
+ * `cytobands`, a `bedLocations` entry) has no object to stamp, so it becomes
7
+ * `{ uri, baseUri }`.
8
+ * jbrowse-web runs this when it fetches a config.json from a URL; anything that
9
+ * injects a fetched config as an object (a hub, a track hub connection, a
10
+ * headless render) has to run it too, or the config's relative data URIs
11
+ * resolve against the page.
7
12
  *
8
13
  * Lives in core because core is what consumes the result — the assembly config
9
14
  * schema and expandAssemblyConfigShorthand read `baseUri` back out.
@@ -11,16 +16,47 @@
11
16
  export function addRelativeUris(config, base) {
12
17
  if (typeof config === 'object' && config !== null) {
13
18
  for (const key of Object.keys(config)) {
14
- if (typeof config[key] === 'object' && config[key] !== null) {
15
- addRelativeUris(config[key], base);
19
+ const value = liftBareFiles(key, config[key]);
20
+ if (value !== config[key]) {
21
+ config[key] = value;
16
22
  }
17
- else if (key === 'uri') {
18
- // fill only when absent, so a node carrying its own baseUri wins
19
- config.baseUri = config.baseUri ?? base.href;
23
+ if (typeof value === 'object' && value !== null) {
24
+ addRelativeUris(value, base);
25
+ }
26
+ if (key === 'uri' || (key === 'bigWigs' && Array.isArray(value))) {
27
+ config.baseUri ??= base.href;
20
28
  }
21
29
  }
22
30
  }
23
31
  }
32
+ // the keys whose value may be a file written as a bare string, which has no
33
+ // object to carry a baseUri until it becomes `{ uri }`
34
+ const FILE_KEYS = new Set(['textSearchAdapter', 'refNameAliases', 'cytobands']);
35
+ const FILE_LIST_KEYS = new Set(['aggregateTextSearchAdapters', 'bedLocations']);
36
+ function liftBareFiles(key, value) {
37
+ const lift = (file) => typeof file === 'string' ? { uri: file } : file;
38
+ return FILE_KEYS.has(key)
39
+ ? lift(value)
40
+ : FILE_LIST_KEYS.has(key) &&
41
+ Array.isArray(value) &&
42
+ value.some(file => typeof file === 'string')
43
+ ? value.map(lift)
44
+ : value;
45
+ }
46
+ /**
47
+ * A copy of `config` with every relative URI stamped against the page, which
48
+ * is what the page itself would resolve it against. An RPC worker started from
49
+ * a `blob:` URL has no such base, so a location it receives without one fails
50
+ * to parse there.
51
+ */
52
+ export function withPageBaseUri(config) {
53
+ if (typeof document === 'undefined' || config === undefined) {
54
+ return config;
55
+ }
56
+ const copy = structuredClone(config);
57
+ addRelativeUris(copy, new URL(document.baseURI));
58
+ return copy;
59
+ }
24
60
  /**
25
61
  * Inverse of {@link addRelativeUris}: recursively delete every synthetic
26
62
  * `baseUri` key (mutates in place), e.g. before serializing a config snapshot
@@ -82,13 +82,10 @@ export declare function addTrackFromWidget({ model, session, conf, }: {
82
82
  name?: string;
83
83
  assemblyNames?: (string | undefined)[];
84
84
  };
85
- }): (import("@jbrowse/mobx-state-tree").$EmptyObjectBrand & Partial<{
85
+ }): import("../configuration/types.ts").AnyConfigurationModel | (import("@jbrowse/mobx-state-tree").$EmptyObjectBrand & Partial<{
86
86
  [x: string]: any;
87
87
  }> & {
88
88
  trackId: string;
89
89
  name?: string;
90
90
  assemblyNames?: (string | undefined)[];
91
- }) | (import("@jbrowse/mobx-state-tree").ModelInstanceTypeProps<Record<string, any>> & {
92
- setSubschema(slotName: string, data: Record<string, unknown>): any;
93
- setSlot(slotName: string, value: unknown): void;
94
- } & IStateTreeNode<import("../configuration/types.ts").AnyConfigurationSchemaType>) | undefined;
91
+ }) | undefined;
@@ -1,3 +1,4 @@
1
+ import { coarseStripHTML } from './coarseStripHTML.js';
1
2
  import { namesTemporaryAssembly } from './temporaryAssembly.js';
2
3
  import { isSameAssemblyName } from './tracks.js';
3
4
  import { isSessionModelWithWidgets, isSessionWithPublishTrackConf, } from './types/index.js';
@@ -65,10 +66,10 @@ export function addTrackFromWidget({ model, session, conf, }) {
65
66
  const { trackContainer } = model;
66
67
  if (namesTemporaryAssembly(session, conf)) {
67
68
  if (!trackContainer) {
68
- session.notify(`Could not add "${conf.name ?? conf.trackId}": the view it was being added to has closed, and it uses an assembly that only that view had.`, 'warning');
69
+ session.notify(`Could not add "${coarseStripHTML(conf.name ?? conf.trackId)}": the view it was being added to has closed, and it uses an assembly that only that view had.`, 'warning');
69
70
  return undefined;
70
71
  }
71
- trackContainer.showTrack(conf.trackId, {}, {}, conf);
72
+ void trackContainer.launchTrack(conf.trackId, {}, {}, conf);
72
73
  finishAddTrack(model, session);
73
74
  return conf;
74
75
  }
@@ -77,11 +78,11 @@ export function addTrackFromWidget({ model, session, conf, }) {
77
78
  return undefined;
78
79
  }
79
80
  if (containerDisplaysAssembly(trackContainer, conf.assemblyNames, session.assemblyManager)) {
80
- trackContainer?.showTrack(conf.trackId);
81
+ void trackContainer?.launchTrack(conf.trackId);
81
82
  }
82
83
  else {
83
84
  const assemblies = conf.assemblyNames?.filter(a => !!a) ?? [];
84
- session.notify(`Added track "${conf.name ?? conf.trackId}" to the session, but it was not displayed because it uses ${assemblies.length
85
+ session.notify(`Added track "${coarseStripHTML(conf.name ?? conf.trackId)}" to the session, but it was not displayed because it uses ${assemblies.length
85
86
  ? `assembly "${assemblies.join('", "')}"`
86
87
  : 'an assembly'}, which is not open in this view. Open a view for that assembly and use its track selector to display it.`, 'warning');
87
88
  }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The field an aggregate op writes: `as` where named, else `count` for a
3
+ * count, else `<op>_<field>`. Imports nothing, so the validator's copy of the
4
+ * mark rule list carries it unchanged.
5
+ */
6
+ export declare function aggregateFieldName({ op, field, as, }: {
7
+ op: string;
8
+ field?: string;
9
+ as?: string;
10
+ }): string;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The field an aggregate op writes: `as` where named, else `count` for a
3
+ * count, else `<op>_<field>`. Imports nothing, so the validator's copy of the
4
+ * mark rule list carries it unchanged.
5
+ */
6
+ export function aggregateFieldName({ op, field, as, }) {
7
+ return as || (op === 'count' || !field ? op : `${op}_${field}`);
8
+ }
@@ -9,11 +9,10 @@ export async function writeAWSAnalytics(rootModel, initialTimestamp, sessionQuer
9
9
  try {
10
10
  const url = 'https://analytics.jbrowse.org/api/v1';
11
11
  const multiAssemblyTracks = rootModel.jbrowse.tracks.filter(track => readConfObject(track, 'assemblyNames').length > 1).length;
12
- // which rendering backend is actually drawing (WebGPU/WebGL2/Canvas2D) —
13
- // capabilities *and* any page-wide pin, so a session that fell back to
14
- // Canvas2D is counted as Canvas2D rather than as what the hardware could
15
- // have done. Reporting the capability answer here is what made "how many
16
- // users end up on Canvas2D" unanswerable.
12
+ // The rung createGpuHal built where a display has built one by idle time,
13
+ // else the ladder's prediction with any page-wide pin applied — so a
14
+ // session that fell back to Canvas2D is counted as Canvas2D rather than as
15
+ // what the hardware could have done.
17
16
  const capabilities = await getGraphicsCapabilities();
18
17
  const renderer = effectiveRenderer(capabilities);
19
18
  // The coarse bit only. `glRenderer` names the exact driver and stays local
@@ -120,14 +119,48 @@ export function doAnalytics(rootModel, initialTimestamp, initialSessionQuery) {
120
119
  !analyticsSent &&
121
120
  !readConfObject(rootModel.jbrowse.configuration, 'disableAnalytics')) {
122
121
  analyticsSent = true;
123
- // Defer off the critical load path: writeGAAnalytics injects a third-party
124
- // Google Analytics script and writeAWSAnalytics probes graphics
125
- // capabilities, together ~hundreds of ms of main-thread work at startup.
126
- // loadTime is still measured from initialTimestamp, so the reported metric
127
- // is unaffected by running these when the browser is idle.
128
- rIC(() => {
129
- void writeAWSAnalytics(rootModel, initialTimestamp, initialSessionQuery);
130
- void writeGAAnalytics(rootModel, initialTimestamp);
122
+ // writeGAAnalytics injects Google's scripts and writeAWSAnalytics probes
123
+ // graphics capabilities, hundreds of ms of main-thread work together. Idle
124
+ // time alone is not late enough: a load spends most of its time idle,
125
+ // waiting on the network, so rIC ran them mid-boot. The writers measure
126
+ // loadTime up to when they run, so the start they get is moved forward by
127
+ // the wait, and loadTime still ends here.
128
+ const calledAt = Date.now();
129
+ afterAppReady(() => {
130
+ rIC(() => {
131
+ const start = initialTimestamp + (Date.now() - calledAt);
132
+ void writeAWSAnalytics(rootModel, start, initialSessionQuery);
133
+ void writeGAAnalytics(rootModel, start);
134
+ });
131
135
  });
132
136
  }
133
137
  }
138
+ // `[data-app-phase="ready"]`, or a timeout for a page that never shows one
139
+ // (Desktop's start screen)
140
+ function afterAppReady(callback, maxWaitMs = 10_000) {
141
+ const isReady = () => document.querySelector('[data-app-phase="ready"]') !== null;
142
+ if (isReady()) {
143
+ callback();
144
+ return;
145
+ }
146
+ let done = false;
147
+ const finish = () => {
148
+ if (!done) {
149
+ done = true;
150
+ observer.disconnect();
151
+ clearTimeout(timer);
152
+ callback();
153
+ }
154
+ };
155
+ const observer = new MutationObserver(() => {
156
+ if (isReady()) {
157
+ finish();
158
+ }
159
+ });
160
+ const timer = setTimeout(finish, maxWaitMs);
161
+ observer.observe(document.body, {
162
+ subtree: true,
163
+ childList: true,
164
+ attributeFilter: ['data-app-phase'],
165
+ });
166
+ }
@@ -15,3 +15,12 @@ import type { AnimationMode } from './types/index.ts';
15
15
  * honors it.
16
16
  */
17
17
  export declare function animationAllowed(mode: AnimationMode): boolean;
18
+ /** how long a layout morph takes from where it drew to where it now draws */
19
+ export declare const MORPH_DURATION_MS = 300;
20
+ export declare function easeInOutCubic(t: number): number;
21
+ /**
22
+ * The wall clock a morph is timed on. Falls back to the epoch clock rather than
23
+ * a constant where `performance` is missing: a clock that never advances
24
+ * leaves a frame loop at progress 0 forever.
25
+ */
26
+ export declare function morphClockMs(): number;
@@ -20,3 +20,16 @@ export function animationAllowed(mode) {
20
20
  return (hasFrameClock &&
21
21
  (mode === 'enabled' || (mode === 'system' && !prefersReduced)));
22
22
  }
23
+ /** how long a layout morph takes from where it drew to where it now draws */
24
+ export const MORPH_DURATION_MS = 300;
25
+ export function easeInOutCubic(t) {
26
+ return t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2;
27
+ }
28
+ /**
29
+ * The wall clock a morph is timed on. Falls back to the epoch clock rather than
30
+ * a constant where `performance` is missing: a clock that never advances
31
+ * leaves a frame loop at progress 0 forever.
32
+ */
33
+ export function morphClockMs() {
34
+ return typeof performance === 'undefined' ? Date.now() : performance.now();
35
+ }
@@ -1,10 +1,15 @@
1
- interface RowResizeTarget {
1
+ import type { VirtualScrollModel } from './useVirtualScrollWheel.ts';
2
+ export interface RowResizeTarget extends VirtualScrollModel {
3
+ /** resolved, never the 0/fit sentinel — this is divided by */
2
4
  effectiveRowHeight: number;
3
- scrollTop: number;
4
5
  nrow: number;
5
- viewportHeight: number;
6
6
  setRowHeight: (n: number) => void;
7
- setScrollTop: (n: number) => void;
8
7
  }
8
+ /**
9
+ * shift+wheel over a row stack: resize the rows, pinning the row under the
10
+ * cursor. The floor is the fit height, so rows never shrink past filling the
11
+ * viewport. The cap stops a gesture but never moves rows on its own, so it
12
+ * rises to a current height already above it (a pinned `rowHeight` is
13
+ * unbounded).
14
+ */
9
15
  export declare function applyRowResizeWheel(e: WheelEvent, el: HTMLElement, model: RowResizeTarget): void;
10
- export {};
@@ -1,30 +1,19 @@
1
- // shift+wheel resizes the sample rows (a vertical-zoom gesture) rather than
2
- // scrolling, keeping the row under the cursor pinned in place as the height
3
- // changes. Shared by every row-stack display — both variant displays and MAF —
4
- // so the gesture stays identical wherever rows have a resolved height and a
5
- // scroll offset. setScrollTop clamps to the new scrollableHeight, so the raw
6
- // target is passed through unclamped.
7
1
  import { normalizeWheelDelta } from './wheelZoom.js';
8
2
  const MAX_ROW_HEIGHT = 20;
9
- // px of row-height change per pixel of normalized wheel scroll. A mouse notch
10
- // (~100px) nudges the height ~0.4px; a trackpad's small continuous deltas
11
- // accumulate smoothly instead of the old sign-based ±1-per-event, which flew
12
- // through the whole range on a trackpad's event flood.
3
+ // A mouse notch (~100px) nudges the height ~0.4px, and a trackpad's small
4
+ // deltas accumulate smoothly rather than flying through the range.
13
5
  const RESIZE_PX_PER_WHEEL_PX = 1 / 240;
6
+ /**
7
+ * shift+wheel over a row stack: resize the rows, pinning the row under the
8
+ * cursor. The floor is the fit height, so rows never shrink past filling the
9
+ * viewport. The cap stops a gesture but never moves rows on its own, so it
10
+ * rises to a current height already above it (a pinned `rowHeight` is
11
+ * unbounded).
12
+ */
14
13
  export function applyRowResizeWheel(e, el, model) {
15
14
  e.preventDefault();
16
- // scroll up (deltaY < 0) grows rows; proportional to the normalized delta so
17
- // the speed is consistent across mice/trackpads and finer than ±1/event.
18
15
  const delta = -normalizeWheelDelta(e.deltaY, e.deltaMode) * RESIZE_PX_PER_WHEEL_PX;
19
- // guard nrow=0 (no samples) so the auto-fit floor stays finite
20
- const minRowHeight = model.viewportHeight / Math.max(1, model.nrow);
21
- // The cap may stop the gesture going further; it may never move the rows on
22
- // its own. So both heights that can already sit above MAX_ROW_HEIGHT raise
23
- // it: the auto-fit floor (few samples), and the current height (a pinned
24
- // `rowHeight` — the config slot and the "Custom..." dialog are both
25
- // unbounded, and MAF's own docs example is 12 while a bases-mode row wants
26
- // more). Without the second, a 40px pinned row met `min(20, 40.4)` on the
27
- // first notch of a *grow* gesture and halved.
16
+ const minRowHeight = model.scrollViewportHeight / Math.max(1, model.nrow);
28
17
  const maxRowHeight = Math.max(MAX_ROW_HEIGHT, minRowHeight, model.effectiveRowHeight);
29
18
  const newRowHeight = Math.max(minRowHeight, Math.min(maxRowHeight, model.effectiveRowHeight + delta));
30
19
  const mouseY = e.clientY - el.getBoundingClientRect().top;
@@ -51,3 +51,13 @@ export declare function boundBandHeight(n: number, { min, max }?: BandBounds): n
51
51
  * display height so the plot below cannot be squashed to nothing
52
52
  */
53
53
  export declare function clampBandHeight(current: number, target: number, bounds?: BandBounds): number;
54
+ /**
55
+ * #api core/util
56
+ * Heights after growing or shrinking a stack of bands by `distance` px in all:
57
+ * the one rule every whole-stack resize uses. Each band takes its share of the
58
+ * height it has above `floor`, so the tall bands give and take the most, and
59
+ * none goes below `floor`, or below its own height if it already sits under it
60
+ * (the {@link clampBandHeight} rule). Whole pixels, rounded by largest
61
+ * remainder, so the stack moves by exactly the rounded distance.
62
+ */
63
+ export declare function scaleBandHeights(heights: number[], distance: number, floor?: number): number[];
@@ -54,3 +54,32 @@ export function clampBandHeight(current, target, bounds = {}) {
54
54
  const { min = MIN_BAND_HEIGHT } = bounds;
55
55
  return boundBandHeight(target, { ...bounds, min: Math.min(min, current) });
56
56
  }
57
+ /**
58
+ * #api core/util
59
+ * Heights after growing or shrinking a stack of bands by `distance` px in all:
60
+ * the one rule every whole-stack resize uses. Each band takes its share of the
61
+ * height it has above `floor`, so the tall bands give and take the most, and
62
+ * none goes below `floor`, or below its own height if it already sits under it
63
+ * (the {@link clampBandHeight} rule). Whole pixels, rounded by largest
64
+ * remainder, so the stack moves by exactly the rounded distance.
65
+ */
66
+ export function scaleBandHeights(heights, distance, floor = MIN_BAND_HEIGHT) {
67
+ const floors = heights.map(h => Math.min(h, floor));
68
+ const room = heights.map((h, i) => h - floors[i]);
69
+ const roomTotal = room.reduce((a, b) => a + b, 0);
70
+ const target = Math.max(0, Math.round(roomTotal + distance));
71
+ const exact = room.map(r => roomTotal > 0 ? (r * target) / roomTotal : target / heights.length);
72
+ const whole = exact.map(e => Math.floor(e));
73
+ let left = target - whole.reduce((a, b) => a + b, 0);
74
+ const byRemainder = exact
75
+ .map((e, i) => ({ i, frac: e - whole[i] }))
76
+ .sort((a, b) => b.frac - a.frac);
77
+ for (const { i } of byRemainder) {
78
+ if (left <= 0) {
79
+ break;
80
+ }
81
+ whole[i] = whole[i] + 1;
82
+ left -= 1;
83
+ }
84
+ return whole.map((w, i) => w + floors[i]);
85
+ }
@@ -39,11 +39,11 @@ export interface BandStack<K extends string> {
39
39
  /**
40
40
  * #api core/util
41
41
  * Fold an ordered set of bands into tops and a bottom. The order is the
42
- * argument, so a display states its band order exactly once; reserve, paint
43
- * and pick all read the same fold, which is what keeps "the reserver and the
44
- * painter read one function" true by construction rather than by prose.
42
+ * argument, so a display states its band order exactly once. Reserve, paint
43
+ * and pick all call this function, so the reserved and painted positions
44
+ * cannot disagree.
45
45
  *
46
- * Only the fold is shared. What varies per display stays there: per-lane
46
+ * Only the fold is shared; the rest stays in each display. Per-lane
47
47
  * iteration runs this once per lane, sticky-vs-scrolling is a property of how
48
48
  * the result is projected to the screen, and a band drawn outside its
49
49
  * reservation (an overlay) carries its own draw rect beside the stack.
@@ -14,11 +14,11 @@ export function reservedPx(band) {
14
14
  /**
15
15
  * #api core/util
16
16
  * Fold an ordered set of bands into tops and a bottom. The order is the
17
- * argument, so a display states its band order exactly once; reserve, paint
18
- * and pick all read the same fold, which is what keeps "the reserver and the
19
- * painter read one function" true by construction rather than by prose.
17
+ * argument, so a display states its band order exactly once. Reserve, paint
18
+ * and pick all call this function, so the reserved and painted positions
19
+ * cannot disagree.
20
20
  *
21
- * Only the fold is shared. What varies per display stays there: per-lane
21
+ * Only the fold is shared; the rest stays in each display. Per-lane
22
22
  * iteration runs this once per lane, sticky-vs-scrolling is a property of how
23
23
  * the result is projected to the screen, and a band drawn outside its
24
24
  * reservation (an overlay) carries its own draw rect beside the stack.
@@ -0,0 +1,8 @@
1
+ /**
2
+ * #api core/util
3
+ * The base's entry for this display, hydrated, which a reset returns to and
4
+ * "is this the reader's" compares against: the config.json's, or the one a
5
+ * track the session owns was added with; empty in a session that keeps no
6
+ * base.
7
+ */
8
+ export declare function baseDisplayConfig(self: object): Record<string, unknown>;
@@ -0,0 +1,27 @@
1
+ import { hasParent } from '@jbrowse/mobx-state-tree';
2
+ import { getConf } from '../configuration/getConf.js';
3
+ import { getContainingTrack, getSession } from './mstUtils.js';
4
+ import { isSessionWithBaseTrackConfig } from './types/index.js';
5
+ /**
6
+ * #api core/util
7
+ * The base's entry for this display, hydrated, which a reset returns to and
8
+ * "is this the reader's" compares against: the config.json's, or the one a
9
+ * track the session owns was added with; empty in a session that keeps no
10
+ * base.
11
+ */
12
+ export function baseDisplayConfig(self) {
13
+ if (!hasParent(self)) {
14
+ return {};
15
+ }
16
+ const session = getSession(self);
17
+ if (!isSessionWithBaseTrackConfig(session)) {
18
+ return {};
19
+ }
20
+ const base = session.baseTrackConfig(getConf(getContainingTrack(self), 'trackId'));
21
+ const { displayId } = self
22
+ .configuration;
23
+ const displays = base?.displays;
24
+ return ((Array.isArray(displays)
25
+ ? displays.find(d => d.displayId === displayId)
26
+ : undefined) ?? {});
27
+ }
@@ -1,5 +1,6 @@
1
- export declare const BEZIER_CONNECTOR_MAX_REACH_PX: number;
2
- export declare function bezierConnectorPath({ x1, y1, x2, y2, s1, s2, leadingEnd2, reversed1, reversed2, maxHandlePx, dip, }: {
1
+ export declare const CUBIC_APEX_RATIO = 0.75;
2
+ export declare const BEZIER_CONNECTOR_MAX_REACH_PX = 110;
3
+ export declare function bezierConnectorPath({ x1, y1, x2, y2, s1, s2, leadingEnd2, reversed1, reversed2, maxHandlePx, dipPx, }: {
3
4
  x1: number;
4
5
  y1: number;
5
6
  x2: number;
@@ -10,5 +11,5 @@ export declare function bezierConnectorPath({ x1, y1, x2, y2, s1, s2, leadingEnd
10
11
  reversed1?: boolean;
11
12
  reversed2?: boolean;
12
13
  maxHandlePx?: number;
13
- dip?: boolean;
14
+ dipPx?: number;
14
15
  }): string;
@@ -19,43 +19,38 @@ const SPAN_FACTOR = 0.3;
19
19
  // its leading end: unbounded, that hook grows with the arc, and a full-width
20
20
  // inversion flings a ~500px curl back across unrelated reads.
21
21
  const MAX_HANDLE_PX = 200;
22
+ // A symmetric cubic's extreme sits 3/4 of the way from its baseline to its
23
+ // control points, so an arc asked to reach a given apex puts its controls 4/3
24
+ // past it. Exported because the sashimi overlay solves the same equation in the
25
+ // other direction, and the two spellings drifting apart would put the insert-
26
+ // size ruler's labels at heights nothing plots at.
27
+ export const CUBIC_APEX_RATIO = 0.75;
22
28
  // Vertical bow applied to a connection whose two endpoints share (or nearly
23
29
  // share) a row — e.g. a chain whose split segments are all laid out on one
24
30
  // pileup row. Without it the horizontal-only handles collapse the cubic to a
25
31
  // flat, invisible line lying on the row; the bow lifts the control points so
26
32
  // the curve arcs into a visible hump. This is the control-point lift, not the
27
- // height the curve reaches: a cubic with both control points lifted by `bow`
28
- // apexes at 0.75 * bow.
33
+ // height the curve reaches.
29
34
  const MAX_BOW_PX = 30;
30
35
  // A discordant connection bows *down* instead of up, so the two classes read
31
36
  // apart at a glance. Both renderers follow this: BreakpointSplitView dips its
32
- // same-level discordant links, and the pileup overlay dips every curve it draws
33
- // (its normal-orientation pairs are plain lines, so a curve there is always
34
- // discordant). Keep it that way — a renderer that opts out makes "below the
35
- // reads" mean two different things in two views of the same data.
37
+ // same-level discordant links, and the pileup overlay dips every discordant
38
+ // curve it draws (a normal-orientation pair is a plain line, or bows up over its
39
+ // row where a hidden-segment one would lie on a chain's connecting line). Keep
40
+ // it that way — a renderer that opts out makes "below the reads" mean two
41
+ // different things in two views of the same data.
36
42
  //
37
- // Depth comes from the connection's own horizontal span
38
- // rather than reaching for some fixed row: with "view as pairs" / "link
39
- // supplementary alignments" every qname lands on one row, so dipping to a
40
- // shared row bottoms every curve out at the same depth and they collapse into
41
- // spaghetti. Keying on span makes the depth mean something — wide events dive
42
- // deeper than narrow ones — and lets the curves nest.
43
- //
44
- // Depth saturates toward MAX_DIP_PX rather than clamping at it. A hard cap
45
- // reintroduces exactly the problem being fixed: every connection wider than the
46
- // cap point bottoms out at an identical depth, and at any plausible cap a
47
- // typical view is mostly wider. This form stays strictly increasing in span at
48
- // every width while staying bounded. DIP_HALF_SPAN_PX is the span at which the
49
- // dip reaches half its maximum.
50
- const MAX_DIP_PX = 110;
51
- const DIP_HALF_SPAN_PX = 500;
52
- // How far a curve can stray outside the band between its two endpoints. A cubic
53
- // with both control points offset by `d` apexes at 0.75 * d, and the dip — the
54
- // deeper of the two shaping terms — saturates toward MAX_DIP_PX, so this bounds
55
- // both. A caller that culls off-screen curves has to pad its viewport test by
56
- // this: the shaping is applied to the *control points*, so a curve whose two
43
+ // HOW DEEP is the renderer's call, not this file's. Depth is the mark's one free
44
+ // channel, and only the renderer knows the band the ink has to survive in — the
45
+ // pileup clips each section at its band bottom, and the split view bleeds a
46
+ // too-deep dip into the panel below. So callers pass the depth they want and
47
+ // `discordantDipPx` (@jbrowse/sv-core) is the law the two of them share.
48
+ // How far a curve can stray outside the band between its two endpoints. The dip
49
+ // is the deeper of the two shaping terms, so this is a ceiling on it, applied
50
+ // here rather than trusted to a caller: a culler pads its viewport test by this,
51
+ // and the shaping is applied to the *control points*, so a curve whose two
57
52
  // endpoints both sit just outside the viewport can still have a visible body.
58
- export const BEZIER_CONNECTOR_MAX_REACH_PX = 0.75 * MAX_DIP_PX;
53
+ export const BEZIER_CONNECTOR_MAX_REACH_PX = 110;
59
54
  // Sign (+1/-1) of an endpoint's horizontal control handle. The handle leaves a
60
55
  // trailing (3') endpoint along the read's reading direction (`strand`); at a
61
56
  // split junction's leading (5') endpoint it flips, so the curve arrives flowing
@@ -75,19 +70,6 @@ function shapingBudget(p1, p2) {
75
70
  function bowHeight(p1, p2, budget) {
76
71
  return Math.min(budget, Math.max(0, MAX_BOW_PX - Math.abs(p2.y - p1.y)));
77
72
  }
78
- // Negative = the control points drop below the reads (see MAX_DIP_PX). Keyed on
79
- // horizontal span alone: two reads a few px apart describe a small event and get
80
- // a small dip, however tall their track happens to be.
81
- //
82
- // Budget-clamped like the bow. At the current tuning the saturating curve
83
- // already resolves under the budget at every span (worst ratio ~0.73, as span
84
- // → 0), so this is inert — it's here so retuning MAX_DIP_PX / DIP_HALF_SPAN_PX
85
- // can't silently reintroduce the fold-back squiggle SPAN_FACTOR exists to
86
- // prevent. Pinned by 'the dip never outgrows its shaping budget'.
87
- function dipHeight(p1, p2, budget) {
88
- const span = Math.abs(p2.x - p1.x);
89
- return -Math.min(budget, MAX_DIP_PX * (span / (span + DIP_HALF_SPAN_PX)));
90
- }
91
73
  function cubicPath(from, ctrl1, ctrl2, to) {
92
74
  return `M ${from.x} ${from.y} C ${ctrl1.x} ${ctrl1.y} ${ctrl2.x} ${ctrl2.y} ${to.x} ${to.y}`;
93
75
  }
@@ -95,14 +77,25 @@ export function bezierConnectorPath({ x1, y1, x2, y2, s1, s2,
95
77
  // The second endpoint is a split junction's 5' leading edge (its handle flips
96
78
  // to fold the curve into the next segment); false for a paired mate's 3' edge.
97
79
  leadingEnd2 = false, reversed1 = false, reversed2 = false, maxHandlePx = MAX_HANDLE_PX,
98
- // This connection is discordant (aberrant pair orientation, or a split
99
- // junction's strand flip): it dips below the reads instead of arcing over
100
- // them, so the two classes are tellable apart by shape alone.
101
- dip = false, }) {
80
+ // Depth, in px, of the dip a discordant connection draws instead of the bow a
81
+ // concordant one gets — aberrant pair orientation, or a split junction's
82
+ // strand flip, so the two classes are tellable apart by shape alone. It is
83
+ // the depth of the curve's APEX — what a caller can bound by the room it has —
84
+ // and CUBIC_APEX_RATIO converts it to the control-point drop that puts the ink
85
+ // there. Leave it out to bow up.
86
+ dipPx, }) {
102
87
  const from = { x: x1, y: y1 };
103
88
  const to = { x: x2, y: y2 };
104
89
  const budget = shapingBudget(from, to);
105
90
  const handle = Math.min(maxHandlePx, budget);
106
- const bow = dip ? dipHeight(from, to, budget) : bowHeight(from, to, budget);
91
+ // The dip is deliberately not clamped to the budget, unlike the bow. The
92
+ // budget stops the cubic folding back over itself, and only the horizontal
93
+ // handles can do that — a vertical offset leaves x(t) monotonic however deep
94
+ // it goes, so a big event squeezed into a few px draws a narrow trough rather
95
+ // than a squiggle. Pinned by 'a dipped connection never overshoots its
96
+ // endpoints in x'.
97
+ const bow = dipPx === undefined
98
+ ? bowHeight(from, to, budget)
99
+ : -Math.min(dipPx, BEZIER_CONNECTOR_MAX_REACH_PX) / CUBIC_APEX_RATIO;
107
100
  return cubicPath(from, { x: x1 + handle * tangentSign(s1, false, reversed1), y: y1 - bow }, { x: x2 + handle * tangentSign(s2, leadingEnd2, reversed2), y: y2 - bow }, to);
108
101
  }