@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
@@ -72,7 +72,7 @@ export function makeContrasting(foreground, background = 'white', minContrastRat
72
72
  }
73
73
  return best;
74
74
  }
75
- export { isNamedColor, namedColorToHex } from './cssColorsLevel4.js';
75
+ export { CSS_COLOR_NAMES, isNamedColor, namedColorToHex, } from './cssColorsLevel4.js';
76
76
  // The (lightness, chroma) tiers randomColor picks between, in OKLCH. Values are
77
77
  // in the band a hand-built categorical palette occupies — bright enough to tell
78
78
  // apart, dark enough that black text over one still reads, and never near
@@ -81,7 +81,10 @@ export { isNamedColor, namedColorToHex } from './cssColorsLevel4.js';
81
81
  // What a value-less feature is painted. Neutral and unsaturated on purpose: it
82
82
  // has to read as "not in a category" beside a palette whose every member is
83
83
  // equally light and equally colorful, so it cannot be one more hue.
84
- const NO_CATEGORY_COLOR = '#afafaf';
84
+ export const NO_CATEGORY_COLOR = '#afafaf';
85
+ // What a colour declaration paints where it reads nothing it can colour, so a
86
+ // misconfiguration surfaces rather than passing for the no-category grey.
87
+ export const MISCONFIGURED_COLOR = '#808080';
85
88
  const RANDOM_COLOR_TIERS = [
86
89
  { lightness: 0.66, chroma: 0.15 },
87
90
  { lightness: 0.56, chroma: 0.14 },
@@ -175,8 +178,8 @@ export function relight(color, lightnessShift, chromaScale = 1) {
175
178
  *
176
179
  * A value that is absent gets NO_CATEGORY_COLOR rather than a hue, and that is
177
180
  * the difference between this being usable on real data and not. The everyday
178
- * caller is the Color-by-attribute dialog, which writes
179
- * `jexl:randomColor(get(feature,'<attr>'))` over a whole track — and most files
181
+ * caller is a `jexl:randomColor(get(feature,'<attr>'))` color slot over a
182
+ * whole track — and most files
180
183
  * have the attribute on some features and not others, so most of the time this
181
184
  * is handed `undefined`. It used to throw on that (`str.length` of undefined),
182
185
  * once per feature, and what a reader saw was every unlabelled feature in one
@@ -1,5 +1,7 @@
1
- import type { Color } from './color-bits/index.ts';
1
+ import { abgrToCssRgba } from '@jbrowse/render-core/marks/colorFill';
2
2
  import type { Feature } from './simpleFeature.ts';
3
+ export { abgrToCssRgba };
4
+ export { isCssColor, parseCssColorOr } from './cssColorParse.ts';
3
5
  export { alpha, blend, darken, formatHEX, formatHEXA, formatRGBA, getAlpha, getBlue, getGreen, getLuminance, getRed, lighten, newColor, parse, toHSLA, toRGBA, } from './color-bits/index.ts';
4
6
  export type { Color } from './color-bits/index.ts';
5
7
  /**
@@ -17,7 +19,6 @@ export declare function featureItemRgb(raw: unknown): string | undefined;
17
19
  * undefined if it declares none.
18
20
  */
19
21
  export declare function featureBedColor(feature: Feature): string | undefined;
20
- export declare function parseCssColorOr(color: string, fallback: Color): Color;
21
22
  export declare function parseCssColor(color: string | undefined | null): number;
22
23
  export declare function cssColorToNormalizedRgb(color: string): [number, number, number];
23
24
  export declare function cssColorToRgb(color: string): [number, number, number];
@@ -35,5 +36,4 @@ export declare function abgrRed(c: number): number;
35
36
  export declare function abgrGreen(c: number): number;
36
37
  export declare function abgrBlue(c: number): number;
37
38
  export declare function abgrAlpha(c: number): number;
38
- export declare function abgrToCssRgba(c: number): string;
39
39
  export declare function cssColorToNormalizedRgba(color: string): [number, number, number, number];
@@ -1,5 +1,8 @@
1
- import { getAlpha, getBlue, getGreen, getRed, newColor, parse, } from './color-bits/index.js';
2
- import { namedColorToHex } from './color/cssColorsLevel4.js';
1
+ import { abgrToCssRgba } from '@jbrowse/render-core/marks/colorFill';
2
+ import { getAlpha, getBlue, getGreen, getRed, newColor, } from './color-bits/index.js';
3
+ import { bedTriple, parseCssColorOr } from './cssColorParse.js';
4
+ export { abgrToCssRgba };
5
+ export { isCssColor, parseCssColorOr } from './cssColorParse.js';
3
6
  export { alpha, blend, darken, formatHEX, formatHEXA, formatRGBA, getAlpha, getBlue, getGreen, getLuminance, getRed, lighten, newColor, parse, toHSLA, toRGBA, } from './color-bits/index.js';
4
7
  // Magenta sentinel for invalid input. User-written jexl color callbacks can
5
8
  // legitimately return undefined (e.g. when a feature lacks the field they
@@ -7,10 +10,6 @@ export { alpha, blend, darken, formatHEX, formatHEXA, formatRGBA, getAlpha, getB
7
10
  // Returning magenta makes the bad slot visually obvious without breaking the
8
11
  // rest of the render.
9
12
  const INVALID_COLOR = newColor(255, 0, 255, 255);
10
- // A bare BED color triple ("255,0,0"), which is not a CSS color but is what
11
- // BED-family adapters put on the feature verbatim. The spec has no spaces, but
12
- // tolerate them rather than silently ignoring an otherwise-usable color.
13
- const BED_TRIPLE = /^(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})$/;
14
13
  // UCSC's convention is that a color of "0" means "no color specified", and plain
15
14
  // BED12 files fill the column with that placeholder (often spelled as the
16
15
  // all-zero triple) rather than omitting it — every itemRgb in our own
@@ -18,17 +17,6 @@ const BED_TRIPLE = /^(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})$/;
18
17
  // ordinary BED12 track solid black, so read them as absent. A file that really
19
18
  // wants black can say so with an explicit `color` slot.
20
19
  const BED_TRIPLE_UNSET = /^0(,0,0)?$/;
21
- /**
22
- * Normalize a bare BED color triple to canonical "r,g,b", or undefined if the
23
- * string isn't one. Each component must be in range: the underlying parser
24
- * masks to 8 bits, so a bogus "999,0,0" would otherwise *wrap* to 231 and paint
25
- * a plausible-looking but wrong color rather than being caught.
26
- */
27
- function bedTriple(str) {
28
- const m = BED_TRIPLE.exec(str.trim());
29
- const rgb = m?.slice(1, 4).map(Number);
30
- return rgb?.every(n => n <= 255) ? rgb.join(',') : undefined;
31
- }
32
20
  /**
33
21
  * One raw attribute value as a usable BED color, or undefined when it isn't
34
22
  * one. Deliberately strict: this feeds an *automatic* coloring path, so a value
@@ -73,27 +61,6 @@ export function featureBedColor(feature) {
73
61
  }
74
62
  return found;
75
63
  }
76
- // Resolve a CSS color string to a Color: honors named colors, `transparent`,
77
- // and bare BED color triples, and returns `fallback` on malformed-but-nonempty
78
- // input. `parse` throws on e.g. an empty "rgb()"; callers pass a fallback so one
79
- // bad per-feature color can't crash a whole render/RPC. An out-of-range triple
80
- // is left to throw into `fallback` (magenta) rather than wrapping to a wrong
81
- // color — the same rule featureItemRgb applies, so a jexl callback reading an
82
- // itemRgb column and the automatic path agree on what counts as a color.
83
- export function parseCssColorOr(color, fallback) {
84
- const str = color.trim().toLowerCase();
85
- if (str === 'transparent') {
86
- return newColor(0, 0, 0, 0);
87
- }
88
- try {
89
- const hex = namedColorToHex(str);
90
- const triple = bedTriple(str);
91
- return parse(hex ? hex : triple ? `rgb(${triple})` : str);
92
- }
93
- catch {
94
- return fallback;
95
- }
96
- }
97
64
  export function parseCssColor(color) {
98
65
  if (typeof color !== 'string' || color.length === 0) {
99
66
  return INVALID_COLOR;
@@ -118,9 +85,22 @@ export function cssColorToRgba(color) {
118
85
  export function packAbgr(r, g, b, a) {
119
86
  return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0;
120
87
  }
88
+ // A packer resolves the same few strings once per primitive, so the parse is
89
+ // cached by string. Capped, because BED itemRgb triples are unbounded.
90
+ const ABGR_CACHE_LIMIT = 4096;
91
+ const abgrByCss = new Map();
121
92
  export function cssColorToABGR(color) {
93
+ const cached = abgrByCss.get(color);
94
+ if (cached !== undefined) {
95
+ return cached;
96
+ }
122
97
  const c = parseCssColor(color);
123
- return packAbgr(getRed(c), getGreen(c), getBlue(c), getAlpha(c));
98
+ const packed = packAbgr(getRed(c), getGreen(c), getBlue(c), getAlpha(c));
99
+ if (abgrByCss.size >= ABGR_CACHE_LIMIT) {
100
+ abgrByCss.clear();
101
+ }
102
+ abgrByCss.set(color, packed);
103
+ return packed;
124
104
  }
125
105
  // Replace the alpha byte of an ABGR-packed u32, keeping its RGB. RGB already
126
106
  // occupies the low 24 bits (b<<16 | g<<8 | r), so this is a mask + or — no
@@ -143,7 +123,6 @@ export function normalizedRgbToCss(c) {
143
123
  export function normalizedRgbToCssRgba(c, alpha) {
144
124
  return `rgba(${Math.round(c[0] * 255)},${Math.round(c[1] * 255)},${Math.round(c[2] * 255)},${alpha})`;
145
125
  }
146
- // Set fillStyle from an ABGR-packed u32.
147
126
  export function setAbgrFill(ctx, c) {
148
127
  ctx.fillStyle = abgrToCssRgba(c);
149
128
  }
@@ -165,10 +144,6 @@ export function abgrBlue(c) {
165
144
  export function abgrAlpha(c) {
166
145
  return (c >>> 24) & 0xff;
167
146
  }
168
- // Format an ABGR-packed u32 as a CSS rgba() string.
169
- export function abgrToCssRgba(c) {
170
- return `rgba(${abgrRed(c)},${abgrGreen(c)},${abgrBlue(c)},${abgrAlpha(c) / 255})`;
171
- }
172
147
  export function cssColorToNormalizedRgba(color) {
173
148
  const c = parseCssColor(color);
174
149
  return [
@@ -1,4 +1,5 @@
1
- import type { GradientStop } from '../ui/SvgGradientLegend.tsx';
1
+ import type { RampStop } from '../ui/colorScale.ts';
2
+ import type { ColorSchemeName } from './colorSchemes.ts';
2
3
  /** One evenly-spaced ramp stop: 8-bit red, green, blue, alpha. */
3
4
  export type ColorRampStop = readonly [number, number, number, number];
4
5
  /**
@@ -8,6 +9,27 @@ export type ColorRampStop = readonly [number, number, number, number];
8
9
  * stops.
9
10
  */
10
11
  export declare const VIRIDIS_STOPS: readonly ColorRampStop[];
12
+ /**
13
+ * #api
14
+ * Whether a named ramp runs dark at its low end, drawn over white: viridis
15
+ * and its siblings do, juicebox, fall, reds and blues do not.
16
+ */
17
+ export declare function darkAtLowEnd(scheme: ColorSchemeName): boolean;
18
+ /**
19
+ * #api
20
+ * The domain a continuous colour scale spans: each end `min` or `max` pins,
21
+ * else the extent's, ascending, since a span has no direction and `reverse`
22
+ * is the ramp's. An open end stops at a pinned one rather than crossing it,
23
+ * and an extent holding no value (`[Infinity, -Infinity]`) spans [0, 1].
24
+ */
25
+ export declare function rampDomain(min: number | undefined, max: number | undefined, extent: readonly [number, number]): [number, number];
26
+ /**
27
+ * #api
28
+ * The stops a continuous colour scale samples: `range`'s CSS colours where it
29
+ * lists any, else the named `scheme`, viridis while that is unset, turned
30
+ * round under `reverse`.
31
+ */
32
+ export declare function colorRampStops({ range, scheme, reverse, }: RampDeclaration): readonly ColorRampStop[];
11
33
  /**
12
34
  * #api
13
35
  * The color at `t` in `[0, 1]` across a list of EVENLY SPACED stops, linearly
@@ -22,16 +44,38 @@ export declare function sampleColorRamp(stops: readonly ColorRampStop[], t: numb
22
44
  * texture both GPU backends upload and the Canvas2D twins index — entry `i` is
23
45
  * the color at `t = i / (N - 1)`. N comes off the shader that samples it, so
24
46
  * the table and `rampColor`'s texel mapping cannot disagree.
47
+ *
48
+ * The table is always straight. A diverging ramp whose middle belongs at a
49
+ * value off the centre of the domain reads it through `rampMidT`, the shader's
50
+ * rule and its generated twin, so the middle follows a moving domain without a
51
+ * new table.
25
52
  */
26
53
  export declare function buildColorRampLut(stops: readonly ColorRampStop[]): Uint8Array<ArrayBuffer>;
54
+ /**
55
+ * #api
56
+ * A continuous colour scale's ramp as a config declares it.
57
+ */
58
+ export interface RampDeclaration {
59
+ range?: readonly string[];
60
+ scheme?: ColorSchemeName;
61
+ reverse?: boolean;
62
+ }
63
+ /**
64
+ * #api
65
+ * The {@link buildColorRampLut} table a ramp declaration asks for, the same
66
+ * `Uint8Array` for the same declaration, since a GPU backend re-uploads its
67
+ * ramp texture when the identity changes and a render state is rebuilt far
68
+ * more often than its ramp.
69
+ */
70
+ export declare function rampLutOf(ramp: RampDeclaration): Uint8Array;
27
71
  /**
28
72
  * #api
29
73
  * `n` evenly spaced legend stops read straight out of a
30
74
  * {@link buildColorRampLut} byte table — the same 256×1 RGBA array
31
75
  * `uploadColorRampLut` hands the GPU and the Canvas2D fillStyle LUTs index —
32
- * formatted for `SvgGradientLegend`. It holds one claim by construction: the
33
- * swatch at bar fraction `t` is byte-identical to the ramp entry at `t` on
34
- * both backends. Alpha rides `opacity` (the juicebox fade), never baked into
76
+ * as the stops of a `RampScale`. It holds one claim by construction: the
77
+ * swatch at bar fraction `t` is byte-identical to the ramp entry both backends
78
+ * read at `t`, through the ramp's middle stop at `midNorm` (`rampMidT`). Alpha rides `opacity` (the juicebox fade), never baked into
35
79
  * the color string.
36
80
  */
37
- export declare function stopsFromRampLut(lut: Uint8Array, n: number): GradientStop[];
81
+ export declare function stopsFromRampLut(lut: Uint8Array, n: number, midNorm?: number): RampStop[];
@@ -1,18 +1,15 @@
1
1
  import { COLOR_RAMP_LUT_ENTRIES } from '@jbrowse/render-core/colorRampLut';
2
- // Viridis full 256-color hex spec, kept whole so a LUT built from these stops
3
- // carries the smooth perceptually-uniform gradient rather than an
4
- // interpolation over a subset. Lived in the hic plugin until wiggle density
5
- // gained the same named ramp; both build their 256×1 GPU/Canvas2D LUTs from
6
- // this one table.
2
+ import { rampMidT } from '@jbrowse/render-core/shaders/colorRampLut';
3
+ import { cssColorToRgba } from './colorBits.js';
4
+ import { DEFAULT_COLOR_SCHEME } from './colorSchemes.js';
7
5
  const VIRIDIS_HEX_SPEC = '44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725';
8
- function viridisStopsFromHex() {
6
+ function stopsFromHex(spec) {
9
7
  const out = [];
10
- for (let i = 0; i < 256; i++) {
11
- const hex = VIRIDIS_HEX_SPEC.slice(i * 6, i * 6 + 6);
8
+ for (let i = 0; i < spec.length; i += 6) {
12
9
  out.push([
13
- Number.parseInt(hex.slice(0, 2), 16),
14
- Number.parseInt(hex.slice(2, 4), 16),
15
- Number.parseInt(hex.slice(4, 6), 16),
10
+ Number.parseInt(spec.slice(i, i + 2), 16),
11
+ Number.parseInt(spec.slice(i + 2, i + 4), 16),
12
+ Number.parseInt(spec.slice(i + 4, i + 6), 16),
16
13
  255,
17
14
  ]);
18
15
  }
@@ -24,7 +21,133 @@ function viridisStopsFromHex() {
24
21
  * for the texture/fillStyle form, or to {@link sampleColorRamp} for legend
25
22
  * stops.
26
23
  */
27
- export const VIRIDIS_STOPS = viridisStopsFromHex();
24
+ export const VIRIDIS_STOPS = stopsFromHex(VIRIDIS_HEX_SPEC);
25
+ const MAGMA_HEX_SPEC = '00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf';
26
+ const INFERNO_HEX_SPEC = '00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4';
27
+ const CIVIDIS_HEX_SPEC = '00224e00234f00245100255300255400265600275800285900285b00295d002a5f002a61002b62002c64002c66002d68002e6a002e6c002f6d00306f0030700031700031710132710533710833700c34700f357012357014367016377018376f1a386f1c396f1e3a6f203a6f213b6e233c6e243c6e263d6e273e6e293f6e2a3f6d2b406d2d416d2e416d2f426d31436d32436d33446d34456c35456c36466c38476c39486c3a486c3b496c3c4a6c3d4a6c3e4b6c3f4c6c404c6c414d6c424e6c434e6c444f6c45506c46516c47516c48526c49536c4a536c4b546c4c556c4d556c4e566c4f576c50576c51586d52596d535a6d545a6d555b6d555c6d565c6d575d6d585e6d595e6e5a5f6e5b606e5c616e5d616e5e626e5e636f5f636f60646f61656f62656f636670646770656870656870666970676a71686a71696b716a6c716b6d726c6d726c6e726d6f726e6f736f70737071737172747272747273747374757474757575757676767777767777777878777979777a7a787b7a787c7b787d7c787e7c787e7d787f7e78807f78817f788280798381798482798582798683798784788885788985788a86788b87788c88788d88788e89788f8a78908b78918b78928c78928d78938e78948e77958f779690779791779892779992779a93769b94769c95769d95769e96769f9775a09875a19975a29975a39a74a49b74a59c74a69c74a79d73a89e73a99f73aaa073aba072aca172ada272aea371afa471b0a571b1a570b3a670b4a76fb5a86fb6a96fb7a96eb8aa6eb9ab6dbaac6dbbad6dbcae6cbdae6cbeaf6bbfb06bc0b16ac1b26ac2b369c3b369c4b468c5b568c6b667c7b767c8b866c9b965cbb965ccba64cdbb63cebc63cfbd62d0be62d1bf61d2c060d3c05fd4c15fd5c25ed6c35dd7c45cd9c55cdac65bdbc75adcc859ddc858dec958dfca57e0cb56e1cc55e2cd54e4ce53e5cf52e6d051e7d150e8d24fe9d34eead34cebd44bedd54aeed649efd748f0d846f1d945f2da44f3db42f5dc41f6dd3ff7de3ef8df3cf9e03afbe138fce236fde334fee434fee535fee636fee838';
28
+ const FALL_STOPS = [
29
+ [255, 255, 255, 255],
30
+ [255, 255, 204, 255],
31
+ [255, 237, 160, 255],
32
+ [254, 217, 118, 255],
33
+ [254, 178, 76, 255],
34
+ [253, 141, 60, 255],
35
+ [252, 78, 42, 255],
36
+ [227, 26, 28, 255],
37
+ [189, 0, 38, 255],
38
+ [128, 0, 38, 255],
39
+ [0, 0, 0, 255],
40
+ ];
41
+ const JUICEBOX_STOPS = [
42
+ [255, 0, 0, 0],
43
+ [255, 0, 0, 255],
44
+ ];
45
+ const REDS_STOPS = [
46
+ [255, 245, 240, 255],
47
+ [254, 224, 210, 255],
48
+ [252, 187, 161, 255],
49
+ [252, 146, 114, 255],
50
+ [251, 106, 74, 255],
51
+ [239, 59, 44, 255],
52
+ [203, 24, 29, 255],
53
+ [165, 15, 21, 255],
54
+ [103, 0, 13, 255],
55
+ ];
56
+ const BLUES_STOPS = [
57
+ [247, 251, 255, 255],
58
+ [222, 235, 247, 255],
59
+ [198, 219, 239, 255],
60
+ [158, 202, 225, 255],
61
+ [107, 174, 214, 255],
62
+ [66, 146, 198, 255],
63
+ [33, 113, 181, 255],
64
+ [8, 81, 156, 255],
65
+ [8, 48, 107, 255],
66
+ ];
67
+ const REDBLUE_STOPS = [
68
+ [103, 0, 31, 255],
69
+ [178, 24, 43, 255],
70
+ [214, 96, 77, 255],
71
+ [244, 165, 130, 255],
72
+ [253, 219, 199, 255],
73
+ [247, 247, 247, 255],
74
+ [209, 229, 240, 255],
75
+ [146, 197, 222, 255],
76
+ [67, 147, 195, 255],
77
+ [33, 102, 172, 255],
78
+ [5, 48, 97, 255],
79
+ ];
80
+ const PURPLEORANGE_STOPS = [
81
+ [45, 0, 75, 255],
82
+ [84, 39, 136, 255],
83
+ [128, 115, 172, 255],
84
+ [178, 171, 210, 255],
85
+ [216, 218, 235, 255],
86
+ [247, 247, 247, 255],
87
+ [254, 224, 182, 255],
88
+ [253, 184, 99, 255],
89
+ [224, 130, 20, 255],
90
+ [179, 88, 6, 255],
91
+ [127, 59, 8, 255],
92
+ ];
93
+ const SCHEME_STOPS = {
94
+ viridis: VIRIDIS_STOPS,
95
+ juicebox: JUICEBOX_STOPS,
96
+ fall: FALL_STOPS,
97
+ reds: REDS_STOPS,
98
+ blues: BLUES_STOPS,
99
+ magma: stopsFromHex(MAGMA_HEX_SPEC),
100
+ inferno: stopsFromHex(INFERNO_HEX_SPEC),
101
+ cividis: stopsFromHex(CIVIDIS_HEX_SPEC),
102
+ redblue: REDBLUE_STOPS,
103
+ purpleorange: PURPLEORANGE_STOPS,
104
+ };
105
+ function luminanceOverWhite([r, g, b, a]) {
106
+ const over = (c) => 255 + (c - 255) * (a / 255);
107
+ return 0.2126 * over(r) + 0.7152 * over(g) + 0.0722 * over(b);
108
+ }
109
+ /**
110
+ * #api
111
+ * Whether a named ramp runs dark at its low end, drawn over white: viridis
112
+ * and its siblings do, juicebox, fall, reds and blues do not.
113
+ */
114
+ export function darkAtLowEnd(scheme) {
115
+ const stops = SCHEME_STOPS[scheme];
116
+ return luminanceOverWhite(stops[0]) < luminanceOverWhite(stops.at(-1));
117
+ }
118
+ const EMPTY_EXTENT_DOMAIN = [0, 1];
119
+ /**
120
+ * #api
121
+ * The domain a continuous colour scale spans: each end `min` or `max` pins,
122
+ * else the extent's, ascending, since a span has no direction and `reverse`
123
+ * is the ramp's. An open end stops at a pinned one rather than crossing it,
124
+ * and an extent holding no value (`[Infinity, -Infinity]`) spans [0, 1].
125
+ */
126
+ export function rampDomain(min, max, extent) {
127
+ const [lo, hi] = extent[0] <= extent[1] ? extent : EMPTY_EXTENT_DOMAIN;
128
+ if (min !== undefined && max !== undefined) {
129
+ return min <= max ? [min, max] : [max, min];
130
+ }
131
+ if (min !== undefined) {
132
+ return [min, Math.max(min, hi)];
133
+ }
134
+ if (max !== undefined) {
135
+ return [Math.min(lo, max), max];
136
+ }
137
+ return [lo, hi];
138
+ }
139
+ /**
140
+ * #api
141
+ * The stops a continuous colour scale samples: `range`'s CSS colours where it
142
+ * lists any, else the named `scheme`, viridis while that is unset, turned
143
+ * round under `reverse`.
144
+ */
145
+ export function colorRampStops({ range, scheme, reverse, }) {
146
+ const stops = range?.length
147
+ ? range.map(c => cssColorToRgba(c))
148
+ : SCHEME_STOPS[scheme ?? DEFAULT_COLOR_SCHEME];
149
+ return reverse ? stops.toReversed() : stops;
150
+ }
28
151
  function lerp8(a, b, t) {
29
152
  return Math.round(a * (1 - t) + b * t);
30
153
  }
@@ -54,6 +177,11 @@ export function sampleColorRamp(stops, t) {
54
177
  * texture both GPU backends upload and the Canvas2D twins index — entry `i` is
55
178
  * the color at `t = i / (N - 1)`. N comes off the shader that samples it, so
56
179
  * the table and `rampColor`'s texel mapping cannot disagree.
180
+ *
181
+ * The table is always straight. A diverging ramp whose middle belongs at a
182
+ * value off the centre of the domain reads it through `rampMidT`, the shader's
183
+ * rule and its generated twin, so the middle follows a moving domain without a
184
+ * new table.
57
185
  */
58
186
  export function buildColorRampLut(stops) {
59
187
  const last = COLOR_RAMP_LUT_ENTRIES - 1;
@@ -67,24 +195,47 @@ export function buildColorRampLut(stops) {
67
195
  }
68
196
  return data;
69
197
  }
198
+ const MAX_RAMP_LUTS = 32;
199
+ const luts = new Map();
200
+ /**
201
+ * #api
202
+ * The {@link buildColorRampLut} table a ramp declaration asks for, the same
203
+ * `Uint8Array` for the same declaration, since a GPU backend re-uploads its
204
+ * ramp texture when the identity changes and a render state is rebuilt far
205
+ * more often than its ramp.
206
+ */
207
+ export function rampLutOf(ramp) {
208
+ const key = [ramp.scheme ?? '', ramp.range?.join(' ') ?? '', !!ramp.reverse]
209
+ .map(String)
210
+ .join('|');
211
+ let lut = luts.get(key);
212
+ if (!lut) {
213
+ if (luts.size >= MAX_RAMP_LUTS) {
214
+ luts.delete(luts.keys().next().value);
215
+ }
216
+ lut = buildColorRampLut(colorRampStops(ramp));
217
+ luts.set(key, lut);
218
+ }
219
+ return lut;
220
+ }
70
221
  /**
71
222
  * #api
72
223
  * `n` evenly spaced legend stops read straight out of a
73
224
  * {@link buildColorRampLut} byte table — the same 256×1 RGBA array
74
225
  * `uploadColorRampLut` hands the GPU and the Canvas2D fillStyle LUTs index —
75
- * formatted for `SvgGradientLegend`. It holds one claim by construction: the
76
- * swatch at bar fraction `t` is byte-identical to the ramp entry at `t` on
77
- * both backends. Alpha rides `opacity` (the juicebox fade), never baked into
226
+ * as the stops of a `RampScale`. It holds one claim by construction: the
227
+ * swatch at bar fraction `t` is byte-identical to the ramp entry both backends
228
+ * read at `t`, through the ramp's middle stop at `midNorm` (`rampMidT`). Alpha rides `opacity` (the juicebox fade), never baked into
78
229
  * the color string.
79
230
  */
80
- export function stopsFromRampLut(lut, n) {
231
+ export function stopsFromRampLut(lut, n, midNorm = 0.5) {
81
232
  const lastEntry = lut.length / 4 - 1;
82
233
  const out = [];
83
234
  for (let i = 0; i < n; i++) {
84
235
  const t = n === 1 ? 0 : i / (n - 1);
85
- const o = Math.round(t * lastEntry) * 4;
236
+ const o = Math.round(rampMidT(t, midNorm) * lastEntry) * 4;
86
237
  out.push({
87
- offset: `${+(t * 100).toFixed(2)}%`,
238
+ offset: t,
88
239
  color: `rgb(${lut[o]},${lut[o + 1]},${lut[o + 2]})`,
89
240
  opacity: lut[o + 3] / 255,
90
241
  });
@@ -0,0 +1,156 @@
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 declare const COLOR_SCALES: readonly ['none', 'categorical', 'linear', 'log', 'threshold'];
8
+ /**
9
+ * The scale that maps no field: each feature paints the colour it carries, and
10
+ * the key names the colours `domain` lists. Only a display whose features
11
+ * carry colours of their own declares it.
12
+ */
13
+ export declare const IDENTITY_SCALE = "identity";
14
+ export type ColorScaleName = (typeof COLOR_SCALES)[number] | typeof IDENTITY_SCALE;
15
+ /**
16
+ * A field's defaults on a display: the scale it paints through while `scale`
17
+ * is unset, and the members that scale reads while the config leaves them
18
+ * unwritten, so a field with a vocabulary or ramp of its own is the colour
19
+ * object's defaults rather than a painter beside it.
20
+ */
21
+ export interface FieldPreset<S extends string = ColorScaleName> {
22
+ scale: S;
23
+ /** The key a feature carrying no value files under. */
24
+ missing?: string;
25
+ domain?: readonly string[];
26
+ range?: readonly string[];
27
+ labels?: readonly string[];
28
+ title?: string;
29
+ domainMin?: number;
30
+ domainMax?: number;
31
+ domainMid?: number;
32
+ scheme?: string;
33
+ reverse?: boolean;
34
+ }
35
+ /** Each field's preset, `*` for any other field. */
36
+ export type FieldPresets<S extends string = ColorScaleName> = Readonly<Record<string, FieldPreset<S>>>;
37
+ /**
38
+ * The fields whose values have names, an order and colours of their own on
39
+ * every display, beneath each display's own presets. Red forward and blue
40
+ * reverse is what the synteny ribbons paint too. The SV classes are
41
+ * `svClassOf`'s, deletion red and duplication blue as dbVar and gnomAD-SV
42
+ * paint them, insertion the pileup's purple, and the rest kept apart under
43
+ * deuteranopia and protanopia. A record with no class files under `''`, so
44
+ * each display keeps its own no-value colour for it.
45
+ */
46
+ export declare const UNIVERSAL_FIELD_PRESETS: {
47
+ readonly strand: {
48
+ readonly scale: 'categorical';
49
+ readonly missing: '0';
50
+ readonly domain: readonly ["1", "-1", "0"];
51
+ readonly range: readonly ["tomato", "cornflowerblue", "goldenrod"];
52
+ readonly labels: readonly ["Forward strand", "Reverse strand", "No strand"];
53
+ };
54
+ readonly svType: {
55
+ readonly scale: 'categorical';
56
+ readonly domain: readonly ["DEL", "DUP", "INS", "INV", "CNV", "TR", "BND", "CPX", "OTHER"];
57
+ readonly range: readonly ["#e41a1c", "#377eb8", "#800080", "#ff7f00", "#7e6148", "#e7298a", "#17becf", "#66a61e", "#000000"];
58
+ readonly labels: readonly ["Deletion", "Duplication", "Insertion", "Inversion", "Copy-number variable", "Tandem repeat", "Breakend / translocation", "Complex", "Other / mixed"];
59
+ readonly title: 'SV type';
60
+ };
61
+ };
62
+ /** The universal preset of `field`, if it has one. */
63
+ export declare function universalPresetOf(field: string): FieldPreset<'categorical'> | undefined;
64
+ /** Every field categorical while `scale` is unset, with nothing preset. */
65
+ export declare const CATEGORICAL_FIELD_PRESETS: {
66
+ readonly '*': FieldPreset<"categorical">;
67
+ };
68
+ /**
69
+ * What a feature's field paints through while `scale` is unset: `score` a
70
+ * ramp, any other field categories.
71
+ */
72
+ export declare const FEATURE_FIELD_PRESETS: {
73
+ readonly score: {
74
+ readonly scale: 'linear';
75
+ };
76
+ readonly '*': FieldPreset<"categorical">;
77
+ };
78
+ /**
79
+ * A field's preset under `presets`: its own, else a universal one, else
80
+ * `*`'s, else categorical.
81
+ */
82
+ export declare function presetOf<S extends string>(presets: FieldPresets<S>, field: string): FieldPreset<S | 'categorical'>;
83
+ /** What a field paints through under `presets` while `scale` is unset. */
84
+ export declare function fieldScaleOf<S extends string>(presets: FieldPresets<S>, field: string): S | 'categorical';
85
+ /**
86
+ * A colour object with its field's preset under it: each member the preset
87
+ * names and the config leaves unwritten, an empty list counting as unwritten.
88
+ * Only while the colour paints through the preset's own scale, so the cuts of
89
+ * a threshold preset never reach a field read through a ramp. A categorical
90
+ * preset's `range` and `labels` name its `domain`'s values in order, so they
91
+ * fill only while `domain` does too: a written order keeps each value's own
92
+ * colour and name.
93
+ */
94
+ export declare function withPreset<C extends {
95
+ field?: string;
96
+ scale?: string;
97
+ }>(color: C, presets: FieldPresets<string>): C;
98
+ /**
99
+ * The scale a colour object paints through: `none` while no `field` is
100
+ * named, else its own `scale`, or `fieldScale` where that is unset.
101
+ */
102
+ export declare function paintedScale<S extends string, F extends string>({ scale, field }: {
103
+ scale: S | undefined;
104
+ field: string;
105
+ }, fieldScale: F): S | F | 'none';
106
+ /** A combination of a scale's slots the display cannot draw as written. */
107
+ export interface ScaleProblem {
108
+ rule: 'threshold-cuts' | 'threshold-range' | 'ramp-domain' | 'domain-ends' | 'domain-quantile' | 'labels-domain';
109
+ /** the slot to look at, relative to the scale's own object */
110
+ slot: string;
111
+ message: string;
112
+ }
113
+ /**
114
+ * The members a quantitative scale's ends are read by, as a colour ramp,
115
+ * `scales.y` and a mark's width spell them alike.
116
+ */
117
+ export interface ScaleEnds {
118
+ domainMin?: number;
119
+ domainMax?: number;
120
+ domainQuantile?: number;
121
+ }
122
+ /**
123
+ * What a quantitative scale's ends say together that neither can refuse
124
+ * alone: a `domainMax` below its `domainMin`, which every such scale draws in
125
+ * order either way, and a `domainQuantile` outside 0.5 to 1, where the quantile
126
+ * an open end follows is clamped. `reverse` is whether the scale turns round by
127
+ * a member of its own, which is then the spelling to point at.
128
+ */
129
+ export declare function scaleEndProblems({ domainMin, domainMax, domainQuantile }: ScaleEnds, { reverse }?: {
130
+ reverse?: boolean;
131
+ }): ScaleProblem[];
132
+ /** Problems as the lines a display's corner notice lists, under the setting that holds the scale. */
133
+ export declare function noticeLines(setting: string, problems: readonly ScaleProblem[]): string[];
134
+ /** The slots `colorProblems` reads, as a snapshot or a resolved setting holds them. */
135
+ export interface ColorSlots {
136
+ value?: string;
137
+ field?: string;
138
+ scale?: string;
139
+ domain?: readonly unknown[];
140
+ range?: readonly unknown[];
141
+ domainMin?: number;
142
+ domainMax?: number;
143
+ domainQuantile?: number;
144
+ labels?: readonly unknown[];
145
+ }
146
+ /**
147
+ * What a colour object's slots say together that no single slot can refuse,
148
+ * since the config editor writes one slot at a time (ADR-133), read with its
149
+ * field's preset under it. A display shows these as a notice and draws what
150
+ * it can. A threshold naming no cuts leaves its intervals to the display —
151
+ * the alignments insert-size band samples its cuts, the wiggle plot cuts at
152
+ * its origin — so its `labels` go uncounted.
153
+ */
154
+ export declare function colorProblems(written: ColorSlots, presets: FieldPresets<string>): ScaleProblem[];
155
+ /** `colorProblems` as the lines a display's corner notice lists, under `color`. */
156
+ export declare function colorNotices(color: ColorSlots, presets: FieldPresets<string>): string[];