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

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 (611) hide show
  1. package/README.md +1476 -265
  2. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
  3. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -3
  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 +16 -9
  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 +50 -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/configSchema.d.ts +1 -1
  35. package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
  36. package/esm/BaseFeatureWidget/formatDetails.js +62 -83
  37. package/esm/BaseFeatureWidget/index.d.ts +2 -1
  38. package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
  39. package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
  40. package/esm/BaseFeatureWidget/types.d.ts +12 -6
  41. package/esm/BaseFeatureWidget/util.d.ts +0 -10
  42. package/esm/BaseFeatureWidget/util.js +0 -17
  43. package/esm/CorePlugin.js +2 -2
  44. package/esm/PluginLoader.d.ts +24 -13
  45. package/esm/PluginLoader.js +167 -51
  46. package/esm/PluginManager.d.ts +130 -24
  47. package/esm/PluginManager.js +180 -32
  48. package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
  49. package/esm/ReExports/MuiDataGridReExports.js +2 -2
  50. package/esm/ReExports/coreModules.generated.d.ts +2 -0
  51. package/esm/ReExports/coreModules.generated.js +528 -0
  52. package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
  53. package/esm/ReExports/coreWorkerModules.generated.js +488 -0
  54. package/esm/ReExports/frameworkModules.d.ts +2 -0
  55. package/esm/ReExports/frameworkModules.js +68 -0
  56. package/esm/ReExports/frameworkShared.d.ts +12 -0
  57. package/esm/ReExports/frameworkShared.js +16 -0
  58. package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
  59. package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
  60. package/esm/ReExports/list.js +527 -79
  61. package/esm/ReExports/modules.d.ts +1 -1
  62. package/esm/ReExports/modules.js +10 -165
  63. package/esm/ReExports/registry.d.ts +1 -0
  64. package/esm/ReExports/registry.js +23 -5
  65. package/esm/ReExports/uiStub.d.ts +3 -0
  66. package/esm/ReExports/uiStub.js +33 -0
  67. package/esm/ReExports/workerModules.d.ts +2 -0
  68. package/esm/ReExports/workerModules.js +11 -0
  69. package/esm/TextSearch/TextSearchManager.d.ts +27 -13
  70. package/esm/TextSearch/TextSearchManager.js +77 -36
  71. package/esm/TextSearch/places.d.ts +12 -0
  72. package/esm/TextSearch/places.js +94 -0
  73. package/esm/assemblyManager/assembly.d.ts +21 -19
  74. package/esm/assemblyManager/assembly.js +28 -26
  75. package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
  76. package/esm/assemblyManager/assemblyAdapters.js +8 -2
  77. package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
  78. package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
  79. package/esm/assemblyManager/assemblyManager.d.ts +35 -180
  80. package/esm/assemblyManager/assemblyManager.js +47 -51
  81. package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
  82. package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
  83. package/esm/assemblyManager/geneticCodes.js +2 -5
  84. package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
  85. package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
  86. package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
  87. package/esm/assemblyManager/indexAssemblyNames.js +22 -0
  88. package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
  89. package/esm/assemblyManager/loadRefNameMap.js +4 -9
  90. package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
  91. package/esm/assemblyManager/refNameMapKey.js +12 -0
  92. package/esm/checkPlugins.d.ts +2 -0
  93. package/esm/checkPlugins.js +38 -17
  94. package/esm/configuration/bamIndexFields.d.ts +49 -0
  95. package/esm/configuration/bamIndexFields.js +41 -0
  96. package/esm/configuration/configurationSchema.d.ts +101 -71
  97. package/esm/configuration/configurationSchema.js +207 -134
  98. package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
  99. package/esm/configuration/configurationSchemaUnion.js +56 -0
  100. package/esm/configuration/configurationSlot.d.ts +150 -60
  101. package/esm/configuration/configurationSlot.js +103 -75
  102. package/esm/configuration/fillLocations.d.ts +14 -0
  103. package/esm/configuration/fillLocations.js +14 -0
  104. package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
  105. package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
  106. package/esm/configuration/formatDetailsConfigSchema.js +10 -13
  107. package/esm/configuration/fullConfSnapshot.d.ts +4 -19
  108. package/esm/configuration/fullConfSnapshot.js +30 -52
  109. package/esm/configuration/getConf.d.ts +45 -41
  110. package/esm/configuration/getConf.js +111 -44
  111. package/esm/configuration/index.d.ts +24 -11
  112. package/esm/configuration/index.js +15 -7
  113. package/esm/configuration/indexType.d.ts +26 -0
  114. package/esm/configuration/indexType.js +38 -0
  115. package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
  116. package/esm/configuration/mergeFormatCallbacks.js +13 -10
  117. package/esm/configuration/readConfObject.d.ts +2 -24
  118. package/esm/configuration/readConfObject.js +20 -63
  119. package/esm/configuration/requirements.d.ts +37 -0
  120. package/esm/configuration/requirements.js +88 -0
  121. package/esm/configuration/schemaRegistry.d.ts +32 -15
  122. package/esm/configuration/schemaRegistry.js +33 -35
  123. package/esm/configuration/schemaTypes.d.ts +21 -5
  124. package/esm/configuration/schemaTypes.js +66 -55
  125. package/esm/configuration/slotFacade.d.ts +12 -29
  126. package/esm/configuration/slotFacade.js +44 -23
  127. package/esm/configuration/snapshotPreprocess.d.ts +43 -0
  128. package/esm/configuration/snapshotPreprocess.js +161 -0
  129. package/esm/configuration/tabixIndexFields.d.ts +30 -4
  130. package/esm/configuration/tabixIndexFields.js +21 -4
  131. package/esm/configuration/tabixShorthand.d.ts +34 -17
  132. package/esm/configuration/tabixShorthand.js +49 -22
  133. package/esm/configuration/types.d.ts +182 -43
  134. package/esm/configuration/uriShorthand.d.ts +9 -0
  135. package/esm/configuration/uriShorthand.js +16 -0
  136. package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
  137. package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
  138. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
  139. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
  140. package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
  141. package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
  142. package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
  143. package/esm/data_adapters/BaseAdapter/index.js +1 -0
  144. package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
  145. package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
  146. package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
  147. package/esm/data_adapters/BaseAdapter/stats.js +52 -13
  148. package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
  149. package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
  150. package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
  151. package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
  152. package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
  153. package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
  154. package/esm/data_adapters/dataAdapterCache.js +44 -10
  155. package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
  156. package/esm/data_adapters/getFeatureAdapter.js +8 -8
  157. package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
  158. package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
  159. package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
  160. package/esm/pluggableElementTypes/AdapterType.js +1 -1
  161. package/esm/pluggableElementTypes/DisplayType.d.ts +46 -16
  162. package/esm/pluggableElementTypes/DisplayType.js +22 -12
  163. package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
  164. package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
  165. package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
  166. package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
  167. package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
  168. package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
  169. package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
  170. package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
  171. package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
  172. package/esm/pluggableElementTypes/ViewType.js +32 -4
  173. package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
  174. package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
  175. package/esm/pluggableElementTypes/extendElementType.js +9 -5
  176. package/esm/pluggableElementTypes/index.d.ts +2 -1
  177. package/esm/pluggableElementTypes/index.js +1 -1
  178. package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
  179. package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +65 -27
  180. package/esm/pluggableElementTypes/models/BaseDisplayModel.js +72 -10
  181. package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
  182. package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
  183. package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +85 -16
  184. package/esm/pluggableElementTypes/models/BaseViewModel.js +53 -10
  185. package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
  186. package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
  187. package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
  188. package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
  189. package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
  190. package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
  191. package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
  192. package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
  193. package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
  194. package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
  195. package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
  196. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
  197. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
  198. package/esm/pluggableElementTypes/models/index.d.ts +2 -3
  199. package/esm/pluggableElementTypes/models/index.js +2 -3
  200. package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
  201. package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
  202. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
  203. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
  204. package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
  205. package/esm/pluginDefinitions.d.ts +34 -7
  206. package/esm/pluginDefinitions.js +54 -20
  207. package/esm/rpc/BaseRpcDriver.d.ts +2 -2
  208. package/esm/rpc/BaseRpcDriver.js +25 -30
  209. package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
  210. package/esm/rpc/MainThreadRpcDriver.js +13 -8
  211. package/esm/rpc/RpcClient.d.ts +18 -6
  212. package/esm/rpc/RpcClient.js +51 -16
  213. package/esm/rpc/RpcManager.d.ts +14 -10
  214. package/esm/rpc/RpcManager.js +11 -1
  215. package/esm/rpc/RpcRegistry.d.ts +40 -7
  216. package/esm/rpc/RpcServer.d.ts +3 -1
  217. package/esm/rpc/RpcServer.js +19 -12
  218. package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
  219. package/esm/rpc/WebWorkerRpcDriver.js +64 -68
  220. package/esm/rpc/byteBudget.d.ts +20 -5
  221. package/esm/rpc/byteBudget.js +16 -5
  222. package/esm/rpc/configSchema.d.ts +7 -21
  223. package/esm/rpc/coreRpcMethods.d.ts +4 -0
  224. package/esm/rpc/coreRpcMethods.js +4 -0
  225. package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
  226. package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
  227. package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
  228. package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
  229. package/esm/rpc/methods/CoreGetExportData.js +3 -4
  230. package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
  231. package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
  232. package/esm/rpc/methods/CoreGetFeatures.js +3 -5
  233. package/esm/rpc/methods/CoreGetRefNames.js +2 -12
  234. package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
  235. package/esm/rpc/methods/CoreGetSequence.js +2 -2
  236. package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
  237. package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
  238. package/esm/rpc/methods/layerFeatures.d.ts +33 -0
  239. package/esm/rpc/methods/layerFeatures.js +29 -0
  240. package/esm/svg/SvgExport.js +6 -7
  241. package/esm/svg/SvgThemeProviders.d.ts +12 -0
  242. package/esm/svg/SvgThemeProviders.js +15 -0
  243. package/esm/svg/exportViewSvg.d.ts +28 -0
  244. package/esm/svg/exportViewSvg.js +13 -0
  245. package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
  246. package/esm/svg/normalizeSvgMarkup.js +99 -0
  247. package/esm/svg/serializeSvg.d.ts +7 -0
  248. package/esm/svg/serializeSvg.js +11 -0
  249. package/esm/svg/svgId.d.ts +1 -1
  250. package/esm/svg/svgId.js +1 -1
  251. package/esm/svg/svgReady.d.ts +9 -7
  252. package/esm/svg/svgReady.js +8 -7
  253. package/esm/svg/trackNames.d.ts +7 -5
  254. package/esm/svg/trackNames.js +12 -9
  255. package/esm/svg/wrapSvgExport.js +6 -74
  256. package/esm/ui/AddCustomPluginDialog.js +3 -8
  257. package/esm/ui/AppReadyMarker.d.ts +45 -0
  258. package/esm/ui/AppReadyMarker.js +89 -0
  259. package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
  260. package/esm/ui/CascadingMenu.js +181 -104
  261. package/esm/ui/DropDownMenu.js +2 -1
  262. package/esm/ui/ErrorBanner.js +1 -1
  263. package/esm/ui/ErrorBoundary.d.ts +2 -2
  264. package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
  265. package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
  266. package/esm/ui/ExportSvgDialog.d.ts +1 -1
  267. package/esm/ui/FileDropZone.js +2 -1
  268. package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
  269. package/esm/ui/HoverMenu.d.ts +1 -2
  270. package/esm/ui/HoverMenu.js +6 -3
  271. package/esm/ui/JexlFilterDialog.d.ts +13 -10
  272. package/esm/ui/JexlFilterDialog.js +122 -49
  273. package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
  274. package/esm/ui/JexlFilterRowEditors.js +90 -0
  275. package/esm/ui/LazyBaseTooltip.d.ts +4 -0
  276. package/esm/ui/LazyBaseTooltip.js +9 -0
  277. package/esm/ui/LegendSwatchGlyph.js +26 -21
  278. package/esm/ui/LoadingOverlay.d.ts +14 -0
  279. package/esm/ui/LoadingOverlay.js +4 -2
  280. package/esm/ui/MenuTypes.d.ts +23 -53
  281. package/esm/ui/MenuTypes.js +3 -0
  282. package/esm/ui/MonospaceTextField.d.ts +2 -1
  283. package/esm/ui/MonospaceTextField.js +23 -20
  284. package/esm/ui/PaletteContext.d.ts +10 -5
  285. package/esm/ui/PaletteContext.js +44 -6
  286. package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
  287. package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
  288. package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
  289. package/esm/ui/RefNameAutocomplete/index.js +8 -2
  290. package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
  291. package/esm/ui/RefNameAutocomplete/util.js +42 -1
  292. package/esm/ui/ResizeHandle.d.ts +3 -1
  293. package/esm/ui/ResizeHandle.js +44 -11
  294. package/esm/ui/ScrollChrome.d.ts +13 -0
  295. package/esm/ui/ScrollChrome.js +11 -0
  296. package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
  297. package/esm/ui/ScrollEdgeShadow.js +14 -35
  298. package/esm/ui/ScrollZoomToggle.d.ts +4 -27
  299. package/esm/ui/ScrollZoomToggle.js +34 -51
  300. package/esm/ui/SessionJsonPanel.d.ts +3 -0
  301. package/esm/ui/SessionJsonPanel.js +14 -0
  302. package/esm/ui/SettingsChangesTable.d.ts +1 -0
  303. package/esm/ui/SettingsChangesTable.js +49 -11
  304. package/esm/ui/ShareLinkField.d.ts +1 -3
  305. package/esm/ui/ShareLinkField.js +13 -40
  306. package/esm/ui/SizeSliderRow.d.ts +1 -3
  307. package/esm/ui/SizeSliderRow.js +4 -6
  308. package/esm/ui/SnackbarModel.js +79 -67
  309. package/esm/ui/StatusProgressBar.js +2 -2
  310. package/esm/ui/SvgColorLegend.d.ts +9 -4
  311. package/esm/ui/SvgColorLegend.js +82 -41
  312. package/esm/ui/VerticalScrollbar.d.ts +13 -34
  313. package/esm/ui/VerticalScrollbar.js +29 -83
  314. package/esm/ui/ViewLoadingScreen.d.ts +5 -4
  315. package/esm/ui/ViewLoadingScreen.js +8 -32
  316. package/esm/ui/colorScale.d.ts +92 -0
  317. package/esm/ui/colorScale.js +72 -0
  318. package/esm/ui/colors.d.ts +64 -0
  319. package/esm/ui/colors.js +230 -1
  320. package/esm/ui/hoverBoxStyle.d.ts +14 -2
  321. package/esm/ui/hoverBoxStyle.js +17 -2
  322. package/esm/ui/index.d.ts +12 -12
  323. package/esm/ui/index.js +14 -22
  324. package/esm/ui/launchViewMenu.js +15 -5
  325. package/esm/ui/legendMenuItem.d.ts +10 -32
  326. package/esm/ui/legendMenuItem.js +9 -36
  327. package/esm/ui/legendSpec.d.ts +15 -8
  328. package/esm/ui/legendSpec.js +14 -23
  329. package/esm/ui/makeSizeMenu.d.ts +0 -6
  330. package/esm/ui/makeSizeMenu.js +6 -30
  331. package/esm/ui/measureLegendText.js +1 -1
  332. package/esm/ui/menuItemAdornment.d.ts +9 -20
  333. package/esm/ui/menuItemAdornment.js +10 -32
  334. package/esm/ui/menuItems.d.ts +2 -7
  335. package/esm/ui/menuItems.js +1 -6
  336. package/esm/ui/multiTrackMenuItems.d.ts +6 -0
  337. package/esm/ui/palette.d.ts +118 -116
  338. package/esm/ui/palette.js +114 -75
  339. package/esm/ui/replaceViewAction.d.ts +1 -1
  340. package/esm/ui/replaceViewAction.js +1 -1
  341. package/esm/ui/theme.d.ts +43 -119
  342. package/esm/ui/theme.js +62 -78
  343. package/esm/ui/toggleMenuItems.d.ts +1 -3
  344. package/esm/ui/toggleMenuItems.js +6 -5
  345. package/esm/ui/useAssemblySelection.d.ts +4 -4
  346. package/esm/ui/viewHeaderHeight.d.ts +1 -0
  347. package/esm/ui/viewHeaderHeight.js +1 -0
  348. package/esm/util/Base1DUtils.d.ts +5 -3
  349. package/esm/util/Base1DUtils.js +14 -6
  350. package/esm/util/Base1DViewModel.d.ts +2 -1
  351. package/esm/util/Base1DViewModel.js +3 -2
  352. package/esm/util/SvgCanvas.d.ts +15 -13
  353. package/esm/util/SvgCanvas.js +76 -56
  354. package/esm/util/aborting.d.ts +39 -0
  355. package/esm/util/aborting.js +88 -6
  356. package/esm/util/adapterMetadata.d.ts +1 -1
  357. package/esm/util/adapterMetadata.js +6 -5
  358. package/esm/util/addAndShowTrack.d.ts +2 -5
  359. package/esm/util/addAndShowTrack.js +5 -1
  360. package/esm/util/addRelativeUris.d.ts +17 -5
  361. package/esm/util/addRelativeUris.js +46 -10
  362. package/esm/util/addTrackFromWidget.d.ts +2 -5
  363. package/esm/util/addTrackFromWidget.js +5 -4
  364. package/esm/util/aggregateFieldName.d.ts +10 -0
  365. package/esm/util/aggregateFieldName.js +8 -0
  366. package/esm/util/analytics.js +46 -13
  367. package/esm/util/animationAllowed.d.ts +9 -0
  368. package/esm/util/animationAllowed.js +13 -0
  369. package/esm/util/applyRowResizeWheel.d.ts +10 -5
  370. package/esm/util/applyRowResizeWheel.js +10 -21
  371. package/esm/util/bandHeight.d.ts +10 -0
  372. package/esm/util/bandHeight.js +29 -0
  373. package/esm/util/bandLayout.d.ts +4 -4
  374. package/esm/util/bandLayout.js +4 -4
  375. package/esm/util/bezierConnector.d.ts +4 -3
  376. package/esm/util/bezierConnector.js +38 -45
  377. package/esm/util/bgzfWorkerPool.d.ts +20 -74
  378. package/esm/util/bgzfWorkerPool.js +20 -74
  379. package/esm/util/binnedAggregate.d.ts +17 -0
  380. package/esm/util/binnedAggregate.js +275 -0
  381. package/esm/util/cacheBudgets.d.ts +22 -19
  382. package/esm/util/cacheBudgets.js +22 -19
  383. package/esm/util/cachedSetup.d.ts +1 -1
  384. package/esm/util/cachedSetup.js +2 -2
  385. package/esm/util/categoricalField.d.ts +56 -0
  386. package/esm/util/categoricalField.js +73 -0
  387. package/esm/util/clampToContig.d.ts +17 -0
  388. package/esm/util/clampToContig.js +19 -0
  389. package/esm/util/coarseStripHTML.js +1 -2
  390. package/esm/util/color/cssColorsLevel4.d.ts +1 -0
  391. package/esm/util/color/cssColorsLevel4.js +1 -0
  392. package/esm/util/color/index.d.ts +5 -3
  393. package/esm/util/color/index.js +7 -4
  394. package/esm/util/colorBits.d.ts +3 -3
  395. package/esm/util/colorBits.js +19 -44
  396. package/esm/util/colorRamp.d.ts +49 -5
  397. package/esm/util/colorRamp.js +169 -18
  398. package/esm/util/colorScale.d.ts +156 -0
  399. package/esm/util/colorScale.js +243 -0
  400. package/esm/util/colorSchemes.d.ts +21 -0
  401. package/esm/util/colorSchemes.js +30 -0
  402. package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
  403. package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
  404. package/esm/util/createSvgRasterCanvas.d.ts +10 -0
  405. package/esm/util/cssColorParse.d.ts +15 -0
  406. package/esm/util/cssColorParse.js +53 -0
  407. package/esm/util/diagonalizeRegions.d.ts +2 -3
  408. package/esm/util/diagonalizeRegions.js +8 -13
  409. package/esm/util/expandLooseSearchIndex.d.ts +19 -0
  410. package/esm/util/expandLooseSearchIndex.js +29 -0
  411. package/esm/util/featureTable.d.ts +224 -0
  412. package/esm/util/featureTable.js +366 -0
  413. package/esm/util/featureTransforms.d.ts +80 -0
  414. package/esm/util/featureTransforms.js +1579 -0
  415. package/esm/util/featureTypes.d.ts +24 -0
  416. package/esm/util/featureTypes.js +35 -0
  417. package/esm/util/fetchAndMaybeUnzip.js +16 -9
  418. package/esm/util/fetchContext.d.ts +7 -8
  419. package/esm/util/fetchContext.js +3 -3
  420. package/esm/util/fetchHub.d.ts +4 -2
  421. package/esm/util/fetchHub.js +2 -2
  422. package/esm/util/fetchPhases.d.ts +10 -10
  423. package/esm/util/fetchSeq.d.ts +2 -3
  424. package/esm/util/fetchSeq.js +2 -2
  425. package/esm/util/fieldReader.d.ts +17 -0
  426. package/esm/util/fieldReader.js +62 -0
  427. package/esm/util/freezeDeep.d.ts +8 -10
  428. package/esm/util/freezeDeep.js +8 -10
  429. package/esm/util/groupKeys.d.ts +77 -0
  430. package/esm/util/groupKeys.js +155 -0
  431. package/esm/util/highlights.d.ts +10 -6
  432. package/esm/util/highlights.js +12 -25
  433. package/esm/util/hooks.d.ts +31 -2
  434. package/esm/util/hooks.js +72 -3
  435. package/esm/util/index.d.ts +11 -11
  436. package/esm/util/index.js +11 -10
  437. package/esm/util/indexCandidates.d.ts +1 -31
  438. package/esm/util/indexCandidates.js +5 -63
  439. package/esm/util/installFetch.d.ts +77 -37
  440. package/esm/util/installFetch.js +65 -38
  441. package/esm/util/installInitAutorun.d.ts +14 -13
  442. package/esm/util/installInitAutorun.js +17 -17
  443. package/esm/util/installPrerequisiteFetch.d.ts +115 -0
  444. package/esm/util/installPrerequisiteFetch.js +111 -0
  445. package/esm/util/io/index.js +19 -14
  446. package/esm/util/isDataCurrent.d.ts +7 -5
  447. package/esm/util/isDataCurrent.js +9 -6
  448. package/esm/util/isTextEntryFocused.d.ts +7 -0
  449. package/esm/util/isTextEntryFocused.js +16 -0
  450. package/esm/util/jexl.js +24 -21
  451. package/esm/util/jexlFilterRows.d.ts +89 -0
  452. package/esm/util/jexlFilterRows.js +252 -0
  453. package/esm/util/jexlFilters.d.ts +20 -27
  454. package/esm/util/jexlFilters.js +23 -11
  455. package/esm/util/jexlStrings.d.ts +3 -4
  456. package/esm/util/jexlStrings.js +2 -3
  457. package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
  458. package/esm/util/layouts/GranularRectLayout.js +25 -8
  459. package/esm/util/lazyAfterAttach.d.ts +13 -0
  460. package/esm/util/lazyAfterAttach.js +31 -0
  461. package/esm/util/lazyWithPreload.d.ts +19 -0
  462. package/esm/util/lazyWithPreload.js +27 -0
  463. package/esm/util/legendCandidates.d.ts +72 -0
  464. package/esm/util/legendCandidates.js +138 -0
  465. package/esm/util/localStorage.js +4 -4
  466. package/esm/util/markEncoding.d.ts +150 -0
  467. package/esm/util/markEncoding.js +845 -0
  468. package/esm/util/markEncodingTypes.d.ts +588 -0
  469. package/esm/util/markEncodingTypes.js +8 -0
  470. package/esm/util/mst-reflection.d.ts +2 -20
  471. package/esm/util/mst-reflection.js +3 -53
  472. package/esm/util/mstUtils.d.ts +31 -23
  473. package/esm/util/mstUtils.js +39 -24
  474. package/esm/util/numericUtils.d.ts +7 -0
  475. package/esm/util/numericUtils.js +16 -0
  476. package/esm/util/numericValue.d.ts +14 -0
  477. package/esm/util/numericValue.js +34 -0
  478. package/esm/util/openFeatureWidget.d.ts +5 -0
  479. package/esm/util/openFeatureWidget.js +2 -2
  480. package/esm/util/openViews.d.ts +17 -0
  481. package/esm/util/openViews.js +22 -0
  482. package/esm/util/parentWalk.d.ts +1 -1
  483. package/esm/util/parentWalk.js +1 -1
  484. package/esm/util/parseLineByLine.d.ts +4 -5
  485. package/esm/util/parseLineByLine.js +8 -14
  486. package/esm/util/pluginStore.d.ts +6 -8
  487. package/esm/util/pluginStore.js +17 -16
  488. package/esm/util/preloadComponent.d.ts +5 -0
  489. package/esm/util/preloadComponent.js +11 -0
  490. package/esm/util/progress.d.ts +22 -22
  491. package/esm/util/progress.js +27 -26
  492. package/esm/util/quantileExtent.d.ts +49 -0
  493. package/esm/util/quantileExtent.js +162 -0
  494. package/esm/util/range.d.ts +13 -9
  495. package/esm/util/range.js +17 -8
  496. package/esm/util/renameRegions.d.ts +26 -6
  497. package/esm/util/renameRegions.js +68 -54
  498. package/esm/util/renderToStaticMarkup.js +24 -14
  499. package/esm/util/rxjs.d.ts +23 -8
  500. package/esm/util/rxjs.js +61 -15
  501. package/esm/util/samplesTsv.d.ts +49 -0
  502. package/esm/util/samplesTsv.js +86 -0
  503. package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
  504. package/esm/util/scheduleDetachedDestroy.js +24 -0
  505. package/esm/util/scrollLatch.d.ts +1 -0
  506. package/esm/util/scrollLatch.js +8 -0
  507. package/esm/util/selectEncodedFeature.d.ts +16 -0
  508. package/esm/util/selectEncodedFeature.js +34 -0
  509. package/esm/util/sessionSharing.d.ts +7 -5
  510. package/esm/util/sessionSharing.js +23 -23
  511. package/esm/util/shapeNameList.d.ts +2 -0
  512. package/esm/util/shapeNameList.js +6 -0
  513. package/esm/util/shapeNames.d.ts +7 -0
  514. package/esm/util/shapeNames.js +11 -0
  515. package/esm/util/simpleFeature.d.ts +0 -1
  516. package/esm/util/starFusion.d.ts +26 -0
  517. package/esm/util/starFusion.js +37 -0
  518. package/esm/util/stepTables.d.ts +82 -0
  519. package/esm/util/stepTables.js +243 -0
  520. package/esm/util/svAlt.d.ts +145 -0
  521. package/esm/util/svAlt.js +364 -0
  522. package/esm/util/svgColorProps.d.ts +11 -0
  523. package/esm/util/svgColorProps.js +28 -1
  524. package/esm/util/systemColorScheme.d.ts +12 -0
  525. package/esm/util/systemColorScheme.js +27 -0
  526. package/esm/util/tabix.d.ts +13 -8
  527. package/esm/util/tabix.js +17 -12
  528. package/esm/util/thresholdScale.d.ts +91 -0
  529. package/esm/util/thresholdScale.js +166 -0
  530. package/esm/util/timeGate.d.ts +4 -5
  531. package/esm/util/timeGate.js +4 -5
  532. package/esm/util/trackConfigDelta.d.ts +26 -26
  533. package/esm/util/trackConfigDelta.js +63 -47
  534. package/esm/util/tracks.d.ts +121 -40
  535. package/esm/util/tracks.js +497 -112
  536. package/esm/util/translateTranscript.d.ts +44 -0
  537. package/esm/util/translateTranscript.js +102 -0
  538. package/esm/util/types/data.d.ts +0 -2
  539. package/esm/util/types/index.d.ts +121 -22
  540. package/esm/util/types/index.js +9 -0
  541. package/esm/util/types/mst.d.ts +3 -0
  542. package/esm/util/types/mst.js +4 -0
  543. package/esm/util/types/renameIds.d.ts +1 -0
  544. package/esm/util/types/renameIds.js +29 -0
  545. package/esm/util/types/services.d.ts +1 -1
  546. package/esm/util/unknownSnapshotKeys.d.ts +51 -0
  547. package/esm/util/unknownSnapshotKeys.js +82 -0
  548. package/esm/util/useFeatureSequence.js +5 -5
  549. package/esm/util/useFetch.d.ts +3 -4
  550. package/esm/util/useFetch.js +19 -10
  551. package/esm/util/useFetchPlugins.d.ts +6 -2
  552. package/esm/util/useFetchPlugins.js +7 -3
  553. package/esm/util/usePanelVirtualScroll.d.ts +7 -35
  554. package/esm/util/usePanelVirtualScroll.js +9 -36
  555. package/esm/util/useRowVirtualScroll.d.ts +6 -29
  556. package/esm/util/useRowVirtualScroll.js +8 -49
  557. package/esm/util/useVirtualScrollWheel.d.ts +20 -4
  558. package/esm/util/useVirtualScrollWheel.js +40 -74
  559. package/esm/util/viewHighlights.d.ts +3 -0
  560. package/esm/util/viewHighlights.js +5 -0
  561. package/esm/util/viewStatus.d.ts +47 -15
  562. package/esm/util/viewStatus.js +34 -0
  563. package/esm/util/wheelZoom.d.ts +7 -1
  564. package/esm/util/wheelZoom.js +85 -19
  565. package/esm/util/whenViewSettled.d.ts +55 -8
  566. package/esm/util/whenViewSettled.js +56 -7
  567. package/esm/util/withLaunchInput.d.ts +174 -0
  568. package/esm/util/withLaunchInput.js +274 -0
  569. package/package.json +70 -20
  570. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
  571. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
  572. package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
  573. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
  574. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
  575. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
  576. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
  577. package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
  578. package/esm/ReExports/BaseFeatureDetails.js +0 -10
  579. package/esm/ReExports/index.d.ts +0 -1
  580. package/esm/ReExports/index.js +0 -1
  581. package/esm/ReExports/publicUtil.d.ts +0 -1
  582. package/esm/ReExports/publicUtil.js +0 -28
  583. package/esm/configuration/promotableDefaults.d.ts +0 -199
  584. package/esm/configuration/promotableDefaults.js +0 -326
  585. package/esm/configuration/promotablePin.d.ts +0 -55
  586. package/esm/configuration/promotablePin.js +0 -1
  587. package/esm/configuration/promotableResolve.d.ts +0 -108
  588. package/esm/configuration/promotableResolve.js +0 -117
  589. package/esm/configuration/promotableSlots.d.ts +0 -12
  590. package/esm/configuration/promotableSlots.js +0 -45
  591. package/esm/configuration/slotShape.d.ts +0 -12
  592. package/esm/configuration/slotShape.js +0 -84
  593. package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
  594. package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
  595. package/esm/ui/PinAdornment.d.ts +0 -5
  596. package/esm/ui/PinAdornment.js +0 -79
  597. package/esm/ui/SvgGradientLegend.d.ts +0 -26
  598. package/esm/ui/SvgGradientLegend.js +0 -26
  599. package/esm/ui/highlightChipReveal.d.ts +0 -32
  600. package/esm/ui/highlightChipReveal.js +0 -39
  601. package/esm/ui/promotableMenuItems.d.ts +0 -19
  602. package/esm/ui/promotableMenuItems.js +0 -89
  603. package/esm/ui/promotablePinCoverage.d.ts +0 -44
  604. package/esm/ui/promotablePinCoverage.js +0 -87
  605. package/esm/util/applyInitSettings.d.ts +0 -79
  606. package/esm/util/applyInitSettings.js +0 -91
  607. package/esm/util/openDisplays.d.ts +0 -23
  608. package/esm/util/openDisplays.js +0 -79
  609. package/esm/util/stopToken.d.ts +0 -211
  610. package/esm/util/stopToken.js +0 -438
  611. /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
@@ -0,0 +1,364 @@
1
+ import { parseBreakend } from '@gmod/vcf';
2
+ export const SV_SYMBOLIC_ALLELES = [
3
+ '<TRA',
4
+ '<DEL',
5
+ '<INV',
6
+ '<INS',
7
+ '<DUP',
8
+ '<CNV',
9
+ ];
10
+ /**
11
+ * #api
12
+ * parseBreakend, honoring its `Breakend | undefined` signature. ALT strings are
13
+ * user data and malformed breakends do occur; @gmod/vcf <=7.0.10 throws on them
14
+ * instead of returning undefined, which would otherwise fail a whole render or
15
+ * feature-parse pass over one bad allele. Use this everywhere rather than
16
+ * importing parseBreakend directly; it can become a plain re-export once the
17
+ * upstream fix ships.
18
+ */
19
+ export function safeParseBreakend(alt) {
20
+ try {
21
+ return parseBreakend(alt);
22
+ }
23
+ catch {
24
+ return undefined;
25
+ }
26
+ }
27
+ /**
28
+ * #api
29
+ * The mate locString ("chr2:100") of a parsed breakend, or undefined when it
30
+ * names no navigable position. Two ALT forms reach here without one: a single
31
+ * breakend (`.A` / `G.`) has no mate at all, and the symbolic-mate forms
32
+ * (`G<DEL>`, `<DEL>G`) get a placeholder `<DEL>:1` from parseBreakend, which
33
+ * puts a symbolic allele id where a contig name belongs. Callers that navigate
34
+ * or split-view a mate must drop both rather than treat `<DEL>` as a refName.
35
+ */
36
+ export function getBreakendMateLocString(breakend) {
37
+ const matePosition = breakend?.MatePosition;
38
+ return matePosition === undefined || matePosition.startsWith('<')
39
+ ? undefined
40
+ : matePosition;
41
+ }
42
+ // VCF 4.5 computes END rather than storing it: a DEL, DUP, INV or CNV allele
43
+ // ends |SVLEN| bases past POS, SVLEN one value per ALT (one for all in files
44
+ // older than 4.4)
45
+ function spannedEnd(feature, alt, svlen, alleleIndex) {
46
+ if (!/^<(DEL|DUP|INV|CNV)[:>]/.test(alt) || !Array.isArray(svlen)) {
47
+ return undefined;
48
+ }
49
+ const len = Math.abs(Number(svlen.length === 1 ? svlen[0] : svlen[alleleIndex]));
50
+ return len > 0 ? feature.get('start') + 1 + len : undefined;
51
+ }
52
+ /**
53
+ * #api
54
+ * Parse raw (non-assembly-resolved) mate coordinates from a VCF SV feature+alt.
55
+ * Returns undefined when no mate coordinate info is found. `alleleIndex` is
56
+ * the alt's place in `ALT`, which a record repeating one symbolic allele with
57
+ * several lengths needs; it defaults to the first place `alt` appears.
58
+ */
59
+ export function parseSvAlt(feature, alt, alleleIndex = Math.max(0, feature.get('ALT')?.indexOf(alt ?? '') ?? 0)) {
60
+ const bnd = alt !== undefined ? safeParseBreakend(alt) : undefined;
61
+ const mateLocString = getBreakendMateLocString(bnd);
62
+ const refName = feature.get('refName');
63
+ if (alt !== undefined && SV_SYMBOLIC_ALLELES.some(a => alt.startsWith(a))) {
64
+ // An insertion has one end: its END, where a caller writes one, is POS.
65
+ if (alt.startsWith('<INS')) {
66
+ return undefined;
67
+ }
68
+ const info = feature.get('INFO');
69
+ const matePos = info?.END?.[0] ??
70
+ spannedEnd(feature, alt, info?.SVLEN, alleleIndex);
71
+ if (matePos === undefined) {
72
+ return undefined;
73
+ }
74
+ return {
75
+ mateRefName: info?.CHR2?.[0] ?? refName,
76
+ matePos,
77
+ };
78
+ }
79
+ else if (bnd !== undefined && mateLocString !== undefined) {
80
+ // Split at the LAST colon, the same rule `parseLocString` applies and for
81
+ // the same reason: a refName may contain one. GRCh38's full analysis set
82
+ // names its HLA contigs `HLA-A*01:01:01:01`, so a mate on one arrives here
83
+ // as `HLA-A*01:01:01:01:1000` and splitting at the first colon read the
84
+ // chromosome as `HLA-A*01` and the position as 1.
85
+ const colon = mateLocString.lastIndexOf(':');
86
+ const mateRefName = mateLocString.slice(0, colon);
87
+ const matePosStr = mateLocString.slice(colon + 1);
88
+ const matePos = Number(matePosStr);
89
+ // A position that is not a 1-based coordinate is not a location. Returning
90
+ // one anyway put it through `svMateLocus` into a fetch region and a panel's
91
+ // `centerAt`, neither of which reports anything. `Number` alone is too
92
+ // generous to screen on: it reads `''` as 0 and `'0x10'` as 16.
93
+ if (colon <= 0 || !/^\d+$/.test(matePosStr) || matePos < 1) {
94
+ return undefined;
95
+ }
96
+ return { mateRefName, matePos, ...breakendKeepsDirections(bnd) };
97
+ }
98
+ return undefined;
99
+ }
100
+ /**
101
+ * #api
102
+ * Which way the sequence each end of a breakend KEEPS runs from its breakpoint,
103
+ * as `+1 = right` / `-1 = left` — the convention `StarFusionAdapter`'s
104
+ * `tickDirection` states and the one every producer in the tree emits.
105
+ *
106
+ * The two halves read their strings with OPPOSITE polarity, which is the whole
107
+ * reason to state them together. `Join: 'right'` says the mate piece is joined
108
+ * to the RIGHT of the ref base, so this end keeps the sequence to its left:
109
+ * negated. `MateDirection: 'right'` says the mate's own piece extends to the
110
+ * right of the mate position, which is already the direction it keeps: taken as
111
+ * read. So `N[chr2:2000[` is `{ joinDirection: -1, mateDirection: 1 }`, and that
112
+ * is the same pair `StarFusionAdapter` emits for the fusion it describes — the
113
+ * donor keeps the sequence below its breakpoint (-1) and the acceptor the
114
+ * sequence above its own (+1).
115
+ *
116
+ * Split out of `parseSvAlt` because a consumer holding an already-parsed
117
+ * `Breakend` was re-deriving it by hand, in two adjacent ternaries of opposite
118
+ * polarity — the shape that produced 78bb7b84f9.
119
+ */
120
+ export function breakendKeepsDirections(bnd) {
121
+ return {
122
+ mateDirection: bnd.MateDirection === 'left' ? -1 : 1,
123
+ joinDirection: bnd.Join === 'left' ? 1 : -1,
124
+ };
125
+ }
126
+ /**
127
+ * #api
128
+ * Breakend notation, without parsing it: bracket forms (`G[chr2:100[`), single
129
+ * breakends (`.A` / `G.`), and the symbolic-mate form (`G<DEL>`, an angle
130
+ * bracket past position 0; a leading `<` is a plain symbolic allele).
131
+ */
132
+ export function isBreakend(alt) {
133
+ return (alt.includes('[') ||
134
+ alt.includes(']') ||
135
+ alt.startsWith('.') ||
136
+ alt.endsWith('.') ||
137
+ alt.lastIndexOf('<') > 0);
138
+ }
139
+ /**
140
+ * #api
141
+ * The conventional size floor for calling a sequence indel structural.
142
+ */
143
+ export const SV_MIN_LENGTH = 50;
144
+ const CLASS_OF_TOKEN = {
145
+ DEL: 'DEL',
146
+ DUP: 'DUP',
147
+ INS: 'INS',
148
+ INV: 'INV',
149
+ CNV: 'CNV',
150
+ TR: 'TR',
151
+ VNTR: 'TR',
152
+ BND: 'BND',
153
+ TRA: 'BND',
154
+ CTX: 'BND',
155
+ CPX: 'CPX',
156
+ INVDUP: 'CPX',
157
+ CHROMOTHRIPSIS: 'CPX',
158
+ CHROMOPLEXY: 'CPX',
159
+ BFB: 'CPX',
160
+ DOUBLEMINUTE: 'CPX',
161
+ };
162
+ // gVCF's `<NON_REF>` and bcftools mpileup's `<*>` stand for whatever allele
163
+ // the caller did not name, not for a structure.
164
+ const ANY_OTHER_ALLELE = new Set(['<NON_REF>', '<*>']);
165
+ /**
166
+ * #api
167
+ * The class a symbolic allele id, `SVTYPE` or `EVENTTYPE` names. A subtype folds
168
+ * into its first level (`DEL:ME:ALU` is DEL, `DUP:TANDEM` DUP), except the
169
+ * tandem repeats VCF 4.4 spells `CNV:TR` and ExpansionHunter `STRn`, and the
170
+ * inverted duplication `INV:DUP`. 1000 Genomes' `CNn` counts one haplotype's
171
+ * copies, so none is a deletion and two or more a duplication. `''` for an
172
+ * empty or missing token.
173
+ */
174
+ export function svClassOfToken(raw) {
175
+ const token = raw.trim().toUpperCase();
176
+ if (token === '' || token === '.') {
177
+ return '';
178
+ }
179
+ if (token === 'CNV:TR') {
180
+ return 'TR';
181
+ }
182
+ if (token === 'INV:DUP') {
183
+ return 'CPX';
184
+ }
185
+ const first = token.split(':')[0];
186
+ const copies = /^CN(\d+)$/.exec(first);
187
+ if (copies) {
188
+ const n = Number(copies[1]);
189
+ return n === 0 ? 'DEL' : n === 1 ? 'CNV' : 'DUP';
190
+ }
191
+ return /^STR\d*$/.test(first) ? 'TR' : (CLASS_OF_TOKEN[first] ?? 'OTHER');
192
+ }
193
+ // an INFO token one allele states: its own entry of a Number=A field, or the
194
+ // one entry a record-wide field has
195
+ function alleleToken(info, key, alleleIndex) {
196
+ const value = info?.[key];
197
+ const list = Array.isArray(value) ? value : [value];
198
+ const token = list.length === 1 ? list[0] : list[alleleIndex];
199
+ return typeof token === 'string' ? token : '';
200
+ }
201
+ /**
202
+ * #api
203
+ * The structural-variant class one ALT allele states, `''` for one that is not
204
+ * structural. A symbolic allele's own id wins. Otherwise VCF 4.4's `EVENTTYPE`
205
+ * does; then a breakend is the class its `SVTYPE` declares where that says more
206
+ * than BND, and a sequence allele is an insertion or deletion by its length
207
+ * against REF, else its `SVTYPE`'s class.
208
+ */
209
+ export function svClassOfAlt(alt, { ref, info, alleleIndex = 0, } = {}) {
210
+ if (ANY_OTHER_ALLELE.has(alt)) {
211
+ return '';
212
+ }
213
+ if (alt.startsWith('<') && alt.endsWith('>')) {
214
+ return svClassOfToken(alt.slice(1, -1));
215
+ }
216
+ const event = svClassOfToken(alleleToken(info, 'EVENTTYPE', alleleIndex));
217
+ if (event) {
218
+ return event;
219
+ }
220
+ const declared = svClassOfToken(alleleToken(info, 'SVTYPE', alleleIndex));
221
+ if (isBreakend(alt)) {
222
+ return declared && declared !== 'BND' && declared !== 'OTHER'
223
+ ? declared
224
+ : 'BND';
225
+ }
226
+ const diff = alt.length - (ref?.length ?? alt.length);
227
+ return diff >= SV_MIN_LENGTH
228
+ ? 'INS'
229
+ : diff <= -SV_MIN_LENGTH
230
+ ? 'DEL'
231
+ : declared;
232
+ }
233
+ /**
234
+ * #api
235
+ * The structural-variant class of a VCF record as a whole: the one class its
236
+ * alleles state, CNV where they are losses and gains of one segment, OTHER
237
+ * where they otherwise disagree, and `''` for a record with no structural
238
+ * allele.
239
+ */
240
+ export function svClassOf(feature) {
241
+ const alts = feature.get('ALT');
242
+ const ref = feature.get('REF');
243
+ const info = feature.get('INFO');
244
+ if (!alts?.length) {
245
+ return svClassOfToken(alleleToken(info, 'SVTYPE', 0));
246
+ }
247
+ const classes = new Set();
248
+ for (const [alleleIndex, alt] of alts.entries()) {
249
+ const found = svClassOfAlt(alt, { ref, info, alleleIndex });
250
+ if (found) {
251
+ classes.add(found);
252
+ }
253
+ }
254
+ const [only, ...rest] = classes;
255
+ return rest.length === 0
256
+ ? (only ?? '')
257
+ : [...classes].every(c => c === 'DEL' || c === 'DUP' || c === 'CNV')
258
+ ? 'CNV'
259
+ : 'OTHER';
260
+ }
261
+ // Read the mate destination from a VCF translocation INFO record. CHR2/END
262
+ // give the mate ref+position; STRANDS[0] is a two-char code (e.g. "+-") where
263
+ // the first char is this side's strand and the second is the mate's. Returns
264
+ // undefined when CHR2/END aren't both present.
265
+ export function readTranslocationMate(info) {
266
+ const chr = info.CHR2?.[0];
267
+ const pos = info.END?.[0];
268
+ if (chr === undefined || pos === undefined) {
269
+ return undefined;
270
+ }
271
+ const [myDir, mateDir] = info.STRANDS?.[0]?.split('') ?? ['.', '.'];
272
+ // A STRANDS char names the strand the record is ON, and an end on `+` keeps
273
+ // the sequence to its LEFT — so the keeps-direction (`breakendKeepsDirections`,
274
+ // +1 = right) is its negation. Resolved here so the one consumer that draws
275
+ // these as ticks does not have to know that, which is how the two conventions
276
+ // came to sit a negation apart in the first place.
277
+ const sign = (s) => (s === '+' ? -1 : s === '-' ? 1 : 0);
278
+ return {
279
+ chr,
280
+ pos,
281
+ myDir: myDir ?? '.',
282
+ mateDir: mateDir ?? '.',
283
+ myKeepsDir: sign(myDir ?? '.'),
284
+ mateKeepsDir: sign(mateDir ?? '.'),
285
+ };
286
+ }
287
+ // A BEDPE strand names the side of the block the junction is on: `+` its end,
288
+ // so the block keeps the sequence to its left.
289
+ function keepsOf(mateDirection, strand) {
290
+ if (typeof mateDirection === 'number') {
291
+ return mateDirection;
292
+ }
293
+ return strand === 1 ? -1 : strand === -1 ? 1 : 0;
294
+ }
295
+ function joinBase(self, other) {
296
+ const keeps = self.keeps || (self.start + self.end <= other.start + other.end ? -1 : 1);
297
+ return keeps === -1 ? self.end - 1 : self.start;
298
+ }
299
+ function symbolicKeeps(feature, alt) {
300
+ if (alt.startsWith('<DEL')) {
301
+ return [-1, 1];
302
+ }
303
+ if (alt.startsWith('<DUP')) {
304
+ return [1, -1];
305
+ }
306
+ const tra = readTranslocationMate(feature.get('INFO') ?? {});
307
+ return [tra?.myKeepsDir ?? 0, tra?.mateKeepsDir ?? 0];
308
+ }
309
+ /**
310
+ * #api
311
+ * Where a paired record's junction is at each of its two ends, and which side
312
+ * of it each end keeps — the one answer every launcher, the row menu and the
313
+ * chain walk take, whether the record is a VCF breakend, a symbolic SV or a
314
+ * paired adapter's row (BEDPE, STAR-Fusion). Refnames are as the record spells
315
+ * them. `undefined` for a record naming no other end. A VCF record is read
316
+ * through `alt`, its first ALT unless the caller names another.
317
+ *
318
+ * A VCF end is its own position. A paired adapter's end is a block, and the
319
+ * junction is the block's edge on the side the end keeps: stated by
320
+ * `mateDirection` where the adapter knows it, read off the strands where the
321
+ * record states one for each end as BEDPE does, and with neither the two
322
+ * blocks face each other. A PAF row's strand is the query's orientation and
323
+ * states none for the target, so it names no side.
324
+ */
325
+ export function junctionEnds(feature, alt = feature.get('ALT')?.[0], alleleIndex) {
326
+ const refName = feature.get('refName');
327
+ const mate = feature.get('mate');
328
+ if (mate?.refName !== undefined && mate.start !== undefined) {
329
+ const sided = mate.strand !== undefined;
330
+ const self = {
331
+ start: feature.get('start'),
332
+ end: feature.get('end'),
333
+ keeps: keepsOf(feature.get('mateDirection'), sided ? feature.get('strand') : undefined),
334
+ };
335
+ const far = {
336
+ start: mate.start,
337
+ end: mate.end ?? mate.start + 1,
338
+ keeps: keepsOf(mate.mateDirection, mate.strand),
339
+ };
340
+ return {
341
+ own: { refName, pos: joinBase(self, far), keeps: self.keeps },
342
+ mate: {
343
+ refName: mate.refName,
344
+ pos: joinBase(far, self),
345
+ keeps: far.keeps,
346
+ },
347
+ };
348
+ }
349
+ const parsed = parseSvAlt(feature, alt, alleleIndex);
350
+ if (!parsed || alt === undefined) {
351
+ return undefined;
352
+ }
353
+ const [ownKeeps, mateKeeps] = parsed.joinDirection === undefined
354
+ ? symbolicKeeps(feature, alt)
355
+ : [parsed.joinDirection, parsed.mateDirection ?? 0];
356
+ return {
357
+ own: { refName, pos: feature.get('start'), keeps: ownKeeps },
358
+ mate: {
359
+ refName: parsed.mateRefName,
360
+ pos: parsed.matePos - 1,
361
+ keeps: mateKeeps,
362
+ },
363
+ };
364
+ }
@@ -5,3 +5,14 @@ export declare function getStrokeProps(str: string): {
5
5
  export declare function getFillProps(str: string): {
6
6
  [x: string]: string | number;
7
7
  };
8
+ /**
9
+ * A paint value split into the `rgb()` an SVG 1.1 `<color>` can carry and the
10
+ * alpha it cannot, for a separate `*-opacity`. Illustrator and older Inkscape
11
+ * drop an element whose fill they cannot parse, so `rgba()`, `hsl()`, `#rgba`
12
+ * and `transparent` have to be split before they reach a file. Undefined for a
13
+ * value that is already an SVG color, `none` or a `url()`.
14
+ */
15
+ export declare function splitPaintAlpha(value: string): {
16
+ color: string;
17
+ opacity: number;
18
+ } | undefined;
@@ -1,4 +1,4 @@
1
- import { formatHEX, getAlpha, newColor, parseCssColorOr } from './colorBits.js';
1
+ import { formatHEX, getAlpha, getBlue, getGreen, getRed, newColor, parseCssColorOr, } from './colorBits.js';
2
2
  // Matches colord()'s fallback for unparsable input.
3
3
  const FALLBACK = newColor(0, 0, 0, 255);
4
4
  // Works on the packed Color directly rather than via colord(): these run per
@@ -26,3 +26,30 @@ export function getStrokeProps(str) {
26
26
  export function getFillProps(str) {
27
27
  return svgColorProps(str, 'fill', 'fillOpacity');
28
28
  }
29
+ // four channels, comma- or slash-separated, so a three-channel `rgb(4,5,6)`
30
+ // never reads its blue as an alpha
31
+ const FUNCTIONAL_ALPHA = /^(?:rgb|hsl)a?\((?:[^,/)]+,){3}\s*([\d.]+)(%?)\s*\)$|^(?:rgb|hsl)a?\([^,/)]+\/\s*([\d.]+)(%?)\s*\)$/i;
32
+ const HEX_ALPHA = /^#(?:[\da-f]{4}|[\da-f]{8})$/i;
33
+ const NOT_SVG_COLOR = /^(?:rgba|hsla?)\(|^transparent$/i;
34
+ /**
35
+ * A paint value split into the `rgb()` an SVG 1.1 `<color>` can carry and the
36
+ * alpha it cannot, for a separate `*-opacity`. Illustrator and older Inkscape
37
+ * drop an element whose fill they cannot parse, so `rgba()`, `hsl()`, `#rgba`
38
+ * and `transparent` have to be split before they reach a file. Undefined for a
39
+ * value that is already an SVG color, `none` or a `url()`.
40
+ */
41
+ export function splitPaintAlpha(value) {
42
+ const m = FUNCTIONAL_ALPHA.exec(value);
43
+ if (!m && !HEX_ALPHA.test(value) && !NOT_SVG_COLOR.test(value)) {
44
+ return undefined;
45
+ }
46
+ const c = parseCssColorOr(value, FALLBACK);
47
+ const digits = m?.[1] ?? m?.[3];
48
+ const percent = (m?.[2] ?? m?.[4]) === '%';
49
+ return {
50
+ color: `rgb(${getRed(c)},${getGreen(c)},${getBlue(c)})`,
51
+ opacity: digits === undefined
52
+ ? getAlpha(c) / 255
53
+ : Math.min(1, Number(digits) / (percent ? 100 : 1)),
54
+ };
55
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Whether the OS asks for a dark UI. False wherever `matchMedia` is missing — a
3
+ * worker, jsdom, node — which is the light theme JBrowse has always started in.
4
+ */
5
+ export declare function prefersDarkColorScheme(): boolean;
6
+ /**
7
+ * Call `listener` whenever the OS preference flips, and return the unsubscribe.
8
+ * Both halves live here rather than beside either caller because the session's
9
+ * `system` theme and the embedding hook `useSessionPalette` are two readers of
10
+ * one preference, and a second spelling of the query is a second answer.
11
+ */
12
+ export declare function onColorSchemeChange(listener: () => void): () => void;
@@ -0,0 +1,27 @@
1
+ const DARK_SCHEME = '(prefers-color-scheme: dark)';
2
+ function darkSchemeQuery() {
3
+ return typeof window !== 'undefined' &&
4
+ typeof window.matchMedia === 'function'
5
+ ? window.matchMedia(DARK_SCHEME)
6
+ : undefined;
7
+ }
8
+ /**
9
+ * Whether the OS asks for a dark UI. False wherever `matchMedia` is missing — a
10
+ * worker, jsdom, node — which is the light theme JBrowse has always started in.
11
+ */
12
+ export function prefersDarkColorScheme() {
13
+ return darkSchemeQuery()?.matches ?? false;
14
+ }
15
+ /**
16
+ * Call `listener` whenever the OS preference flips, and return the unsubscribe.
17
+ * Both halves live here rather than beside either caller because the session's
18
+ * `system` theme and the embedding hook `useSessionPalette` are two readers of
19
+ * one preference, and a second spelling of the query is a second answer.
20
+ */
21
+ export function onColorSchemeChange(listener) {
22
+ const media = darkSchemeQuery();
23
+ media?.addEventListener('change', listener);
24
+ return () => {
25
+ media?.removeEventListener('change', listener);
26
+ };
27
+ }
@@ -1,5 +1,4 @@
1
1
  import type { StatusCallback } from './progress.ts';
2
- import type { StopToken } from './stopToken.ts';
3
2
  /**
4
3
  * A raw tabix line paired with the metadata the GFF3/GTF adapters need before
5
4
  * parsing: `offset` (the tabix byte offset) mints a stable per-feature id that
@@ -34,20 +33,26 @@ interface TabixLineSource {
34
33
  * label, capturing each line's byte offset, indexed start/end, and feature type
35
34
  * into a {@link TabixLine}. Shared by the GFF3 and GTF tabix adapters.
36
35
  *
37
- * The stop token becomes the read's `AbortSignal`, so a cancelled fetch drops
36
+ * The signal becomes the read's `AbortSignal`, so a cancelled fetch drops
38
37
  * its block reads at the socket instead of downloading them and discarding the
39
38
  * lines. @gmod/tabix aborts a block shared between callers only once every
40
39
  * joined caller has aborted (`AggregateAbortController`), so this can't cancel a
41
40
  * chunk another region still needs.
42
41
  */
43
- export declare function readTabixLines(gff: TabixLineSource, refName: string, start: number, end: number, statusCallback?: StatusCallback, stopToken?: StopToken): Promise<TabixLine[]>;
42
+ export declare function readTabixLines(gff: TabixLineSource, refName: string, start: number, end: number, statusCallback?: StatusCallback, signal?: AbortSignal): Promise<TabixLine[]>;
44
43
  /**
45
44
  * Read a region's tabix lines, then — if any feature found there extends past
46
45
  * the query — read the overhang on either side, so a parent line's children (a
47
46
  * gene's exons, a transcript's CDS) outside the original window are pulled in
48
- * and the parent/child tree resolves fully. Types in `dontRedispatchSet` are
49
- * excluded from the bounds, so one chromosome-spanning record can't force a
50
- * whole-chromosome refetch.
47
+ * and the parent/child tree resolves fully. `expands` decides which lines widen
48
+ * the bound, so one chromosome-spanning record can't force a whole-chromosome
49
+ * refetch; {@link calculateRedispatchRange} says why that is a predicate.
50
+ *
51
+ * **There is one control, and skipping the expansion is a value of it**: an
52
+ * `expands` that admits nothing reads the query and stops. A caller that wants
53
+ * that says so to its adapter, which is the layer that knows whether its format
54
+ * can honour it — see `Gff3TabixAdapter`, and `GtfTabixAdapter` for a format
55
+ * that cannot.
51
56
  *
52
57
  * **The flanks, not the union.** Re-reading `[minStart, maxEnd]` returns
53
58
  * everything the first read already had — a second full read of the query range
@@ -76,9 +81,9 @@ export declare function readTabixLinesRedispatched(file: TabixLineSource, query:
76
81
  refName: string;
77
82
  start: number;
78
83
  end: number;
79
- }, dontRedispatchSet: Set<string>, opts?: {
84
+ }, expands: (line: TabixLine) => boolean, opts?: {
80
85
  statusCallback?: StatusCallback;
81
- stopToken?: StopToken;
86
+ signal?: AbortSignal;
82
87
  }): Promise<TabixLine[]>;
83
88
  /**
84
89
  * Minimal structural view of the `@gmod/tabix` call a header read needs, kept
package/esm/util/tabix.js CHANGED
@@ -1,6 +1,5 @@
1
1
  import { createStatusFanOut, downloadStatus } from './progress.js';
2
2
  import { calculateRedispatchRange } from './range.js';
3
- import { withStopTokenSignal } from './stopToken.js';
4
3
  /**
5
4
  * Read the feature type (column 3) from a raw GFF3/GTF line without a full
6
5
  * split. Used only to classify a line for redispatch.
@@ -18,15 +17,15 @@ function extractType(line) {
18
17
  * label, capturing each line's byte offset, indexed start/end, and feature type
19
18
  * into a {@link TabixLine}. Shared by the GFF3 and GTF tabix adapters.
20
19
  *
21
- * The stop token becomes the read's `AbortSignal`, so a cancelled fetch drops
20
+ * The signal becomes the read's `AbortSignal`, so a cancelled fetch drops
22
21
  * its block reads at the socket instead of downloading them and discarding the
23
22
  * lines. @gmod/tabix aborts a block shared between callers only once every
24
23
  * joined caller has aborted (`AggregateAbortController`), so this can't cancel a
25
24
  * chunk another region still needs.
26
25
  */
27
- export function readTabixLines(gff, refName, start, end, statusCallback, stopToken) {
26
+ export function readTabixLines(gff, refName, start, end, statusCallback, signal) {
28
27
  const lines = [];
29
- return withStopTokenSignal(stopToken, signal => downloadStatus('Downloading features', statusCallback, onProgress => gff.getLines(refName, start, end, {
28
+ return downloadStatus('Downloading features', statusCallback, onProgress => gff.getLines(refName, start, end, {
30
29
  lineCallback: (line, offset, s, e) => {
31
30
  lines.push({
32
31
  line,
@@ -38,15 +37,21 @@ export function readTabixLines(gff, refName, start, end, statusCallback, stopTok
38
37
  },
39
38
  onProgress,
40
39
  signal,
41
- }))).then(() => lines);
40
+ })).then(() => lines);
42
41
  }
43
42
  /**
44
43
  * Read a region's tabix lines, then — if any feature found there extends past
45
44
  * the query — read the overhang on either side, so a parent line's children (a
46
45
  * gene's exons, a transcript's CDS) outside the original window are pulled in
47
- * and the parent/child tree resolves fully. Types in `dontRedispatchSet` are
48
- * excluded from the bounds, so one chromosome-spanning record can't force a
49
- * whole-chromosome refetch.
46
+ * and the parent/child tree resolves fully. `expands` decides which lines widen
47
+ * the bound, so one chromosome-spanning record can't force a whole-chromosome
48
+ * refetch; {@link calculateRedispatchRange} says why that is a predicate.
49
+ *
50
+ * **There is one control, and skipping the expansion is a value of it**: an
51
+ * `expands` that admits nothing reads the query and stops. A caller that wants
52
+ * that says so to its adapter, which is the layer that knows whether its format
53
+ * can honour it — see `Gff3TabixAdapter`, and `GtfTabixAdapter` for a format
54
+ * that cannot.
50
55
  *
51
56
  * **The flanks, not the union.** Re-reading `[minStart, maxEnd]` returns
52
57
  * everything the first read already had — a second full read of the query range
@@ -74,13 +79,13 @@ export function readTabixLines(gff, refName, start, end, statusCallback, stopTok
74
79
  export async function readTabixLinesRedispatched(file,
75
80
  // the region's locus only — kept structural, like TabixLineSource above, so
76
81
  // this module stays free of the `types` barrel and its MST models
77
- query, dontRedispatchSet, opts = {}) {
78
- const { statusCallback, stopToken } = opts;
82
+ query, expands, opts = {}) {
83
+ const { statusCallback, signal } = opts;
79
84
  // `cb` is not optional: each read decides where it reports, and the flanks
80
85
  // report somewhere the first read does not
81
- const read = (start, end, cb) => readTabixLines(file, query.refName, start, end, cb, stopToken);
86
+ const read = (start, end, cb) => readTabixLines(file, query.refName, start, end, cb, signal);
82
87
  const lines = await read(query.start, query.end, statusCallback);
83
- const redispatch = calculateRedispatchRange(lines, dontRedispatchSet, query.start, query.end);
88
+ const redispatch = calculateRedispatchRange(lines, expands, query.start, query.end);
84
89
  if (redispatch) {
85
90
  const slot = createStatusFanOut(statusCallback);
86
91
  const flanks = await Promise.all([
@@ -0,0 +1,91 @@
1
+ import type { CategoricalScale } from '../ui/colorScale.ts';
2
+ import type { CategoricalField } from './categoricalField.ts';
3
+ /**
4
+ * #api
5
+ * A domain written as strings — the shared `domain` slot is a `stringArray` —
6
+ * read back as the numbers it names. A member that is not a number reads NaN,
7
+ * which every comparison against it declines.
8
+ */
9
+ export declare function numericDomain(domain: readonly (string | number)[]): number[];
10
+ /**
11
+ * #api
12
+ * A threshold scale's cut points as {@link thresholdIndex} walks them: the
13
+ * numbers the domain names, ascending. Cuts written high to low, as p-value
14
+ * thresholds often are, left the middle interval unreachable, the walk stopping
15
+ * at the first cut a value is under.
16
+ */
17
+ export declare function thresholdCuts(domain: readonly (string | number)[]): number[];
18
+ /**
19
+ * #api
20
+ * The bin a value falls in: how many of the ascending cut points it is at or
21
+ * past, so a palette with one more entry than the domain paints it as
22
+ * `palette[thresholdIndex(value, domain)]`. A value that is not a number is
23
+ * in no bin and answers -1; an infinite one takes the end bin on its side, as
24
+ * d3's threshold scale places it, so a `-log10` of a zero p-value lands in
25
+ * the top bin.
26
+ */
27
+ export declare function thresholdIndex(value: unknown, domain: readonly number[]): number;
28
+ /**
29
+ * #api
30
+ * The colour of each interval, in order: the declared palette, and the
31
+ * default categorical palette where it runs out.
32
+ */
33
+ export declare function thresholdPalette(bins: number, palette?: readonly string[]): string[];
34
+ /**
35
+ * #api
36
+ * What a threshold scale's bins are called in a key, one label per palette
37
+ * entry: `< a` below the first cut, `a – b` between two, `≥ b` past the last.
38
+ */
39
+ export declare function thresholdLabels(domain: readonly number[]): string[];
40
+ /**
41
+ * #api
42
+ * The key a value holding text that is no number files under on a threshold
43
+ * scale, painted the misconfiguration grey rather than passing for a missing
44
+ * value.
45
+ */
46
+ export declare const NOT_A_NUMBER_LABEL = "(not a number)";
47
+ /**
48
+ * #api
49
+ * A threshold key's rows: every interval, painted or not, since the bins are
50
+ * the whole domain, then the not-a-number and no-value rows where a feature
51
+ * took one, in the order `thresholdField` sorts them.
52
+ */
53
+ export declare function thresholdKeyEntries(cuts: readonly number[], range: readonly string[] | undefined, met: {
54
+ missing?: boolean;
55
+ notNumber?: boolean;
56
+ }, names?: readonly string[]): {
57
+ value: string;
58
+ label: string;
59
+ color: string;
60
+ missing?: true;
61
+ }[];
62
+ /**
63
+ * #api
64
+ * The rows a ramp's key lists beside its bar once a feature painted one: the
65
+ * not-a-number and no-value rows a threshold's key ends with. Empty while
66
+ * neither painted.
67
+ */
68
+ export declare function rampGapScales(id: string, met: {
69
+ missing?: boolean;
70
+ notNumber?: boolean;
71
+ }): CategoricalScale[];
72
+ /**
73
+ * #api
74
+ * Whether a field holds no value at all, as against text that fails to parse:
75
+ * absent, empty, or a VCF's `AF=.`, which arrives as `[undefined]`.
76
+ */
77
+ export declare function isMissing(value: unknown): boolean;
78
+ /**
79
+ * #api
80
+ * A threshold scale read the way every categorical channel reads its field: a
81
+ * value files under the label of the bin it falls in, a feature with no value
82
+ * under `''`, and text that is no number under {@link NOT_A_NUMBER_LABEL}.
83
+ * The bins are the whole domain, so a key lists each one. `labels` names the
84
+ * bins in a key, one each from the lowest, where a config spells them for a
85
+ * reader; a bin's key stays its interval.
86
+ */
87
+ export declare function thresholdField(field: string, { domain, range, labels: names, }?: {
88
+ domain?: readonly string[];
89
+ range?: readonly string[];
90
+ labels?: readonly string[];
91
+ }): CategoricalField;