@jbrowse/core 5.0.0-beta.11 → 5.0.0-beta.14

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 (439) hide show
  1. package/README.md +450 -132
  2. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
  3. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +4 -2
  4. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +6 -2
  5. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +18 -3
  6. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseAttributes.d.ts +2 -1
  7. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseAttributes.js +4 -2
  8. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.d.ts +2 -1
  9. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +4 -2
  10. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCoreDetails.d.ts +2 -1
  11. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCoreDetails.js +4 -2
  12. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +5 -4
  13. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +6 -4
  14. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +2 -1
  15. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +4 -2
  16. package/esm/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.d.ts +3 -2
  17. package/esm/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.js +4 -2
  18. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +2 -2
  19. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureWash.d.ts +3 -2
  20. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureWash.js +4 -2
  21. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +3 -2
  22. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +4 -2
  23. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldName.d.ts +3 -2
  24. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldName.js +4 -2
  25. package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.d.ts +3 -2
  26. package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +4 -2
  27. package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +3 -2
  28. package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +4 -2
  29. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
  30. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +4 -2
  31. package/esm/BaseFeatureWidget/BaseFeatureDetail/UriField.d.ts +3 -2
  32. package/esm/BaseFeatureWidget/BaseFeatureDetail/UriField.js +4 -2
  33. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceBody.d.ts +3 -2
  34. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceBody.js +4 -2
  35. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.d.ts +3 -1
  36. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.js +15 -24
  37. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.js +1 -1
  38. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceLegend.d.ts +3 -2
  39. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceLegend.js +4 -2
  40. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequencePanel.js +4 -4
  41. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/FeatureSequenceDialog.d.ts +3 -1
  42. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/FeatureSequenceDialog.js +2 -2
  43. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/HelpDialog.d.ts +3 -2
  44. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/HelpDialog.js +4 -2
  45. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.d.ts +1 -2
  46. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.js +2 -2
  47. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceTypeSelector.d.ts +1 -2
  48. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceTypeSelector.js +15 -36
  49. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.d.ts +3 -2
  50. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +4 -2
  51. package/esm/BaseFeatureWidget/SequenceFeatureDetails/featureTypeUtil.d.ts +4 -2
  52. package/esm/BaseFeatureWidget/SequenceFeatureDetails/featureTypeUtil.js +29 -20
  53. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +13 -1
  54. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +28 -1
  55. package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDNASequence.js +3 -3
  56. package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/SequenceDisplay.js +2 -2
  57. package/esm/BaseFeatureWidget/stateModelFactory.d.ts +9 -0
  58. package/esm/BaseFeatureWidget/stateModelFactory.js +11 -0
  59. package/esm/BaseFeatureWidget/types.d.ts +2 -0
  60. package/esm/PluginManager.d.ts +7 -3
  61. package/esm/PluginManager.js +12 -3
  62. package/esm/ReExports/coreModules.generated.js +538 -518
  63. package/esm/ReExports/coreWorkerModules.generated.js +456 -438
  64. package/esm/ReExports/lazify.js +3 -2
  65. package/esm/ReExports/list.js +22 -6
  66. package/esm/ReExports/names.d.ts +1 -0
  67. package/esm/ReExports/names.generated.d.ts +2 -0
  68. package/esm/ReExports/names.generated.js +566 -0
  69. package/esm/ReExports/names.js +3 -0
  70. package/esm/TextSearch/TextSearchManager.d.ts +3 -3
  71. package/esm/TextSearch/TextSearchManager.js +6 -13
  72. package/esm/assemblyManager/assembly.d.ts +9 -0
  73. package/esm/assemblyManager/assembly.js +13 -0
  74. package/esm/assemblyManager/assemblyConfigSchema.d.ts +6 -1
  75. package/esm/assemblyManager/assemblyConfigSchema.js +23 -22
  76. package/esm/assemblyManager/assemblyManager.d.ts +11 -0
  77. package/esm/assemblyManager/assemblyManager.js +2 -0
  78. package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +9 -0
  79. package/esm/assemblyManager/expandAssemblyConfigShorthand.js +23 -0
  80. package/esm/checkPlugins.js +10 -4
  81. package/esm/configuration/configurationSchema.d.ts +51 -100
  82. package/esm/configuration/configurationSchema.js +59 -225
  83. package/esm/configuration/configurationSchemaUnion.d.ts +2 -1
  84. package/esm/configuration/configurationSchemaUnion.js +2 -1
  85. package/esm/configuration/configurationSlot.d.ts +18 -64
  86. package/esm/configuration/configurationSlot.js +32 -98
  87. package/esm/configuration/fillLocations.d.ts +4 -2
  88. package/esm/configuration/fillLocations.js +9 -3
  89. package/esm/configuration/formatAboutConfigSchema.d.ts +2 -2
  90. package/esm/configuration/formatAboutConfigSchema.js +2 -2
  91. package/esm/configuration/formatDetailsConfigSchema.d.ts +2 -2
  92. package/esm/configuration/formatDetailsConfigSchema.js +7 -5
  93. package/esm/configuration/getConf.d.ts +7 -36
  94. package/esm/configuration/getConf.js +20 -41
  95. package/esm/configuration/index.d.ts +4 -3
  96. package/esm/configuration/index.js +3 -2
  97. package/esm/configuration/partitionAdvanced.d.ts +12 -0
  98. package/esm/configuration/partitionAdvanced.js +42 -0
  99. package/esm/configuration/plot.d.ts +6 -0
  100. package/esm/configuration/plot.js +56 -9
  101. package/esm/configuration/readConfObject.d.ts +15 -17
  102. package/esm/configuration/readConfObject.js +19 -50
  103. package/esm/configuration/schemaRegistry.d.ts +0 -2
  104. package/esm/configuration/schemaTypes.js +5 -1
  105. package/esm/configuration/slotFacade.js +2 -2
  106. package/esm/configuration/snapshotPreprocess.d.ts +42 -18
  107. package/esm/configuration/snapshotPreprocess.js +95 -37
  108. package/esm/configuration/tabixShorthand.js +1 -3
  109. package/esm/configuration/types.d.ts +60 -159
  110. package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +7 -0
  111. package/esm/data_adapters/BaseAdapter/BaseAdapter.js +7 -0
  112. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +0 -22
  113. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +0 -55
  114. package/esm/data_adapters/BaseAdapter/index.d.ts +0 -1
  115. package/esm/data_adapters/BaseAdapter/index.js +0 -1
  116. package/esm/data_adapters/BaseAdapter/rowSources.d.ts +2 -2
  117. package/esm/data_adapters/BaseAdapter/types.d.ts +1 -0
  118. package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +2 -0
  119. package/esm/data_adapters/CytobandAdapter/configSchema.js +5 -0
  120. package/esm/data_adapters/dataAdapterCache.d.ts +25 -13
  121. package/esm/data_adapters/dataAdapterCache.js +68 -24
  122. package/esm/data_adapters/getFeatureAdapter.d.ts +9 -0
  123. package/esm/data_adapters/getFeatureAdapter.js +17 -0
  124. package/esm/pluggableElementTypes/DisplayType.d.ts +7 -0
  125. package/esm/pluggableElementTypes/DisplayType.js +7 -0
  126. package/esm/pluggableElementTypes/RpcMethodType.d.ts +7 -0
  127. package/esm/pluggableElementTypes/RpcMethodType.js +9 -0
  128. package/esm/pluggableElementTypes/addMenuItems.d.ts +2 -1
  129. package/esm/pluggableElementTypes/addMenuItems.js +2 -1
  130. package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +2 -0
  131. package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.js +2 -0
  132. package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +40 -5
  133. package/esm/pluggableElementTypes/models/BaseDisplayModel.js +57 -9
  134. package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +5 -7
  135. package/esm/pluggableElementTypes/models/BaseTrackModel.js +9 -10
  136. package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +2 -0
  137. package/esm/pluggableElementTypes/models/BaseViewModel.js +2 -0
  138. package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +3 -0
  139. package/esm/pluggableElementTypes/models/InternetAccountModel.js +3 -0
  140. package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +3 -0
  141. package/esm/pluggableElementTypes/models/baseConnectionConfig.js +3 -0
  142. package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +3 -1
  143. package/esm/pluggableElementTypes/models/baseInternetAccountConfig.js +3 -1
  144. package/esm/pluggableElementTypes/models/baseTrackConfig.js +12 -1
  145. package/esm/pluggableElementTypes/models/components/SaveTrackData.js +2 -2
  146. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +1 -1
  147. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +1 -1
  148. package/esm/pluginDefinitions.d.ts +7 -0
  149. package/esm/pluginDefinitions.js +20 -0
  150. package/esm/rpc/RpcRegistry.d.ts +2 -11
  151. package/esm/rpc/byteBudget.d.ts +15 -0
  152. package/esm/rpc/byteBudget.js +23 -0
  153. package/esm/rpc/configSchema.d.ts +2 -0
  154. package/esm/rpc/configSchema.js +3 -1
  155. package/esm/rpc/coreRpcMethods.d.ts +1 -2
  156. package/esm/rpc/coreRpcMethods.js +1 -2
  157. package/esm/rpc/explainTransferError.js +3 -3
  158. package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +2 -2
  159. package/esm/rpc/methods/CoreGetEncodedLayers.js +7 -5
  160. package/esm/rpc/methods/CoreLoadTrackCode.d.ts +17 -0
  161. package/esm/rpc/methods/CoreLoadTrackCode.js +24 -0
  162. package/esm/rpc/methods/layerFeatures.d.ts +9 -6
  163. package/esm/rpc/methods/layerFeatures.js +21 -5
  164. package/esm/ui/ActionLink.d.ts +3 -2
  165. package/esm/ui/ActionLink.js +4 -2
  166. package/esm/ui/AddCustomPluginDialog.d.ts +3 -2
  167. package/esm/ui/AddCustomPluginDialog.js +6 -4
  168. package/esm/ui/AppLogo.js +43 -3
  169. package/esm/ui/BaseTooltip.d.ts +3 -2
  170. package/esm/ui/BaseTooltip.js +4 -2
  171. package/esm/ui/CascadingMenu.js +14 -12
  172. package/esm/ui/CascadingMenuButton.d.ts +2 -2
  173. package/esm/ui/CascadingMenuButton.js +5 -4
  174. package/esm/ui/CascadingMenuHelpDialog.d.ts +3 -2
  175. package/esm/ui/CascadingMenuHelpDialog.js +4 -2
  176. package/esm/ui/CascadingMenuHelpIconButton.d.ts +4 -3
  177. package/esm/ui/CascadingMenuHelpIconButton.js +9 -5
  178. package/esm/ui/ColorPicker.d.ts +5 -4
  179. package/esm/ui/ColorPicker.js +6 -4
  180. package/esm/ui/ContextMenu.d.ts +1 -1
  181. package/esm/ui/ContextMenu.js +1 -1
  182. package/esm/ui/CopyToClipboardButton.d.ts +3 -2
  183. package/esm/ui/CopyToClipboardButton.js +4 -2
  184. package/esm/ui/Crosshairs.js +13 -10
  185. package/esm/ui/DOMPurifySanitizedHTML.d.ts +3 -2
  186. package/esm/ui/DOMPurifySanitizedHTML.js +4 -2
  187. package/esm/ui/DataGridFlexContainer.d.ts +3 -2
  188. package/esm/ui/DataGridFlexContainer.js +4 -2
  189. package/esm/ui/Dialog.d.ts +1 -1
  190. package/esm/ui/Dialog.js +5 -4
  191. package/esm/ui/DropDownMenu.js +2 -2
  192. package/esm/ui/EditableTypography.d.ts +1 -1
  193. package/esm/ui/EditableTypography.js +3 -2
  194. package/esm/ui/ErrorActions.d.ts +3 -2
  195. package/esm/ui/ErrorActions.js +4 -2
  196. package/esm/ui/ErrorBanner.d.ts +2 -2
  197. package/esm/ui/ErrorBanner.js +3 -2
  198. package/esm/ui/ErrorBar.d.ts +3 -2
  199. package/esm/ui/ErrorBar.js +4 -2
  200. package/esm/ui/ErrorMessage.d.ts +3 -2
  201. package/esm/ui/ErrorMessage.js +4 -2
  202. package/esm/ui/ErrorMessageStackTraceContents.d.ts +3 -2
  203. package/esm/ui/ErrorMessageStackTraceContents.js +4 -2
  204. package/esm/ui/ErrorMessageStackTraceDialog.d.ts +3 -2
  205. package/esm/ui/ErrorMessageStackTraceDialog.js +4 -2
  206. package/esm/ui/ErrorOverlay.d.ts +3 -2
  207. package/esm/ui/ErrorOverlay.js +4 -2
  208. package/esm/ui/ExportSvgDialog.d.ts +3 -2
  209. package/esm/ui/ExportSvgDialog.js +4 -2
  210. package/esm/ui/ExternalLink.d.ts +2 -1
  211. package/esm/ui/ExternalLink.js +4 -2
  212. package/esm/ui/FactoryResetDialog.d.ts +3 -2
  213. package/esm/ui/FactoryResetDialog.js +4 -2
  214. package/esm/ui/FatalErrorDialog.d.ts +3 -2
  215. package/esm/ui/FatalErrorDialog.js +6 -4
  216. package/esm/ui/FileDropZone.d.ts +3 -2
  217. package/esm/ui/FileDropZone.js +4 -2
  218. package/esm/ui/FileSelector/LocalFileChooser.js +4 -4
  219. package/esm/ui/FileSelector/LocationInput.d.ts +3 -2
  220. package/esm/ui/FileSelector/LocationInput.js +4 -2
  221. package/esm/ui/FileSelector/SourceTypeSelector.d.ts +3 -2
  222. package/esm/ui/FileSelector/SourceTypeSelector.js +8 -6
  223. package/esm/ui/GpuFallbackButton.d.ts +3 -2
  224. package/esm/ui/GpuFallbackButton.js +4 -2
  225. package/esm/ui/HoverMenu.d.ts +2 -2
  226. package/esm/ui/HoverMenu.js +7 -3
  227. package/esm/ui/HoverTooltip.d.ts +3 -2
  228. package/esm/ui/HoverTooltip.js +4 -2
  229. package/esm/ui/Icons.d.ts +5 -5
  230. package/esm/ui/Icons.js +11 -10
  231. package/esm/ui/InlineMenuControls.d.ts +2 -2
  232. package/esm/ui/InlineMenuControls.js +4 -3
  233. package/esm/ui/JexlFilterRowEditors.d.ts +4 -4
  234. package/esm/ui/JexlFilterRowEditors.js +9 -8
  235. package/esm/ui/LabeledCheckbox.d.ts +3 -2
  236. package/esm/ui/LabeledCheckbox.js +4 -2
  237. package/esm/ui/LazyBaseTooltip.d.ts +12 -3
  238. package/esm/ui/LazyBaseTooltip.js +4 -2
  239. package/esm/ui/LegendSwatchGlyph.js +1 -0
  240. package/esm/ui/LoadingDots.d.ts +2 -1
  241. package/esm/ui/LoadingDots.js +4 -2
  242. package/esm/ui/LoadingEllipses.d.ts +5 -2
  243. package/esm/ui/LoadingEllipses.js +5 -3
  244. package/esm/ui/LoadingOverlay.d.ts +3 -2
  245. package/esm/ui/LoadingOverlay.js +4 -2
  246. package/esm/ui/LoadingProgress.d.ts +3 -2
  247. package/esm/ui/LoadingProgress.js +4 -2
  248. package/esm/ui/Logo.d.ts +2 -2
  249. package/esm/ui/Logo.js +9 -8
  250. package/esm/ui/MenuItemChevron.d.ts +2 -2
  251. package/esm/ui/MenuItemChevron.js +3 -2
  252. package/esm/ui/MenuItemEndDecoration.d.ts +2 -2
  253. package/esm/ui/MenuItemEndDecoration.js +3 -2
  254. package/esm/ui/MenuItemTrailing.d.ts +2 -2
  255. package/esm/ui/MenuItemTrailing.js +7 -6
  256. package/esm/ui/MenuTypes.d.ts +21 -1
  257. package/esm/ui/MenuTypes.js +20 -0
  258. package/esm/ui/MonospaceTextField.d.ts +3 -2
  259. package/esm/ui/MonospaceTextField.js +4 -2
  260. package/esm/ui/NumberTextField.d.ts +2 -2
  261. package/esm/ui/NumberTextField.js +4 -2
  262. package/esm/ui/PaletteContext.d.ts +11 -9
  263. package/esm/ui/PaletteContext.js +33 -18
  264. package/esm/ui/PluginStoreCard.d.ts +3 -2
  265. package/esm/ui/PluginStoreCard.js +4 -2
  266. package/esm/ui/PopoverPicker.d.ts +3 -2
  267. package/esm/ui/PopoverPicker.js +4 -2
  268. package/esm/ui/PrerenderedCanvas.d.ts +2 -2
  269. package/esm/ui/PrerenderedCanvas.js +3 -2
  270. package/esm/ui/RedErrorMessageBox.d.ts +3 -2
  271. package/esm/ui/RedErrorMessageBox.js +4 -2
  272. package/esm/ui/RefNameAutocomplete/EndAdornment.d.ts +3 -2
  273. package/esm/ui/RefNameAutocomplete/EndAdornment.js +4 -2
  274. package/esm/ui/RefNameAutocomplete/HelpDialog.d.ts +3 -2
  275. package/esm/ui/RefNameAutocomplete/HelpDialog.js +4 -2
  276. package/esm/ui/ReplaceCurrentViewButton.d.ts +3 -2
  277. package/esm/ui/ReplaceCurrentViewButton.js +4 -2
  278. package/esm/ui/ResizeHandle.d.ts +2 -2
  279. package/esm/ui/ResizeHandle.js +3 -2
  280. package/esm/ui/SanitizedHTML.d.ts +3 -2
  281. package/esm/ui/SanitizedHTML.js +6 -4
  282. package/esm/ui/ScrollChrome.d.ts +3 -2
  283. package/esm/ui/ScrollChrome.js +4 -2
  284. package/esm/ui/ScrollEdgeShadow.d.ts +2 -2
  285. package/esm/ui/ScrollEdgeShadow.js +2 -2
  286. package/esm/ui/SessionJsonPanel.d.ts +3 -2
  287. package/esm/ui/SessionJsonPanel.js +4 -2
  288. package/esm/ui/ShareLinkField.d.ts +3 -2
  289. package/esm/ui/ShareLinkField.js +4 -2
  290. package/esm/ui/SingleSlider.d.ts +2 -2
  291. package/esm/ui/SingleSlider.js +4 -2
  292. package/esm/ui/SliderTooltip.d.ts +2 -1
  293. package/esm/ui/SliderTooltip.js +4 -2
  294. package/esm/ui/SnackbarContents.d.ts +3 -2
  295. package/esm/ui/SnackbarContents.js +4 -2
  296. package/esm/ui/SnackbarModel.d.ts +2 -0
  297. package/esm/ui/SnackbarModel.js +2 -0
  298. package/esm/ui/StackTraceButton.d.ts +3 -2
  299. package/esm/ui/StackTraceButton.js +4 -2
  300. package/esm/ui/StatusProgressBar.d.ts +3 -2
  301. package/esm/ui/StatusProgressBar.js +4 -2
  302. package/esm/ui/SubmitForm.d.ts +2 -1
  303. package/esm/ui/SubmitForm.js +4 -2
  304. package/esm/ui/SvgColorLegend.d.ts +3 -4
  305. package/esm/ui/SvgColorLegend.js +27 -18
  306. package/esm/ui/TagTextField.d.ts +2 -2
  307. package/esm/ui/TagTextField.js +4 -2
  308. package/esm/ui/ViewLoadingScreen.d.ts +3 -2
  309. package/esm/ui/ViewLoadingScreen.js +4 -2
  310. package/esm/ui/buildExtraTrackMenuItems.d.ts +2 -2
  311. package/esm/ui/colorScale.d.ts +5 -1
  312. package/esm/ui/colorScale.js +12 -10
  313. package/esm/ui/colors.d.ts +42 -31
  314. package/esm/ui/colors.js +85 -48
  315. package/esm/ui/filterMenuItems.d.ts +10 -31
  316. package/esm/ui/filterMenuItems.js +13 -14
  317. package/esm/ui/index.d.ts +1 -1
  318. package/esm/ui/index.js +1 -1
  319. package/esm/ui/launchTargetsMenuItem.js +9 -13
  320. package/esm/ui/legendMenuItem.d.ts +4 -4
  321. package/esm/ui/legendMenuItem.js +4 -4
  322. package/esm/ui/menuItemAdornment.d.ts +1 -1
  323. package/esm/ui/menuItemAdornment.js +1 -1
  324. package/esm/ui/menuItems.d.ts +1 -1
  325. package/esm/ui/menuItems.js +1 -1
  326. package/esm/ui/menuLabels.d.ts +2 -2
  327. package/esm/ui/menuLabels.js +2 -2
  328. package/esm/ui/multiTrackMenuItems.d.ts +2 -2
  329. package/esm/ui/palette.d.ts +2 -2
  330. package/esm/ui/palette.js +10 -10
  331. package/esm/ui/radioSubMenu.d.ts +5 -3
  332. package/esm/ui/radioSubMenu.js +2 -2
  333. package/esm/ui/rampKey.d.ts +15 -0
  334. package/esm/ui/rampKey.js +17 -0
  335. package/esm/ui/showSubMenu.d.ts +0 -5
  336. package/esm/ui/showSubMenu.js +6 -15
  337. package/esm/ui/theme.d.ts +2 -2
  338. package/esm/ui/theme.js +1 -1
  339. package/esm/ui/useAssemblySelection.d.ts +2 -0
  340. package/esm/ui/useMouseTracking.d.ts +8 -20
  341. package/esm/ui/useMouseTracking.js +23 -62
  342. package/esm/ui/usePlacedMenuFocus.d.ts +19 -0
  343. package/esm/ui/usePlacedMenuFocus.js +28 -0
  344. package/esm/util/Base1DViewModel.d.ts +5 -3
  345. package/esm/util/Base1DViewModel.js +5 -3
  346. package/esm/util/SvgCanvas.js +1 -1
  347. package/esm/util/aggregateFieldName.d.ts +1 -10
  348. package/esm/util/aggregateFieldName.js +1 -8
  349. package/esm/util/alignedBytes.d.ts +19 -0
  350. package/esm/util/alignedBytes.js +37 -0
  351. package/esm/util/analytics.d.ts +6 -9
  352. package/esm/util/analytics.js +148 -15
  353. package/esm/util/bezierConnector.d.ts +20 -0
  354. package/esm/util/bezierConnector.js +34 -96
  355. package/esm/util/cacheBudgets.d.ts +3 -0
  356. package/esm/util/cacheBudgets.js +3 -0
  357. package/esm/util/categoricalField.d.ts +24 -4
  358. package/esm/util/categoricalField.js +38 -5
  359. package/esm/util/cellMatches.js +14 -14
  360. package/esm/util/cellsStep.d.ts +3 -5
  361. package/esm/util/cellsStep.js +31 -29
  362. package/esm/util/color/index.d.ts +1 -1
  363. package/esm/util/color/index.js +2 -2
  364. package/esm/util/color-bits/bit.js +1 -1
  365. package/esm/util/color-bits/parse.js +28 -17
  366. package/esm/util/colorBits.d.ts +15 -4
  367. package/esm/util/colorBits.js +38 -15
  368. package/esm/util/colorRamp.d.ts +3 -3
  369. package/esm/util/colorRamp.js +20 -2
  370. package/esm/util/colorScale.d.ts +123 -22
  371. package/esm/util/colorScale.js +157 -28
  372. package/esm/util/colorSchemes.d.ts +7 -3
  373. package/esm/util/colorSchemes.js +8 -2
  374. package/esm/util/createSvgRasterCanvas.d.ts +14 -1
  375. package/esm/util/createSvgRasterCanvas.js +36 -12
  376. package/esm/util/diagonalizeRegions.js +18 -9
  377. package/esm/util/featureTransforms.d.ts +2 -2
  378. package/esm/util/featureTransforms.js +85 -135
  379. package/esm/util/fileHandleStore.js +5 -0
  380. package/esm/util/groupKeys.d.ts +5 -4
  381. package/esm/util/groupKeys.js +15 -9
  382. package/esm/util/index.js +1 -1
  383. package/esm/util/installFetch.d.ts +2 -2
  384. package/esm/util/installPrerequisiteFetch.d.ts +8 -3
  385. package/esm/util/installPrerequisiteFetch.js +9 -7
  386. package/esm/util/io/RemoteFileWithRangeCache.d.ts +1 -1
  387. package/esm/util/io/RemoteFileWithRangeCache.js +1 -1
  388. package/esm/util/isoformRank.d.ts +39 -0
  389. package/esm/util/isoformRank.js +118 -0
  390. package/esm/util/jexl.js +1 -1
  391. package/esm/util/layouts/GranularRectLayout.d.ts +19 -3
  392. package/esm/util/layouts/GranularRectLayout.js +57 -34
  393. package/esm/util/leadingEdgeAutorun.d.ts +9 -1
  394. package/esm/util/leadingEdgeAutorun.js +5 -2
  395. package/esm/util/markEncoding.d.ts +10 -8
  396. package/esm/util/markEncoding.js +50 -12
  397. package/esm/util/markEncodingTypes.d.ts +77 -21
  398. package/esm/util/originCut.d.ts +14 -0
  399. package/esm/util/originCut.js +19 -0
  400. package/esm/util/paintLayer.d.ts +1 -1
  401. package/esm/util/paintLayer.js +4 -3
  402. package/esm/util/pathSeries.d.ts +18 -0
  403. package/esm/util/pathSeries.js +143 -0
  404. package/esm/util/pressOwner.d.ts +20 -0
  405. package/esm/util/pressOwner.js +26 -0
  406. package/esm/util/quantileExtent.d.ts +23 -1
  407. package/esm/util/quantileExtent.js +25 -2
  408. package/esm/util/rowStackGeometry.d.ts +1 -1
  409. package/esm/util/rowStackGeometry.js +1 -1
  410. package/esm/util/sessionActivity.d.ts +36 -0
  411. package/esm/util/sessionActivity.js +88 -0
  412. package/esm/util/stepOutputs.d.ts +165 -0
  413. package/esm/util/stepOutputs.js +201 -0
  414. package/esm/util/stepTables.d.ts +7 -3
  415. package/esm/util/stepTables.js +86 -3
  416. package/esm/util/systemColorScheme.d.ts +4 -0
  417. package/esm/util/systemColorScheme.js +21 -0
  418. package/esm/util/tabix.d.ts +1 -1
  419. package/esm/util/tabix.js +1 -1
  420. package/esm/util/temporaryAssembly.d.ts +2 -2
  421. package/esm/util/temporaryAssembly.js +2 -3
  422. package/esm/util/thresholdScale.d.ts +1 -1
  423. package/esm/util/thresholdScale.js +1 -1
  424. package/esm/util/trackConfigDelta.d.ts +1 -1
  425. package/esm/util/tracks.d.ts +25 -15
  426. package/esm/util/tracks.js +68 -44
  427. package/esm/util/types/index.d.ts +15 -7
  428. package/esm/util/types/index.js +21 -2
  429. package/esm/util/usePanZoom.js +4 -10
  430. package/esm/util/useRowVirtualScroll.d.ts +1 -0
  431. package/esm/util/windowStep.d.ts +6 -0
  432. package/esm/util/windowStep.js +153 -0
  433. package/package.json +27 -16
  434. package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +0 -40
  435. package/esm/data_adapters/BaseAdapter/featureDensity.js +0 -31
  436. package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +0 -11
  437. package/esm/rpc/methods/CoreGetFeatureDensity.js +0 -22
  438. package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +0 -13
  439. package/esm/rpc/methods/CoreLoadAdapterCode.js +0 -16
@@ -1,7 +1,9 @@
1
1
  import { ConfigurationSchema } from '../../configuration/index.js';
2
2
  /**
3
3
  * #config BaseInternetAccount
4
- * the "base" internet account type
4
+ * Holds an internet account's name and description, the domains it handles,
5
+ * and the request header it sends credentials in. Every internet account type
6
+ * has these slots.
5
7
  */
6
8
  export const BaseInternetAccountConfig = ConfigurationSchema('InternetAccount', {
7
9
  /**
@@ -162,7 +162,7 @@ export function createBaseTrackConfig(pluginManager) {
162
162
  },
163
163
  /**
164
164
  * #slot
165
- * where this track's data comes from. Its `type` names the adapter for
165
+ * The source of this track's data. Its `type` names the adapter for
166
166
  * the file format (`BamAdapter`, `Gff3TabixAdapter`, ...) and the rest of
167
167
  * the object is that adapter's own slots — see the adapter pages for
168
168
  * each. Most adapters also accept a `uri` shorthand in place of writing
@@ -177,6 +177,7 @@ export function createBaseTrackConfig(pluginManager) {
177
177
  type: 'stringArray',
178
178
  description: 'list of which feature attributes to index for text searching',
179
179
  defaultValue: ['Name', 'ID', 'symbol'],
180
+ advanced: true,
180
181
  },
181
182
  /**
182
183
  * #slot textSearching.indexingFeatureTypesToExclude
@@ -185,6 +186,7 @@ export function createBaseTrackConfig(pluginManager) {
185
186
  type: 'stringArray',
186
187
  description: 'list of feature types to exclude in text search index',
187
188
  defaultValue: ['CDS', 'exon'],
189
+ advanced: true,
188
190
  },
189
191
  /**
190
192
  * #slot textSearching.indexingFeatureTypesToInclude
@@ -207,6 +209,7 @@ export function createBaseTrackConfig(pluginManager) {
207
209
  type: 'stringArray',
208
210
  description: 'the only feature types to index; empty means index every type not excluded',
209
211
  defaultValue: [],
212
+ advanced: true,
210
213
  },
211
214
  /**
212
215
  * #slot textSearching.textSearchAdapter
@@ -255,5 +258,13 @@ export function createBaseTrackConfig(pluginManager) {
255
258
  */
256
259
  explicitIdentifier: 'trackId',
257
260
  explicitlyTyped: true,
261
+ closed: true,
262
+ // v1.3 wrote the text-search adapter and its attributes on the track,
263
+ // before `textSearching`
264
+ retired: {
265
+ rpcDriverName: () => ({}),
266
+ textSearchAdapter: () => ({}),
267
+ textSearchIndexingAttributes: () => ({}),
268
+ },
258
269
  });
259
270
  }
@@ -56,7 +56,7 @@ function useTrackDataExport({ model, regions, regionStr, type, options, }) {
56
56
  * The format picker, owning the per-format help text and the dialog that shows
57
57
  * it — nothing above needs to know a format can carry one.
58
58
  */
59
- function FormatSelector({ options, type, setType, usedAdapterExport, }) {
59
+ const FormatSelector = observer(function FormatSelector({ options, type, setType, usedAdapterExport, }) {
60
60
  const { classes } = useStyles();
61
61
  const [helpText, setHelpText] = useState();
62
62
  return (_jsxs(FormControl, { children: [_jsx(FormLabel, { children: `File type${usedAdapterExport ? ' (adapter export)' : ''}` }), _jsx(RadioGroup, { value: type, onChange: e => {
@@ -66,7 +66,7 @@ function FormatSelector({ options, type, setType, usedAdapterExport, }) {
66
66
  }, title: "Show help for this format", children: _jsx(HelpOutlineIcon, { fontSize: "small" }) })) : null] }, key))) }), _jsx(InfoDialog, { open: helpText !== undefined, onClose: () => {
67
67
  setHelpText(undefined);
68
68
  }, title: "Format Information", children: _jsx(DialogContentText, { children: helpText }) })] }));
69
- }
69
+ });
70
70
  /**
71
71
  * What the preview pane says — the export itself only once there is one, and
72
72
  * before that whichever of the four other states the dialog is in. In
@@ -8,7 +8,7 @@ export interface DisplaySnapshot {
8
8
  /**
9
9
  * Route each shorthand `displayDefaults: {...}` setting to the display types
10
10
  * whose member of that name takes its value: `color: 'red'` reaches every
11
- * display with a colour, `color: { field: 'type' }` only those whose colour
11
+ * display with a color, `color: { field: 'type' }` only those whose color
12
12
  * maps a field, and a spelling a display retired reaches that display as the
13
13
  * members it became. `reached` names the displays each key went to. A key no
14
14
  * display knows is an `unknownKeys` entry, and one every display that knows it
@@ -35,7 +35,7 @@ function verdictOf(schema, key, value) {
35
35
  /**
36
36
  * Route each shorthand `displayDefaults: {...}` setting to the display types
37
37
  * whose member of that name takes its value: `color: 'red'` reaches every
38
- * display with a colour, `color: { field: 'type' }` only those whose colour
38
+ * display with a color, `color: { field: 'type' }` only those whose color
39
39
  * maps a field, and a spelling a display retired reaches that display as the
40
40
  * members it became. `reached` names the displays each key went to. A key no
41
41
  * display knows is an `unknownKeys` entry, and one every display that knows it
@@ -129,6 +129,13 @@ export declare function pluginDescriptionString(d: PluginDefinition): string;
129
129
  * the same plugin just because neither has a url.
130
130
  */
131
131
  export declare function maybePluginUrl(d: PluginDefinition): string | undefined;
132
+ /**
133
+ * The absolute url PluginLoader fetches the definition from: a `umdLoc` or
134
+ * `esmLoc` against its own `baseUri`, any other form against the page. Trust
135
+ * decisions key on this rather than `maybePluginUrl`, under which one relative
136
+ * `plugin.js` names a different file in every config that lists it.
137
+ */
138
+ export declare function resolvedPluginUrl(d: PluginDefinition, pageUri?: string | undefined): string | undefined;
132
139
  export declare function pluginUrl(d: PluginDefinition): string;
133
140
  /**
134
141
  * Whether a definition loads from exactly `url` — the question behind "which
@@ -114,6 +114,26 @@ export function maybePluginUrl(d) {
114
114
  return undefined;
115
115
  }
116
116
  }
117
+ /**
118
+ * The absolute url PluginLoader fetches the definition from: a `umdLoc` or
119
+ * `esmLoc` against its own `baseUri`, any other form against the page. Trust
120
+ * decisions key on this rather than `maybePluginUrl`, under which one relative
121
+ * `plugin.js` names a different file in every config that lists it.
122
+ */
123
+ export function resolvedPluginUrl(d, pageUri = typeof location === 'undefined' ? undefined : location.href) {
124
+ const url = maybePluginUrl(d);
125
+ const base = 'umdLoc' in d
126
+ ? d.umdLoc.baseUri
127
+ : 'esmLoc' in d
128
+ ? d.esmLoc.baseUri
129
+ : pageUri;
130
+ try {
131
+ return url === undefined ? undefined : new URL(url, base).href;
132
+ }
133
+ catch {
134
+ return undefined;
135
+ }
136
+ }
117
137
  export function pluginUrl(d) {
118
138
  return maybePluginUrl(d) ?? 'unknown url';
119
139
  }
@@ -1,4 +1,3 @@
1
- import type { FeatureDensity } from '../data_adapters/BaseAdapter/featureDensity.ts';
2
1
  import type { CoreGetEncodedLayersArgs, EncodedLayersResult } from '../util/markEncodingTypes.ts';
3
2
  import type { StatusCallback } from '../util/progress.ts';
4
3
  import type { UnwrapRpcResult } from '../util/rpc.ts';
@@ -64,15 +63,6 @@ export interface RpcRegistry {
64
63
  };
65
64
  return: number | undefined;
66
65
  };
67
- CoreGetFeatureDensity: {
68
- args: {
69
- adapterConfig: Record<string, unknown>;
70
- regions: RegionLike[];
71
- bpPerPx: number;
72
- headers?: Record<string, string>;
73
- };
74
- return: FeatureDensity[] | undefined;
75
- };
76
66
  CoreGetInfo: {
77
67
  args: {
78
68
  adapterConfig: Record<string, unknown>;
@@ -100,9 +90,10 @@ export interface RpcRegistry {
100
90
  args: Record<string, unknown>;
101
91
  return: void;
102
92
  };
103
- CoreLoadAdapterCode: {
93
+ CoreLoadTrackCode: {
104
94
  args: {
105
95
  adapterTypes: string[];
96
+ rpcMethods: string[];
106
97
  };
107
98
  return: void;
108
99
  };
@@ -33,8 +33,23 @@ export interface RegionTooLargeResult {
33
33
  partial?: boolean;
34
34
  }
35
35
  export declare function isRegionRefused(result: unknown): result is RegionTooLargeResult;
36
+ /**
37
+ * The thrown form of the same refusal, for an adapter whose limit only a fetch
38
+ * can find, such as a graph's node count. Marked by an own `regionTooLarge`
39
+ * property, which crosses the worker boundary, so an adapter's own error class
40
+ * opts in without importing anything.
41
+ */
42
+ export declare function isRegionTooLargeError(error: unknown): error is Error;
36
43
  /** Undefined, never 0, when no region could be measured. */
37
44
  export declare function largestRegionBytes(perRegion: (number | undefined)[]): number | undefined;
45
+ /**
46
+ * The regions' index-only byte estimates summed, for a reader that holds
47
+ * every region at once; undefined, never 0, when no region could be measured.
48
+ */
49
+ export declare function totalRegionBytes(dataAdapter: ByteMeasurableAdapter, regions: AugmentedRegion[], opts?: {
50
+ signal?: AbortSignal;
51
+ statusCallback?: StatusCallback;
52
+ }): Promise<number | undefined>;
38
53
  /** A non-positive declared limit means "no opinion" (htsget reports 0). */
39
54
  export declare function adapterByteLimit(declared: unknown, fallback: number): number;
40
55
  export declare function overByteBudget(bytes: number | undefined, byteLimit: number | undefined): bytes is number;
@@ -3,6 +3,16 @@ import { updateStatus } from '../util/progress.js';
3
3
  export function isRegionRefused(result) {
4
4
  return (typeof result === 'object' && result !== null && 'regionTooLarge' in result);
5
5
  }
6
+ /**
7
+ * The thrown form of the same refusal, for an adapter whose limit only a fetch
8
+ * can find, such as a graph's node count. Marked by an own `regionTooLarge`
9
+ * property, which crosses the worker boundary, so an adapter's own error class
10
+ * opts in without importing anything.
11
+ */
12
+ export function isRegionTooLargeError(error) {
13
+ return (error instanceof Error &&
14
+ error.regionTooLarge === true);
15
+ }
6
16
  /** Undefined, never 0, when no region could be measured. */
7
17
  export function largestRegionBytes(perRegion) {
8
18
  let largest;
@@ -13,6 +23,19 @@ export function largestRegionBytes(perRegion) {
13
23
  }
14
24
  return largest;
15
25
  }
26
+ /**
27
+ * The regions' index-only byte estimates summed, for a reader that holds
28
+ * every region at once; undefined, never 0, when no region could be measured.
29
+ */
30
+ export async function totalRegionBytes(dataAdapter, regions, opts) {
31
+ let total;
32
+ for (const bytes of await Promise.all(regions.map(region => dataAdapter.getRegionByteSize([region], opts)))) {
33
+ if (bytes !== undefined) {
34
+ total = (total ?? 0) + bytes;
35
+ }
36
+ }
37
+ return total;
38
+ }
16
39
  /** A non-positive declared limit means "no opinion" (htsget reports 0). */
17
40
  export function adapterByteLimit(declared, fallback) {
18
41
  return typeof declared === 'number' && declared > 0 ? declared : fallback;
@@ -1,6 +1,8 @@
1
1
  /**
2
2
  * #config RpcOptions
3
3
  * #category root
4
+ * Chooses whether data fetching runs on the main thread or in web workers, and
5
+ * how many workers to start. Found on the root config as `configuration.rpc`.
4
6
  */
5
7
  declare const _default: import("../configuration/configurationSchema.ts").ConfigurationSchemaType<{
6
8
  readonly defaultDriver: {
@@ -2,11 +2,13 @@ import { ConfigurationSchema } from '../configuration/index.js';
2
2
  /**
3
3
  * #config RpcOptions
4
4
  * #category root
5
+ * Chooses whether data fetching runs on the main thread or in web workers, and
6
+ * how many workers to start. Found on the root config as `configuration.rpc`.
5
7
  */
6
8
  export default ConfigurationSchema('RpcOptions', {
7
9
  /**
8
10
  * #slot
9
- * which RPC backend to use. Empty means "use the host application's
11
+ * The RPC backend. Empty means "use the host application's
10
12
  * default" (web/desktop default to the web worker driver, embedded/headless
11
13
  * to the main thread). Every call in the session runs on the driver this
12
14
  * names; there is no per-track or per-call override.
@@ -6,8 +6,7 @@ export { default as CoreGetEncodedLayers } from './methods/CoreGetEncodedLayers.
6
6
  export { default as CoreGetEncodedFeature } from './methods/CoreGetEncodedFeature.ts';
7
7
  export { default as CoreGetSequence } from './methods/CoreGetSequence.ts';
8
8
  export { default as CoreFreeResources } from './methods/CoreFreeResources.ts';
9
- export { default as CoreLoadAdapterCode } from './methods/CoreLoadAdapterCode.ts';
9
+ export { default as CoreLoadTrackCode } from './methods/CoreLoadTrackCode.ts';
10
10
  export { default as CoreGetRegionByteEstimate } from './methods/CoreGetRegionByteEstimate.ts';
11
- export { default as CoreGetFeatureDensity } from './methods/CoreGetFeatureDensity.ts';
12
11
  export { default as CoreGetRegions } from './methods/CoreGetRegions.ts';
13
12
  export { default as CoreGetExportData } from './methods/CoreGetExportData.ts';
@@ -6,8 +6,7 @@ export { default as CoreGetEncodedLayers } from './methods/CoreGetEncodedLayers.
6
6
  export { default as CoreGetEncodedFeature } from './methods/CoreGetEncodedFeature.js';
7
7
  export { default as CoreGetSequence } from './methods/CoreGetSequence.js';
8
8
  export { default as CoreFreeResources } from './methods/CoreFreeResources.js';
9
- export { default as CoreLoadAdapterCode } from './methods/CoreLoadAdapterCode.js';
9
+ export { default as CoreLoadTrackCode } from './methods/CoreLoadTrackCode.js';
10
10
  export { default as CoreGetRegionByteEstimate } from './methods/CoreGetRegionByteEstimate.js';
11
- export { default as CoreGetFeatureDensity } from './methods/CoreGetFeatureDensity.js';
12
11
  export { default as CoreGetRegions } from './methods/CoreGetRegions.js';
13
12
  export { default as CoreGetExportData } from './methods/CoreGetExportData.js';
@@ -14,9 +14,9 @@
14
14
  // sentence this appends to.
15
15
  //
16
16
  // Only runs on the error path.
17
- // The deepest RPC result in the tree is the regular multi-sample variant one:
18
- // `perRegionCellData.0.featureGenotypeMap.<featureId>.genotypeCodes` — four
19
- // containers down. The alignments result is three (`groups.3.data.mismatchStarts`),
17
+ // The deepest RPC result in the tree is the multi-sample variant one:
18
+ // `perRegionCellData.0.featureInfo.<index>.genotypeCodes` — four containers
19
+ // down. The alignments result is three (`groups.3.data.mismatchStarts`),
20
20
  // synteny two (`instanceData.bp1`, `attributes.identity`) and most are one. The
21
21
  // walk is capped rather than unbounded because a payload also carries plain data
22
22
  // — a featureIds array of half a million strings — and there is no reason to
@@ -6,9 +6,9 @@ import type { RpcExecuteArgs } from '../RpcRegistry.ts';
6
6
  * split them by the facet where the request names one, run each layer's own
7
7
  * steps (per section, under a facet), and evaluate the layer's encoding over
8
8
  * what is left in the worker, where the `Feature` objects are, filling the
9
- * lanes its mark reads. The colours come back packed, the scale tables
9
+ * lanes its mark reads. The colors come back packed, the scale tables
10
10
  * resolved, and the main thread reads the same table for its legend that the
11
- * colours were drawn from.
11
+ * colors were drawn from.
12
12
  */
13
13
  export default class CoreGetEncodedLayers extends RpcMethodTypeWithRenameRegion<'CoreGetEncodedLayers'> {
14
14
  name: 'CoreGetEncodedLayers';
@@ -10,9 +10,9 @@ import { layerFeatures } from './layerFeatures.js';
10
10
  * split them by the facet where the request names one, run each layer's own
11
11
  * steps (per section, under a facet), and evaluate the layer's encoding over
12
12
  * what is left in the worker, where the `Feature` objects are, filling the
13
- * lanes its mark reads. The colours come back packed, the scale tables
13
+ * lanes its mark reads. The colors come back packed, the scale tables
14
14
  * resolved, and the main thread reads the same table for its legend that the
15
- * colours were drawn from.
15
+ * colors were drawn from.
16
16
  */
17
17
  export default class CoreGetEncodedLayers extends RpcMethodTypeWithRenameRegion {
18
18
  name = 'CoreGetEncodedLayers';
@@ -34,10 +34,10 @@ export default class CoreGetEncodedLayers extends RpcMethodTypeWithRenameRegion
34
34
  return tooLarge;
35
35
  }
36
36
  const { jexl } = pluginManager;
37
- const { layers: layered, sections, zoomRange, notices, } = await layerFeatures(dataAdapter, args, jexl);
37
+ const { layers: layered, sections, zoomRange, notices, facts, } = await layerFeatures(dataAdapter, args, jexl);
38
38
  const layers = requested.map((request, i) => {
39
- const { table, row } = layered[i];
40
- return encodeFeatures(table, { ...request.encoding, row }, request.lanes, {
39
+ const { table, row, series, gapBp } = layered[i];
40
+ const encoded = encodeFeatures(table, { ...request.encoding, row, series }, request.lanes, {
41
41
  jexl,
42
42
  report: createProgressReporter({
43
43
  label: 'Processing features',
@@ -46,6 +46,7 @@ export default class CoreGetEncodedLayers extends RpcMethodTypeWithRenameRegion
46
46
  signal,
47
47
  }),
48
48
  });
49
+ return gapBp === undefined ? encoded : { ...encoded, gapBp };
49
50
  });
50
51
  const result = {
51
52
  layers,
@@ -53,6 +54,7 @@ export default class CoreGetEncodedLayers extends RpcMethodTypeWithRenameRegion
53
54
  bytes,
54
55
  zoomRange,
55
56
  ...(notices.length > 0 ? { notices } : {}),
57
+ ...(Object.keys(facts).length > 0 ? { facts } : {}),
56
58
  };
57
59
  return rpcResult(result, layers.flatMap(l => encodedChannelTransferables(l)));
58
60
  }
@@ -0,0 +1,17 @@
1
+ import RpcMethodType from '../../pluggableElementTypes/RpcMethodType.ts';
2
+ import type { RpcExecuteArgs } from '../RpcRegistry.ts';
3
+ /**
4
+ * Load the code a track's first request runs in the worker it is about to use:
5
+ * its adapter classes and the RPC methods its display names. Each arrives by
6
+ * dynamic import on that request otherwise, after the view lays out, the
7
+ * assembly loads and the request's refNames resolve.
8
+ *
9
+ * At launch rather than at worker boot: until `parallelizeChunkLoading` is
10
+ * installed a classic worker loads chunks by serial `importScripts`, and an
11
+ * import there delayed the first data request 360ms at 80ms RTT.
12
+ */
13
+ export default class CoreLoadTrackCode extends RpcMethodType<'CoreLoadTrackCode'> {
14
+ name: 'CoreLoadTrackCode';
15
+ execute({ adapterTypes, rpcMethods, }: RpcExecuteArgs<'CoreLoadTrackCode'>): Promise<void>;
16
+ serializeArguments(args: Record<string, unknown>): Promise<Record<string, unknown>>;
17
+ }
@@ -0,0 +1,24 @@
1
+ import RpcMethodType from '../../pluggableElementTypes/RpcMethodType.js';
2
+ /**
3
+ * Load the code a track's first request runs in the worker it is about to use:
4
+ * its adapter classes and the RPC methods its display names. Each arrives by
5
+ * dynamic import on that request otherwise, after the view lays out, the
6
+ * assembly loads and the request's refNames resolve.
7
+ *
8
+ * At launch rather than at worker boot: until `parallelizeChunkLoading` is
9
+ * installed a classic worker loads chunks by serial `importScripts`, and an
10
+ * import there delayed the first data request 360ms at 80ms RTT.
11
+ */
12
+ export default class CoreLoadTrackCode extends RpcMethodType {
13
+ name = 'CoreLoadTrackCode';
14
+ async execute({ adapterTypes, rpcMethods, }) {
15
+ const { pluginManager } = this;
16
+ await Promise.all([
17
+ ...adapterTypes.map(type => pluginManager.getAdapterType(type).getAdapterClass()),
18
+ ...rpcMethods.map(name => pluginManager.getRpcMethodType(name).preload()),
19
+ ]);
20
+ }
21
+ async serializeArguments(args) {
22
+ return args;
23
+ }
24
+ }
@@ -11,23 +11,26 @@ import type { StatusCallback } from '../../util/progress.ts';
11
11
  export interface LayerFeatures {
12
12
  table: FeatureTable;
13
13
  row: FieldRef | ArrayLike<number> | undefined;
14
+ /** Each row's series, for a layer whose request names a path. */
15
+ series?: Uint32Array;
16
+ /** The stretch a path breaks across, for a layer whose request names a path. */
17
+ gapBp?: number;
14
18
  }
15
19
  /**
16
20
  * The table each layer of a `CoreGetEncodedLayers` request encodes: the
17
21
  * region's features through the shared steps, split by the facet where the
18
22
  * request names one, then through each layer's own steps, with each faceted
19
- * layer's stacked rows beside it. An instance's `featureIndex` indexes its
20
- * layer's table, so the same request answers which row an instance is.
23
+ * layer's stacked rows beside it, and a path layer's rows in series order.
24
+ * An instance's `featureIndex` indexes its layer's table, so the same request
25
+ * answers which row an instance is.
21
26
  */
22
27
  export declare function layerFeatures(dataAdapter: BaseFeatureDataAdapter, args: Pick<CoreGetEncodedLayersArgs, 'region' | 'layers' | 'transform' | 'facet' | 'bpPerPx' | 'opts'> & {
23
28
  signal?: AbortSignal;
24
29
  statusCallback?: StatusCallback;
25
30
  }, jexl: JexlInstance): Promise<{
26
- layers: {
27
- table: FeatureTable;
28
- row: FieldRef | Uint32Array | undefined;
29
- }[];
31
+ layers: LayerFeatures[];
30
32
  sections: import("../../util/markEncodingTypes.ts").FacetSection[] | undefined;
31
33
  zoomRange: import("../../data_adapters/BaseAdapter/zoomRange.ts").ZoomRange | undefined;
32
34
  notices: string[];
35
+ facts: Record<string, unknown>;
33
36
  }>;
@@ -1,23 +1,33 @@
1
1
  import { checkAbortSignal } from '../../util/aborting.js';
2
2
  import { layerTables } from '../../util/featureTransforms.js';
3
+ import { pathSeries } from '../../util/pathSeries.js';
3
4
  import { updateStatus } from '../../util/progress.js';
4
5
  /**
5
6
  * The table each layer of a `CoreGetEncodedLayers` request encodes: the
6
7
  * region's features through the shared steps, split by the facet where the
7
8
  * request names one, then through each layer's own steps, with each faceted
8
- * layer's stacked rows beside it. An instance's `featureIndex` indexes its
9
- * layer's table, so the same request answers which row an instance is.
9
+ * layer's stacked rows beside it, and a path layer's rows in series order.
10
+ * An instance's `featureIndex` indexes its layer's table, so the same request
11
+ * answers which row an instance is.
10
12
  */
11
13
  export async function layerFeatures(dataAdapter, args, jexl) {
12
14
  const { region, layers: requested, transform = [], facet, bpPerPx, opts, signal, statusCallback, } = args;
13
15
  const notices = [];
14
- const fetchOpts = { ...opts, bpPerPx, statusCallback, signal, notices };
16
+ const facts = {};
17
+ const fetchOpts = {
18
+ ...opts,
19
+ bpPerPx,
20
+ statusCallback,
21
+ signal,
22
+ notices,
23
+ facts,
24
+ };
15
25
  const [fetched, zoomRange] = await updateStatus('Downloading features', statusCallback, () => Promise.all([
16
26
  dataAdapter.getFeatureTable(region, fetchOpts),
17
27
  dataAdapter.getZoomRange(fetchOpts),
18
28
  ]));
19
29
  checkAbortSignal(signal);
20
- const { layers, sections } = layerTables(fetched, {
30
+ const tables = layerTables(fetched, {
21
31
  transform,
22
32
  facet,
23
33
  layers: requested.map(r => ({
@@ -25,5 +35,11 @@ export async function layerFeatures(dataAdapter, args, jexl) {
25
35
  row: r.encoding.row,
26
36
  })),
27
37
  }, jexl);
28
- return { layers, sections, zoomRange, notices };
38
+ const layers = tables.layers.map((layer, i) => {
39
+ const { path, transform: own = [] } = requested[i];
40
+ return path
41
+ ? pathSeries(layer.table, layer.row, path, [...transform, ...(facet?.transform ?? []), ...own], jexl)
42
+ : layer;
43
+ });
44
+ return { layers, sections: tables.sections, zoomRange, notices, facts };
29
45
  }
@@ -1,7 +1,8 @@
1
1
  /** A Link that acts as a button — no real navigation, just calls onClick. */
2
- export default function ActionLink({ onClick, children, className, title, }: {
2
+ declare const ActionLink: ({ onClick, children, className, title, }: {
3
3
  onClick: () => void;
4
4
  children: React.ReactNode;
5
5
  className?: string;
6
6
  title?: string;
7
- }): import("react").JSX.Element;
7
+ }) => import("react").JSX.Element;
8
+ export default ActionLink;
@@ -1,9 +1,11 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { Link } from '@mui/material';
3
+ import { observer } from 'mobx-react';
3
4
  /** A Link that acts as a button — no real navigation, just calls onClick. */
4
- export default function ActionLink({ onClick, children, className, title, }) {
5
+ const ActionLink = observer(function ActionLink({ onClick, children, className, title, }) {
5
6
  return (_jsx(Link, { href: "#", className: className, title: title, onClick: (e) => {
6
7
  e.preventDefault();
7
8
  onClick();
8
9
  }, children: children }));
9
- }
10
+ });
11
+ export default ActionLink;
@@ -8,7 +8,8 @@ import type { PluginDefinition } from '../pluginDefinitions.ts';
8
8
  * `onAdd` returns false to reject the definition and keep the dialog open (the
9
9
  * plugin store rejects a name already installed).
10
10
  */
11
- export default function AddCustomPluginDialog({ onClose, onAdd, }: {
11
+ declare const AddCustomPluginDialog: ({ onClose, onAdd, }: {
12
12
  onClose: () => void;
13
13
  onAdd: (definition: PluginDefinition) => boolean;
14
- }): import("react").JSX.Element;
14
+ }) => import("react").JSX.Element;
15
+ export default AddCustomPluginDialog;
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState } from 'react';
3
3
  import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
4
4
  import { Collapse, DialogContentText, IconButton, TextField, } from '@mui/material';
5
+ import { observer } from 'mobx-react';
5
6
  import { cx, makeStyles } from '../util/tss-react/index.js';
6
7
  import SubmitDialog from './SubmitDialog.js';
7
8
  const useStyles = makeStyles()({
@@ -28,7 +29,7 @@ const useStyles = makeStyles()({
28
29
  * `onAdd` returns false to reject the definition and keep the dialog open (the
29
30
  * plugin store rejects a name already installed).
30
31
  */
31
- export default function AddCustomPluginDialog({ onClose, onAdd, }) {
32
+ const AddCustomPluginDialog = observer(function AddCustomPluginDialog({ onClose, onAdd, }) {
32
33
  const { classes } = useStyles();
33
34
  const [umdPluginName, setUMDPluginName] = useState('');
34
35
  const [umdPluginUrl, setUMDPluginUrl] = useState('');
@@ -44,13 +45,14 @@ export default function AddCustomPluginDialog({ onClose, onAdd, }) {
44
45
  }
45
46
  }, children: _jsxs("div", { className: classes.dialogContent, children: [_jsx(DialogContentText, { children: "Enter the name of the plugin and its URL. The name should match what is defined in the plugin's build." }), _jsx(TextField, { label: "Plugin name", variant: "outlined", fullWidth: true, margin: "dense", value: umdPluginName, onChange: event => {
46
47
  setUMDPluginName(event.target.value);
47
- } }), _jsx(TextField, { label: "Plugin URL", variant: "outlined", fullWidth: true, margin: "dense", value: umdPluginUrl, onChange: event => {
48
+ } }), _jsx(TextField, { label: "Plugin URL", "data-testid": "custom-plugin-url", variant: "outlined", fullWidth: true, margin: "dense", value: umdPluginUrl, onChange: event => {
48
49
  setUMDPluginUrl(event.target.value);
49
50
  } }), _jsxs(DialogContentText, { onClick: () => {
50
51
  setAdvancedOptionsOpen(!advancedOptionsOpen);
51
52
  }, children: [_jsx(IconButton, { className: cx(classes.expand, {
52
53
  [classes.expandOpen]: advancedOptionsOpen,
53
- }), "aria-expanded": advancedOptionsOpen, "aria-label": "show more", children: _jsx(ExpandMoreIcon, {}) }), "Advanced options"] }), _jsx(Collapse, { in: advancedOptionsOpen, children: _jsxs("div", { className: classes.dialogContent, children: [_jsx(DialogContentText, { children: "The above fields assume that the plugin is built in UMD format. For an ESM build, enter its URL here instead; it carries its own name, so the fields above stay empty." }), _jsx(TextField, { label: "ESM build URL", variant: "outlined", fullWidth: true, margin: "dense", value: esmPluginUrl, onChange: event => {
54
+ }), "aria-expanded": advancedOptionsOpen, "aria-label": "show more", children: _jsx(ExpandMoreIcon, {}) }), "Advanced options"] }), _jsx(Collapse, { in: advancedOptionsOpen, children: _jsxs("div", { className: classes.dialogContent, children: [_jsx(DialogContentText, { children: "The above fields assume that the plugin is built in UMD format. For an ESM build, enter its URL here instead; it carries its own name, so the fields above stay empty." }), _jsx(TextField, { label: "ESM build URL", "data-testid": "custom-plugin-esm-url", variant: "outlined", fullWidth: true, margin: "dense", value: esmPluginUrl, onChange: event => {
54
55
  setESMPluginUrl(event.target.value);
55
56
  } })] }) })] }) }));
56
- }
57
+ });
58
+ export default AddCustomPluginDialog;
package/esm/ui/AppLogo.js CHANGED
@@ -1,10 +1,50 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
2
3
  import { observer } from 'mobx-react';
3
4
  import { readConfObject } from '../configuration/index.js';
5
+ import { isUriLocation } from '../util/types/data.js';
4
6
  import { LogoFull } from './Logo.js';
7
+ function resolvedUri(location) {
8
+ return location.baseUri
9
+ ? new URL(location.uri, location.baseUri).href
10
+ : location.uri;
11
+ }
12
+ // A URI goes straight to the <img>, which needs no CORS; a local path, a
13
+ // blob or a file handle is read into an object URL.
14
+ function useLogoSrc(location) {
15
+ const [objectUrl, setObjectUrl] = useState();
16
+ useEffect(() => {
17
+ if (!location || isUriLocation(location)) {
18
+ return;
19
+ }
20
+ let url;
21
+ let cancelled = false;
22
+ import('../util/io/index.js')
23
+ .then(({ openLocation }) => openLocation(location).readFile())
24
+ .then(bytes => {
25
+ if (!cancelled) {
26
+ url = URL.createObjectURL(new Blob([bytes]));
27
+ setObjectUrl(url);
28
+ }
29
+ })
30
+ .catch((e) => {
31
+ console.error(e);
32
+ });
33
+ return () => {
34
+ cancelled = true;
35
+ if (url) {
36
+ URL.revokeObjectURL(url);
37
+ }
38
+ };
39
+ }, [location]);
40
+ return location && isUriLocation(location)
41
+ ? resolvedUri(location)
42
+ : location
43
+ ? objectUrl
44
+ : undefined;
45
+ }
5
46
  const Logo = observer(function Logo({ session, }) {
6
- const { configuration } = session;
7
- const logoPath = readConfObject(configuration, 'logoPath');
8
- return logoPath?.uri ? (_jsx("img", { src: logoPath.uri, alt: "Custom logo" })) : (_jsx(LogoFull, { variant: "white" }));
47
+ const src = useLogoSrc(readConfObject(session.configuration, 'logoPath'));
48
+ return src ? (_jsx("img", { src: src, alt: "Custom logo" })) : (_jsx(LogoFull, { variant: "white" }));
9
49
  });
10
50
  export default Logo;
@@ -1,5 +1,5 @@
1
1
  export type TooltipPlacement = 'top' | 'top-start' | 'top-end' | 'right' | 'right-start' | 'right-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end';
2
- export default function BaseTooltip({ clientPoint: clientPointCoords, anchor, id, children, placement, }: {
2
+ declare const BaseTooltip: ({ clientPoint: clientPointCoords, anchor, id, children, placement, }: {
3
3
  placement?: TooltipPlacement;
4
4
  /** Follow the pointer. The cursor-anchored mode, and the older of the two. */
5
5
  clientPoint?: {
@@ -16,4 +16,5 @@ export default function BaseTooltip({ clientPoint: clientPointCoords, anchor, id
16
16
  /** For a trigger pointing at this with `aria-describedby`. */
17
17
  id?: string;
18
18
  children: React.ReactNode;
19
- }): import("react").ReactPortal | null;
19
+ }) => import("react").ReactPortal | null;
20
+ export default BaseTooltip;