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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. package/README.md +1476 -265
  2. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
  3. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -3
  4. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
  5. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
  6. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
  7. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
  8. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +16 -9
  9. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
  10. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
  11. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
  12. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
  13. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
  14. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
  15. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
  16. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
  17. package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
  18. package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
  19. package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
  20. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
  21. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
  22. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
  23. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
  24. package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
  25. package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +50 -0
  26. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
  27. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
  28. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
  29. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
  30. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
  31. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
  32. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
  33. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
  34. package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
  35. package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
  36. package/esm/BaseFeatureWidget/formatDetails.js +62 -83
  37. package/esm/BaseFeatureWidget/index.d.ts +2 -1
  38. package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
  39. package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
  40. package/esm/BaseFeatureWidget/types.d.ts +12 -6
  41. package/esm/BaseFeatureWidget/util.d.ts +0 -10
  42. package/esm/BaseFeatureWidget/util.js +0 -17
  43. package/esm/CorePlugin.js +2 -2
  44. package/esm/PluginLoader.d.ts +24 -13
  45. package/esm/PluginLoader.js +167 -51
  46. package/esm/PluginManager.d.ts +130 -24
  47. package/esm/PluginManager.js +180 -32
  48. package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
  49. package/esm/ReExports/MuiDataGridReExports.js +2 -2
  50. package/esm/ReExports/coreModules.generated.d.ts +2 -0
  51. package/esm/ReExports/coreModules.generated.js +528 -0
  52. package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
  53. package/esm/ReExports/coreWorkerModules.generated.js +488 -0
  54. package/esm/ReExports/frameworkModules.d.ts +2 -0
  55. package/esm/ReExports/frameworkModules.js +68 -0
  56. package/esm/ReExports/frameworkShared.d.ts +12 -0
  57. package/esm/ReExports/frameworkShared.js +16 -0
  58. package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
  59. package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
  60. package/esm/ReExports/list.js +527 -79
  61. package/esm/ReExports/modules.d.ts +1 -1
  62. package/esm/ReExports/modules.js +10 -165
  63. package/esm/ReExports/registry.d.ts +1 -0
  64. package/esm/ReExports/registry.js +23 -5
  65. package/esm/ReExports/uiStub.d.ts +3 -0
  66. package/esm/ReExports/uiStub.js +33 -0
  67. package/esm/ReExports/workerModules.d.ts +2 -0
  68. package/esm/ReExports/workerModules.js +11 -0
  69. package/esm/TextSearch/TextSearchManager.d.ts +27 -13
  70. package/esm/TextSearch/TextSearchManager.js +77 -36
  71. package/esm/TextSearch/places.d.ts +12 -0
  72. package/esm/TextSearch/places.js +94 -0
  73. package/esm/assemblyManager/assembly.d.ts +21 -19
  74. package/esm/assemblyManager/assembly.js +28 -26
  75. package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
  76. package/esm/assemblyManager/assemblyAdapters.js +8 -2
  77. package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
  78. package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
  79. package/esm/assemblyManager/assemblyManager.d.ts +35 -180
  80. package/esm/assemblyManager/assemblyManager.js +47 -51
  81. package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
  82. package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
  83. package/esm/assemblyManager/geneticCodes.js +2 -5
  84. package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
  85. package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
  86. package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
  87. package/esm/assemblyManager/indexAssemblyNames.js +22 -0
  88. package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
  89. package/esm/assemblyManager/loadRefNameMap.js +4 -9
  90. package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
  91. package/esm/assemblyManager/refNameMapKey.js +12 -0
  92. package/esm/checkPlugins.d.ts +2 -0
  93. package/esm/checkPlugins.js +38 -17
  94. package/esm/configuration/bamIndexFields.d.ts +49 -0
  95. package/esm/configuration/bamIndexFields.js +41 -0
  96. package/esm/configuration/configurationSchema.d.ts +101 -71
  97. package/esm/configuration/configurationSchema.js +207 -134
  98. package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
  99. package/esm/configuration/configurationSchemaUnion.js +56 -0
  100. package/esm/configuration/configurationSlot.d.ts +150 -60
  101. package/esm/configuration/configurationSlot.js +103 -75
  102. package/esm/configuration/fillLocations.d.ts +14 -0
  103. package/esm/configuration/fillLocations.js +14 -0
  104. package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
  105. package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
  106. package/esm/configuration/formatDetailsConfigSchema.js +10 -13
  107. package/esm/configuration/fullConfSnapshot.d.ts +4 -19
  108. package/esm/configuration/fullConfSnapshot.js +30 -52
  109. package/esm/configuration/getConf.d.ts +45 -41
  110. package/esm/configuration/getConf.js +111 -44
  111. package/esm/configuration/index.d.ts +24 -11
  112. package/esm/configuration/index.js +15 -7
  113. package/esm/configuration/indexType.d.ts +26 -0
  114. package/esm/configuration/indexType.js +38 -0
  115. package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
  116. package/esm/configuration/mergeFormatCallbacks.js +13 -10
  117. package/esm/configuration/readConfObject.d.ts +2 -24
  118. package/esm/configuration/readConfObject.js +20 -63
  119. package/esm/configuration/requirements.d.ts +37 -0
  120. package/esm/configuration/requirements.js +88 -0
  121. package/esm/configuration/schemaRegistry.d.ts +32 -15
  122. package/esm/configuration/schemaRegistry.js +33 -35
  123. package/esm/configuration/schemaTypes.d.ts +21 -5
  124. package/esm/configuration/schemaTypes.js +66 -55
  125. package/esm/configuration/slotFacade.d.ts +12 -29
  126. package/esm/configuration/slotFacade.js +44 -23
  127. package/esm/configuration/snapshotPreprocess.d.ts +43 -0
  128. package/esm/configuration/snapshotPreprocess.js +161 -0
  129. package/esm/configuration/tabixIndexFields.d.ts +30 -4
  130. package/esm/configuration/tabixIndexFields.js +21 -4
  131. package/esm/configuration/tabixShorthand.d.ts +34 -17
  132. package/esm/configuration/tabixShorthand.js +49 -22
  133. package/esm/configuration/types.d.ts +182 -43
  134. package/esm/configuration/uriShorthand.d.ts +9 -0
  135. package/esm/configuration/uriShorthand.js +16 -0
  136. package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
  137. package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
  138. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
  139. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
  140. package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
  141. package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
  142. package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
  143. package/esm/data_adapters/BaseAdapter/index.js +1 -0
  144. package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
  145. package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
  146. package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
  147. package/esm/data_adapters/BaseAdapter/stats.js +52 -13
  148. package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
  149. package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
  150. package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
  151. package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
  152. package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
  153. package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
  154. package/esm/data_adapters/dataAdapterCache.js +44 -10
  155. package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
  156. package/esm/data_adapters/getFeatureAdapter.js +8 -8
  157. package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
  158. package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
  159. package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
  160. package/esm/pluggableElementTypes/AdapterType.js +1 -1
  161. package/esm/pluggableElementTypes/DisplayType.d.ts +46 -16
  162. package/esm/pluggableElementTypes/DisplayType.js +22 -12
  163. package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
  164. package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
  165. package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
  166. package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
  167. package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
  168. package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
  169. package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
  170. package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
  171. package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
  172. package/esm/pluggableElementTypes/ViewType.js +32 -4
  173. package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
  174. package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
  175. package/esm/pluggableElementTypes/extendElementType.js +9 -5
  176. package/esm/pluggableElementTypes/index.d.ts +2 -1
  177. package/esm/pluggableElementTypes/index.js +1 -1
  178. package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
  179. package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +65 -27
  180. package/esm/pluggableElementTypes/models/BaseDisplayModel.js +72 -10
  181. package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
  182. package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
  183. package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +85 -16
  184. package/esm/pluggableElementTypes/models/BaseViewModel.js +53 -10
  185. package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
  186. package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
  187. package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
  188. package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
  189. package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
  190. package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
  191. package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
  192. package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
  193. package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
  194. package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
  195. package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
  196. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
  197. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
  198. package/esm/pluggableElementTypes/models/index.d.ts +2 -3
  199. package/esm/pluggableElementTypes/models/index.js +2 -3
  200. package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
  201. package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
  202. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
  203. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
  204. package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
  205. package/esm/pluginDefinitions.d.ts +34 -7
  206. package/esm/pluginDefinitions.js +54 -20
  207. package/esm/rpc/BaseRpcDriver.d.ts +2 -2
  208. package/esm/rpc/BaseRpcDriver.js +25 -30
  209. package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
  210. package/esm/rpc/MainThreadRpcDriver.js +13 -8
  211. package/esm/rpc/RpcClient.d.ts +18 -6
  212. package/esm/rpc/RpcClient.js +51 -16
  213. package/esm/rpc/RpcManager.d.ts +14 -10
  214. package/esm/rpc/RpcManager.js +11 -1
  215. package/esm/rpc/RpcRegistry.d.ts +40 -7
  216. package/esm/rpc/RpcServer.d.ts +3 -1
  217. package/esm/rpc/RpcServer.js +19 -12
  218. package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
  219. package/esm/rpc/WebWorkerRpcDriver.js +64 -68
  220. package/esm/rpc/byteBudget.d.ts +20 -5
  221. package/esm/rpc/byteBudget.js +16 -5
  222. package/esm/rpc/configSchema.d.ts +7 -21
  223. package/esm/rpc/coreRpcMethods.d.ts +4 -0
  224. package/esm/rpc/coreRpcMethods.js +4 -0
  225. package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
  226. package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
  227. package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
  228. package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
  229. package/esm/rpc/methods/CoreGetExportData.js +3 -4
  230. package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
  231. package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
  232. package/esm/rpc/methods/CoreGetFeatures.js +3 -5
  233. package/esm/rpc/methods/CoreGetRefNames.js +2 -12
  234. package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
  235. package/esm/rpc/methods/CoreGetSequence.js +2 -2
  236. package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
  237. package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
  238. package/esm/rpc/methods/layerFeatures.d.ts +33 -0
  239. package/esm/rpc/methods/layerFeatures.js +29 -0
  240. package/esm/svg/SvgExport.js +6 -7
  241. package/esm/svg/SvgThemeProviders.d.ts +12 -0
  242. package/esm/svg/SvgThemeProviders.js +15 -0
  243. package/esm/svg/exportViewSvg.d.ts +28 -0
  244. package/esm/svg/exportViewSvg.js +13 -0
  245. package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
  246. package/esm/svg/normalizeSvgMarkup.js +99 -0
  247. package/esm/svg/serializeSvg.d.ts +7 -0
  248. package/esm/svg/serializeSvg.js +11 -0
  249. package/esm/svg/svgId.d.ts +1 -1
  250. package/esm/svg/svgId.js +1 -1
  251. package/esm/svg/svgReady.d.ts +9 -7
  252. package/esm/svg/svgReady.js +8 -7
  253. package/esm/svg/trackNames.d.ts +7 -5
  254. package/esm/svg/trackNames.js +12 -9
  255. package/esm/svg/wrapSvgExport.js +6 -74
  256. package/esm/ui/AddCustomPluginDialog.js +3 -8
  257. package/esm/ui/AppReadyMarker.d.ts +45 -0
  258. package/esm/ui/AppReadyMarker.js +89 -0
  259. package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
  260. package/esm/ui/CascadingMenu.js +181 -104
  261. package/esm/ui/DropDownMenu.js +2 -1
  262. package/esm/ui/ErrorBanner.js +1 -1
  263. package/esm/ui/ErrorBoundary.d.ts +2 -2
  264. package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
  265. package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
  266. package/esm/ui/ExportSvgDialog.d.ts +1 -1
  267. package/esm/ui/FileDropZone.js +2 -1
  268. package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
  269. package/esm/ui/HoverMenu.d.ts +1 -2
  270. package/esm/ui/HoverMenu.js +6 -3
  271. package/esm/ui/JexlFilterDialog.d.ts +13 -10
  272. package/esm/ui/JexlFilterDialog.js +122 -49
  273. package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
  274. package/esm/ui/JexlFilterRowEditors.js +90 -0
  275. package/esm/ui/LazyBaseTooltip.d.ts +4 -0
  276. package/esm/ui/LazyBaseTooltip.js +9 -0
  277. package/esm/ui/LegendSwatchGlyph.js +26 -21
  278. package/esm/ui/LoadingOverlay.d.ts +14 -0
  279. package/esm/ui/LoadingOverlay.js +4 -2
  280. package/esm/ui/MenuTypes.d.ts +23 -53
  281. package/esm/ui/MenuTypes.js +3 -0
  282. package/esm/ui/MonospaceTextField.d.ts +2 -1
  283. package/esm/ui/MonospaceTextField.js +23 -20
  284. package/esm/ui/PaletteContext.d.ts +10 -5
  285. package/esm/ui/PaletteContext.js +44 -6
  286. package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
  287. package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
  288. package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
  289. package/esm/ui/RefNameAutocomplete/index.js +8 -2
  290. package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
  291. package/esm/ui/RefNameAutocomplete/util.js +42 -1
  292. package/esm/ui/ResizeHandle.d.ts +3 -1
  293. package/esm/ui/ResizeHandle.js +44 -11
  294. package/esm/ui/ScrollChrome.d.ts +13 -0
  295. package/esm/ui/ScrollChrome.js +11 -0
  296. package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
  297. package/esm/ui/ScrollEdgeShadow.js +14 -35
  298. package/esm/ui/ScrollZoomToggle.d.ts +4 -27
  299. package/esm/ui/ScrollZoomToggle.js +34 -51
  300. package/esm/ui/SessionJsonPanel.d.ts +3 -0
  301. package/esm/ui/SessionJsonPanel.js +14 -0
  302. package/esm/ui/SettingsChangesTable.d.ts +1 -0
  303. package/esm/ui/SettingsChangesTable.js +49 -11
  304. package/esm/ui/ShareLinkField.d.ts +1 -3
  305. package/esm/ui/ShareLinkField.js +13 -40
  306. package/esm/ui/SizeSliderRow.d.ts +1 -3
  307. package/esm/ui/SizeSliderRow.js +4 -6
  308. package/esm/ui/SnackbarModel.js +79 -67
  309. package/esm/ui/StatusProgressBar.js +2 -2
  310. package/esm/ui/SvgColorLegend.d.ts +9 -4
  311. package/esm/ui/SvgColorLegend.js +82 -41
  312. package/esm/ui/VerticalScrollbar.d.ts +13 -34
  313. package/esm/ui/VerticalScrollbar.js +29 -83
  314. package/esm/ui/ViewLoadingScreen.d.ts +5 -4
  315. package/esm/ui/ViewLoadingScreen.js +8 -32
  316. package/esm/ui/colorScale.d.ts +92 -0
  317. package/esm/ui/colorScale.js +72 -0
  318. package/esm/ui/colors.d.ts +64 -0
  319. package/esm/ui/colors.js +230 -1
  320. package/esm/ui/hoverBoxStyle.d.ts +14 -2
  321. package/esm/ui/hoverBoxStyle.js +17 -2
  322. package/esm/ui/index.d.ts +12 -12
  323. package/esm/ui/index.js +14 -22
  324. package/esm/ui/launchViewMenu.js +15 -5
  325. package/esm/ui/legendMenuItem.d.ts +10 -32
  326. package/esm/ui/legendMenuItem.js +9 -36
  327. package/esm/ui/legendSpec.d.ts +15 -8
  328. package/esm/ui/legendSpec.js +14 -23
  329. package/esm/ui/makeSizeMenu.d.ts +0 -6
  330. package/esm/ui/makeSizeMenu.js +6 -30
  331. package/esm/ui/measureLegendText.js +1 -1
  332. package/esm/ui/menuItemAdornment.d.ts +9 -20
  333. package/esm/ui/menuItemAdornment.js +10 -32
  334. package/esm/ui/menuItems.d.ts +2 -7
  335. package/esm/ui/menuItems.js +1 -6
  336. package/esm/ui/multiTrackMenuItems.d.ts +6 -0
  337. package/esm/ui/palette.d.ts +118 -116
  338. package/esm/ui/palette.js +114 -75
  339. package/esm/ui/replaceViewAction.d.ts +1 -1
  340. package/esm/ui/replaceViewAction.js +1 -1
  341. package/esm/ui/theme.d.ts +43 -119
  342. package/esm/ui/theme.js +62 -78
  343. package/esm/ui/toggleMenuItems.d.ts +1 -3
  344. package/esm/ui/toggleMenuItems.js +6 -5
  345. package/esm/ui/useAssemblySelection.d.ts +4 -4
  346. package/esm/ui/viewHeaderHeight.d.ts +1 -0
  347. package/esm/ui/viewHeaderHeight.js +1 -0
  348. package/esm/util/Base1DUtils.d.ts +5 -3
  349. package/esm/util/Base1DUtils.js +14 -6
  350. package/esm/util/Base1DViewModel.d.ts +2 -1
  351. package/esm/util/Base1DViewModel.js +3 -2
  352. package/esm/util/SvgCanvas.d.ts +15 -13
  353. package/esm/util/SvgCanvas.js +76 -56
  354. package/esm/util/aborting.d.ts +39 -0
  355. package/esm/util/aborting.js +88 -6
  356. package/esm/util/adapterMetadata.d.ts +1 -1
  357. package/esm/util/adapterMetadata.js +6 -5
  358. package/esm/util/addAndShowTrack.d.ts +2 -5
  359. package/esm/util/addAndShowTrack.js +5 -1
  360. package/esm/util/addRelativeUris.d.ts +17 -5
  361. package/esm/util/addRelativeUris.js +46 -10
  362. package/esm/util/addTrackFromWidget.d.ts +2 -5
  363. package/esm/util/addTrackFromWidget.js +5 -4
  364. package/esm/util/aggregateFieldName.d.ts +10 -0
  365. package/esm/util/aggregateFieldName.js +8 -0
  366. package/esm/util/analytics.js +46 -13
  367. package/esm/util/animationAllowed.d.ts +9 -0
  368. package/esm/util/animationAllowed.js +13 -0
  369. package/esm/util/applyRowResizeWheel.d.ts +10 -5
  370. package/esm/util/applyRowResizeWheel.js +10 -21
  371. package/esm/util/bandHeight.d.ts +10 -0
  372. package/esm/util/bandHeight.js +29 -0
  373. package/esm/util/bandLayout.d.ts +4 -4
  374. package/esm/util/bandLayout.js +4 -4
  375. package/esm/util/bezierConnector.d.ts +4 -3
  376. package/esm/util/bezierConnector.js +38 -45
  377. package/esm/util/bgzfWorkerPool.d.ts +20 -74
  378. package/esm/util/bgzfWorkerPool.js +20 -74
  379. package/esm/util/binnedAggregate.d.ts +17 -0
  380. package/esm/util/binnedAggregate.js +275 -0
  381. package/esm/util/cacheBudgets.d.ts +22 -19
  382. package/esm/util/cacheBudgets.js +22 -19
  383. package/esm/util/cachedSetup.d.ts +1 -1
  384. package/esm/util/cachedSetup.js +2 -2
  385. package/esm/util/categoricalField.d.ts +56 -0
  386. package/esm/util/categoricalField.js +73 -0
  387. package/esm/util/clampToContig.d.ts +17 -0
  388. package/esm/util/clampToContig.js +19 -0
  389. package/esm/util/coarseStripHTML.js +1 -2
  390. package/esm/util/color/cssColorsLevel4.d.ts +1 -0
  391. package/esm/util/color/cssColorsLevel4.js +1 -0
  392. package/esm/util/color/index.d.ts +5 -3
  393. package/esm/util/color/index.js +7 -4
  394. package/esm/util/colorBits.d.ts +3 -3
  395. package/esm/util/colorBits.js +19 -44
  396. package/esm/util/colorRamp.d.ts +49 -5
  397. package/esm/util/colorRamp.js +169 -18
  398. package/esm/util/colorScale.d.ts +156 -0
  399. package/esm/util/colorScale.js +243 -0
  400. package/esm/util/colorSchemes.d.ts +21 -0
  401. package/esm/util/colorSchemes.js +30 -0
  402. package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
  403. package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
  404. package/esm/util/createSvgRasterCanvas.d.ts +10 -0
  405. package/esm/util/cssColorParse.d.ts +15 -0
  406. package/esm/util/cssColorParse.js +53 -0
  407. package/esm/util/diagonalizeRegions.d.ts +2 -3
  408. package/esm/util/diagonalizeRegions.js +8 -13
  409. package/esm/util/expandLooseSearchIndex.d.ts +19 -0
  410. package/esm/util/expandLooseSearchIndex.js +29 -0
  411. package/esm/util/featureTable.d.ts +224 -0
  412. package/esm/util/featureTable.js +366 -0
  413. package/esm/util/featureTransforms.d.ts +80 -0
  414. package/esm/util/featureTransforms.js +1579 -0
  415. package/esm/util/featureTypes.d.ts +24 -0
  416. package/esm/util/featureTypes.js +35 -0
  417. package/esm/util/fetchAndMaybeUnzip.js +16 -9
  418. package/esm/util/fetchContext.d.ts +7 -8
  419. package/esm/util/fetchContext.js +3 -3
  420. package/esm/util/fetchHub.d.ts +4 -2
  421. package/esm/util/fetchHub.js +2 -2
  422. package/esm/util/fetchPhases.d.ts +10 -10
  423. package/esm/util/fetchSeq.d.ts +2 -3
  424. package/esm/util/fetchSeq.js +2 -2
  425. package/esm/util/fieldReader.d.ts +17 -0
  426. package/esm/util/fieldReader.js +62 -0
  427. package/esm/util/freezeDeep.d.ts +8 -10
  428. package/esm/util/freezeDeep.js +8 -10
  429. package/esm/util/groupKeys.d.ts +77 -0
  430. package/esm/util/groupKeys.js +155 -0
  431. package/esm/util/highlights.d.ts +10 -6
  432. package/esm/util/highlights.js +12 -25
  433. package/esm/util/hooks.d.ts +31 -2
  434. package/esm/util/hooks.js +72 -3
  435. package/esm/util/index.d.ts +11 -11
  436. package/esm/util/index.js +11 -10
  437. package/esm/util/indexCandidates.d.ts +1 -31
  438. package/esm/util/indexCandidates.js +5 -63
  439. package/esm/util/installFetch.d.ts +77 -37
  440. package/esm/util/installFetch.js +65 -38
  441. package/esm/util/installInitAutorun.d.ts +14 -13
  442. package/esm/util/installInitAutorun.js +17 -17
  443. package/esm/util/installPrerequisiteFetch.d.ts +115 -0
  444. package/esm/util/installPrerequisiteFetch.js +111 -0
  445. package/esm/util/io/index.js +19 -14
  446. package/esm/util/isDataCurrent.d.ts +7 -5
  447. package/esm/util/isDataCurrent.js +9 -6
  448. package/esm/util/isTextEntryFocused.d.ts +7 -0
  449. package/esm/util/isTextEntryFocused.js +16 -0
  450. package/esm/util/jexl.js +24 -21
  451. package/esm/util/jexlFilterRows.d.ts +89 -0
  452. package/esm/util/jexlFilterRows.js +252 -0
  453. package/esm/util/jexlFilters.d.ts +20 -27
  454. package/esm/util/jexlFilters.js +23 -11
  455. package/esm/util/jexlStrings.d.ts +3 -4
  456. package/esm/util/jexlStrings.js +2 -3
  457. package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
  458. package/esm/util/layouts/GranularRectLayout.js +25 -8
  459. package/esm/util/lazyAfterAttach.d.ts +13 -0
  460. package/esm/util/lazyAfterAttach.js +31 -0
  461. package/esm/util/lazyWithPreload.d.ts +19 -0
  462. package/esm/util/lazyWithPreload.js +27 -0
  463. package/esm/util/legendCandidates.d.ts +72 -0
  464. package/esm/util/legendCandidates.js +138 -0
  465. package/esm/util/localStorage.js +4 -4
  466. package/esm/util/markEncoding.d.ts +150 -0
  467. package/esm/util/markEncoding.js +845 -0
  468. package/esm/util/markEncodingTypes.d.ts +588 -0
  469. package/esm/util/markEncodingTypes.js +8 -0
  470. package/esm/util/mst-reflection.d.ts +2 -20
  471. package/esm/util/mst-reflection.js +3 -53
  472. package/esm/util/mstUtils.d.ts +31 -23
  473. package/esm/util/mstUtils.js +39 -24
  474. package/esm/util/numericUtils.d.ts +7 -0
  475. package/esm/util/numericUtils.js +16 -0
  476. package/esm/util/numericValue.d.ts +14 -0
  477. package/esm/util/numericValue.js +34 -0
  478. package/esm/util/openFeatureWidget.d.ts +5 -0
  479. package/esm/util/openFeatureWidget.js +2 -2
  480. package/esm/util/openViews.d.ts +17 -0
  481. package/esm/util/openViews.js +22 -0
  482. package/esm/util/parentWalk.d.ts +1 -1
  483. package/esm/util/parentWalk.js +1 -1
  484. package/esm/util/parseLineByLine.d.ts +4 -5
  485. package/esm/util/parseLineByLine.js +8 -14
  486. package/esm/util/pluginStore.d.ts +6 -8
  487. package/esm/util/pluginStore.js +17 -16
  488. package/esm/util/preloadComponent.d.ts +5 -0
  489. package/esm/util/preloadComponent.js +11 -0
  490. package/esm/util/progress.d.ts +22 -22
  491. package/esm/util/progress.js +27 -26
  492. package/esm/util/quantileExtent.d.ts +49 -0
  493. package/esm/util/quantileExtent.js +162 -0
  494. package/esm/util/range.d.ts +13 -9
  495. package/esm/util/range.js +17 -8
  496. package/esm/util/renameRegions.d.ts +26 -6
  497. package/esm/util/renameRegions.js +68 -54
  498. package/esm/util/renderToStaticMarkup.js +24 -14
  499. package/esm/util/rxjs.d.ts +23 -8
  500. package/esm/util/rxjs.js +61 -15
  501. package/esm/util/samplesTsv.d.ts +49 -0
  502. package/esm/util/samplesTsv.js +86 -0
  503. package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
  504. package/esm/util/scheduleDetachedDestroy.js +24 -0
  505. package/esm/util/scrollLatch.d.ts +1 -0
  506. package/esm/util/scrollLatch.js +8 -0
  507. package/esm/util/selectEncodedFeature.d.ts +16 -0
  508. package/esm/util/selectEncodedFeature.js +34 -0
  509. package/esm/util/sessionSharing.d.ts +7 -5
  510. package/esm/util/sessionSharing.js +23 -23
  511. package/esm/util/shapeNameList.d.ts +2 -0
  512. package/esm/util/shapeNameList.js +6 -0
  513. package/esm/util/shapeNames.d.ts +7 -0
  514. package/esm/util/shapeNames.js +11 -0
  515. package/esm/util/simpleFeature.d.ts +0 -1
  516. package/esm/util/starFusion.d.ts +26 -0
  517. package/esm/util/starFusion.js +37 -0
  518. package/esm/util/stepTables.d.ts +82 -0
  519. package/esm/util/stepTables.js +243 -0
  520. package/esm/util/svAlt.d.ts +145 -0
  521. package/esm/util/svAlt.js +364 -0
  522. package/esm/util/svgColorProps.d.ts +11 -0
  523. package/esm/util/svgColorProps.js +28 -1
  524. package/esm/util/systemColorScheme.d.ts +12 -0
  525. package/esm/util/systemColorScheme.js +27 -0
  526. package/esm/util/tabix.d.ts +13 -8
  527. package/esm/util/tabix.js +17 -12
  528. package/esm/util/thresholdScale.d.ts +91 -0
  529. package/esm/util/thresholdScale.js +166 -0
  530. package/esm/util/timeGate.d.ts +4 -5
  531. package/esm/util/timeGate.js +4 -5
  532. package/esm/util/trackConfigDelta.d.ts +26 -26
  533. package/esm/util/trackConfigDelta.js +63 -47
  534. package/esm/util/tracks.d.ts +121 -40
  535. package/esm/util/tracks.js +497 -112
  536. package/esm/util/translateTranscript.d.ts +44 -0
  537. package/esm/util/translateTranscript.js +102 -0
  538. package/esm/util/types/data.d.ts +0 -2
  539. package/esm/util/types/index.d.ts +121 -22
  540. package/esm/util/types/index.js +9 -0
  541. package/esm/util/types/mst.d.ts +3 -0
  542. package/esm/util/types/mst.js +4 -0
  543. package/esm/util/types/renameIds.d.ts +1 -0
  544. package/esm/util/types/renameIds.js +29 -0
  545. package/esm/util/types/services.d.ts +1 -1
  546. package/esm/util/unknownSnapshotKeys.d.ts +51 -0
  547. package/esm/util/unknownSnapshotKeys.js +82 -0
  548. package/esm/util/useFeatureSequence.js +5 -5
  549. package/esm/util/useFetch.d.ts +3 -4
  550. package/esm/util/useFetch.js +19 -10
  551. package/esm/util/useFetchPlugins.d.ts +6 -2
  552. package/esm/util/useFetchPlugins.js +7 -3
  553. package/esm/util/usePanelVirtualScroll.d.ts +7 -35
  554. package/esm/util/usePanelVirtualScroll.js +9 -36
  555. package/esm/util/useRowVirtualScroll.d.ts +6 -29
  556. package/esm/util/useRowVirtualScroll.js +8 -49
  557. package/esm/util/useVirtualScrollWheel.d.ts +20 -4
  558. package/esm/util/useVirtualScrollWheel.js +40 -74
  559. package/esm/util/viewHighlights.d.ts +3 -0
  560. package/esm/util/viewHighlights.js +5 -0
  561. package/esm/util/viewStatus.d.ts +47 -15
  562. package/esm/util/viewStatus.js +34 -0
  563. package/esm/util/wheelZoom.d.ts +7 -1
  564. package/esm/util/wheelZoom.js +85 -19
  565. package/esm/util/whenViewSettled.d.ts +55 -8
  566. package/esm/util/whenViewSettled.js +56 -7
  567. package/esm/util/withLaunchInput.d.ts +174 -0
  568. package/esm/util/withLaunchInput.js +274 -0
  569. package/package.json +70 -20
  570. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
  571. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
  572. package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
  573. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
  574. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
  575. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
  576. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
  577. package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
  578. package/esm/ReExports/BaseFeatureDetails.js +0 -10
  579. package/esm/ReExports/index.d.ts +0 -1
  580. package/esm/ReExports/index.js +0 -1
  581. package/esm/ReExports/publicUtil.d.ts +0 -1
  582. package/esm/ReExports/publicUtil.js +0 -28
  583. package/esm/configuration/promotableDefaults.d.ts +0 -199
  584. package/esm/configuration/promotableDefaults.js +0 -326
  585. package/esm/configuration/promotablePin.d.ts +0 -55
  586. package/esm/configuration/promotablePin.js +0 -1
  587. package/esm/configuration/promotableResolve.d.ts +0 -108
  588. package/esm/configuration/promotableResolve.js +0 -117
  589. package/esm/configuration/promotableSlots.d.ts +0 -12
  590. package/esm/configuration/promotableSlots.js +0 -45
  591. package/esm/configuration/slotShape.d.ts +0 -12
  592. package/esm/configuration/slotShape.js +0 -84
  593. package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
  594. package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
  595. package/esm/ui/PinAdornment.d.ts +0 -5
  596. package/esm/ui/PinAdornment.js +0 -79
  597. package/esm/ui/SvgGradientLegend.d.ts +0 -26
  598. package/esm/ui/SvgGradientLegend.js +0 -26
  599. package/esm/ui/highlightChipReveal.d.ts +0 -32
  600. package/esm/ui/highlightChipReveal.js +0 -39
  601. package/esm/ui/promotableMenuItems.d.ts +0 -19
  602. package/esm/ui/promotableMenuItems.js +0 -89
  603. package/esm/ui/promotablePinCoverage.d.ts +0 -44
  604. package/esm/ui/promotablePinCoverage.js +0 -87
  605. package/esm/util/applyInitSettings.d.ts +0 -79
  606. package/esm/util/applyInitSettings.js +0 -91
  607. package/esm/util/openDisplays.d.ts +0 -23
  608. package/esm/util/openDisplays.js +0 -79
  609. package/esm/util/stopToken.d.ts +0 -211
  610. package/esm/util/stopToken.js +0 -438
  611. /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
@@ -0,0 +1,845 @@
1
+ import { makeScoreNormalizer, rampMidNorm, scaleTypeCode, } from '@jbrowse/render-core/scoreScale';
2
+ import { rampMidT } from '@jbrowse/render-core/shaders/colorRampLut';
3
+ import { RAMP_NO_VALUE_BITS } from '@jbrowse/render-core/shaders/markColorConsts';
4
+ import { GLYPH_DISC } from '@jbrowse/render-core/shaders/pointMarkConsts';
5
+ import { categoricalScale } from '../ui/colors.js';
6
+ import { categoricalField } from './categoricalField.js';
7
+ import { MISCONFIGURED_COLOR, NO_CATEGORY_COLOR } from './color/index.js';
8
+ import { cssColorToABGR, packAbgr } from './colorBits.js';
9
+ import { rampDomain, rampLutOf } from './colorRamp.js';
10
+ import { asTable, numberReaderOf, readerOf } from './featureTable.js';
11
+ import { fieldReader, isPlainFieldRef } from './fieldReader.js';
12
+ import Flatbush from './flatbush/index.js';
13
+ import { valueText } from './groupKeys.js';
14
+ import { isJexl, stringToJexlExpression } from './jexlStrings.js';
15
+ import { numericValue } from './numericValue.js';
16
+ import { scaleExtent } from './quantileExtent.js';
17
+ import { SHAPE_CODES, SHAPE_NAMES } from './shapeNames.js';
18
+ import { buildJexlContext } from './simpleFeature.js';
19
+ import { isMissing, thresholdCuts, thresholdIndex, thresholdPalette, } from './thresholdScale.js';
20
+ export { COLOR_SCHEMES } from './colorSchemes.js';
21
+ export { NO_VALUE_LABEL } from './categoricalField.js';
22
+ export const DEFAULT_MARK_COLOR = '#0068d1';
23
+ export const DEFAULT_SIZE_RANGE_PX = [1, 6];
24
+ /**
25
+ * #api
26
+ * The misconfiguration grey packed as the encoder paints it: a `jexl:` colour
27
+ * that answered no string, a ramp value that is no number, text a threshold
28
+ * cannot read.
29
+ */
30
+ export const MISCONFIGURED_ABGR = cssColorToABGR(MISCONFIGURED_COLOR);
31
+ /**
32
+ * #api
33
+ * The no-value grey packed as the encoder paints it: a feature with nothing in
34
+ * the field a threshold reads.
35
+ */
36
+ export const NO_VALUE_ABGR = cssColorToABGR(NO_CATEGORY_COLOR);
37
+ const FALLBACK_COLOR = MISCONFIGURED_ABGR;
38
+ function jexlExpression(ref, jexl) {
39
+ if (!jexl) {
40
+ throw new Error(`a jexl: channel needs a jexl instance (${ref})`);
41
+ }
42
+ return stringToJexlExpression(ref, jexl);
43
+ }
44
+ function channelReader(table, ref, jexl) {
45
+ if (typeof ref === 'function') {
46
+ return i => ref(table.row(i));
47
+ }
48
+ if (isPlainFieldRef(ref)) {
49
+ return readerOf(table.column(ref));
50
+ }
51
+ const read = fieldReader(ref, jexl);
52
+ return i => read(table.row(i));
53
+ }
54
+ function numberChannelReader(table, ref, jexl) {
55
+ if (typeof ref !== 'function' && isPlainFieldRef(ref)) {
56
+ return numberReaderOf(table.column(ref));
57
+ }
58
+ const read = channelReader(table, ref, jexl);
59
+ return i => numericValue(read(i));
60
+ }
61
+ function isShapeName(shape) {
62
+ return shape in SHAPE_CODES;
63
+ }
64
+ // A shape named outright is its code, which fills the lane without reading a
65
+ // row.
66
+ function shapeReader(table, shape, jexl) {
67
+ if (shape === undefined) {
68
+ return GLYPH_DISC;
69
+ }
70
+ if (typeof shape === 'function') {
71
+ return i => shape(table.row(i));
72
+ }
73
+ if (isShapeName(shape)) {
74
+ return SHAPE_CODES[shape];
75
+ }
76
+ const expr = jexlExpression(shape, jexl);
77
+ return i => {
78
+ const v = expr.eval(buildJexlContext({ feature: table.row(i) }));
79
+ return typeof v === 'string' && isShapeName(v) ? SHAPE_CODES[v] : GLYPH_DISC;
80
+ };
81
+ }
82
+ function lutColorAt(lut, t) {
83
+ const entries = lut.length / 4;
84
+ const i = Math.min(entries - 1, Math.max(0, Math.round(t * (entries - 1))));
85
+ const o = i * 4;
86
+ return packAbgr(lut[o], lut[o + 1], lut[o + 2], lut[o + 3]);
87
+ }
88
+ function numberSource(table, ref, jexl) {
89
+ return {
90
+ lane: laneOf(table, ref),
91
+ read: numberChannelReader(table, ref, jexl),
92
+ };
93
+ }
94
+ function laneOf(table, ref) {
95
+ if (typeof ref === 'function' || !isPlainFieldRef(ref)) {
96
+ return undefined;
97
+ }
98
+ const column = table.column(ref);
99
+ return column.kind === 'number' ? column : undefined;
100
+ }
101
+ // A stacked row reads as `Number` reads it, where a quantitative channel reads
102
+ // text by `numericValue`'s rules.
103
+ function rowSource(table, ref, jexl) {
104
+ const read = channelReader(table, ref, jexl);
105
+ return { lane: laneOf(table, ref), read: i => Number(read(i)) };
106
+ }
107
+ function isUnsigned(values) {
108
+ return (values instanceof Uint32Array ||
109
+ values instanceof Uint16Array ||
110
+ values instanceof Uint8Array);
111
+ }
112
+ // A lane of whole numbers holds no NaN or infinity, so it places every row.
113
+ function isWhole(source) {
114
+ const values = source.lane?.values;
115
+ return (values !== undefined &&
116
+ !(values instanceof Float32Array || values instanceof Float64Array));
117
+ }
118
+ // The one index a loop reads a lane through for instance `k`: the kept row,
119
+ // the lane's own index, or both composed. A loop tests for it once and runs
120
+ // with no branch per element, which V8 does not hoist for it.
121
+ function laneIndex(kept, at) {
122
+ if (!kept || !at) {
123
+ return kept ?? at;
124
+ }
125
+ const index = new Uint32Array(kept.length);
126
+ for (let k = 0; k < kept.length; k++) {
127
+ index[k] = at[kept[k]];
128
+ }
129
+ return index;
130
+ }
131
+ // `out[k]`, the value instance `k` reads; into an unsigned lane a negative
132
+ // stops at 0 rather than wrapping.
133
+ function fillNumbers(out, { lane, read }, kept, count) {
134
+ const unsigned = out instanceof Uint32Array;
135
+ if (!lane) {
136
+ for (let k = 0; k < count; k++) {
137
+ const v = read(kept ? kept[k] : k);
138
+ out[k] = unsigned && v < 0 ? 0 : v;
139
+ }
140
+ return;
141
+ }
142
+ const { values } = lane;
143
+ const index = laneIndex(kept, lane.at);
144
+ if (!index && (!unsigned || isUnsigned(values))) {
145
+ out.set(values.subarray(0, count));
146
+ }
147
+ else if (!index) {
148
+ for (let k = 0; k < count; k++) {
149
+ const v = values[k];
150
+ out[k] = v < 0 ? 0 : v;
151
+ }
152
+ }
153
+ else if (unsigned) {
154
+ for (let k = 0; k < count; k++) {
155
+ const v = values[index[k]];
156
+ out[k] = v < 0 ? 0 : v;
157
+ }
158
+ }
159
+ else {
160
+ for (let k = 0; k < count; k++) {
161
+ out[k] = values[index[k]];
162
+ }
163
+ }
164
+ }
165
+ // The rows that place, and their `x`, `x2` and `y` written: every row where
166
+ // all three are lanes of whole numbers, and otherwise each whose three read
167
+ // finite. A position before the sequence's first base, a flank run off the
168
+ // start or an `END=0`, stops at 0 rather than wrapping the unsigned lane.
169
+ function admit(sources, out, n, report) {
170
+ const { x, x2, y } = sources;
171
+ if (isWhole(x) && isWhole(x2) && (!y || isWhole(y))) {
172
+ fillNumbers(out.x, x, undefined, n);
173
+ fillNumbers(out.x2, x2, undefined, n);
174
+ if (y && out.y) {
175
+ fillNumbers(out.y, y, undefined, n);
176
+ }
177
+ return { kept: undefined, count: n, skippedPosition: 0 };
178
+ }
179
+ const kept = new Uint32Array(n);
180
+ const { x: xs, x2: x2s, y: ys } = out;
181
+ const lanes = unindexedLanes(x, x2, y);
182
+ if (lanes) {
183
+ const { count, skippedPosition } = admitLanes(lanes, out, kept, n);
184
+ return {
185
+ kept: count === n ? undefined : kept.subarray(0, count),
186
+ count,
187
+ skippedPosition,
188
+ };
189
+ }
190
+ const readX = x.read;
191
+ const readX2 = x2.read;
192
+ const readY = y?.read;
193
+ let count = 0;
194
+ let skippedPosition = 0;
195
+ for (let i = 0; i < n; i++) {
196
+ report?.(i);
197
+ const xv = readX(i);
198
+ const x2v = readX2(i);
199
+ const yv = readY ? readY(i) : 0;
200
+ if (!Number.isFinite(xv) || !Number.isFinite(x2v)) {
201
+ skippedPosition++;
202
+ continue;
203
+ }
204
+ if (!Number.isFinite(yv)) {
205
+ continue;
206
+ }
207
+ xs[count] = xv < 0 ? 0 : xv;
208
+ x2s[count] = x2v < 0 ? 0 : x2v;
209
+ if (ys) {
210
+ ys[count] = yv;
211
+ }
212
+ kept[count++] = i;
213
+ }
214
+ return {
215
+ kept: count === n ? undefined : kept.subarray(0, count),
216
+ count,
217
+ skippedPosition,
218
+ };
219
+ }
220
+ function unindexedLanes(x, x2, y) {
221
+ const lanes = [x.lane, x2.lane, y?.lane];
222
+ return lanes[0] &&
223
+ !lanes[0].at &&
224
+ lanes[1] &&
225
+ !lanes[1].at &&
226
+ (!y || (lanes[2] && !lanes[2].at))
227
+ ? { x: lanes[0].values, x2: lanes[1].values, y: lanes[2]?.values }
228
+ : undefined;
229
+ }
230
+ // `admit`'s walk read straight off lanes with no index, so no row costs a
231
+ // call: with a `y` lane in one loop and without one in another, since V8
232
+ // would test for it on every row.
233
+ function admitLanes(lanes, out, kept, n) {
234
+ const { x: xl, x2: x2l, y: yl } = lanes;
235
+ const { x: xs, x2: x2s } = out;
236
+ let count = 0;
237
+ let skippedPosition = 0;
238
+ if (yl) {
239
+ const ys = out.y;
240
+ for (let i = 0; i < n; i++) {
241
+ const xv = xl[i];
242
+ const x2v = x2l[i];
243
+ const yv = yl[i];
244
+ if (!Number.isFinite(xv) || !Number.isFinite(x2v)) {
245
+ skippedPosition++;
246
+ }
247
+ else if (Number.isFinite(yv)) {
248
+ xs[count] = xv < 0 ? 0 : xv;
249
+ x2s[count] = x2v < 0 ? 0 : x2v;
250
+ ys[count] = yv;
251
+ kept[count++] = i;
252
+ }
253
+ }
254
+ }
255
+ else {
256
+ for (let i = 0; i < n; i++) {
257
+ const xv = xl[i];
258
+ const x2v = x2l[i];
259
+ if (!Number.isFinite(xv) || !Number.isFinite(x2v)) {
260
+ skippedPosition++;
261
+ }
262
+ else {
263
+ xs[count] = xv < 0 ? 0 : xv;
264
+ x2s[count] = x2v < 0 ? 0 : x2v;
265
+ kept[count++] = i;
266
+ }
267
+ }
268
+ }
269
+ return { count, skippedPosition };
270
+ }
271
+ // The categorical arm `color` and `shape` share: `out[k]` the lane value of
272
+ // the entry instance `k`'s key takes, `''` the key of none, and the keys met
273
+ // with their entries in the field's order. A key's entry is its own whatever
274
+ // else was met, so two regions agree on every key they share. Over a category
275
+ // column each label is keyed once, and the lane written by its code.
276
+ function paintCategories(table, ref, jexl, categories, within, out, entryOf, laneValue) {
277
+ const { kept, count, report } = within;
278
+ const resolved = new Map();
279
+ const resolve = (key) => {
280
+ let r = resolved.get(key);
281
+ if (r === undefined) {
282
+ const entry = entryOf(key);
283
+ r = { entry, value: laneValue(entry) };
284
+ resolved.set(key, r);
285
+ }
286
+ return r;
287
+ };
288
+ const column = typeof ref !== 'function' && isPlainFieldRef(ref)
289
+ ? table.column(ref)
290
+ : undefined;
291
+ let met;
292
+ if (column?.kind === 'category') {
293
+ const { codes, labels } = column;
294
+ const keyOfCode = labels.map(label => categories.key(label));
295
+ const valueOfCode = Uint32Array.from(keyOfCode, key => resolve(key).value);
296
+ const metCode = new Uint8Array(labels.length);
297
+ const index = laneIndex(kept, column.at);
298
+ if (index) {
299
+ for (let k = 0; k < count; k++) {
300
+ const code = codes[index[k]];
301
+ metCode[code] = 1;
302
+ out[k] = valueOfCode[code];
303
+ }
304
+ }
305
+ else {
306
+ for (let k = 0; k < count; k++) {
307
+ const code = codes[k];
308
+ metCode[code] = 1;
309
+ out[k] = valueOfCode[code];
310
+ }
311
+ }
312
+ met = new Set(keyOfCode.filter((_, code) => metCode[code]));
313
+ }
314
+ else {
315
+ const read = channelReader(table, ref, jexl);
316
+ for (let k = 0; k < count; k++) {
317
+ report?.(k);
318
+ out[k] = resolve(categories.key(read(kept ? kept[k] : k))).value;
319
+ }
320
+ met = resolved.keys();
321
+ }
322
+ return [...met]
323
+ .sort(categories.compare)
324
+ .map(value => ({ value, entry: resolved.get(value).entry }));
325
+ }
326
+ /**
327
+ * #api
328
+ * The hit index over `count` instances: each a box from `x` to `x2` at its
329
+ * `y`, or at 0 for a mark with no value.
330
+ */
331
+ export function hitIndexOf(x, x2, y, count = x.length) {
332
+ const fb = new Flatbush(count, undefined, Float64Array);
333
+ for (let i = 0; i < count; i++) {
334
+ const v = y ? y[i] : 0;
335
+ const a = x[i];
336
+ const b = x2[i];
337
+ fb.add(Math.min(a, b), v, Math.max(a, b), v);
338
+ }
339
+ fb.finish();
340
+ return fb;
341
+ }
342
+ /**
343
+ * #api
344
+ * {@link HitIndexed} over what the worker shipped.
345
+ */
346
+ export function withHitIndex(channels) {
347
+ const { flatbushData } = channels;
348
+ return {
349
+ ...channels,
350
+ flatbush: flatbushData ? Flatbush.from(flatbushData) : undefined,
351
+ };
352
+ }
353
+ /**
354
+ * #api
355
+ * Evaluate one encoding over a feature list into dense channel arrays for
356
+ * the lanes named, the scale table each scaled channel came from, the `y`
357
+ * extremes and — when `index` is among the lanes — a hit index.
358
+ *
359
+ * A feature whose `x`, `x2` or (declared and asked-for) `y` is not finite is
360
+ * skipped and counted in `skipped`, so every array stays index-aligned with
361
+ * the Flatbush. Pure: the RPC around it owns the adapter, the filters and the
362
+ * transferables.
363
+ *
364
+ * Columnar: one pass admits the rows over `x`, `x2` and `y` alone, and none
365
+ * runs where all three are lanes of whole numbers; every other lane is then
366
+ * filled in its own loop over the admitted rows, a lane straight off a typed
367
+ * column and a categorical over a `category` column per label.
368
+ */
369
+ export function encodeFeatures(input, encoding, lanes, ctx = {}) {
370
+ const { jexl, report } = ctx;
371
+ const table = asTable(input);
372
+ const n = table.length;
373
+ const has = (lane) => lanes.includes(lane);
374
+ const { x2: x2Encoding, y: yEncoding, row: rowEncoding, text: textEncoding, size: sizeEncoding, shape: shapeEncoding, } = encoding;
375
+ const x2Locus = typeof x2Encoding === 'object' ? x2Encoding : undefined;
376
+ const ySource = has('y') && yEncoding !== undefined
377
+ ? numberSource(table, yEncoding, jexl)
378
+ : undefined;
379
+ const xs = new Uint32Array(n);
380
+ const x2s = new Uint32Array(n);
381
+ const ys = has('y') ? new Float32Array(n) : undefined;
382
+ const { kept, count, skippedPosition } = admit({
383
+ x: numberSource(table, encoding.x ?? 'start', jexl),
384
+ x2: numberSource(table, typeof x2Encoding === 'object' ? x2Encoding.pos : (x2Encoding ?? 'end'), jexl),
385
+ y: ySource,
386
+ }, { x: xs, x2: x2s, y: ys }, n, report);
387
+ const rowAt = (k) => (kept ? kept[k] : k);
388
+ const y = ys?.subarray(0, count);
389
+ let yMin = Infinity;
390
+ let yMax = -Infinity;
391
+ if (ySource && y) {
392
+ for (let k = 0; k < count; k++) {
393
+ const v = y[k];
394
+ if (v < yMin) {
395
+ yMin = v;
396
+ }
397
+ if (v > yMax) {
398
+ yMax = v;
399
+ }
400
+ }
401
+ }
402
+ let x2Ref;
403
+ const x2RefNames = [];
404
+ if (has('x2Ref')) {
405
+ x2Ref = new Uint32Array(count);
406
+ const readChrom = x2Locus
407
+ ? channelReader(table, x2Locus.chrom, jexl)
408
+ : undefined;
409
+ const readRefName = readerOf(table.column('refName'));
410
+ const refIndex = new Map();
411
+ for (let k = 0; k < count; k++) {
412
+ report?.(k);
413
+ const r = rowAt(k);
414
+ const there = readChrom
415
+ ? valueText(readChrom(r))
416
+ : readRefName(r);
417
+ let ref = refIndex.get(there);
418
+ if (ref === undefined) {
419
+ ref = x2RefNames.length;
420
+ refIndex.set(there, ref);
421
+ x2RefNames.push(there);
422
+ }
423
+ x2Ref[k] = ref;
424
+ }
425
+ }
426
+ const sizeRef = has('size') &&
427
+ sizeEncoding !== undefined &&
428
+ typeof sizeEncoding !== 'number'
429
+ ? typeof sizeEncoding === 'string'
430
+ ? { field: sizeEncoding }
431
+ : sizeEncoding
432
+ : undefined;
433
+ const size = sizeRef ? new Float32Array(count) : undefined;
434
+ if (sizeRef && size) {
435
+ fillNumbers(size, numberSource(table, sizeRef.field, jexl), kept, count);
436
+ }
437
+ const row = has('row') ? new Uint32Array(count) : undefined;
438
+ if (row && typeof rowEncoding === 'object') {
439
+ if (rowEncoding instanceof Uint32Array && !kept) {
440
+ row.set(rowEncoding.subarray(0, count));
441
+ }
442
+ else {
443
+ for (let k = 0; k < count; k++) {
444
+ const rv = rowEncoding[rowAt(k)];
445
+ row[k] = rv > 0 ? rv : 0;
446
+ }
447
+ }
448
+ }
449
+ else if (row &&
450
+ rowEncoding !== undefined &&
451
+ typeof rowEncoding !== 'object') {
452
+ fillNumbers(row, rowSource(table, rowEncoding, jexl), kept, count);
453
+ }
454
+ const text = has('text') ? new Array(count) : undefined;
455
+ if (text) {
456
+ if (textEncoding === undefined) {
457
+ text.fill('');
458
+ }
459
+ else {
460
+ const read = channelReader(table, textEncoding, jexl);
461
+ for (let k = 0; k < count; k++) {
462
+ report?.(k);
463
+ text[k] = valueText(read(rowAt(k)));
464
+ }
465
+ }
466
+ }
467
+ const glyph = has('glyph') ? new Uint8Array(count) : undefined;
468
+ let shapeScale;
469
+ if (glyph && typeof shapeEncoding === 'object') {
470
+ const shapeField = categoricalField(shapeEncoding.field, {
471
+ domain: shapeEncoding.domain?.map(String),
472
+ });
473
+ const range = shapeEncoding.range ?? SHAPE_NAMES;
474
+ const shapeOf = categoricalScale(shapeField.domain, range, {
475
+ fallback: range.length > shapeField.domain.length ? [] : SHAPE_NAMES,
476
+ });
477
+ const entries = paintCategories(table, shapeEncoding.field, jexl, shapeField, { kept, count, report }, glyph, (key) => (key === '' ? 'circle' : shapeOf(key)), name => SHAPE_CODES[name]);
478
+ shapeScale = {
479
+ kind: 'shape',
480
+ field: shapeEncoding.field,
481
+ domain: [...shapeField.domain],
482
+ ...(shapeEncoding.range ? { range: [...shapeEncoding.range] } : {}),
483
+ entries: entries.map(e => ({ value: e.value, shape: e.entry })),
484
+ };
485
+ }
486
+ else if (glyph && typeof shapeEncoding !== 'object') {
487
+ const shape = shapeReader(table, shapeEncoding, jexl);
488
+ if (typeof shape === 'number') {
489
+ glyph.fill(shape);
490
+ }
491
+ else {
492
+ for (let k = 0; k < count; k++) {
493
+ report?.(k);
494
+ glyph[k] = shape(rowAt(k));
495
+ }
496
+ }
497
+ }
498
+ const colorEncoding = encoding.color ?? DEFAULT_MARK_COLOR;
499
+ const declaredScale = typeof colorEncoding === 'object' ? colorEncoding : undefined;
500
+ const rampEncoding = declaredScale &&
501
+ (declaredScale.scale === 'linear' || declaredScale.scale === 'log')
502
+ ? declaredScale
503
+ : undefined;
504
+ const thresholdEncoding = declaredScale?.scale === 'threshold' ? declaredScale : undefined;
505
+ // Which side of the wire a quantitative colour resolves on is the caller's
506
+ // lane choice: a mark that reads the scale itself names `colorValue` and
507
+ // gets the raw values, so a ramp's domain unions over the regions and a
508
+ // threshold's cuts move as uniforms. Anything else names `color` and the
509
+ // encoder resolves per region. A colour over the field `y` plots is the `y`
510
+ // lane itself, aliased rather than copied.
511
+ const quantitative = rampEncoding ?? thresholdEncoding;
512
+ const colorReadsY = quantitative !== undefined &&
513
+ has('colorValue') &&
514
+ y !== undefined &&
515
+ typeof yEncoding === 'string' &&
516
+ quantitative.field === yEncoding;
517
+ const colorValue = quantitative && has('colorValue')
518
+ ? colorReadsY
519
+ ? y
520
+ : new Float32Array(count)
521
+ : undefined;
522
+ const paintsColor = has('color') && !colorValue;
523
+ const unscaled = paintsColor && declaredScale?.scale !== 'categorical' && !quantitative
524
+ ? unscaledColor(table, colorEncoding, jexl)
525
+ : undefined;
526
+ const color = paintsColor && typeof unscaled !== 'number'
527
+ ? new Uint32Array(count)
528
+ : undefined;
529
+ const scaled = paintsColor || colorValue ? declaredScale : undefined;
530
+ let scale;
531
+ let missingMet = false;
532
+ let notNumberMet = false;
533
+ if (scaled?.scale === 'categorical' && color) {
534
+ const colorField = categoricalField(scaled.field, {
535
+ domain: scaled.domain?.map(String),
536
+ range: scaled.range,
537
+ });
538
+ const entries = paintCategories(table, scaled.field, jexl, colorField, { kept, count, report }, color, key => cssColorToABGR(colorField.color(key)), abgr => abgr);
539
+ scale = {
540
+ kind: 'categorical',
541
+ field: scaled.field,
542
+ domain: [...colorField.domain],
543
+ ...(scaled.range ? { range: [...scaled.range] } : {}),
544
+ ...(keysAreNumeric(entries) ? { numericKeys: true } : {}),
545
+ entries: entries.map(e => ({ value: e.value, color: e.entry })),
546
+ };
547
+ }
548
+ else if (scaled && quantitative) {
549
+ // The raw values, where they are kept: a ramp's always, a threshold's
550
+ // where the caller resolves it; the encoder resolves a threshold into
551
+ // packed colours only for a caller naming `color` alone.
552
+ const values = colorValue ?? (rampEncoding ? new Float32Array(count) : undefined);
553
+ const read = channelReader(table, quantitative.field, jexl);
554
+ if (values && !colorReadsY) {
555
+ const bits = new Uint32Array(values.buffer, values.byteOffset, count);
556
+ for (let k = 0; k < count; k++) {
557
+ report?.(k);
558
+ const v = read(rowAt(k));
559
+ if (isMissing(v)) {
560
+ bits[k] = RAMP_NO_VALUE_BITS;
561
+ missingMet = true;
562
+ }
563
+ else {
564
+ values[k] = numericValue(v);
565
+ notNumberMet ||= Number.isNaN(values[k]);
566
+ }
567
+ }
568
+ }
569
+ if (thresholdEncoding) {
570
+ const cuts = thresholdCuts(thresholdEncoding.domain ?? []);
571
+ if (color) {
572
+ const binColors = Uint32Array.from(thresholdPalette(cuts.length + 1, thresholdEncoding.range), c => cssColorToABGR(c));
573
+ for (let k = 0; k < count; k++) {
574
+ report?.(k);
575
+ const v = read(rowAt(k));
576
+ const bin = thresholdIndex(v, cuts);
577
+ if (bin >= 0) {
578
+ color[k] = binColors[bin];
579
+ }
580
+ else if (isMissing(v)) {
581
+ color[k] = NO_VALUE_ABGR;
582
+ missingMet = true;
583
+ }
584
+ else {
585
+ color[k] = FALLBACK_COLOR;
586
+ notNumberMet = true;
587
+ }
588
+ }
589
+ }
590
+ scale = {
591
+ kind: 'threshold',
592
+ field: thresholdEncoding.field,
593
+ domain: cuts,
594
+ ...(thresholdEncoding.range
595
+ ? { range: [...thresholdEncoding.range] }
596
+ : {}),
597
+ ...(missingMet ? { missing: true } : {}),
598
+ ...(notNumberMet ? { notNumber: true } : {}),
599
+ };
600
+ }
601
+ else if (rampEncoding && values) {
602
+ scale = rampScale(rampEncoding, values, count, color, {
603
+ missingMet,
604
+ notNumberMet,
605
+ });
606
+ }
607
+ }
608
+ else if (color && typeof unscaled === 'function') {
609
+ for (let k = 0; k < count; k++) {
610
+ report?.(k);
611
+ color[k] = unscaled(rowAt(k));
612
+ }
613
+ }
614
+ let sizeScale;
615
+ if (sizeRef && size) {
616
+ const scale = sizeRef.scale ?? 'linear';
617
+ const extent = scaleExtent(size, count, scale);
618
+ const { domainMin, domainMax } = sizeRef;
619
+ sizeScale = {
620
+ field: sizeRef.field,
621
+ scale,
622
+ domain: rampDomain(domainMin, domainMax, extent),
623
+ pinned: [domainMin !== undefined, domainMax !== undefined],
624
+ range: sizeRef.range ?? DEFAULT_SIZE_RANGE_PX,
625
+ extent,
626
+ };
627
+ }
628
+ const x = xs.subarray(0, count);
629
+ const x2 = x2s.subarray(0, count);
630
+ const flatbushData = has('index') && count > 0 ? hitIndexOf(x, x2, y, count).data : undefined;
631
+ const encoded = {
632
+ count,
633
+ skipped: n - count,
634
+ skippedPosition,
635
+ x,
636
+ x2,
637
+ yMin,
638
+ yMax,
639
+ };
640
+ if (kept) {
641
+ encoded.featureIndex = kept;
642
+ }
643
+ if (y) {
644
+ encoded.y = y;
645
+ }
646
+ if (row) {
647
+ encoded.row = row;
648
+ }
649
+ if (typeof unscaled === 'number') {
650
+ encoded.color = unscaled;
651
+ }
652
+ else if (color) {
653
+ encoded.color = color;
654
+ }
655
+ if (colorValue) {
656
+ // the y view itself where the colour reads y, so a reader can tell
657
+ encoded.colorValue = colorValue;
658
+ }
659
+ if (glyph) {
660
+ encoded.glyph = glyph;
661
+ }
662
+ if (text) {
663
+ encoded.text = text;
664
+ }
665
+ if (size) {
666
+ encoded.size = size;
667
+ }
668
+ if (x2Ref) {
669
+ encoded.x2Ref = x2Ref;
670
+ encoded.x2RefNames = x2RefNames;
671
+ }
672
+ if (sizeScale) {
673
+ encoded.sizeScale = sizeScale;
674
+ }
675
+ if (flatbushData) {
676
+ encoded.flatbushData = flatbushData;
677
+ }
678
+ if (scale) {
679
+ encoded.scale = scale;
680
+ }
681
+ if (shapeScale) {
682
+ encoded.shapeScale = shapeScale;
683
+ }
684
+ return encoded;
685
+ }
686
+ // A ramp's table over the values it met, painting `color` through it where
687
+ // the encoder resolves the scale.
688
+ function rampScale(rampEncoding, values, count, color, met) {
689
+ const extent = scaleExtent(values, count, rampEncoding.scale, rampEncoding.domainQuantile);
690
+ const { domainMin, domainMax, domainMid, domainQuantile, range, scheme, reverse, } = rampEncoding;
691
+ const { domain, lut, colorOf } = continuousColorScale(rampEncoding, extent);
692
+ if (color) {
693
+ const bits = new Uint32Array(values.buffer, values.byteOffset, count);
694
+ for (let k = 0; k < count; k++) {
695
+ color[k] =
696
+ bits[k] === RAMP_NO_VALUE_BITS ? NO_VALUE_ABGR : colorOf(values[k]);
697
+ }
698
+ }
699
+ return {
700
+ kind: 'ramp',
701
+ field: rampEncoding.field,
702
+ scale: rampEncoding.scale,
703
+ domain,
704
+ pinned: [domainMin !== undefined, domainMax !== undefined],
705
+ ...(domainMid === undefined ? {} : { domainMid }),
706
+ ...(range ? { range: [...range] } : {}),
707
+ ...(scheme ? { scheme } : {}),
708
+ ...(reverse ? { reverse } : {}),
709
+ extent,
710
+ ...(domainQuantile !== undefined && domainQuantile < 1
711
+ ? { quantile: domainQuantile }
712
+ : {}),
713
+ lut,
714
+ ...(met.missingMet ? { missing: true } : {}),
715
+ ...(met.notNumberMet ? { notNumber: true } : {}),
716
+ };
717
+ }
718
+ /**
719
+ * #api
720
+ * A continuous colour scale over `extent`, the values it met: the domain its
721
+ * declared ends and the extent make, the straight table its stops bake to and
722
+ * where its middle stop sits, and the packed colour a value paints through
723
+ * them: an infinity the end on its side, as a threshold places it, and NaN,
724
+ * text that is no number, the misconfiguration grey. The encoder and every
725
+ * display painting a ramp itself read it, so a value takes one colour whoever
726
+ * paints it.
727
+ */
728
+ export function continuousColorScale(encoding, extent) {
729
+ const { domainMin, domainMax, domainMid, scale } = encoding;
730
+ const domain = rampDomain(domainMin, domainMax, extent);
731
+ const norm = makeScoreNormalizer(domain[0], domain[1], scaleTypeCode(scale), 1);
732
+ const lut = rampLutOf(encoding);
733
+ const midNorm = rampMidNorm(domain[0], domain[1], scaleTypeCode(scale), domainMid);
734
+ return {
735
+ domain,
736
+ lut,
737
+ midNorm,
738
+ colorOf: (value) => Number.isNaN(value)
739
+ ? FALLBACK_COLOR
740
+ : lutColorAt(lut, rampMidT(Number.isFinite(value) ? norm(value) : value > 0 ? 1 : 0, midNorm)),
741
+ };
742
+ }
743
+ /**
744
+ * #api
745
+ * A ramp table over `extent`, the union a display took across the regions it
746
+ * loaded: each open end of the domain moved to the union's, the pinned ends
747
+ * kept. The table stays straight and `domainMid` a value, so the middle stop
748
+ * follows the widened domain with no table baked again.
749
+ */
750
+ export function rampOverExtent(table, extent) {
751
+ const { pinned } = table;
752
+ const domain = rampDomain(pinned[0] ? table.domain[0] : undefined, pinned[1] ? table.domain[1] : undefined, extent);
753
+ return { ...table, extent, domain };
754
+ }
755
+ function keysAreNumeric(entries) {
756
+ const named = entries.filter(e => e.value !== '');
757
+ return named.length > 0 && named.every(e => Number.isFinite(Number(e.value)));
758
+ }
759
+ // `[Infinity, -Infinity]` where no value is finite, which a union of regions'
760
+ // extents passes over.
761
+ /**
762
+ * #api
763
+ * A CSS colour or `jexl:` colour expression as a per-feature packed ABGR —
764
+ * the unscaled arm of {@link ColorEncoding}, on its own for a display that
765
+ * carries a plain `color` slot.
766
+ */
767
+ export function colorEvaluator(color, jexl) {
768
+ if (isJexl(color)) {
769
+ const expr = jexlExpression(color, jexl);
770
+ // A jexl colour answers from a handful of strings over a million
771
+ // features; parsing each answer once is a third of the arm's cost
772
+ // (packages/core/benches/encodeFeatures.bench.ts).
773
+ const packed = new Map();
774
+ return feature => {
775
+ const v = expr.eval(buildJexlContext({ feature }));
776
+ if (typeof v !== 'string') {
777
+ return FALLBACK_COLOR;
778
+ }
779
+ let c = packed.get(v);
780
+ if (c === undefined) {
781
+ c = cssColorToABGR(v);
782
+ packed.set(v, c);
783
+ }
784
+ return c;
785
+ };
786
+ }
787
+ const constant = cssColorToABGR(color);
788
+ return () => constant;
789
+ }
790
+ function unscaledColor(table, color, jexl) {
791
+ if (typeof color === 'function') {
792
+ return i => color(table.row(i));
793
+ }
794
+ if (!isJexl(color)) {
795
+ return cssColorToABGR(color);
796
+ }
797
+ const colorOf = colorEvaluator(color, jexl);
798
+ return i => colorOf(table.row(i));
799
+ }
800
+ /**
801
+ * #api
802
+ * The input feature instance `i` of `channels` was: `featureIndex[i]`, or `i`
803
+ * itself where the encoder skipped none and so shipped no index.
804
+ */
805
+ export function featureIndexAt(channels, i) {
806
+ const { featureIndex } = channels;
807
+ return featureIndex ? featureIndex[i] : i;
808
+ }
809
+ /**
810
+ * #api
811
+ * The packed colour instance `i` of `channels` paints: `color[i]`, or `color`
812
+ * itself where the colour is a constant and so shipped as one number.
813
+ */
814
+ export function colorAt(channels, i) {
815
+ const { color } = channels;
816
+ return typeof color === 'number' ? color : color?.[i];
817
+ }
818
+ /**
819
+ * #api
820
+ * The buffers an {@link EncodedChannels} owns, for `rpcResult`'s transfer
821
+ * list.
822
+ */
823
+ export function encodedChannelTransferables(c) {
824
+ // A set, since `colorValue` may be the `y` lane itself and a buffer listed
825
+ // twice fails the transfer.
826
+ const buffers = new Set([c.x.buffer, c.x2.buffer]);
827
+ for (const lane of [
828
+ c.featureIndex,
829
+ c.y,
830
+ c.row,
831
+ typeof c.color === 'number' ? undefined : c.color,
832
+ c.colorValue,
833
+ c.glyph,
834
+ c.size,
835
+ c.x2Ref,
836
+ ]) {
837
+ if (lane) {
838
+ buffers.add(lane.buffer);
839
+ }
840
+ }
841
+ if (c.flatbushData) {
842
+ buffers.add(c.flatbushData);
843
+ }
844
+ return [...buffers];
845
+ }