@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
package/esm/ui/colors.js CHANGED
@@ -1,4 +1,8 @@
1
- import { relight } from '../util/color/index.js';
1
+ import * as convert from '../util/color-bits/convert.js';
2
+ import { NO_CATEGORY_COLOR, relight } from '../util/color/index.js';
3
+ import { cssColorToNormalizedRgb } from '../util/colorBits.js';
4
+ import { isCssColor } from '../util/cssColorParse.js';
5
+ import { valueText } from '../util/groupKeys.js';
2
6
  const category10 = [
3
7
  '#1f77b4',
4
8
  '#ff7f0e',
@@ -108,10 +112,149 @@ export const paletteColors = {
108
112
  * Past the end is the caller's problem, and the two callers answer differently
109
113
  * on purpose: an attribute palette-by hashes the VALUE (stable across
110
114
  * re-palettes), while a by-position painter has no value to hash and wraps.
115
+ *
116
+ * **It holds 14 pairs `similarColors` calls the same** — five schemes' blues,
117
+ * oranges, greens, reds and pinks — and deduping it at construction is the
118
+ * wrong reading of that, measured on the 38 GENCODE gene biotypes. Hashed,
119
+ * which is what a track with no `colorDomain` does, 30 of them land on 22
120
+ * colors and 38 on 26; the loss is the birthday collision on 40 slots, not the
121
+ * near-twins, and only 3 of the pairs they land on read alike. Pruning to the
122
+ * 30 distinct entries makes that 23 and 24, so it costs ten colors and buys
123
+ * nothing.
124
+ *
125
+ * The near-twins bite the PINNED case instead, where a `domain` spends the
126
+ * list in order: 30 listed values take 30 colors today and 7 of those pairs
127
+ * read alike. Ordering the distinct 30 first and the twins behind them fixes
128
+ * that outright (0 pairs at 30 listed values, 11 at 38 where the twins are
129
+ * reached anyway) and costs no colors — but it moves every hashed color in
130
+ * marks, GWAS, canvas, multi-row and the arrangement dialog, so it is a pass
131
+ * with a figure refresh in it.
111
132
  */
112
133
  export const categoricalPalette = [
113
134
  ...new Set([...tableau10, ...set1, ...dark2, ...set2, ...category10].filter(hex => !NEUTRALS.has(hex.toLowerCase()))),
114
135
  ];
136
+ export function categoricalValueColor(value, palette = categoricalPalette) {
137
+ return palette[valueSlot(value, palette.length)];
138
+ }
139
+ function valueSlot(value, n) {
140
+ const num = Number(value);
141
+ return value !== '' && Number.isInteger(num) && num >= 0
142
+ ? (num + n - 1) % n
143
+ : hashString(value) % n;
144
+ }
145
+ function entryKey(entry) {
146
+ return typeof entry === 'string' ? entry.toLowerCase() : entry;
147
+ }
148
+ // The first slot derived from the value that `taken` does not hold, trying
149
+ // rehashes before walking, so the values landing on a taken slot spread over
150
+ // the free ones instead of piling onto the next.
151
+ function freeSlot(value, size, taken) {
152
+ let slot = valueSlot(value, size);
153
+ for (let salt = 1; taken.has(slot) && salt <= size; salt++) {
154
+ slot = hashString(`${salt}:${value}`) % size;
155
+ }
156
+ for (let step = 0; taken.has(slot) && step < size; step++) {
157
+ slot = (slot + 1) % size;
158
+ }
159
+ return slot;
160
+ }
161
+ /**
162
+ * The categorical rule every scaled channel resolves through. With no
163
+ * `domain` a value takes `categoricalValueColor`'s slot in `range`. With one,
164
+ * the listed values take `range` in order, continuing into the `fallback`
165
+ * entries `range` lacks past its end, and any other value takes a slot of the
166
+ * whole list derived from itself that no listed value holds, nor one
167
+ * `isNear` calls the same. A value's entry depends only on the value and the
168
+ * declaration, so every region agrees on it, and adding a listed value moves
169
+ * only the unlisted values on the slots it takes.
170
+ */
171
+ export function categoricalScale(domain, range, { fallback = [], isNear, } = {}) {
172
+ const base = range.length ? range : fallback;
173
+ const listed = [...new Set((domain ?? []).map(String))].filter(v => v !== '');
174
+ if (listed.length === 0) {
175
+ return value => base[valueSlot(value, base.length)];
176
+ }
177
+ const seen = new Set(base.map(entryKey));
178
+ const entries = [
179
+ ...base,
180
+ ...fallback.filter(entry => {
181
+ const key = entryKey(entry);
182
+ return seen.has(key) ? false : (seen.add(key), true);
183
+ }),
184
+ ];
185
+ const size = entries.length;
186
+ const rank = new Map(listed.map((value, i) => [value, i]));
187
+ const listedSlots = new Set(listed.map((_, i) => i % size));
188
+ const taken = new Set(entries.flatMap((entry, i) => listedSlots.has(i) ||
189
+ (isNear && [...listedSlots].some(j => isNear(entries[j], entry)))
190
+ ? [i]
191
+ : []));
192
+ return value => {
193
+ const i = rank.get(value);
194
+ return entries[i !== undefined
195
+ ? i % size
196
+ : taken.size < size
197
+ ? freeSlot(value, size, taken)
198
+ : valueSlot(value, size)];
199
+ };
200
+ }
201
+ const oklabByColor = new Map();
202
+ function oklabOf(color) {
203
+ let lab = oklabByColor.get(color);
204
+ if (lab === undefined) {
205
+ lab = convert.xyzd65ToOklab(...convert.xyzd50ToD65(...convert.srgbToXyzd50(...cssColorToNormalizedRgb(color))));
206
+ oklabByColor.set(color, lab);
207
+ }
208
+ return lab;
209
+ }
210
+ /**
211
+ * Whether two CSS colors read as one: under 0.05 apart in OKLab, where the
212
+ * wide palette's tableau and category10 oranges sit 0.003 apart.
213
+ */
214
+ export function similarColors(a, b) {
215
+ const [l1, a1, b1] = oklabOf(a);
216
+ const [l2, a2, b2] = oklabOf(b);
217
+ return Math.hypot(l1 - l2, a1 - a2, b1 - b2) < 0.05;
218
+ }
219
+ /**
220
+ * `categoricalScale` for a color channel: `palette` (the wide palette when
221
+ * empty) spent in `domain` order and continued into the wide palette, and an
222
+ * unlisted value never on a listed value's color or one that reads the same.
223
+ */
224
+ export function categoricalColorScale(domain, palette = []) {
225
+ return categoricalScale(domain, palette, {
226
+ fallback: categoricalPalette,
227
+ isNear: similarColors,
228
+ });
229
+ }
230
+ const MAX_CACHED_SCALES = 16;
231
+ const scaleCache = new Map();
232
+ function cachedColorScale(domain, palette) {
233
+ const key = `${domain.join('\u001F')}\u001E${palette.join('\u001F')}`;
234
+ let scale = scaleCache.get(key);
235
+ if (scale === undefined) {
236
+ if (scaleCache.size >= MAX_CACHED_SCALES) {
237
+ scaleCache.delete(scaleCache.keys().next().value);
238
+ }
239
+ scale = categoricalColorScale(domain, palette);
240
+ scaleCache.set(key, scale);
241
+ }
242
+ return scale;
243
+ }
244
+ /**
245
+ * The color one value of a categorical color channel paints, by
246
+ * `categoricalColorScale`. A value-less feature is neutral grey, and an array
247
+ * value joins the way a group key does.
248
+ */
249
+ export function categoricalColor(value, domain = [], palette = []) {
250
+ const label = valueText(value);
251
+ if (label === '') {
252
+ return NO_CATEGORY_COLOR;
253
+ }
254
+ return domain.length === 0 && palette.length === 0
255
+ ? categoricalValueColor(label)
256
+ : cachedColorScale(domain, palette)(label);
257
+ }
115
258
  // only category10 and set1 are imported by name; the rest are reached through
116
259
  // paletteColors above
117
260
  /**
@@ -198,4 +341,90 @@ export function refNameColor(name, position) {
198
341
  ? refNameColorHexes[hashString(name) % refNameColorHexes.length]
199
342
  : refNamePaletteColorAt(position);
200
343
  }
344
+ // The four below are as their sources publish them less the black or grey,
345
+ // which reads as "no value" on a fill (see NEUTRALS).
346
+ // Okabe & Ito, "Color Universal Design" (2008), jfly.uni-koeln.de/color
347
+ const okabeIto = [
348
+ '#e69f00',
349
+ '#56b4e9',
350
+ '#009e73',
351
+ '#f0e442',
352
+ '#0072b2',
353
+ '#d55e00',
354
+ '#cc79a7',
355
+ ];
356
+ // Paul Tol, "Colour Schemes", SRON/EPS/TN/09-002 (2021), the bright scheme
357
+ const tolBright = [
358
+ '#4477aa',
359
+ '#ee6677',
360
+ '#228833',
361
+ '#ccbb44',
362
+ '#66ccee',
363
+ '#aa3377',
364
+ ];
365
+ // Paul Tol, "Colour Schemes", SRON/EPS/TN/09-002 (2021), the muted scheme
366
+ const tolMuted = [
367
+ '#cc6677',
368
+ '#332288',
369
+ '#ddcc77',
370
+ '#117733',
371
+ '#88ccee',
372
+ '#882255',
373
+ '#44aa99',
374
+ '#999933',
375
+ '#aa4499',
376
+ ];
377
+ // Tableau 20, Tableau 10.0's paired palette (Maureen Stone, 2016)
378
+ const tableau20 = [
379
+ '#4e79a7',
380
+ '#a0cbe8',
381
+ '#f28e2b',
382
+ '#ffbe7d',
383
+ '#59a14f',
384
+ '#8cd17d',
385
+ '#b6992d',
386
+ '#f1ce63',
387
+ '#499894',
388
+ '#86bcb6',
389
+ '#e15759',
390
+ '#ff9d9a',
391
+ '#d37295',
392
+ '#fabfd2',
393
+ '#b07aa1',
394
+ '#d4a6c8',
395
+ '#9d7660',
396
+ '#d7b5a6',
397
+ ];
398
+ /** The palettes a capture run can deal the rows from by name (`paletteFromSpec`). */
399
+ const namedPalettes = {
400
+ set1: () => set1,
401
+ categoricalPalette: () => categoricalPalette,
402
+ tableau10: () => tableau10,
403
+ // ColorBrewer Set2, which d3-scale-chromatic publishes as schemeSet2
404
+ schemeSet2: () => set2,
405
+ okabeIto: () => okabeIto,
406
+ tolBright: () => tolBright,
407
+ tolMuted: () => tolMuted,
408
+ tableau20: () => tableau20,
409
+ // every lap `refNamePaletteColorAt` re-lights category10 through
410
+ relit: () => Array.from({ length: refNameColorHexes.length * PALETTE_LAP_TONES.length }, (_, i) => refNamePaletteColorAt(i)),
411
+ };
412
+ /**
413
+ * A palette named in `namedPalettes`, or a comma-separated list of CSS
414
+ * colours; undefined, with a warning, for anything else.
415
+ */
416
+ export function paletteFromSpec(spec) {
417
+ if (typeof spec !== 'string' || spec === '') {
418
+ return undefined;
419
+ }
420
+ if (Object.hasOwn(namedPalettes, spec)) {
421
+ return namedPalettes[spec]();
422
+ }
423
+ const colors = spec.split(/,(?![^(]*\))/).map(c => c.trim());
424
+ if (colors.every(isCssColor)) {
425
+ return colors;
426
+ }
427
+ console.warn(`palette "${spec}" is neither one of ${Object.keys(namedPalettes).join(', ')} nor a comma-separated list of CSS colours`);
428
+ return undefined;
429
+ }
201
430
  export { category10, set1 };
@@ -5,7 +5,19 @@ import type { CSSProperties } from 'react';
5
5
  * washes them out.
6
6
  *
7
7
  * One definition because the alternative was proven to fail: `highlightBoxColors`
8
- * exists for the same reason, after two backends drifted apart on their own alpha
9
- * literals kept in step by a comment.
8
+ * below exists for the same reason, after two backends drifted apart on their own
9
+ * alpha literals kept in step by a comment.
10
10
  */
11
11
  export declare const hoverBoxStyle: CSSProperties;
12
+ /**
13
+ * The border and fill of a pinned highlight box, off the palette's highlight
14
+ * hue. The chrome draws it on screen and `renderDisplaySvg` bakes it into the
15
+ * export, so both reach one definition.
16
+ *
17
+ * JBrowse's own `alpha`, not Material UI's: the SVG export reaches this module
18
+ * and should not drag @mui/material along.
19
+ */
20
+ export declare function highlightBoxColors(highlightMain: string): {
21
+ border: string;
22
+ fill: string;
23
+ };
@@ -1,13 +1,28 @@
1
+ import { alpha } from './palette.js';
1
2
  /**
2
3
  * The hover mark for a cell or block on a canvas display: a white wash plus a
3
4
  * dark border, never a color tint — the cell colors are the data, and a tint
4
5
  * washes them out.
5
6
  *
6
7
  * One definition because the alternative was proven to fail: `highlightBoxColors`
7
- * exists for the same reason, after two backends drifted apart on their own alpha
8
- * literals kept in step by a comment.
8
+ * below exists for the same reason, after two backends drifted apart on their own
9
+ * alpha literals kept in step by a comment.
9
10
  */
10
11
  export const hoverBoxStyle = {
11
12
  border: '1px solid rgba(0,0,0,0.5)',
12
13
  background: 'rgba(255,255,255,0.3)',
13
14
  };
15
+ /**
16
+ * The border and fill of a pinned highlight box, off the palette's highlight
17
+ * hue. The chrome draws it on screen and `renderDisplaySvg` bakes it into the
18
+ * export, so both reach one definition.
19
+ *
20
+ * JBrowse's own `alpha`, not Material UI's: the SVG export reaches this module
21
+ * and should not drag @mui/material along.
22
+ */
23
+ export function highlightBoxColors(highlightMain) {
24
+ return {
25
+ border: alpha(highlightMain, 0.9),
26
+ fill: alpha(highlightMain, 0.25),
27
+ };
28
+ }
package/esm/ui/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { type JBrowseTheme, type SerializableThemeArgs, type ThemeMap, colorFwdStrand, colorInterchrom, colorLongInsert, colorLongreadInv, colorNeutralRead, colorPairLL, colorPairLR, colorPairLRDark, colorPairRL, colorPairRR, colorRevStrand, colorShortInsert, colorSplitReadInversion, colorSupplementary, colorUnmappedMate, colorUnmappedMateDark, createJBrowseBaseTheme, createJBrowseTheme, createJBrowseThemeFromArgs, defaultThemes, methylated5hmC, methylated5mC, tagColorPalette, unmethylated5mC, } from './theme.ts';
1
+ export { type JBrowseTheme, type SerializableThemeArgs, type ThemeMap, colorFwdStrand, colorInterchrom, colorLongInsert, colorLongreadInv, colorPairLL, colorPairLR, colorPairLRDark, colorPairRL, colorPairRR, colorRevStrand, colorShortInsert, colorSplitReadInversion, colorSupplementary, colorUnmappedMate, colorUnmappedMateDark, createJBrowseBaseTheme, createJBrowseTheme, createJBrowseThemeFromArgs, defaultThemes, methylated5hmC, methylated5mC, tagColorPalette, unmethylated5mC, } from './theme.ts';
2
2
  export { default as BaseExportSvgDialog } from './BaseExportSvgDialog.tsx';
3
3
  export type { BaseExportSvgOptions } from './BaseExportSvgDialog.tsx';
4
4
  export { default as ExportSvgDialog } from './ExportSvgDialog.tsx';
@@ -8,7 +8,8 @@ export { default as AssemblySelector } from './AssemblySelector.tsx';
8
8
  export { useAssemblySelection } from './useAssemblySelection.ts';
9
9
  export { useRecentLocations } from './useRecentLocations.ts';
10
10
  export type { RecentLocation } from './useRecentLocations.ts';
11
- export { RefNameAutocompleteEndAdornment, adornmentReservePx, getInputWidth, default as RefNameAutocomplete, } from './RefNameAutocomplete/index.tsx';
11
+ export { RefNameAutocompleteEndAdornment, default as RefNameAutocomplete, } from './RefNameAutocomplete/index.tsx';
12
+ export { adornmentReservePx, getInputWidth, } from './RefNameAutocomplete/util.ts';
12
13
  export { default as CascadingMenu } from './CascadingMenu.tsx';
13
14
  export { default as CascadingMenuButton } from './CascadingMenuButton.tsx';
14
15
  export { default as ContextMenu } from './ContextMenu.tsx';
@@ -37,7 +38,7 @@ export { default as MonospaceTextField } from './MonospaceTextField.tsx';
37
38
  export { default as ShareLinkField } from './ShareLinkField.tsx';
38
39
  export { default as SingleSlider } from './SingleSlider.tsx';
39
40
  export { default as SliderTooltip } from './SliderTooltip.tsx';
40
- export { makePromotableSizeMenu, makeSizeMenu, makeSizeSubMenu, } from './makeSizeMenu.tsx';
41
+ export { makeSizeMenu, makeSizeSubMenu } from './makeSizeMenu.tsx';
41
42
  export { INLINE_MENU_ROW_WIDTH, ResetToDefaultButton, } from './InlineMenuControls.tsx';
42
43
  export { sliderScale } from './sliderScale.ts';
43
44
  export type { SliderScale } from './sliderScale.ts';
@@ -48,6 +49,7 @@ export { default as StatusProgressBar } from './StatusProgressBar.tsx';
48
49
  export { default as Menu } from './Menu.tsx';
49
50
  export { default as PrerenderedCanvas } from './PrerenderedCanvas.tsx';
50
51
  export { default as ResizeHandle } from './ResizeHandle.tsx';
52
+ export { default as ScrollChrome } from './ScrollChrome.tsx';
51
53
  export { default as ScrollEdgeShadow } from './ScrollEdgeShadow.tsx';
52
54
  export { default as VerticalScrollbar } from './VerticalScrollbar.tsx';
53
55
  export { default as SubmitDialog } from './SubmitDialog.tsx';
@@ -59,6 +61,7 @@ export { default as SettingsChangesTable } from './SettingsChangesTable.tsx';
59
61
  export { default as ActionLink } from './ActionLink.tsx';
60
62
  export { default as ExternalLink } from './ExternalLink.tsx';
61
63
  export { default as SanitizedHTML } from './SanitizedHTML.tsx';
64
+ export { default as BaseTooltip } from './LazyBaseTooltip.tsx';
62
65
  export { default as PluggableComponent } from './PluggableComponent.tsx';
63
66
  export { default as PluggableComponents } from './PluggableComponents.tsx';
64
67
  export type { ComponentExtensionPointName } from './PluggableComponents.tsx';
@@ -70,23 +73,20 @@ export type { SlotExtensionPointName, SlotProps, WrapperProps, } from './wrapCom
70
73
  export { matchesTrackSelector } from './extensionSelectors.ts';
71
74
  export type { TrackSelector } from './extensionSelectors.ts';
72
75
  export type { BaseMenuItem, CheckboxMenuItem, ClickableMenuItem, CustomMenuItem, MenuDivider, MenuItem, MenuItemClickHandler, MenuItemsGetter, MenuSubHeader, NormalMenuItem, RadioMenuItem, SubMenuItem, } from './MenuTypes.ts';
73
- export { staysOpenOnClick } from './MenuTypes.ts';
76
+ export { resolveSubMenu, staysOpenOnClick } from './MenuTypes.ts';
74
77
  export { LAUNCH_LABEL, pushIntoSubMenu, pushLaunchViewMenuItem, } from './launchViewMenu.ts';
75
78
  export { launchTargetsMenuItem } from './launchTargetsMenuItem.ts';
76
79
  export { default as Crosshairs } from './Crosshairs.tsx';
77
80
  export { hoverBoxStyle } from './hoverBoxStyle.ts';
78
81
  export { useMouseState, useMouseTracking } from './useMouseTracking.ts';
79
82
  export type { MouseState, MouseTracker } from './useMouseTracking.ts';
80
- export { PinAdornment } from './PinAdornment.tsx';
81
- export { promotableRadioItem, promotableRadioItems, promotableToggleItem, } from './promotableMenuItems.ts';
82
- export { displayTypesWithPromotableSlots, promotableSlotsWithoutPin, } from './promotablePinCoverage.ts';
83
- export declare const VIEW_HEADER_HEIGHT = 28;
84
- export { GRADIENT_LEGEND_HEIGHT, GRADIENT_LEGEND_SVG_AREA_WIDTH, GRADIENT_LEGEND_WIDTH, default as SvgGradientLegend, } from './SvgGradientLegend.tsx';
85
- export type { GradientLabel, GradientStop } from './SvgGradientLegend.tsx';
86
- export { LEGEND_ROW_HEIGHT, LEGEND_SWATCH, default as SvgColorLegend, } from './SvgColorLegend.tsx';
83
+ export { VIEW_HEADER_HEIGHT } from './viewHeaderHeight.ts';
84
+ export { LEGEND_ROW_HEIGHT, LEGEND_SVG_GUTTER_WIDTH, LEGEND_SWATCH, default as SvgColorLegend, } from './SvgColorLegend.tsx';
87
85
  export type { ColorLegendEntry } from './SvgColorLegend.tsx';
88
86
  export { measureLegendText } from './measureLegendText.ts';
89
87
  export { LegendSwatchGlyph } from './LegendSwatchGlyph.tsx';
90
88
  export { MAX_LEGEND_ITEMS, legendEntries, legendIsReadable, legendSwatches, nonEmptyLegendSections, } from './legendSpec.ts';
91
- export type { LegendItem, LegendMark, LegendSection, LegendSpec, LegendSwatch, } from './legendSpec.ts';
89
+ export type { LegendGradient, LegendItem, LegendSection, LegendSpec, LegendSwatch, } from './legendSpec.ts';
90
+ export { colorScaleIsEmpty, legendSpecOf } from './colorScale.ts';
91
+ export type { CategoricalEntry, CategoricalScale, ColorScale, RampScale, RampStop, } from './colorScale.ts';
92
92
  export { checkboxItem, radioItems } from './toggleMenuItems.ts';
package/esm/ui/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { colorFwdStrand, colorInterchrom, colorLongInsert, colorLongreadInv, colorNeutralRead, colorPairLL, colorPairLR, colorPairLRDark, colorPairRL, colorPairRR, colorRevStrand, colorShortInsert, colorSplitReadInversion, colorSupplementary, colorUnmappedMate, colorUnmappedMateDark, createJBrowseBaseTheme, createJBrowseTheme, createJBrowseThemeFromArgs, defaultThemes, methylated5hmC, methylated5mC, tagColorPalette, unmethylated5mC, } from './theme.js';
1
+ export { colorFwdStrand, colorInterchrom, colorLongInsert, colorLongreadInv, colorPairLL, colorPairLR, colorPairLRDark, colorPairRL, colorPairRR, colorRevStrand, colorShortInsert, colorSplitReadInversion, colorSupplementary, colorUnmappedMate, colorUnmappedMateDark, createJBrowseBaseTheme, createJBrowseTheme, createJBrowseThemeFromArgs, defaultThemes, methylated5hmC, methylated5mC, tagColorPalette, unmethylated5mC, } from './theme.js';
2
2
  export { default as BaseExportSvgDialog } from './BaseExportSvgDialog.js';
3
3
  export { default as ExportSvgDialog } from './ExportSvgDialog.js';
4
4
  export { useExportSvgPreference } from './useExportSvgPreference.js';
@@ -6,7 +6,8 @@ export { LogoFull, Logomark } from './Logo.js';
6
6
  export { default as AssemblySelector } from './AssemblySelector.js';
7
7
  export { useAssemblySelection } from './useAssemblySelection.js';
8
8
  export { useRecentLocations } from './useRecentLocations.js';
9
- export { RefNameAutocompleteEndAdornment, adornmentReservePx, getInputWidth, default as RefNameAutocomplete, } from './RefNameAutocomplete/index.js';
9
+ export { RefNameAutocompleteEndAdornment, default as RefNameAutocomplete, } from './RefNameAutocomplete/index.js';
10
+ export { adornmentReservePx, getInputWidth, } from './RefNameAutocomplete/util.js';
10
11
  export { default as CascadingMenu } from './CascadingMenu.js';
11
12
  export { default as CascadingMenuButton } from './CascadingMenuButton.js';
12
13
  export { default as ContextMenu } from './ContextMenu.js';
@@ -34,7 +35,7 @@ export { default as MonospaceTextField } from './MonospaceTextField.js';
34
35
  export { default as ShareLinkField } from './ShareLinkField.js';
35
36
  export { default as SingleSlider } from './SingleSlider.js';
36
37
  export { default as SliderTooltip } from './SliderTooltip.js';
37
- export { makePromotableSizeMenu, makeSizeMenu, makeSizeSubMenu, } from './makeSizeMenu.js';
38
+ export { makeSizeMenu, makeSizeSubMenu } from './makeSizeMenu.js';
38
39
  export { INLINE_MENU_ROW_WIDTH, ResetToDefaultButton, } from './InlineMenuControls.js';
39
40
  export { sliderScale } from './sliderScale.js';
40
41
  export { default as ErrorBar } from './ErrorBar.js';
@@ -44,6 +45,7 @@ export { default as StatusProgressBar } from './StatusProgressBar.js';
44
45
  export { default as Menu } from './Menu.js';
45
46
  export { default as PrerenderedCanvas } from './PrerenderedCanvas.js';
46
47
  export { default as ResizeHandle } from './ResizeHandle.js';
48
+ export { default as ScrollChrome } from './ScrollChrome.js';
47
49
  export { default as ScrollEdgeShadow } from './ScrollEdgeShadow.js';
48
50
  export { default as VerticalScrollbar } from './VerticalScrollbar.js';
49
51
  export { default as SubmitDialog } from './SubmitDialog.js';
@@ -55,37 +57,27 @@ export { default as SettingsChangesTable } from './SettingsChangesTable.js';
55
57
  export { default as ActionLink } from './ActionLink.js';
56
58
  export { default as ExternalLink } from './ExternalLink.js';
57
59
  export { default as SanitizedHTML } from './SanitizedHTML.js';
58
- // BaseTooltip is deliberately NOT re-exported here: it reaches @floating-ui
59
- // (~266KB), and this barrel is imported by eager plugin entries, so the
60
- // re-export alone held that dependency on the startup path. Every consumer
61
- // deep-imports '@jbrowse/core/ui/BaseTooltip' instead.
60
+ // The eager BaseTooltip reaches @floating-ui (~266KB), and this barrel is
61
+ // imported by eager plugin entries, so the barrel serves the lazy wrapper:
62
+ // published apollo reads `BaseTooltip` off the served ui namespace. In-tree
63
+ // consumers deep-import '@jbrowse/core/ui/BaseTooltip'.
64
+ export { default as BaseTooltip } from './LazyBaseTooltip.js';
62
65
  export { default as PluggableComponent } from './PluggableComponent.js';
63
66
  export { default as PluggableComponents } from './PluggableComponents.js';
64
67
  export { default as PluggableElements } from './PluggableElements.js';
65
68
  export { addExtensionElement } from './addExtensionElement.js';
66
69
  export { wrapComponent } from './wrapComponent.js';
67
70
  export { matchesTrackSelector } from './extensionSelectors.js';
68
- export { staysOpenOnClick } from './MenuTypes.js';
71
+ export { resolveSubMenu, staysOpenOnClick } from './MenuTypes.js';
69
72
  export { LAUNCH_LABEL, pushIntoSubMenu, pushLaunchViewMenuItem, } from './launchViewMenu.js';
70
73
  export { launchTargetsMenuItem } from './launchTargetsMenuItem.js';
71
74
  export { default as Crosshairs } from './Crosshairs.js';
72
75
  export { hoverBoxStyle } from './hoverBoxStyle.js';
73
76
  export { useMouseState, useMouseTracking } from './useMouseTracking.js';
74
- export { PinAdornment } from './PinAdornment.js';
75
- export { promotableRadioItem, promotableRadioItems, promotableToggleItem, } from './promotableMenuItems.js';
76
- // Not on the React-free `menuItems.ts` entry beside the two builders above: this
77
- // reads a config's slot table, so it pulls `configuration/promotableSlots.ts`
78
- // in, and that entry exists precisely to stay out of every plugin's eager graph.
79
- //
80
- // `pinnedSlots`, the walk underneath it, stays module-private: the question a
81
- // caller has is "which promotable slots does this menu miss", and answering the
82
- // half of it that lists what a menu *does* offer needs the schema's slot table
83
- // to mean anything.
84
- export { displayTypesWithPromotableSlots, promotableSlotsWithoutPin, } from './promotablePinCoverage.js';
85
- export const VIEW_HEADER_HEIGHT = 28;
86
- export { GRADIENT_LEGEND_HEIGHT, GRADIENT_LEGEND_SVG_AREA_WIDTH, GRADIENT_LEGEND_WIDTH, default as SvgGradientLegend, } from './SvgGradientLegend.js';
87
- export { LEGEND_ROW_HEIGHT, LEGEND_SWATCH, default as SvgColorLegend, } from './SvgColorLegend.js';
77
+ export { VIEW_HEADER_HEIGHT } from './viewHeaderHeight.js';
78
+ export { LEGEND_ROW_HEIGHT, LEGEND_SVG_GUTTER_WIDTH, LEGEND_SWATCH, default as SvgColorLegend, } from './SvgColorLegend.js';
88
79
  export { measureLegendText } from './measureLegendText.js';
89
80
  export { LegendSwatchGlyph } from './LegendSwatchGlyph.js';
90
81
  export { MAX_LEGEND_ITEMS, legendEntries, legendIsReadable, legendSwatches, nonEmptyLegendSections, } from './legendSpec.js';
82
+ export { colorScaleIsEmpty, legendSpecOf } from './colorScale.js';
91
83
  export { checkboxItem, radioItems } from './toggleMenuItems.js';
@@ -8,9 +8,19 @@ export const LAUNCH_LABEL = 'Launch';
8
8
  // first time. What makes several plugins' contributions collect in one place
9
9
  // instead of each becoming its own top-level row, whatever order they ran in.
10
10
  export function pushIntoSubMenu(items, label, item) {
11
- const existing = items.find((i) => i.type === 'subMenu' && i.label === label);
11
+ // `'subMenu' in i`, not `i.type === 'subMenu'`: `type` is OPTIONAL on a
12
+ // submenu row and most of the tree omits it, so the type test would miss an
13
+ // existing group and push a second top-level row under the same label — two
14
+ // rows that then share a React key and an open/closed state.
15
+ const existing = items.find((i) => 'subMenu' in i && i.label === label);
12
16
  if (existing) {
13
- existing.subMenu.push(item);
17
+ const { subMenu } = existing;
18
+ if (typeof subMenu === 'function') {
19
+ existing.subMenu = () => [...subMenu(), item];
20
+ }
21
+ else {
22
+ subMenu.push(item);
23
+ }
14
24
  }
15
25
  else {
16
26
  items.push({ label, type: 'subMenu', subMenu: [item] });
@@ -28,9 +38,9 @@ export function pushIntoSubMenu(items, label, item) {
28
38
  // `rubberBandLaunchMenuItems()` on the linear genome view — because there the
29
39
  // grouping is the model's, not each contributor's, to do.
30
40
  //
31
- // Keeps its name while the label loses a word: this one is pinned by
32
- // `abiBaseline.json`, so a published plugin bundle reads it off the host at
33
- // module scope and a rename is `undefined` inside an already-shipped UMD.
41
+ // Keeps its name while the label loses a word: `@jbrowse/core/ui` serves it, so
42
+ // a published plugin bundle reads it off the host at module scope and a rename
43
+ // is `undefined` inside an already-shipped UMD.
34
44
  export function pushLaunchViewMenuItem(items, item) {
35
45
  pushIntoSubMenu(items, LAUNCH_LABEL, item);
36
46
  }
@@ -1,38 +1,16 @@
1
- import type { Pin } from '../configuration/promotablePin.ts';
2
1
  import type { MenuItem } from './MenuTypes.ts';
2
+ import type { SettingRowOptions } from './toggleMenuItems.ts';
3
3
  /**
4
- * The "Show legend" checkbox, which seven displays build by hand — Hi-C, LD,
5
- * alignments, LGVSynteny, multi-wiggle, multi-row features, both multi-sample
6
- * variant displays and the Manhattan plot.
4
+ * The "Show legend" checkbox behind `LegendMixin`'s row and the circular
5
+ * view's. Takes the value and the toggle, in `checkboxItem`'s order, which is
6
+ * all this adds a label to.
7
7
  *
8
- * Takes the value and the toggle rather than a `{ showLegend, setShowLegend }`
9
- * model, because the Manhattan plot's pair is named for the LD legend it draws
10
- * and would otherwise need an adapter object at the call site. Same argument
11
- * order as `checkboxItem`, which is all this adds a label to.
8
+ * The `showLegend` **config slots** stay per display: their default values
9
+ * legitimately differ (a Hi-C color scale is off by default, a variant genotype
10
+ * key on), and their descriptions describe genuinely different legends.
12
11
  *
13
- * The `showLegend` **config slots** stay per display: their `promotedBase`
14
- * values legitimately differ (a Hi-C color scale is off by default, a variant
15
- * genotype key on), and their descriptions describe genuinely different legends.
16
- * What they now share is being *promotable* — pass `opts.pin` and the row gains
17
- * the pin that makes the current state this display type's session-wide
18
- * default. Every display whose legend is backed by a config slot passes one,
19
- * and gets it from `LegendMixin`'s `showLegendDisplayTypeDefault` rather than
20
- * calling `makePin` itself: the slot is the per-display half, the accessors
21
- * over it are not.
22
- *
23
- * `pin` is optional because two callers have no slot to promote: the Manhattan
24
- * plot's LD legend and `LinearBasicDisplay`'s color key are a volatile and a
25
- * per-legend `dismissed` flag respectively, neither of which is config at all.
26
- * They get the plain row, which is what `checkboxItem` builds either way — the
27
- * promotable form is that same row plus the pin, per `promotableToggleItem`.
28
- *
29
- * Deliberately not used by `synteny-core`'s "Show color legend", which sits
30
- * inside a "Color by..." submenu where the bare word would not say which legend.
12
+ * `synteny-core`'s color-by legend has no toggle at all: it comes up with the
13
+ * modes that have a key and is dismissed from its own close button.
31
14
  */
32
15
  /** #menuBuilder showLegendCheckboxItem | the shared "Show legend" checkbox */
33
- export declare function showLegendCheckboxItem(checked: boolean, onToggle: () => void, opts?: {
34
- helpText?: string;
35
- disabled?: boolean;
36
- disabledHelpText?: string;
37
- pin?: Pin;
38
- }): MenuItem;
16
+ export declare function showLegendCheckboxItem(checked: boolean, onToggle: () => void, opts?: SettingRowOptions): MenuItem;
@@ -1,44 +1,17 @@
1
- import { promotableToggleItem } from './promotableMenuItems.js';
2
1
  import { checkboxItem } from './toggleMenuItems.js';
3
2
  /**
4
- * The "Show legend" checkbox, which seven displays build by hand — Hi-C, LD,
5
- * alignments, LGVSynteny, multi-wiggle, multi-row features, both multi-sample
6
- * variant displays and the Manhattan plot.
3
+ * The "Show legend" checkbox behind `LegendMixin`'s row and the circular
4
+ * view's. Takes the value and the toggle, in `checkboxItem`'s order, which is
5
+ * all this adds a label to.
7
6
  *
8
- * Takes the value and the toggle rather than a `{ showLegend, setShowLegend }`
9
- * model, because the Manhattan plot's pair is named for the LD legend it draws
10
- * and would otherwise need an adapter object at the call site. Same argument
11
- * order as `checkboxItem`, which is all this adds a label to.
7
+ * The `showLegend` **config slots** stay per display: their default values
8
+ * legitimately differ (a Hi-C color scale is off by default, a variant genotype
9
+ * key on), and their descriptions describe genuinely different legends.
12
10
  *
13
- * The `showLegend` **config slots** stay per display: their `promotedBase`
14
- * values legitimately differ (a Hi-C color scale is off by default, a variant
15
- * genotype key on), and their descriptions describe genuinely different legends.
16
- * What they now share is being *promotable* — pass `opts.pin` and the row gains
17
- * the pin that makes the current state this display type's session-wide
18
- * default. Every display whose legend is backed by a config slot passes one,
19
- * and gets it from `LegendMixin`'s `showLegendDisplayTypeDefault` rather than
20
- * calling `makePin` itself: the slot is the per-display half, the accessors
21
- * over it are not.
22
- *
23
- * `pin` is optional because two callers have no slot to promote: the Manhattan
24
- * plot's LD legend and `LinearBasicDisplay`'s color key are a volatile and a
25
- * per-legend `dismissed` flag respectively, neither of which is config at all.
26
- * They get the plain row, which is what `checkboxItem` builds either way — the
27
- * promotable form is that same row plus the pin, per `promotableToggleItem`.
28
- *
29
- * Deliberately not used by `synteny-core`'s "Show color legend", which sits
30
- * inside a "Color by..." submenu where the bare word would not say which legend.
11
+ * `synteny-core`'s color-by legend has no toggle at all: it comes up with the
12
+ * modes that have a key and is dismissed from its own close button.
31
13
  */
32
14
  /** #menuBuilder showLegendCheckboxItem | the shared "Show legend" checkbox */
33
15
  export function showLegendCheckboxItem(checked, onToggle, opts) {
34
- const { pin, ...rest } = opts ?? {};
35
- return pin
36
- ? promotableToggleItem({
37
- label: 'Show legend',
38
- checked,
39
- onToggle,
40
- pin,
41
- ...rest,
42
- })
43
- : checkboxItem('Show legend', checked, onToggle, rest);
16
+ return checkboxItem('Show legend', checked, onToggle, opts);
44
17
  }
@@ -1,8 +1,13 @@
1
- import type { ReactNode } from 'react';
2
- export type LegendMark = 'fill' | 'line' | 'curve';
1
+ import type { ShapeName } from '../util/markEncodingTypes.ts';
2
+ import type { RampStop } from './colorScale.ts';
3
3
  export interface LegendSwatch {
4
4
  color: string;
5
- mark?: LegendMark;
5
+ shape?: ShapeName;
6
+ }
7
+ export interface LegendGradient {
8
+ stops: RampStop[];
9
+ minLabel: string;
10
+ maxLabel: string;
6
11
  }
7
12
  export interface ColorLegendEntry {
8
13
  key: string;
@@ -10,12 +15,13 @@ export interface ColorLegendEntry {
10
15
  color?: string;
11
16
  swatches?: LegendSwatch[];
12
17
  hidden?: boolean;
13
- marker?: ReactNode;
18
+ gradient?: LegendGradient;
14
19
  }
15
20
  export interface LegendItem {
21
+ value?: string;
16
22
  color?: string;
17
- mark?: LegendMark;
18
23
  swatches?: LegendSwatch[];
24
+ gradient?: LegendGradient;
19
25
  label: string;
20
26
  hidden?: boolean;
21
27
  }
@@ -23,14 +29,15 @@ export declare function legendSwatches(item: LegendItem): LegendSwatch[];
23
29
  export interface LegendSection {
24
30
  id: string;
25
31
  title?: string;
32
+ note?: string;
26
33
  items: LegendItem[];
34
+ focusesRows?: boolean;
27
35
  }
28
36
  export interface LegendSpec {
29
37
  title?: string;
30
- items?: LegendItem[];
31
- sections?: LegendSection[];
38
+ sections: LegendSection[];
32
39
  }
33
- export declare function nonEmptyLegendSections({ items, sections }: LegendSpec): LegendSection[];
40
+ export declare function nonEmptyLegendSections(sections: readonly LegendSection[]): LegendSection[];
34
41
  export declare function legendEntries(spec: LegendSpec): ColorLegendEntry[];
35
42
  /**
36
43
  * How many rows a color key may have and still be one. Past this it is a list