@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
@@ -0,0 +1,243 @@
1
+ /**
2
+ * The scales a colour object paints through, in a module that imports
3
+ * nothing: `jbrowse validate` carries a copy of it, so the validator and the
4
+ * displays read one statement.
5
+ */
6
+ /** How a colour object maps its `field`; `none` paints `value`. */
7
+ export const COLOR_SCALES = [
8
+ 'none',
9
+ 'categorical',
10
+ 'linear',
11
+ 'log',
12
+ 'threshold',
13
+ ];
14
+ /**
15
+ * The scale that maps no field: each feature paints the colour it carries, and
16
+ * the key names the colours `domain` lists. Only a display whose features
17
+ * carry colours of their own declares it.
18
+ */
19
+ export const IDENTITY_SCALE = 'identity';
20
+ const CATEGORICAL_PRESET = { scale: 'categorical' };
21
+ /**
22
+ * The fields whose values have names, an order and colours of their own on
23
+ * every display, beneath each display's own presets. Red forward and blue
24
+ * reverse is what the synteny ribbons paint too. The SV classes are
25
+ * `svClassOf`'s, deletion red and duplication blue as dbVar and gnomAD-SV
26
+ * paint them, insertion the pileup's purple, and the rest kept apart under
27
+ * deuteranopia and protanopia. A record with no class files under `''`, so
28
+ * each display keeps its own no-value colour for it.
29
+ */
30
+ export const UNIVERSAL_FIELD_PRESETS = {
31
+ strand: {
32
+ scale: 'categorical',
33
+ missing: '0',
34
+ domain: ['1', '-1', '0'],
35
+ range: ['tomato', 'cornflowerblue', 'goldenrod'],
36
+ labels: ['Forward strand', 'Reverse strand', 'No strand'],
37
+ },
38
+ svType: {
39
+ scale: 'categorical',
40
+ domain: ['DEL', 'DUP', 'INS', 'INV', 'CNV', 'TR', 'BND', 'CPX', 'OTHER'],
41
+ range: [
42
+ '#e41a1c',
43
+ '#377eb8',
44
+ '#800080',
45
+ '#ff7f00',
46
+ '#7e6148',
47
+ '#e7298a',
48
+ '#17becf',
49
+ '#66a61e',
50
+ '#000000',
51
+ ],
52
+ labels: [
53
+ 'Deletion',
54
+ 'Duplication',
55
+ 'Insertion',
56
+ 'Inversion',
57
+ 'Copy-number variable',
58
+ 'Tandem repeat',
59
+ 'Breakend / translocation',
60
+ 'Complex',
61
+ 'Other / mixed',
62
+ ],
63
+ title: 'SV type',
64
+ },
65
+ };
66
+ /** The universal preset of `field`, if it has one. */
67
+ export function universalPresetOf(field) {
68
+ return Object.hasOwn(UNIVERSAL_FIELD_PRESETS, field)
69
+ ? UNIVERSAL_FIELD_PRESETS[field]
70
+ : undefined;
71
+ }
72
+ /** Every field categorical while `scale` is unset, with nothing preset. */
73
+ export const CATEGORICAL_FIELD_PRESETS = {
74
+ '*': CATEGORICAL_PRESET,
75
+ };
76
+ /**
77
+ * What a feature's field paints through while `scale` is unset: `score` a
78
+ * ramp, any other field categories.
79
+ */
80
+ export const FEATURE_FIELD_PRESETS = {
81
+ score: { scale: 'linear' },
82
+ '*': CATEGORICAL_PRESET,
83
+ };
84
+ /**
85
+ * A field's preset under `presets`: its own, else a universal one, else
86
+ * `*`'s, else categorical.
87
+ */
88
+ export function presetOf(presets, field) {
89
+ return ((Object.hasOwn(presets, field)
90
+ ? presets[field]
91
+ : (universalPresetOf(field) ?? presets['*'])) ?? CATEGORICAL_PRESET);
92
+ }
93
+ /** What a field paints through under `presets` while `scale` is unset. */
94
+ export function fieldScaleOf(presets, field) {
95
+ return presetOf(presets, field).scale;
96
+ }
97
+ function unwritten(value) {
98
+ return value === undefined || (Array.isArray(value) && value.length === 0);
99
+ }
100
+ /**
101
+ * A colour object with its field's preset under it: each member the preset
102
+ * names and the config leaves unwritten, an empty list counting as unwritten.
103
+ * Only while the colour paints through the preset's own scale, so the cuts of
104
+ * a threshold preset never reach a field read through a ramp. A categorical
105
+ * preset's `range` and `labels` name its `domain`'s values in order, so they
106
+ * fill only while `domain` does too: a written order keeps each value's own
107
+ * colour and name.
108
+ */
109
+ export function withPreset(color, presets) {
110
+ const field = color.field ?? '';
111
+ const preset = presetOf(presets, field);
112
+ if (!field || (color.scale ?? preset.scale) !== preset.scale) {
113
+ return color;
114
+ }
115
+ const written = new Map(Object.entries(color));
116
+ const ordered = preset.scale !== 'categorical' ||
117
+ !preset.domain ||
118
+ unwritten(written.get('domain'));
119
+ const filled = Object.entries(preset).filter(([key]) => key !== 'scale' &&
120
+ key !== 'missing' &&
121
+ (ordered || (key !== 'range' && key !== 'labels')) &&
122
+ unwritten(written.get(key)));
123
+ return filled.length > 0 ? { ...color, ...Object.fromEntries(filled) } : color;
124
+ }
125
+ /**
126
+ * The scale a colour object paints through: `none` while no `field` is
127
+ * named, else its own `scale`, or `fieldScale` where that is unset.
128
+ */
129
+ export function paintedScale({ scale, field }, fieldScale) {
130
+ return field ? (scale ?? fieldScale) : 'none';
131
+ }
132
+ /**
133
+ * What a quantitative scale's ends say together that neither can refuse
134
+ * alone: a `domainMax` below its `domainMin`, which every such scale draws in
135
+ * order either way, and a `domainQuantile` outside 0.5 to 1, where the quantile
136
+ * an open end follows is clamped. `reverse` is whether the scale turns round by
137
+ * a member of its own, which is then the spelling to point at.
138
+ */
139
+ export function scaleEndProblems({ domainMin, domainMax, domainQuantile }, { reverse = false } = {}) {
140
+ return [
141
+ ...(domainMin !== undefined &&
142
+ domainMax !== undefined &&
143
+ domainMin > domainMax
144
+ ? [
145
+ {
146
+ rule: 'domain-ends',
147
+ slot: 'domainMax',
148
+ message: `domainMax is below domainMin: the scale spans the two in order either way${reverse ? ', and reverse is what turns it round' : ''}`,
149
+ },
150
+ ]
151
+ : []),
152
+ ...(domainQuantile !== undefined &&
153
+ !(domainQuantile >= 0.5 && domainQuantile <= 1)
154
+ ? [
155
+ {
156
+ rule: 'domain-quantile',
157
+ slot: 'domainQuantile',
158
+ message: 'domainQuantile is a fraction from 0.5 to 1, not a percent: 1 follows the extremes and 0.99 clips the outermost 1% at each end; above 1 reads as 1 and below 0.5 as 0.5',
159
+ },
160
+ ]
161
+ : []),
162
+ ];
163
+ }
164
+ /** Problems as the lines a display's corner notice lists, under the setting that holds the scale. */
165
+ export function noticeLines(setting, problems) {
166
+ return problems.map(({ slot, message }) => `${setting}.${slot}: ${message}`);
167
+ }
168
+ function pinned(entry) {
169
+ return entry !== '' && Number.isFinite(Number(entry));
170
+ }
171
+ /**
172
+ * What a colour object's slots say together that no single slot can refuse,
173
+ * since the config editor writes one slot at a time (ADR-133), read with its
174
+ * field's preset under it. A display shows these as a notice and draws what
175
+ * it can. A threshold naming no cuts leaves its intervals to the display —
176
+ * the alignments insert-size band samples its cuts, the wiggle plot cuts at
177
+ * its origin — so its `labels` go uncounted.
178
+ */
179
+ export function colorProblems(written, presets) {
180
+ const color = withPreset(written, presets);
181
+ const { domain = [] } = color;
182
+ const { range = [] } = written;
183
+ const scale = color.scale === IDENTITY_SCALE
184
+ ? IDENTITY_SCALE
185
+ : paintedScale({ scale: color.scale, field: color.field ?? '' }, fieldScaleOf(presets, color.field ?? ''));
186
+ const problems = [];
187
+ if (scale === 'threshold') {
188
+ if (domain.some((cut, i) => !pinned(cut) || Number(cut) <= Number(domain[i - 1]))) {
189
+ problems.push({
190
+ rule: 'threshold-cuts',
191
+ slot: 'domain',
192
+ message: 'threshold cuts are distinct numbers, read in ascending order, with the range running from the lowest interval; a repeated cut leaves an interval no value falls in',
193
+ });
194
+ }
195
+ if (domain.length > 0 &&
196
+ range.length > 0 &&
197
+ range.length !== domain.length + 1) {
198
+ problems.push({
199
+ rule: 'threshold-range',
200
+ slot: 'range',
201
+ message: `${domain.length} threshold ${domain.length === 1 ? 'cut makes' : 'cuts make'} ${domain.length + 1} intervals, one colour each, and range lists ${range.length}: a missing colour comes from the default palette and an extra one is never read`,
202
+ });
203
+ }
204
+ }
205
+ if (scale === 'linear' || scale === 'log') {
206
+ if (domain.length > 0) {
207
+ problems.push({
208
+ rule: 'ramp-domain',
209
+ slot: 'domain',
210
+ message: "a linear or log scale reads no domain, which is a categorical scale's order and a threshold scale's cuts; a ramp's ends are domainMin and domainMax where the colour has them",
211
+ });
212
+ }
213
+ problems.push(...scaleEndProblems(color, { reverse: true }));
214
+ }
215
+ const { labels = [] } = color;
216
+ const named = scale === 'categorical' || scale === IDENTITY_SCALE
217
+ ? domain.length
218
+ : scale === 'threshold'
219
+ ? domain.length + 1
220
+ : undefined;
221
+ const cutsFromData = scale === 'threshold' && domain.length === 0;
222
+ if (labels.length > 0 &&
223
+ !cutsFromData &&
224
+ (named === undefined || labels.length > named)) {
225
+ const what = scale === 'categorical'
226
+ ? 'value'
227
+ : scale === IDENTITY_SCALE
228
+ ? 'colour'
229
+ : 'interval';
230
+ problems.push({
231
+ rule: 'labels-domain',
232
+ slot: 'labels',
233
+ message: named === undefined
234
+ ? "labels names a categorical scale's values, a threshold scale's intervals or an identity scale's colours, and this colour paints none of them"
235
+ : `labels names one ${what} each, and ${labels.length} ${labels.length === 1 ? 'label names' : 'labels name'} ${named} ${named === 1 ? what : `${what}s`}: a label past them names nothing`,
236
+ });
237
+ }
238
+ return problems;
239
+ }
240
+ /** `colorProblems` as the lines a display's corner notice lists, under `color`. */
241
+ export function colorNotices(color, presets) {
242
+ return noticeLines('color', colorProblems(color, presets));
243
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * #api
3
+ * The named ramps a continuous colour scale's `scheme` takes, each one a stop
4
+ * table in `colorRamp.ts` that every ramp baker reads, so no display can name
5
+ * a scheme nothing bakes. `viridis`, `magma`, `inferno` and `cividis` are
6
+ * matplotlib's perceptual ramps, dark at the low end; `juicebox` fades from
7
+ * transparent to red, as Juicebox paints contacts; `fall` runs white through
8
+ * yellow and red to black, as HiGlass does; `reds` and `blues` are
9
+ * ColorBrewer's, from white; `redblue` and `purpleorange` diverge through
10
+ * white, ColorBrewer's RdBu and PuOr.
11
+ */
12
+ export declare const COLOR_SCHEMES: readonly ['viridis', 'magma', 'inferno', 'cividis', 'juicebox', 'fall', 'reds', 'blues', 'redblue', 'purpleorange'];
13
+ /** #api */
14
+ export type ColorSchemeName = (typeof COLOR_SCHEMES)[number];
15
+ /**
16
+ * #api
17
+ * The ramp a continuous scale samples while it names no `range` and no
18
+ * `scheme`, so a declaration spelling it out and one leaving it unset resolve
19
+ * alike.
20
+ */
21
+ export declare const DEFAULT_COLOR_SCHEME: ColorSchemeName;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * #api
3
+ * The named ramps a continuous colour scale's `scheme` takes, each one a stop
4
+ * table in `colorRamp.ts` that every ramp baker reads, so no display can name
5
+ * a scheme nothing bakes. `viridis`, `magma`, `inferno` and `cividis` are
6
+ * matplotlib's perceptual ramps, dark at the low end; `juicebox` fades from
7
+ * transparent to red, as Juicebox paints contacts; `fall` runs white through
8
+ * yellow and red to black, as HiGlass does; `reds` and `blues` are
9
+ * ColorBrewer's, from white; `redblue` and `purpleorange` diverge through
10
+ * white, ColorBrewer's RdBu and PuOr.
11
+ */
12
+ export const COLOR_SCHEMES = [
13
+ 'viridis',
14
+ 'magma',
15
+ 'inferno',
16
+ 'cividis',
17
+ 'juicebox',
18
+ 'fall',
19
+ 'reds',
20
+ 'blues',
21
+ 'redblue',
22
+ 'purpleorange',
23
+ ];
24
+ /**
25
+ * #api
26
+ * The ramp a continuous scale samples while it names no `range` and no
27
+ * `scheme`, so a declaration spelling it out and one leaving it unset resolve
28
+ * alike.
29
+ */
30
+ export const DEFAULT_COLOR_SCHEME = 'viridis';
@@ -7,7 +7,14 @@ export default async function copyToClipboard(text, options = {}) {
7
7
  // navigator.clipboard is only present in secure contexts; isSecureContext is
8
8
  // the real gate, so insecure http:// falls through to execCommand below
9
9
  if (format === 'text/plain' && window.isSecureContext) {
10
- await navigator.clipboard.writeText(text);
10
+ try {
11
+ await navigator.clipboard.writeText(text);
12
+ }
13
+ catch (e) {
14
+ if (!execCommandCopy(text, format)) {
15
+ throw e;
16
+ }
17
+ }
11
18
  }
12
19
  else if (!execCommandCopy(text, format)) {
13
20
  throw new Error('the browser rejected the clipboard write');
@@ -1,5 +1,4 @@
1
1
  import type { RpcStatus, StatusWindow } from './progress.ts';
2
- import type { StopToken } from './stopToken.ts';
3
2
  import type { IStateTreeNode } from '@jbrowse/mobx-state-tree';
4
3
  /**
5
4
  * Where a rotation reports, in the one of two modes the host is actually in.
@@ -13,19 +12,20 @@ import type { IStateTreeNode } from '@jbrowse/mobx-state-tree';
13
12
  */
14
13
  export type StatusReporter = {
15
14
  /**
16
- * The host's own window, present on any display composing the LGV fetch
17
- * mixins. The rotation reports through it rather than opening a SECOND on
18
- * the same status field — which is what one-window-per-owner exists to
15
+ * The host's own window, present on any display composing `FetchMixin`.
16
+ * The rotation reports through it rather than opening a SECOND on the
17
+ * same status field — which is what one-window-per-owner exists to
19
18
  * prevent.
20
19
  */
21
20
  statusWindow: StatusWindow;
22
21
  setStatusMessage?: never;
23
22
  } | {
24
23
  /**
25
- * The sink for the window the rotation opens for itself. This is the mode
26
- * the displays this helper was written for are in (dotplot, synteny),
27
- * which compose no fetch mixin, along with every
28
- * {@link createStatusChannel} holder.
24
+ * The sink for the window the rotation opens for itself: the mode of a
25
+ * fetch on a host with no window of its own — the prerequisite reads,
26
+ * chord, the breakpoint overlay — along with every
27
+ * {@link createStatusChannel} holder. The comparative displays this
28
+ * helper was written for lend a window now (ADR-105).
29
29
  */
30
30
  setStatusMessage: (status?: RpcStatus) => void;
31
31
  statusWindow?: never;
@@ -50,8 +50,7 @@ export interface StatusChannel {
50
50
  }
51
51
  export declare function createStatusChannel(): StatusChannel;
52
52
  export interface ActiveFetch {
53
- /** stop token to forward to the RPC call */
54
- stopToken: StopToken;
53
+ signal: AbortSignal;
55
54
  /**
56
55
  * True only while this is still the most recent fetch AND `self` is alive.
57
56
  * Gate every post-await write — result commit, error set — on it so a
@@ -72,31 +71,29 @@ export interface ActiveFetch {
72
71
  * other operation on the host is still reporting.
73
72
  *
74
73
  * Both together, because a caller doing it by hand gets a subset.
75
- * `isCurrent` is `token === current && isAlive`, and a run that *completes*
76
- * never rotates its own token — so without this the guard stays open past the
74
+ * `isCurrent` is `signal === current && isAlive`, and a run that *completes*
75
+ * never rotates its own signal — so without this the guard stays open past the
77
76
  * work and a trailing write lands on top of a hand-written
78
77
  * `setStatusMessage(undefined)` up to a window later.
79
78
  *
80
- * A **superseded** run calls it too, and must: its slot goes on voting for a
81
- * phase that is over until it does. The run that replaced it has already
82
- * opened its own slot by then, so the label the user is looking at survives.
79
+ * A superseded run's slot is already retired by the `begin()` that replaced
80
+ * it, so its `end()` only closes the guard.
83
81
  */
84
82
  end: () => void;
85
83
  }
86
84
  /**
87
- * Latest-wins stop-token rotation for a fetch that runs in a bare `autorun`
85
+ * Latest-wins abort rotation for a fetch that runs in a bare `autorun`
88
86
  * rather than through `FetchMixin.runFetch` (which welds the same mechanics to
89
87
  * `fetchGeneration`, so it's only for viewport-driven LGV fetches). Each
90
- * `begin()` aborts the prior fetch's token and returns a fresh one plus an
91
- * `isCurrent()` guard that captures this run's token — gate every post-await
92
- * write on it and a superseded or torn-down fetch can never clobber fresher
93
- * data. The guard is the return value, so a caller can't forget to compare a
94
- * token by hand.
88
+ * `begin()` aborts the prior fetch and returns a fresh signal plus an
89
+ * `isCurrent()` guard that captures this run — gate every post-await write on
90
+ * it and a superseded or torn-down fetch can never clobber fresher data. The
91
+ * guard is the return value, so a caller can't forget to compare by hand.
95
92
  *
96
93
  * `end()` in the run's `finally` is the other half, and for the same reason —
97
94
  * see {@link ActiveFetch.end} for the two things it does together.
98
95
  *
99
- * Owns the token mechanics and the status channel; the caller keeps its own
96
+ * Owns the controller and the status channel; the caller keeps its own
100
97
  * loading/error/commit side-effects. Three holders: `FetchMixin` as a member
101
98
  * (so `cancelFetch` can reach it), `installFetch` one per installation (every
102
99
  * other fetch in the tree runs on that skeleton), and the synteny diagonalize
@@ -110,7 +107,8 @@ export interface ActiveFetch {
110
107
  * passes a {@link createStatusChannel}, which is one volatile instead of two
111
108
  * fields and an action.
112
109
  */
113
- export declare function createStopTokenRotation(self: IStateTreeNode, report: StatusReporter): {
110
+ export type AbortRotation = ReturnType<typeof createAbortRotation>;
111
+ export declare function createAbortRotation(self: IStateTreeNode, report: StatusReporter): {
114
112
  begin(): ActiveFetch;
115
113
  cancel: () => void;
116
114
  dispose(): void;
@@ -1,7 +1,6 @@
1
1
  import { isAlive } from '@jbrowse/mobx-state-tree';
2
2
  import { observable, runInAction } from 'mobx';
3
3
  import { createStatusWindow, statusFraction, statusMessageText, } from './progress.js';
4
- import { createStopToken, stopStopToken } from './stopToken.js';
5
4
  export function createStatusChannel() {
6
5
  // MobX rather than MST, so this is a value a model can hold rather than a
7
6
  // node it has to parent. A volatile is `observable.ref`, so the fields have
@@ -28,35 +27,8 @@ export function createStatusChannel() {
28
27
  },
29
28
  };
30
29
  }
31
- /**
32
- * Latest-wins stop-token rotation for a fetch that runs in a bare `autorun`
33
- * rather than through `FetchMixin.runFetch` (which welds the same mechanics to
34
- * `fetchGeneration`, so it's only for viewport-driven LGV fetches). Each
35
- * `begin()` aborts the prior fetch's token and returns a fresh one plus an
36
- * `isCurrent()` guard that captures this run's token — gate every post-await
37
- * write on it and a superseded or torn-down fetch can never clobber fresher
38
- * data. The guard is the return value, so a caller can't forget to compare a
39
- * token by hand.
40
- *
41
- * `end()` in the run's `finally` is the other half, and for the same reason —
42
- * see {@link ActiveFetch.end} for the two things it does together.
43
- *
44
- * Owns the token mechanics and the status channel; the caller keeps its own
45
- * loading/error/commit side-effects. Three holders: `FetchMixin` as a member
46
- * (so `cancelFetch` can reach it), `installFetch` one per installation (every
47
- * other fetch in the tree runs on that skeleton), and the synteny diagonalize
48
- * progress wrapper (`withDiagonalizeProgress`) directly.
49
- *
50
- * `report` is passed rather than read off `self`, so where the status lands is
51
- * the caller's decision and not a shape this imposes. A display passes itself —
52
- * its status fields are part of its own API, and one composing `FetchMixin`
53
- * passes the model-wide window along with them (see `StatusReporter`).
54
- * Anything with one operation to narrate and no status vocabulary of its own
55
- * passes a {@link createStatusChannel}, which is one volatile instead of two
56
- * fields and an action.
57
- */
58
- export function createStopTokenRotation(self, report) {
59
- let currentStopToken;
30
+ export function createAbortRotation(self, report) {
31
+ let current;
60
32
  // The host's window when it has one, so a display composing `FetchMixin` has
61
33
  // one window rather than two writing one field; our own otherwise. Lent means
62
34
  // this fetch is one slot beside the host's others rather than a second writer
@@ -76,8 +48,8 @@ export function createStopTokenRotation(self, report) {
76
48
  /**
77
49
  * Stop the in-flight fetch without starting one, and retire its slot.
78
50
  *
79
- * Dropping `currentStopToken` rather than only stopping it is what closes
80
- * every outstanding guard: `isCurrent` compares against this field, so one
51
+ * Dropping `current` rather than only aborting it is what closes every
52
+ * outstanding guard: `isCurrent` compares against this field, so one
81
53
  * assignment makes a fetch already past its await stale, whether it is the one
82
54
  * being cancelled or a superseded predecessor still unwinding.
83
55
  *
@@ -88,10 +60,8 @@ export function createStopTokenRotation(self, report) {
88
60
  * works: `addDisposer(self, rotation.dispose)` is a shape callers reach for.
89
61
  */
90
62
  const cancel = () => {
91
- if (currentStopToken) {
92
- stopStopToken(currentStopToken);
93
- currentStopToken = undefined;
94
- }
63
+ current?.abort();
64
+ current = undefined;
95
65
  // a fetch in flight when this is called never reaches its `finally`, and a
96
66
  // slot nobody retires goes on voting
97
67
  openStream?.clear();
@@ -99,27 +69,26 @@ export function createStopTokenRotation(self, report) {
99
69
  };
100
70
  return {
101
71
  begin() {
102
- if (currentStopToken) {
103
- stopStopToken(currentStopToken);
104
- }
105
- const stopToken = createStopToken();
106
- currentStopToken = stopToken;
72
+ current?.abort();
73
+ const controller = new AbortController();
74
+ current = controller;
107
75
  // `ended` is the term a completed fetch has no other way to express: the
108
- // token comparison catches a SUPERSEDED one, but a fetch that simply
109
- // finished still holds the current token. The stream reads it as well as
76
+ // controller comparison catches a SUPERSEDED one, but a fetch that simply
77
+ // finished still holds the current one. The stream reads it as well as
110
78
  // the caller's commit guard, which is why both go through this closure.
111
79
  let ended = false;
112
- const isCurrent = () => !ended && stopToken === currentStopToken && isAlive(self);
113
- // Opened BEFORE the superseded run reaches its `finally`, which is what
114
- // keeps the label the user is looking at from blanking between the two:
115
- // the run being replaced is suspended at an await and resumes a microtask
116
- // from now, by which point this slot is already voting. A fetch being
117
- // SUPERSEDED is the one case where the display does not stop loading, so
118
- // a gap there reads as the overlay's `'Loading'` fallback (ADR-080).
80
+ const isCurrent = () => !ended && controller === current && isAlive(self);
81
+ // Opened before the superseded slot retires, so the window is never idle
82
+ // across the handover and the label on screen survives it (ADR-080).
83
+ // Retired here rather than left to the superseded run's `finally`, which
84
+ // comes only when its work settles — and a CRAM record read, or a shared
85
+ // `cachedSetup` parse the replacement rejoins, runs on past the abort,
86
+ // its last reading summed into this fetch's bar the whole time.
119
87
  const stream = statusWindow.open({ isCurrent });
88
+ openStream?.clear();
120
89
  openStream = stream;
121
90
  return {
122
- stopToken,
91
+ signal: controller.signal,
123
92
  isCurrent,
124
93
  statusCallback: stream.statusCallback,
125
94
  end() {
@@ -134,7 +103,7 @@ export function createStopTokenRotation(self, report) {
134
103
  cancel,
135
104
  dispose() {
136
105
  cancel();
137
- // the window outlives the token: a trailing write is queued on a timer,
106
+ // the window outlives the fetch: a trailing write is queued on a timer,
138
107
  // and while the sink's `isCurrent` makes it a no-op rather than a write to
139
108
  // a dead node, the timer itself still stands for up to a window past
140
109
  // teardown. Only ours — resetting a lent one drops a write the host's
@@ -1,5 +1,15 @@
1
1
  export interface SvgRasterCanvasOpts {
2
+ /**
3
+ * headless canvas factory for `rasterizeLayers` (jbrowse-img passes one);
4
+ * without it the raster path needs a DOM canvas
5
+ */
2
6
  createCanvas?: (width: number, height: number) => HTMLCanvasElement;
7
+ /**
8
+ * decodes SVG markup into an image a `createCanvas` canvas can draw, where
9
+ * the environment's `Image` cannot (node, jsdom). A headless decoder draws
10
+ * vectors only, so markup headed for it carries no rasterized layers.
11
+ */
12
+ decodeSvg?: (markup: string) => Promise<CanvasImageSource>;
3
13
  }
4
14
  export declare function createSvgRasterCanvas(width: number, height: number, opts: SvgRasterCanvasOpts | undefined): {
5
15
  canvas: HTMLCanvasElement;
@@ -0,0 +1,15 @@
1
+ import type { Color } from './color-bits/core.ts';
2
+ /**
3
+ * Normalize a bare BED color triple to canonical "r,g,b", or undefined if the
4
+ * string isn't one. Each component must be in range: the underlying parser
5
+ * masks to 8 bits, so a bogus "999,0,0" would otherwise *wrap* to 231 and paint
6
+ * a plausible-looking but wrong color rather than being caught.
7
+ */
8
+ export declare function bedTriple(str: string): string | undefined;
9
+ export declare function parseCssColorOr(color: string, fallback: Color): Color;
10
+ /**
11
+ * Whether the painters read `color` as a color — a CSS name, hex, functional
12
+ * form, `transparent` or a BED triple — rather than as the invalid sentinel.
13
+ * What a `color` config slot admits.
14
+ */
15
+ export declare function isCssColor(color: string): boolean;
@@ -0,0 +1,53 @@
1
+ import { newColor } from './color-bits/core.js';
2
+ import { parse } from './color-bits/parse.js';
3
+ import { namedColorToHex } from './color/cssColorsLevel4.js';
4
+ // Split out of colorBits.ts so a config slot can ask "is this a color?" without
5
+ // taking that module's re-export of render-core's packers: the closure ceiling
6
+ // in scripts/moduleClosure.test.ts is what says so.
7
+ // A bare BED color triple ("255,0,0"), which is not a CSS color but is what
8
+ // BED-family adapters put on the feature verbatim. The spec has no spaces, but
9
+ // tolerate them rather than silently ignoring an otherwise-usable color.
10
+ const BED_TRIPLE = /^(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})$/;
11
+ /**
12
+ * Normalize a bare BED color triple to canonical "r,g,b", or undefined if the
13
+ * string isn't one. Each component must be in range: the underlying parser
14
+ * masks to 8 bits, so a bogus "999,0,0" would otherwise *wrap* to 231 and paint
15
+ * a plausible-looking but wrong color rather than being caught.
16
+ */
17
+ export function bedTriple(str) {
18
+ const m = BED_TRIPLE.exec(str.trim());
19
+ const rgb = m?.slice(1, 4).map(Number);
20
+ return rgb?.every(n => n <= 255) ? rgb.join(',') : undefined;
21
+ }
22
+ function tryParseCssColor(color) {
23
+ const str = color.trim().toLowerCase();
24
+ if (str === 'transparent') {
25
+ return newColor(0, 0, 0, 0);
26
+ }
27
+ try {
28
+ const hex = namedColorToHex(str);
29
+ const triple = bedTriple(str);
30
+ return parse(hex ? hex : triple ? `rgb(${triple})` : str);
31
+ }
32
+ catch {
33
+ return undefined;
34
+ }
35
+ }
36
+ // Resolve a CSS color string to a Color: honors named colors, `transparent`,
37
+ // and bare BED color triples, and returns `fallback` on malformed-but-nonempty
38
+ // input. `parse` throws on e.g. an empty "rgb()"; callers pass a fallback so one
39
+ // bad per-feature color can't crash a whole render/RPC. An out-of-range triple
40
+ // is left to throw into `fallback` (magenta) rather than wrapping to a wrong
41
+ // color — the same rule featureItemRgb applies, so a jexl callback reading an
42
+ // itemRgb column and the automatic path agree on what counts as a color.
43
+ export function parseCssColorOr(color, fallback) {
44
+ return tryParseCssColor(color) ?? fallback;
45
+ }
46
+ /**
47
+ * Whether the painters read `color` as a color — a CSS name, hex, functional
48
+ * form, `transparent` or a BED triple — rather than as the invalid sentinel.
49
+ * What a `color` config slot admits.
50
+ */
51
+ export function isCssColor(color) {
52
+ return tryParseCssColor(color) !== undefined;
53
+ }
@@ -1,5 +1,4 @@
1
1
  import type { StatusCallback } from './progress.ts';
2
- import type { StopToken } from './stopToken.ts';
3
2
  import type { Region } from './types/data.ts';
4
3
  export interface AlignmentData {
5
4
  refRefName: string;
@@ -17,7 +16,7 @@ export interface DiagonalizationResult {
17
16
  regionsReversed: number;
18
17
  };
19
18
  }
20
- export declare function diagonalizeRegions(alignments: AlignmentData[], referenceRegions: Region[], currentRegions: Region[], { stopToken, statusCallback, }?: {
21
- stopToken?: StopToken;
19
+ export declare function diagonalizeRegions(alignments: AlignmentData[], referenceRegions: Region[], currentRegions: Region[], { signal, statusCallback, }?: {
20
+ signal?: AbortSignal;
22
21
  statusCallback?: StatusCallback;
23
22
  }): Promise<DiagonalizationResult>;