@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,437 @@
1
+ // The `cells` step: each row's runs against the reference it was fanned out
2
+ // of, and the texts its walk reads, which the fused identity kernel in
3
+ // cellMatches.ts walks too. Imported by relative path only.
4
+ import { DerivedTable, numberReaderOf, readerOf, valueAt, } from './featureTable.js';
5
+ import { FannedTable, boundsThrough } from './stepTables.js';
6
+ export const DEFAULT_CELLS_FIELD = 'seq';
7
+ export const DASH = 45;
8
+ export const SPACE = 32;
9
+ const LOWER_BIT = 0x20;
10
+ const CELL_STATES = ['match', 'mismatch', 'gap', 'insertion'];
11
+ export const MATCH = 0;
12
+ export const MISMATCH = 1;
13
+ const GAP = 2;
14
+ const INSERTION = 3;
15
+ export const NO_STATE = 255;
16
+ export function isGapByte(b) {
17
+ return b === DASH || b === SPACE;
18
+ }
19
+ // The columns carrying the row's own sequence: a gap run reaching either end
20
+ // of the row measures where the block was cut, not the alignment, so it is no
21
+ // cell either.
22
+ export function firstDrawn(bytes, at, len) {
23
+ let first = 0;
24
+ while (first < len && isGapByte(bytes[at + first])) {
25
+ first++;
26
+ }
27
+ return first;
28
+ }
29
+ export function lastDrawn(bytes, at, len, first) {
30
+ let last = len - 1;
31
+ while (last > first && isGapByte(bytes[at + last])) {
32
+ last--;
33
+ }
34
+ return last;
35
+ }
36
+ // A reference base's cell: no state outside the drawn columns, else the row's
37
+ // gap, or its base matched or not regardless of case.
38
+ export function cellState(refByte, rowByte, drawn) {
39
+ return !drawn
40
+ ? NO_STATE
41
+ : isGapByte(rowByte)
42
+ ? GAP
43
+ : (refByte | LOWER_BIT) === (rowByte | LOWER_BIT)
44
+ ? MATCH
45
+ : MISMATCH;
46
+ }
47
+ // The row a cell step reads against: past any table that only reordered or
48
+ // annotated the rows, the one they were fanned out of.
49
+ function containerOf(table) {
50
+ let at = table;
51
+ let toBase;
52
+ while (at instanceof DerivedTable && !at.madeFrom) {
53
+ toBase = at.parentRow ? compose(toBase, at.parentRow) : toBase;
54
+ at = at.parent;
55
+ }
56
+ if (!(at instanceof DerivedTable)) {
57
+ return undefined;
58
+ }
59
+ return {
60
+ made: at,
61
+ toMade: toBase,
62
+ table: at.parent,
63
+ row: at.parentRow ? compose(toBase, at.parentRow) : toBase,
64
+ };
65
+ }
66
+ function compose(outer, inner) {
67
+ if (!outer) {
68
+ return inner;
69
+ }
70
+ const out = new Uint32Array(outer.length);
71
+ for (let i = 0; i < outer.length; i++) {
72
+ out[i] = inner[outer[i]];
73
+ }
74
+ return out;
75
+ }
76
+ // Below this length a character loop copies a string faster than
77
+ // `encodeInto`, as the MAF packer measured.
78
+ const ASCII_COPY_MAX_LENGTH = 64;
79
+ const encoder = new TextEncoder();
80
+ // A column's text as bytes, one per character: an adapter's own, or the
81
+ // strings a feature holds copied into one buffer.
82
+ function textOf(column, n) {
83
+ if (column.kind === 'text') {
84
+ return column;
85
+ }
86
+ const read = readerOf(column);
87
+ const texts = new Array(n);
88
+ let total = 0;
89
+ for (let i = 0; i < n; i++) {
90
+ const v = read(i);
91
+ if (typeof v === 'string') {
92
+ texts[i] = v;
93
+ total += v.length;
94
+ }
95
+ }
96
+ const bytes = new Uint8Array(total);
97
+ const offset = new Uint32Array(n);
98
+ const length = new Uint32Array(n);
99
+ let pos = 0;
100
+ for (let i = 0; i < n; i++) {
101
+ const text = texts[i];
102
+ if (text === undefined) {
103
+ continue;
104
+ }
105
+ offset[i] = pos;
106
+ if (text.length <= ASCII_COPY_MAX_LENGTH) {
107
+ for (let c = 0; c < text.length; c++) {
108
+ bytes[pos + c] = text.charCodeAt(c);
109
+ }
110
+ length[i] = text.length;
111
+ }
112
+ else {
113
+ length[i] = encoder.encodeInto(text, bytes.subarray(pos, pos + text.length)).written;
114
+ }
115
+ pos += text.length;
116
+ }
117
+ return { kind: 'text', bytes, offset, length, at: undefined };
118
+ }
119
+ /**
120
+ * The texts a `cells` walk reads, by the row of the table it walked: each
121
+ * row's own, and the reference it is read against, which a row fanned out of
122
+ * a container reads off the container.
123
+ */
124
+ class WalkedTexts {
125
+ row;
126
+ reference;
127
+ refRow;
128
+ constructor(row, ref, refRow) {
129
+ this.row = row;
130
+ this.reference = ref;
131
+ this.refRow = refRow;
132
+ }
133
+ rowOf(r) {
134
+ const { at } = this.row;
135
+ return at ? at[r] : r;
136
+ }
137
+ refOf(r) {
138
+ const p = this.refRow ? this.refRow[r] : r;
139
+ const { at } = this.reference;
140
+ return at ? at[p] : p;
141
+ }
142
+ }
143
+ export function walkedTexts(table, field) {
144
+ const row = textOf(table.column(field), table.length);
145
+ const container = containerOf(table);
146
+ const made = container?.made;
147
+ if (container && !(made instanceof FannedTable && made.hasKept)) {
148
+ const { table: base } = container;
149
+ return new WalkedTexts(row, textOf(base.column(field), base.length), container.row);
150
+ }
151
+ // A container a flatten kept with nothing to fan out is the row itself, so
152
+ // its reference is its own container's, as its `parent()` says.
153
+ const byParent = (r) => table.row(r).parent?.()?.get(field);
154
+ const readContainer = container
155
+ ? readerOf(container.table.column(field))
156
+ : undefined;
157
+ const read = readContainer && made instanceof FannedTable
158
+ ? (r) => {
159
+ const { toMade, row: refRow } = container;
160
+ return made.isKept(toMade ? toMade[r] : r)
161
+ ? byParent(r)
162
+ : readContainer(refRow ? refRow[r] : r);
163
+ }
164
+ : byParent;
165
+ return new WalkedTexts(row, textOf({ kind: 'value', read }, table.length));
166
+ }
167
+ /**
168
+ * The runs a `cells` step answers, one per stretch of one state against the
169
+ * reference, typed: each run's span, its state and the text column it starts
170
+ * at, with `base`, `match` and `length` read back out of the texts when asked
171
+ * for.
172
+ */
173
+ class CellTable extends DerivedTable {
174
+ start;
175
+ end;
176
+ state;
177
+ textAt;
178
+ texts;
179
+ firstOfRow;
180
+ derived = new Map();
181
+ constructor(parent, parentRow, lanes, texts) {
182
+ super(parent, parentRow);
183
+ this.start = lanes.start;
184
+ this.end = lanes.end;
185
+ this.state = lanes.state;
186
+ this.textAt = lanes.textAt;
187
+ this.texts = texts;
188
+ }
189
+ get madeFrom() {
190
+ return true;
191
+ }
192
+ laneOf(name, build) {
193
+ let column = this.derived.get(name);
194
+ if (!column) {
195
+ column = build();
196
+ this.derived.set(name, column);
197
+ }
198
+ return column;
199
+ }
200
+ own(name) {
201
+ switch (name) {
202
+ case 'start': {
203
+ return { kind: 'number', values: this.start, at: undefined };
204
+ }
205
+ case 'end': {
206
+ return { kind: 'number', values: this.end, at: undefined };
207
+ }
208
+ case 'state': {
209
+ return {
210
+ kind: 'category',
211
+ codes: this.state,
212
+ labels: CELL_STATES,
213
+ at: undefined,
214
+ };
215
+ }
216
+ case 'match': {
217
+ return this.laneOf(name, () => {
218
+ const values = new Float32Array(this.length);
219
+ for (let i = 0; i < this.length; i++) {
220
+ const s = this.state[i];
221
+ values[i] = s === MATCH ? 1 : s === MISMATCH ? 0 : Number.NaN;
222
+ }
223
+ return { kind: 'number', values, at: undefined, nanIsAbsent: true };
224
+ });
225
+ }
226
+ case 'length': {
227
+ return this.laneOf(name, () => {
228
+ const values = new Float32Array(this.length).fill(Number.NaN);
229
+ for (let i = 0; i < this.length; i++) {
230
+ if (this.state[i] === INSERTION) {
231
+ values[i] = this.inserted(i).length;
232
+ }
233
+ }
234
+ return { kind: 'number', values, at: undefined, nanIsAbsent: true };
235
+ });
236
+ }
237
+ case 'base': {
238
+ return this.laneOf(name, () => {
239
+ const values = new Array(this.length);
240
+ for (let i = 0; i < this.length; i++) {
241
+ const s = this.state[i];
242
+ values[i] =
243
+ s === MISMATCH
244
+ ? this.mismatched(i)
245
+ : s === INSERTION
246
+ ? this.inserted(i)
247
+ : undefined;
248
+ }
249
+ return { kind: 'value', read: i => values[i] };
250
+ });
251
+ }
252
+ default: {
253
+ return undefined;
254
+ }
255
+ }
256
+ }
257
+ mismatched(i) {
258
+ const { bytes, offset } = this.texts.row;
259
+ const k = this.texts.rowOf(this.parentOf(i));
260
+ return String.fromCharCode(bytes[offset[k] + this.textAt[i]]);
261
+ }
262
+ // The bases a row holds where the reference has none, from the column the
263
+ // insertion starts at to the reference's next base.
264
+ inserted(i) {
265
+ const { row, reference: ref } = this.texts;
266
+ const r = this.parentOf(i);
267
+ const k = this.texts.rowOf(r);
268
+ const f = this.texts.refOf(r);
269
+ const rowAt = row.offset[k];
270
+ const refAt = ref.offset[f];
271
+ const end = Math.min(row.length[k], ref.length[f]);
272
+ let out = '';
273
+ for (let col = this.textAt[i]; col < end && ref.bytes[refAt + col] === DASH; col++) {
274
+ const b = row.bytes[rowAt + col];
275
+ if (!isGapByte(b)) {
276
+ out += String.fromCharCode(b);
277
+ }
278
+ }
279
+ return out;
280
+ }
281
+ id(i) {
282
+ const p = this.parentOf(i);
283
+ this.firstOfRow ??= firstRowIndex(this.parentRow, this.parent.length);
284
+ return `${this.parent.row(p).id()}#${i - this.firstOfRow[p]}`;
285
+ }
286
+ json(i) {
287
+ const out = {
288
+ ...this.parent.row(this.parentOf(i)).toJSON(),
289
+ start: this.start[i],
290
+ end: this.end[i],
291
+ state: CELL_STATES[this.state[i]],
292
+ };
293
+ for (const name of ['base', 'match', 'length']) {
294
+ const v = valueAt(this.column(name), i);
295
+ if (v !== undefined) {
296
+ out[name] = v;
297
+ }
298
+ }
299
+ return out;
300
+ }
301
+ }
302
+ // The lanes a `cells` walk writes, doubled as a row would overrun them.
303
+ class RunLanes {
304
+ start;
305
+ end;
306
+ state;
307
+ textAt;
308
+ parentRow;
309
+ length = 0;
310
+ constructor(capacity) {
311
+ this.start = new Uint32Array(capacity);
312
+ this.end = new Uint32Array(capacity);
313
+ this.state = new Uint8Array(capacity);
314
+ this.textAt = new Uint32Array(capacity);
315
+ this.parentRow = new Uint32Array(capacity);
316
+ }
317
+ reserve(more) {
318
+ const need = this.length + more;
319
+ if (need <= this.start.length) {
320
+ return;
321
+ }
322
+ const size = Math.max(this.start.length * 2, need);
323
+ const widen = (a) => {
324
+ const next = new a.constructor(size);
325
+ next.set(a);
326
+ return next;
327
+ };
328
+ this.start = widen(this.start);
329
+ this.end = widen(this.end);
330
+ this.state = widen(this.state);
331
+ this.textAt = widen(this.textAt);
332
+ this.parentRow = widen(this.parentRow);
333
+ }
334
+ // One row's runs against its reference: a run per column is the most it
335
+ // can answer, so the lanes grow once and the walk writes through locals.
336
+ walk(r, startPos, rowBytes, rowAt, rowLen, refBytes, refAt, refLen) {
337
+ this.reserve(refLen + 1);
338
+ const { start, end, state, textAt, parentRow } = this;
339
+ let n = this.length;
340
+ let pos = startPos;
341
+ const first = firstDrawn(rowBytes, rowAt, rowLen);
342
+ const last = lastDrawn(rowBytes, rowAt, rowLen, first);
343
+ let runStart = -1;
344
+ let runState = NO_STATE;
345
+ let runBase = -1;
346
+ let runCol = 0;
347
+ let insertAt = -1;
348
+ for (let col = 0; col < refLen; col++) {
349
+ const refByte = refBytes[refAt + col];
350
+ const rowByte = col < rowLen ? rowBytes[rowAt + col] : SPACE;
351
+ if (refByte === DASH) {
352
+ if (insertAt < 0 && col < rowLen && !isGapByte(rowByte)) {
353
+ insertAt = col;
354
+ }
355
+ continue;
356
+ }
357
+ if (insertAt >= 0) {
358
+ start[n] = pos;
359
+ end[n] = pos;
360
+ state[n] = INSERTION;
361
+ textAt[n] = insertAt;
362
+ parentRow[n] = r;
363
+ n++;
364
+ insertAt = -1;
365
+ }
366
+ const st = cellState(refByte, rowByte, col >= first && col <= last && col < rowLen);
367
+ const base = st === MISMATCH ? rowByte : -1;
368
+ if (st !== runState || base !== runBase) {
369
+ if (runStart >= 0) {
370
+ start[n] = runStart;
371
+ end[n] = pos;
372
+ state[n] = runState;
373
+ textAt[n] = runCol;
374
+ parentRow[n] = r;
375
+ n++;
376
+ }
377
+ runStart = st === NO_STATE ? -1 : pos;
378
+ runState = st;
379
+ runBase = base;
380
+ runCol = col;
381
+ }
382
+ pos++;
383
+ }
384
+ if (runStart >= 0) {
385
+ start[n] = runStart;
386
+ end[n] = pos;
387
+ state[n] = runState;
388
+ textAt[n] = runCol;
389
+ parentRow[n] = r;
390
+ n++;
391
+ }
392
+ this.length = n;
393
+ }
394
+ }
395
+ // Where each parent row's children start, for children written parent by
396
+ // parent in order.
397
+ function firstRowIndex(parentRow, parents) {
398
+ const first = new Uint32Array(parents);
399
+ for (let i = parentRow.length - 1; i >= 0; i--) {
400
+ first[parentRow[i]] = i;
401
+ }
402
+ return first;
403
+ }
404
+ export function cells({ table, bounds }, step) {
405
+ const { field = DEFAULT_CELLS_FIELD } = step;
406
+ const texts = walkedTexts(table, field);
407
+ const readStart = numberReaderOf(table.column('start'));
408
+ const { bytes: rowBytes, offset: rowOffset, length: rowLength } = texts.row;
409
+ const { bytes: refBytes, offset: refOffset, length: refLength, } = texts.reference;
410
+ // A run per reference base is the most a row can answer and far past what
411
+ // one does, so the lanes start at an eighth of it.
412
+ let bound = 0;
413
+ for (let r = 0; r < table.length; r++) {
414
+ bound += refLength[texts.refOf(r)] + 1;
415
+ }
416
+ const lanes = new RunLanes(Math.max(1024, bound >>> 3));
417
+ for (let r = 0; r < table.length; r++) {
418
+ const f = texts.refOf(r);
419
+ const refLen = refLength[f];
420
+ const pos = readStart(r);
421
+ if (refLen > 0 && pos >= 0) {
422
+ const k = texts.rowOf(r);
423
+ lanes.walk(r, pos, rowBytes, rowOffset[k], rowLength[k], refBytes, refOffset[f], refLen);
424
+ }
425
+ }
426
+ const n = lanes.length;
427
+ const rows = lanes.parentRow.subarray(0, n);
428
+ return {
429
+ table: new CellTable(table, rows, {
430
+ start: lanes.start.subarray(0, n),
431
+ end: lanes.end.subarray(0, n),
432
+ state: lanes.state.subarray(0, n),
433
+ textAt: lanes.textAt.subarray(0, n),
434
+ }, texts),
435
+ bounds: boundsThrough(bounds, rows),
436
+ };
437
+ }
@@ -24,3 +24,20 @@ export declare function clampToContig(assembly: Assembly, region: {
24
24
  start: number;
25
25
  end: number;
26
26
  }): Region | undefined;
27
+ /**
28
+ * `clampToContig` for a refName that may not be on the assembly at all, which
29
+ * is the shape a location nobody requested arrives in — a BAM's `nextRef`, an
30
+ * SA record's contig (REFNAME_NAMESPACES.md). `clampToContig` alone passes an
31
+ * unknown name through with nothing to clamp against, so it cannot tell "past
32
+ * the end of a contig we have" from "a contig we do not have", and both callers
33
+ * need that apart to say which happened.
34
+ */
35
+ export declare function clampToListedContig(assembly: Assembly, region: {
36
+ refName: string;
37
+ start: number;
38
+ end: number;
39
+ }): {
40
+ refName: string;
41
+ onAssembly: boolean;
42
+ region: Region | undefined;
43
+ };
@@ -26,3 +26,22 @@ export function clampToContig(assembly, region) {
26
26
  ? { ...region, assemblyName: assembly.name, refName, start, end }
27
27
  : undefined;
28
28
  }
29
+ /**
30
+ * `clampToContig` for a refName that may not be on the assembly at all, which
31
+ * is the shape a location nobody requested arrives in — a BAM's `nextRef`, an
32
+ * SA record's contig (REFNAME_NAMESPACES.md). `clampToContig` alone passes an
33
+ * unknown name through with nothing to clamp against, so it cannot tell "past
34
+ * the end of a contig we have" from "a contig we do not have", and both callers
35
+ * need that apart to say which happened.
36
+ */
37
+ export function clampToListedContig(assembly, region) {
38
+ const refName = assembly.getCanonicalRefName2(region.refName);
39
+ const onAssembly = assembly.getRegionForRefName(refName) !== undefined;
40
+ return {
41
+ refName,
42
+ onAssembly,
43
+ region: onAssembly
44
+ ? clampToContig(assembly, { ...region, refName })
45
+ : undefined,
46
+ };
47
+ }
@@ -1,5 +1,4 @@
1
- // not a sanitizer, this just removes html tags for use in measureText-based
2
- // element width calculations
1
+ // not a sanitizer, this just removes html tags where only the text is shown
3
2
  export function coarseStripHTML(s) {
4
3
  return s.replaceAll(/<[^<>]*>/g, '');
5
4
  }
@@ -1,2 +1,3 @@
1
1
  export declare function namedColorToHex(name: string): string | undefined;
2
2
  export declare function isNamedColor(name: string): boolean;
3
+ export declare const CSS_COLOR_NAMES: readonly string[];
@@ -158,3 +158,4 @@ export function namedColorToHex(name) {
158
158
  export function isNamedColor(name) {
159
159
  return Object.hasOwn(colors, name);
160
160
  }
161
+ export const CSS_COLOR_NAMES = Object.keys(colors);
@@ -20,7 +20,9 @@ export declare function emphasize(color: string, coefficient?: number): string;
20
20
  * default refName colors.
21
21
  */
22
22
  export declare function makeContrasting(foreground: string, background?: string, minContrastRatio?: number): string;
23
- export { isNamedColor, namedColorToHex } from './cssColorsLevel4.ts';
23
+ export { CSS_COLOR_NAMES, isNamedColor, namedColorToHex, } from './cssColorsLevel4.ts';
24
+ export declare const NO_CATEGORY_COLOR = "#afafaf";
25
+ export declare const MISCONFIGURED_COLOR = "#808080";
24
26
  /**
25
27
  * #api
26
28
  * Move a color's OKLCH lightness by `lightnessShift` and scale its chroma,
@@ -69,8 +71,8 @@ export declare function relight(color: string, lightnessShift: number, chromaSca
69
71
  *
70
72
  * A value that is absent gets NO_CATEGORY_COLOR rather than a hue, and that is
71
73
  * the difference between this being usable on real data and not. The everyday
72
- * caller is the Color-by-attribute dialog, which writes
73
- * `jexl:randomColor(get(feature,'<attr>'))` over a whole track — and most files
74
+ * caller is a `jexl:randomColor(get(feature,'<attr>'))` color slot over a
75
+ * whole track — and most files
74
76
  * have the attribute on some features and not others, so most of the time this
75
77
  * is handed `undefined`. It used to throw on that (`str.length` of undefined),
76
78
  * once per feature, and what a reader saw was every unlabelled feature in one
@@ -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 [