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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. package/README.md +1709 -390
  2. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
  3. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -5
  4. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
  5. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
  6. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
  7. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
  8. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +37 -14
  9. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
  10. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
  11. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
  12. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
  13. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
  14. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
  15. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
  16. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
  17. package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
  18. package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
  19. package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
  20. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
  21. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
  22. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
  23. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
  24. package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
  25. package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +49 -0
  26. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
  27. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
  28. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
  29. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
  30. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
  31. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
  32. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
  33. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
  34. package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.js +8 -5
  35. package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
  36. package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
  37. package/esm/BaseFeatureWidget/formatDetails.js +62 -83
  38. package/esm/BaseFeatureWidget/index.d.ts +2 -1
  39. package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
  40. package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
  41. package/esm/BaseFeatureWidget/types.d.ts +12 -6
  42. package/esm/BaseFeatureWidget/util.d.ts +0 -10
  43. package/esm/BaseFeatureWidget/util.js +0 -17
  44. package/esm/CorePlugin.js +34 -3
  45. package/esm/PluginLoader.d.ts +24 -13
  46. package/esm/PluginLoader.js +167 -51
  47. package/esm/PluginManager.d.ts +130 -24
  48. package/esm/PluginManager.js +180 -32
  49. package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
  50. package/esm/ReExports/MuiDataGridReExports.js +2 -2
  51. package/esm/ReExports/coreModules.generated.d.ts +2 -0
  52. package/esm/ReExports/coreModules.generated.js +530 -0
  53. package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
  54. package/esm/ReExports/coreWorkerModules.generated.js +490 -0
  55. package/esm/ReExports/frameworkModules.d.ts +2 -0
  56. package/esm/ReExports/frameworkModules.js +68 -0
  57. package/esm/ReExports/frameworkShared.d.ts +12 -0
  58. package/esm/ReExports/frameworkShared.js +16 -0
  59. package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
  60. package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
  61. package/esm/ReExports/list.js +528 -79
  62. package/esm/ReExports/modules.d.ts +1 -1
  63. package/esm/ReExports/modules.js +10 -165
  64. package/esm/ReExports/registry.d.ts +1 -0
  65. package/esm/ReExports/registry.js +23 -5
  66. package/esm/ReExports/uiStub.d.ts +3 -0
  67. package/esm/ReExports/uiStub.js +33 -0
  68. package/esm/ReExports/workerModules.d.ts +2 -0
  69. package/esm/ReExports/workerModules.js +11 -0
  70. package/esm/TextSearch/TextSearchManager.d.ts +27 -13
  71. package/esm/TextSearch/TextSearchManager.js +77 -36
  72. package/esm/TextSearch/places.d.ts +12 -0
  73. package/esm/TextSearch/places.js +94 -0
  74. package/esm/assemblyManager/assembly.d.ts +21 -19
  75. package/esm/assemblyManager/assembly.js +28 -26
  76. package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
  77. package/esm/assemblyManager/assemblyAdapters.js +8 -2
  78. package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
  79. package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
  80. package/esm/assemblyManager/assemblyManager.d.ts +35 -180
  81. package/esm/assemblyManager/assemblyManager.js +47 -51
  82. package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
  83. package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
  84. package/esm/assemblyManager/geneticCodes.js +2 -5
  85. package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
  86. package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
  87. package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
  88. package/esm/assemblyManager/indexAssemblyNames.js +22 -0
  89. package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
  90. package/esm/assemblyManager/loadRefNameMap.js +4 -9
  91. package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
  92. package/esm/assemblyManager/refNameMapKey.js +12 -0
  93. package/esm/checkPlugins.d.ts +2 -0
  94. package/esm/checkPlugins.js +38 -17
  95. package/esm/configuration/bamIndexFields.d.ts +49 -0
  96. package/esm/configuration/bamIndexFields.js +41 -0
  97. package/esm/configuration/configurationSchema.d.ts +101 -71
  98. package/esm/configuration/configurationSchema.js +207 -134
  99. package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
  100. package/esm/configuration/configurationSchemaUnion.js +56 -0
  101. package/esm/configuration/configurationSlot.d.ts +150 -60
  102. package/esm/configuration/configurationSlot.js +103 -75
  103. package/esm/configuration/fillLocations.d.ts +14 -0
  104. package/esm/configuration/fillLocations.js +14 -0
  105. package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
  106. package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
  107. package/esm/configuration/formatDetailsConfigSchema.js +10 -13
  108. package/esm/configuration/fullConfSnapshot.d.ts +4 -19
  109. package/esm/configuration/fullConfSnapshot.js +30 -52
  110. package/esm/configuration/getConf.d.ts +45 -41
  111. package/esm/configuration/getConf.js +111 -44
  112. package/esm/configuration/index.d.ts +26 -11
  113. package/esm/configuration/index.js +16 -7
  114. package/esm/configuration/indexType.d.ts +26 -0
  115. package/esm/configuration/indexType.js +38 -0
  116. package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
  117. package/esm/configuration/mergeFormatCallbacks.js +13 -10
  118. package/esm/configuration/plot.d.ts +61 -0
  119. package/esm/configuration/plot.js +142 -0
  120. package/esm/configuration/readConfObject.d.ts +2 -24
  121. package/esm/configuration/readConfObject.js +20 -63
  122. package/esm/configuration/requirements.d.ts +37 -0
  123. package/esm/configuration/requirements.js +88 -0
  124. package/esm/configuration/schemaRegistry.d.ts +32 -15
  125. package/esm/configuration/schemaRegistry.js +33 -35
  126. package/esm/configuration/schemaTypes.d.ts +21 -5
  127. package/esm/configuration/schemaTypes.js +66 -55
  128. package/esm/configuration/slotFacade.d.ts +12 -29
  129. package/esm/configuration/slotFacade.js +44 -23
  130. package/esm/configuration/snapshotPreprocess.d.ts +43 -0
  131. package/esm/configuration/snapshotPreprocess.js +161 -0
  132. package/esm/configuration/tabixIndexFields.d.ts +30 -4
  133. package/esm/configuration/tabixIndexFields.js +21 -4
  134. package/esm/configuration/tabixShorthand.d.ts +34 -17
  135. package/esm/configuration/tabixShorthand.js +49 -22
  136. package/esm/configuration/types.d.ts +182 -43
  137. package/esm/configuration/uriShorthand.d.ts +9 -0
  138. package/esm/configuration/uriShorthand.js +16 -0
  139. package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
  140. package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
  141. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
  142. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
  143. package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
  144. package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
  145. package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
  146. package/esm/data_adapters/BaseAdapter/index.js +1 -0
  147. package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
  148. package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
  149. package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
  150. package/esm/data_adapters/BaseAdapter/stats.js +52 -13
  151. package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
  152. package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
  153. package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
  154. package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
  155. package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
  156. package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
  157. package/esm/data_adapters/dataAdapterCache.js +44 -10
  158. package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
  159. package/esm/data_adapters/getFeatureAdapter.js +8 -8
  160. package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
  161. package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
  162. package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
  163. package/esm/pluggableElementTypes/AdapterType.js +1 -1
  164. package/esm/pluggableElementTypes/DisplayType.d.ts +53 -16
  165. package/esm/pluggableElementTypes/DisplayType.js +28 -12
  166. package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
  167. package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
  168. package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
  169. package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
  170. package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
  171. package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
  172. package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
  173. package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
  174. package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
  175. package/esm/pluggableElementTypes/ViewType.js +32 -4
  176. package/esm/pluggableElementTypes/WidgetType.d.ts +6 -0
  177. package/esm/pluggableElementTypes/WidgetType.js +6 -0
  178. package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
  179. package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
  180. package/esm/pluggableElementTypes/extendElementType.js +9 -5
  181. package/esm/pluggableElementTypes/index.d.ts +2 -1
  182. package/esm/pluggableElementTypes/index.js +2 -9
  183. package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
  184. package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +122 -28
  185. package/esm/pluggableElementTypes/models/BaseDisplayModel.js +155 -11
  186. package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
  187. package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
  188. package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +87 -18
  189. package/esm/pluggableElementTypes/models/BaseViewModel.js +54 -11
  190. package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
  191. package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
  192. package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
  193. package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
  194. package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
  195. package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
  196. package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
  197. package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
  198. package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
  199. package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
  200. package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
  201. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
  202. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
  203. package/esm/pluggableElementTypes/models/index.d.ts +2 -3
  204. package/esm/pluggableElementTypes/models/index.js +2 -3
  205. package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
  206. package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
  207. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
  208. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
  209. package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
  210. package/esm/pluginDefinitions.d.ts +34 -7
  211. package/esm/pluginDefinitions.js +54 -20
  212. package/esm/rpc/BaseRpcDriver.d.ts +2 -2
  213. package/esm/rpc/BaseRpcDriver.js +25 -30
  214. package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
  215. package/esm/rpc/MainThreadRpcDriver.js +13 -8
  216. package/esm/rpc/RpcClient.d.ts +18 -6
  217. package/esm/rpc/RpcClient.js +51 -16
  218. package/esm/rpc/RpcManager.d.ts +14 -10
  219. package/esm/rpc/RpcManager.js +11 -1
  220. package/esm/rpc/RpcRegistry.d.ts +40 -7
  221. package/esm/rpc/RpcServer.d.ts +3 -1
  222. package/esm/rpc/RpcServer.js +19 -12
  223. package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
  224. package/esm/rpc/WebWorkerRpcDriver.js +64 -68
  225. package/esm/rpc/byteBudget.d.ts +20 -5
  226. package/esm/rpc/byteBudget.js +16 -5
  227. package/esm/rpc/configSchema.d.ts +7 -21
  228. package/esm/rpc/coreRpcMethods.d.ts +4 -0
  229. package/esm/rpc/coreRpcMethods.js +4 -0
  230. package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
  231. package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
  232. package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
  233. package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
  234. package/esm/rpc/methods/CoreGetExportData.js +3 -4
  235. package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
  236. package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
  237. package/esm/rpc/methods/CoreGetFeatures.js +3 -5
  238. package/esm/rpc/methods/CoreGetRefNames.js +2 -12
  239. package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
  240. package/esm/rpc/methods/CoreGetSequence.js +2 -2
  241. package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
  242. package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
  243. package/esm/rpc/methods/layerFeatures.d.ts +33 -0
  244. package/esm/rpc/methods/layerFeatures.js +29 -0
  245. package/esm/svg/SvgExport.js +6 -7
  246. package/esm/svg/SvgThemeProviders.d.ts +12 -0
  247. package/esm/svg/SvgThemeProviders.js +15 -0
  248. package/esm/svg/exportViewSvg.d.ts +28 -0
  249. package/esm/svg/exportViewSvg.js +13 -0
  250. package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
  251. package/esm/svg/normalizeSvgMarkup.js +99 -0
  252. package/esm/svg/serializeSvg.d.ts +7 -0
  253. package/esm/svg/serializeSvg.js +11 -0
  254. package/esm/svg/svgId.d.ts +1 -1
  255. package/esm/svg/svgId.js +1 -1
  256. package/esm/svg/svgReady.d.ts +9 -7
  257. package/esm/svg/svgReady.js +8 -7
  258. package/esm/svg/trackNames.d.ts +7 -5
  259. package/esm/svg/trackNames.js +12 -9
  260. package/esm/svg/wrapSvgExport.js +6 -74
  261. package/esm/ui/AddCustomPluginDialog.js +3 -8
  262. package/esm/ui/AppReadyMarker.d.ts +45 -0
  263. package/esm/ui/AppReadyMarker.js +89 -0
  264. package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
  265. package/esm/ui/CascadingMenu.js +181 -104
  266. package/esm/ui/DropDownMenu.js +2 -1
  267. package/esm/ui/ErrorBanner.js +1 -1
  268. package/esm/ui/ErrorBoundary.d.ts +2 -2
  269. package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
  270. package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
  271. package/esm/ui/ExportSvgDialog.d.ts +1 -1
  272. package/esm/ui/FileDropZone.js +2 -1
  273. package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
  274. package/esm/ui/HoverMenu.d.ts +1 -2
  275. package/esm/ui/HoverMenu.js +6 -3
  276. package/esm/ui/JexlFilterDialog.d.ts +13 -10
  277. package/esm/ui/JexlFilterDialog.js +122 -50
  278. package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
  279. package/esm/ui/JexlFilterRowEditors.js +90 -0
  280. package/esm/ui/LazyBaseTooltip.d.ts +4 -0
  281. package/esm/ui/LazyBaseTooltip.js +9 -0
  282. package/esm/ui/LegendSwatchGlyph.js +26 -21
  283. package/esm/ui/LoadingOverlay.d.ts +14 -0
  284. package/esm/ui/LoadingOverlay.js +4 -2
  285. package/esm/ui/MenuTypes.d.ts +23 -53
  286. package/esm/ui/MenuTypes.js +3 -0
  287. package/esm/ui/MonospaceTextField.d.ts +2 -1
  288. package/esm/ui/MonospaceTextField.js +23 -20
  289. package/esm/ui/PaletteContext.d.ts +10 -5
  290. package/esm/ui/PaletteContext.js +44 -6
  291. package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
  292. package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
  293. package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
  294. package/esm/ui/RefNameAutocomplete/index.js +8 -2
  295. package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
  296. package/esm/ui/RefNameAutocomplete/util.js +42 -1
  297. package/esm/ui/ResizeHandle.d.ts +3 -1
  298. package/esm/ui/ResizeHandle.js +44 -11
  299. package/esm/ui/ScrollChrome.d.ts +13 -0
  300. package/esm/ui/ScrollChrome.js +11 -0
  301. package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
  302. package/esm/ui/ScrollEdgeShadow.js +14 -35
  303. package/esm/ui/ScrollZoomToggle.d.ts +4 -27
  304. package/esm/ui/ScrollZoomToggle.js +34 -51
  305. package/esm/ui/SessionJsonPanel.d.ts +3 -0
  306. package/esm/ui/SessionJsonPanel.js +14 -0
  307. package/esm/ui/SettingsChangesTable.d.ts +1 -0
  308. package/esm/ui/SettingsChangesTable.js +49 -11
  309. package/esm/ui/ShareLinkField.d.ts +1 -3
  310. package/esm/ui/ShareLinkField.js +13 -40
  311. package/esm/ui/SizeSliderRow.d.ts +1 -3
  312. package/esm/ui/SizeSliderRow.js +4 -6
  313. package/esm/ui/SnackbarModel.js +79 -67
  314. package/esm/ui/StatusProgressBar.js +2 -2
  315. package/esm/ui/SvgColorLegend.d.ts +9 -4
  316. package/esm/ui/SvgColorLegend.js +82 -41
  317. package/esm/ui/VerticalScrollbar.d.ts +13 -34
  318. package/esm/ui/VerticalScrollbar.js +29 -83
  319. package/esm/ui/ViewLoadingScreen.d.ts +5 -4
  320. package/esm/ui/ViewLoadingScreen.js +8 -32
  321. package/esm/ui/colorScale.d.ts +92 -0
  322. package/esm/ui/colorScale.js +72 -0
  323. package/esm/ui/colors.d.ts +64 -0
  324. package/esm/ui/colors.js +230 -1
  325. package/esm/ui/hoverBoxStyle.d.ts +14 -2
  326. package/esm/ui/hoverBoxStyle.js +17 -2
  327. package/esm/ui/index.d.ts +12 -12
  328. package/esm/ui/index.js +14 -22
  329. package/esm/ui/launchViewMenu.js +15 -5
  330. package/esm/ui/legendMenuItem.d.ts +10 -32
  331. package/esm/ui/legendMenuItem.js +9 -36
  332. package/esm/ui/legendSpec.d.ts +15 -8
  333. package/esm/ui/legendSpec.js +14 -23
  334. package/esm/ui/makeSizeMenu.d.ts +0 -6
  335. package/esm/ui/makeSizeMenu.js +6 -30
  336. package/esm/ui/measureLegendText.js +1 -1
  337. package/esm/ui/menuItemAdornment.d.ts +9 -20
  338. package/esm/ui/menuItemAdornment.js +10 -32
  339. package/esm/ui/menuItems.d.ts +2 -7
  340. package/esm/ui/menuItems.js +1 -6
  341. package/esm/ui/multiTrackMenuItems.d.ts +6 -0
  342. package/esm/ui/palette.d.ts +118 -116
  343. package/esm/ui/palette.js +114 -75
  344. package/esm/ui/replaceViewAction.d.ts +1 -1
  345. package/esm/ui/replaceViewAction.js +1 -1
  346. package/esm/ui/theme.d.ts +43 -119
  347. package/esm/ui/theme.js +62 -78
  348. package/esm/ui/toggleMenuItems.d.ts +1 -3
  349. package/esm/ui/toggleMenuItems.js +6 -5
  350. package/esm/ui/useAssemblySelection.d.ts +4 -4
  351. package/esm/ui/viewHeaderHeight.d.ts +1 -0
  352. package/esm/ui/viewHeaderHeight.js +1 -0
  353. package/esm/util/Base1DUtils.d.ts +5 -3
  354. package/esm/util/Base1DUtils.js +14 -6
  355. package/esm/util/Base1DViewModel.d.ts +2 -1
  356. package/esm/util/Base1DViewModel.js +3 -2
  357. package/esm/util/SvgCanvas.d.ts +15 -13
  358. package/esm/util/SvgCanvas.js +76 -56
  359. package/esm/util/TimeTraveller.d.ts +3 -0
  360. package/esm/util/TimeTraveller.js +34 -2
  361. package/esm/util/aborting.d.ts +39 -0
  362. package/esm/util/aborting.js +88 -6
  363. package/esm/util/adapterMetadata.d.ts +1 -1
  364. package/esm/util/adapterMetadata.js +6 -5
  365. package/esm/util/addAndShowTrack.d.ts +2 -5
  366. package/esm/util/addAndShowTrack.js +5 -1
  367. package/esm/util/addRelativeUris.d.ts +17 -5
  368. package/esm/util/addRelativeUris.js +46 -10
  369. package/esm/util/addTrackFromWidget.d.ts +2 -5
  370. package/esm/util/addTrackFromWidget.js +5 -4
  371. package/esm/util/aggregateFieldName.d.ts +10 -0
  372. package/esm/util/aggregateFieldName.js +8 -0
  373. package/esm/util/analytics.js +46 -13
  374. package/esm/util/animationAllowed.d.ts +9 -0
  375. package/esm/util/animationAllowed.js +13 -0
  376. package/esm/util/applyRowResizeWheel.d.ts +10 -5
  377. package/esm/util/applyRowResizeWheel.js +10 -21
  378. package/esm/util/bandHeight.d.ts +10 -0
  379. package/esm/util/bandHeight.js +29 -0
  380. package/esm/util/bandLayout.d.ts +4 -4
  381. package/esm/util/bandLayout.js +4 -4
  382. package/esm/util/baseDisplayConfig.d.ts +8 -0
  383. package/esm/util/baseDisplayConfig.js +27 -0
  384. package/esm/util/bezierConnector.d.ts +4 -3
  385. package/esm/util/bezierConnector.js +38 -45
  386. package/esm/util/bgzfWorkerPool.d.ts +20 -74
  387. package/esm/util/bgzfWorkerPool.js +20 -74
  388. package/esm/util/binnedAggregate.d.ts +17 -0
  389. package/esm/util/binnedAggregate.js +275 -0
  390. package/esm/util/cacheBudgets.d.ts +22 -19
  391. package/esm/util/cacheBudgets.js +22 -19
  392. package/esm/util/cachedSetup.d.ts +16 -6
  393. package/esm/util/cachedSetup.js +108 -38
  394. package/esm/util/categoricalField.d.ts +56 -0
  395. package/esm/util/categoricalField.js +73 -0
  396. package/esm/util/cellMatches.d.ts +23 -0
  397. package/esm/util/cellMatches.js +264 -0
  398. package/esm/util/cellsStep.d.ts +29 -0
  399. package/esm/util/cellsStep.js +437 -0
  400. package/esm/util/clampToContig.d.ts +17 -0
  401. package/esm/util/clampToContig.js +19 -0
  402. package/esm/util/coarseStripHTML.js +1 -2
  403. package/esm/util/color/cssColorsLevel4.d.ts +1 -0
  404. package/esm/util/color/cssColorsLevel4.js +1 -0
  405. package/esm/util/color/index.d.ts +5 -3
  406. package/esm/util/color/index.js +7 -4
  407. package/esm/util/colorBits.d.ts +3 -3
  408. package/esm/util/colorBits.js +19 -44
  409. package/esm/util/colorRamp.d.ts +49 -5
  410. package/esm/util/colorRamp.js +169 -18
  411. package/esm/util/colorScale.d.ts +156 -0
  412. package/esm/util/colorScale.js +243 -0
  413. package/esm/util/colorSchemes.d.ts +21 -0
  414. package/esm/util/colorSchemes.js +30 -0
  415. package/esm/util/copyToClipboard.js +8 -1
  416. package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
  417. package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
  418. package/esm/util/createSvgRasterCanvas.d.ts +10 -0
  419. package/esm/util/cssColorParse.d.ts +15 -0
  420. package/esm/util/cssColorParse.js +53 -0
  421. package/esm/util/diagonalizeRegions.d.ts +2 -3
  422. package/esm/util/diagonalizeRegions.js +8 -13
  423. package/esm/util/expandLooseSearchIndex.d.ts +19 -0
  424. package/esm/util/expandLooseSearchIndex.js +29 -0
  425. package/esm/util/featureTable.d.ts +224 -0
  426. package/esm/util/featureTable.js +366 -0
  427. package/esm/util/featureTransforms.d.ts +81 -0
  428. package/esm/util/featureTransforms.js +1231 -0
  429. package/esm/util/featureTypes.d.ts +24 -0
  430. package/esm/util/featureTypes.js +35 -0
  431. package/esm/util/fetchAndMaybeUnzip.js +16 -9
  432. package/esm/util/fetchContext.d.ts +7 -8
  433. package/esm/util/fetchContext.js +3 -3
  434. package/esm/util/fetchHub.d.ts +4 -2
  435. package/esm/util/fetchHub.js +2 -2
  436. package/esm/util/fetchPhases.d.ts +10 -10
  437. package/esm/util/fetchSeq.d.ts +2 -3
  438. package/esm/util/fetchSeq.js +2 -2
  439. package/esm/util/fieldReader.d.ts +17 -0
  440. package/esm/util/fieldReader.js +62 -0
  441. package/esm/util/formatBytes.js +1 -1
  442. package/esm/util/formatGuessers.d.ts +25 -14
  443. package/esm/util/formatGuessers.js +42 -27
  444. package/esm/util/formatRelativeTime.js +1 -1
  445. package/esm/util/freezeDeep.d.ts +8 -10
  446. package/esm/util/freezeDeep.js +8 -10
  447. package/esm/util/getLocationUri.d.ts +2 -1
  448. package/esm/util/getLocationUri.js +8 -2
  449. package/esm/util/groupKeys.d.ts +76 -0
  450. package/esm/util/groupKeys.js +156 -0
  451. package/esm/util/highlights.d.ts +10 -6
  452. package/esm/util/highlights.js +12 -25
  453. package/esm/util/hooks.d.ts +31 -2
  454. package/esm/util/hooks.js +72 -3
  455. package/esm/util/index.d.ts +11 -11
  456. package/esm/util/index.js +11 -10
  457. package/esm/util/indexCandidates.d.ts +1 -31
  458. package/esm/util/indexCandidates.js +5 -63
  459. package/esm/util/installFetch.d.ts +77 -37
  460. package/esm/util/installFetch.js +65 -38
  461. package/esm/util/installInitAutorun.d.ts +14 -13
  462. package/esm/util/installInitAutorun.js +17 -17
  463. package/esm/util/installPrerequisiteFetch.d.ts +115 -0
  464. package/esm/util/installPrerequisiteFetch.js +111 -0
  465. package/esm/util/intervals.js +9 -4
  466. package/esm/util/io/index.js +22 -15
  467. package/esm/util/isDataCurrent.d.ts +7 -5
  468. package/esm/util/isDataCurrent.js +9 -6
  469. package/esm/util/isTextEntryFocused.d.ts +7 -0
  470. package/esm/util/isTextEntryFocused.js +16 -0
  471. package/esm/util/jexl.js +24 -21
  472. package/esm/util/jexlFilterRows.d.ts +89 -0
  473. package/esm/util/jexlFilterRows.js +252 -0
  474. package/esm/util/jexlFilters.d.ts +32 -57
  475. package/esm/util/jexlFilters.js +31 -29
  476. package/esm/util/jexlStrings.d.ts +3 -4
  477. package/esm/util/jexlStrings.js +2 -3
  478. package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
  479. package/esm/util/layouts/GranularRectLayout.js +25 -8
  480. package/esm/util/lazyAfterAttach.d.ts +13 -0
  481. package/esm/util/lazyAfterAttach.js +31 -0
  482. package/esm/util/lazyWithPreload.d.ts +19 -0
  483. package/esm/util/lazyWithPreload.js +27 -0
  484. package/esm/util/legendCandidates.d.ts +72 -0
  485. package/esm/util/legendCandidates.js +138 -0
  486. package/esm/util/locString.js +5 -2
  487. package/esm/util/localStorage.js +4 -4
  488. package/esm/util/markEncoding.d.ts +150 -0
  489. package/esm/util/markEncoding.js +885 -0
  490. package/esm/util/markEncodingTypes.d.ts +595 -0
  491. package/esm/util/markEncodingTypes.js +8 -0
  492. package/esm/util/mst-reflection.d.ts +2 -20
  493. package/esm/util/mst-reflection.js +3 -53
  494. package/esm/util/mstUtils.d.ts +31 -23
  495. package/esm/util/mstUtils.js +39 -24
  496. package/esm/util/numericUtils.d.ts +7 -0
  497. package/esm/util/numericUtils.js +16 -0
  498. package/esm/util/numericValue.d.ts +14 -0
  499. package/esm/util/numericValue.js +34 -0
  500. package/esm/util/openFeatureWidget.d.ts +5 -0
  501. package/esm/util/openFeatureWidget.js +2 -2
  502. package/esm/util/openViews.d.ts +17 -0
  503. package/esm/util/openViews.js +22 -0
  504. package/esm/util/parentWalk.d.ts +1 -1
  505. package/esm/util/parentWalk.js +1 -1
  506. package/esm/util/parseLineByLine.d.ts +4 -5
  507. package/esm/util/parseLineByLine.js +8 -14
  508. package/esm/util/pluginStore.d.ts +6 -8
  509. package/esm/util/pluginStore.js +17 -16
  510. package/esm/util/preloadComponent.d.ts +5 -0
  511. package/esm/util/preloadComponent.js +11 -0
  512. package/esm/util/progress.d.ts +22 -22
  513. package/esm/util/progress.js +27 -26
  514. package/esm/util/quantileExtent.d.ts +49 -0
  515. package/esm/util/quantileExtent.js +162 -0
  516. package/esm/util/range.d.ts +13 -9
  517. package/esm/util/range.js +17 -8
  518. package/esm/util/renameRegions.d.ts +26 -6
  519. package/esm/util/renameRegions.js +68 -54
  520. package/esm/util/renderToStaticMarkup.js +24 -14
  521. package/esm/util/rxjs.d.ts +23 -8
  522. package/esm/util/rxjs.js +61 -15
  523. package/esm/util/samplesTsv.d.ts +49 -0
  524. package/esm/util/samplesTsv.js +86 -0
  525. package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
  526. package/esm/util/scheduleDetachedDestroy.js +24 -0
  527. package/esm/util/scrollLatch.d.ts +1 -0
  528. package/esm/util/scrollLatch.js +8 -0
  529. package/esm/util/selectEncodedFeature.d.ts +16 -0
  530. package/esm/util/selectEncodedFeature.js +34 -0
  531. package/esm/util/sessionSharing.d.ts +7 -5
  532. package/esm/util/sessionSharing.js +23 -23
  533. package/esm/util/shapeNameList.d.ts +2 -0
  534. package/esm/util/shapeNameList.js +6 -0
  535. package/esm/util/shapeNames.d.ts +7 -0
  536. package/esm/util/shapeNames.js +11 -0
  537. package/esm/util/simpleFeature.d.ts +0 -1
  538. package/esm/util/springAnimate.js +1 -1
  539. package/esm/util/starFusion.d.ts +26 -0
  540. package/esm/util/starFusion.js +37 -0
  541. package/esm/util/stepTables.d.ts +96 -0
  542. package/esm/util/stepTables.js +277 -0
  543. package/esm/util/svAlt.d.ts +145 -0
  544. package/esm/util/svAlt.js +364 -0
  545. package/esm/util/svgColorProps.d.ts +11 -0
  546. package/esm/util/svgColorProps.js +28 -1
  547. package/esm/util/systemColorScheme.d.ts +12 -0
  548. package/esm/util/systemColorScheme.js +27 -0
  549. package/esm/util/tabix.d.ts +19 -10
  550. package/esm/util/tabix.js +19 -14
  551. package/esm/util/thresholdScale.d.ts +91 -0
  552. package/esm/util/thresholdScale.js +166 -0
  553. package/esm/util/timeGate.d.ts +4 -5
  554. package/esm/util/timeGate.js +4 -5
  555. package/esm/util/trackConfigDelta.d.ts +26 -26
  556. package/esm/util/trackConfigDelta.js +63 -47
  557. package/esm/util/tracks.d.ts +120 -66
  558. package/esm/util/tracks.js +501 -151
  559. package/esm/util/translateTranscript.d.ts +44 -0
  560. package/esm/util/translateTranscript.js +102 -0
  561. package/esm/util/types/data.d.ts +0 -2
  562. package/esm/util/types/index.d.ts +121 -22
  563. package/esm/util/types/index.js +9 -0
  564. package/esm/util/types/mst.d.ts +3 -0
  565. package/esm/util/types/mst.js +4 -0
  566. package/esm/util/types/renameIds.d.ts +1 -0
  567. package/esm/util/types/renameIds.js +29 -0
  568. package/esm/util/types/services.d.ts +1 -1
  569. package/esm/util/unknownSnapshotKeys.d.ts +53 -0
  570. package/esm/util/unknownSnapshotKeys.js +76 -0
  571. package/esm/util/useFeatureSequence.js +5 -5
  572. package/esm/util/useFetch.d.ts +3 -4
  573. package/esm/util/useFetch.js +19 -10
  574. package/esm/util/useFetchPlugins.d.ts +6 -2
  575. package/esm/util/useFetchPlugins.js +7 -3
  576. package/esm/util/usePanZoom.js +10 -3
  577. package/esm/util/usePanelVirtualScroll.d.ts +7 -35
  578. package/esm/util/usePanelVirtualScroll.js +9 -36
  579. package/esm/util/useRafCommit.js +1 -0
  580. package/esm/util/useRowVirtualScroll.d.ts +6 -29
  581. package/esm/util/useRowVirtualScroll.js +8 -49
  582. package/esm/util/useVirtualScrollWheel.d.ts +20 -4
  583. package/esm/util/useVirtualScrollWheel.js +40 -74
  584. package/esm/util/viewHighlights.d.ts +3 -0
  585. package/esm/util/viewHighlights.js +5 -0
  586. package/esm/util/viewStatus.d.ts +47 -15
  587. package/esm/util/viewStatus.js +34 -0
  588. package/esm/util/wheelZoom.d.ts +7 -1
  589. package/esm/util/wheelZoom.js +85 -19
  590. package/esm/util/whenViewSettled.d.ts +55 -8
  591. package/esm/util/whenViewSettled.js +56 -7
  592. package/esm/util/withFeatureDetails.js +4 -0
  593. package/esm/util/withLaunchInput.d.ts +174 -0
  594. package/esm/util/withLaunchInput.js +274 -0
  595. package/package.json +75 -24
  596. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
  597. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
  598. package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
  599. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
  600. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
  601. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
  602. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
  603. package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
  604. package/esm/ReExports/BaseFeatureDetails.js +0 -10
  605. package/esm/ReExports/index.d.ts +0 -1
  606. package/esm/ReExports/index.js +0 -1
  607. package/esm/ReExports/publicUtil.d.ts +0 -1
  608. package/esm/ReExports/publicUtil.js +0 -28
  609. package/esm/configuration/promotableDefaults.d.ts +0 -199
  610. package/esm/configuration/promotableDefaults.js +0 -326
  611. package/esm/configuration/promotablePin.d.ts +0 -55
  612. package/esm/configuration/promotablePin.js +0 -1
  613. package/esm/configuration/promotableResolve.d.ts +0 -108
  614. package/esm/configuration/promotableResolve.js +0 -117
  615. package/esm/configuration/promotableSlots.d.ts +0 -12
  616. package/esm/configuration/promotableSlots.js +0 -45
  617. package/esm/configuration/slotShape.d.ts +0 -12
  618. package/esm/configuration/slotShape.js +0 -84
  619. package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
  620. package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
  621. package/esm/ui/PinAdornment.d.ts +0 -5
  622. package/esm/ui/PinAdornment.js +0 -79
  623. package/esm/ui/SvgGradientLegend.d.ts +0 -26
  624. package/esm/ui/SvgGradientLegend.js +0 -26
  625. package/esm/ui/highlightChipReveal.d.ts +0 -32
  626. package/esm/ui/highlightChipReveal.js +0 -39
  627. package/esm/ui/promotableMenuItems.d.ts +0 -19
  628. package/esm/ui/promotableMenuItems.js +0 -89
  629. package/esm/ui/promotablePinCoverage.d.ts +0 -44
  630. package/esm/ui/promotablePinCoverage.js +0 -87
  631. package/esm/util/applyInitSettings.d.ts +0 -79
  632. package/esm/util/applyInitSettings.js +0 -91
  633. package/esm/util/openDisplays.d.ts +0 -23
  634. package/esm/util/openDisplays.js +0 -79
  635. package/esm/util/stopToken.d.ts +0 -211
  636. package/esm/util/stopToken.js +0 -438
  637. /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The markup rules an SVG file has to meet that a React render into an HTML
3
+ * container does not: XML entities only (HTML serialization writes U+00A0 as
4
+ * ` `, which XML does not define, so one no-break space in a feature label
5
+ * made the whole file unparsable), SVG 1.1 colors, and rounded numbers.
6
+ */
7
+ export declare function normalizeSvgMarkup(html: string): string;
@@ -0,0 +1,99 @@
1
+ import { splitPaintAlpha } from '../util/svgColorProps.js';
2
+ // Coordinates computed as bp/bpPerPx land in attributes as long floats
3
+ // (`-32.4816`) or floating-point noise (`242.23839999999998`), bloating exports
4
+ // with sub-pixel precision no renderer needs. Round numbers inside a fixed
5
+ // whitelist of numeric attributes, so a track label or id that happens to look
6
+ // numeric is never a candidate for rewriting. Geometry gets 2 decimals
7
+ // (sub-pixel); opacity keeps 3 so a faint 0.01 mark can't collapse to 0.
8
+ const COORD_ATTRS = [
9
+ 'x',
10
+ 'y',
11
+ 'x1',
12
+ 'y1',
13
+ 'x2',
14
+ 'y2',
15
+ 'cx',
16
+ 'cy',
17
+ 'r',
18
+ 'rx',
19
+ 'ry',
20
+ 'dx',
21
+ 'dy',
22
+ 'width',
23
+ 'height',
24
+ 'd',
25
+ 'points',
26
+ 'transform',
27
+ 'gradientTransform',
28
+ 'offset',
29
+ 'viewBox',
30
+ 'font-size',
31
+ 'stroke-width',
32
+ 'stroke-dashoffset',
33
+ 'stroke-dasharray',
34
+ ];
35
+ const OPACITY_ATTRS = [
36
+ 'opacity',
37
+ 'fill-opacity',
38
+ 'stroke-opacity',
39
+ 'stop-opacity',
40
+ 'flood-opacity',
41
+ ];
42
+ function makeRounder(attrs, digits) {
43
+ const re = new RegExp(`\\b(${attrs.join('|')})="([^"]*)"`, 'g');
44
+ return (svg) => svg.replaceAll(re, (_, name, value) => {
45
+ const rounded = value.replaceAll(/-?\d+\.\d{3,}(?:e-?\d+)?/gi, n => String(Number.parseFloat(Number(n).toFixed(digits))));
46
+ return `${name}="${rounded}"`;
47
+ });
48
+ }
49
+ const roundCoords = makeRounder(COORD_ATTRS, 2);
50
+ const roundOpacity = makeRounder(OPACITY_ATTRS, 3);
51
+ const OPACITY_OF = {
52
+ fill: 'fill-opacity',
53
+ stroke: 'stroke-opacity',
54
+ 'stop-color': 'stop-opacity',
55
+ 'flood-color': 'flood-opacity',
56
+ };
57
+ // a start tag, attribute by attribute, so a `>` inside a quoted value (which
58
+ // HTML serialization leaves unescaped) cannot end it early
59
+ const START_TAG = /<[a-zA-Z][^\s/>]*(?:\s+[^\s"'/=>]+="[^"]*")*\s*\/?>/g;
60
+ const PAINT_ATTR = /\s(fill|stroke|stop-color|flood-color)="([^"]*)"/g;
61
+ const MAY_NEED_SPLIT = /(?:fill|stroke|stop-color|flood-color)="(?:rgba|hsl|#[\da-f]{4}"|#[\da-f]{8}"|transparent)/i;
62
+ // A JSX color reaches the file as React wrote it, and theme palette entries are
63
+ // routinely `rgba()` (`divider`, `text.secondary`) — see `splitPaintAlpha` for
64
+ // why that can't stay. Scoped to one start tag so an alpha folds into an
65
+ // opacity attribute the element already carries instead of duplicating it,
66
+ // which would not parse as XML.
67
+ function splitTagPaintAlpha(tag) {
68
+ const alphas = [];
69
+ let out = tag.replaceAll(PAINT_ATTR, (whole, name, value) => {
70
+ const split = splitPaintAlpha(value);
71
+ if (!split) {
72
+ return whole;
73
+ }
74
+ if (split.opacity < 1) {
75
+ alphas.push([OPACITY_OF[name], split.opacity]);
76
+ }
77
+ return ` ${name}="${split.color}"`;
78
+ });
79
+ for (const [opacityName, alpha] of alphas) {
80
+ const existing = new RegExp(`\\s${opacityName}="([^"]*)"`);
81
+ out = existing.test(out)
82
+ ? out.replace(existing, (_, v) => ` ${opacityName}="${Number(v) * alpha}"`)
83
+ : out.replace(/\s*(\/?>)$/, ` ${opacityName}="${alpha}"$1`);
84
+ }
85
+ return out;
86
+ }
87
+ /**
88
+ * The markup rules an SVG file has to meet that a React render into an HTML
89
+ * container does not: XML entities only (HTML serialization writes U+00A0 as
90
+ * `&nbsp;`, which XML does not define, so one no-break space in a feature label
91
+ * made the whole file unparsable), SVG 1.1 colors, and rounded numbers.
92
+ */
93
+ export function normalizeSvgMarkup(html) {
94
+ const xml = html.replaceAll('&nbsp;', '&#160;');
95
+ const split = MAY_NEED_SPLIT.test(xml)
96
+ ? xml.replaceAll(START_TAG, splitTagPaintAlpha)
97
+ : xml;
98
+ return roundOpacity(roundCoords(split));
99
+ }
@@ -0,0 +1,7 @@
1
+ import type React from 'react';
2
+ export { normalizeSvgMarkup } from './normalizeSvgMarkup.ts';
3
+ /**
4
+ * Serialize one standalone SVG document: its own clip-id numbering run (see
5
+ * `withFreshSvgClipIds`) and the file rules in `normalizeSvgMarkup`.
6
+ */
7
+ export declare function serializeSvg(node: React.ReactElement): string;
@@ -0,0 +1,11 @@
1
+ import { withFreshSvgClipIds } from '../util/SvgCanvas.js';
2
+ import { renderToStaticMarkup } from '../util/renderToStaticMarkup.js';
3
+ import { normalizeSvgMarkup } from './normalizeSvgMarkup.js';
4
+ export { normalizeSvgMarkup } from './normalizeSvgMarkup.js';
5
+ /**
6
+ * Serialize one standalone SVG document: its own clip-id numbering run (see
7
+ * `withFreshSvgClipIds`) and the file rules in `normalizeSvgMarkup`.
8
+ */
9
+ export function serializeSvg(node) {
10
+ return normalizeSvgMarkup(withFreshSvgClipIds(() => renderToStaticMarkup(node)));
11
+ }
@@ -5,7 +5,7 @@
5
5
  * Injective but NOT idempotent — escaping the marker is what buys injectivity,
6
6
  * so a second pass re-escapes the `~`s the first one wrote. Apply it exactly
7
7
  * once, at the place that emits both the id and the reference to it
8
- * (`SvgClipRect` and `SvgGradientLegend` already do; a hand-rolled `<clipPath>`
8
+ * (`SvgClipRect` and `SvgColorLegend` already do; a hand-rolled `<clipPath>`
9
9
  * must). Double-applying is harmless to correctness — the id and its `url()`
10
10
  * still agree, since both are derived from one call — but it produces noisy ids
11
11
  * for no reason.
package/esm/svg/svgId.js CHANGED
@@ -34,7 +34,7 @@ const UNSAFE_ID_CHAR = /[^\w.:-]/g;
34
34
  * Injective but NOT idempotent — escaping the marker is what buys injectivity,
35
35
  * so a second pass re-escapes the `~`s the first one wrote. Apply it exactly
36
36
  * once, at the place that emits both the id and the reference to it
37
- * (`SvgClipRect` and `SvgGradientLegend` already do; a hand-rolled `<clipPath>`
37
+ * (`SvgClipRect` and `SvgColorLegend` already do; a hand-rolled `<clipPath>`
38
38
  * must). Double-applying is harmless to correctness — the id and its `url()`
39
39
  * still agree, since both are derived from one call — but it produces noisy ids
40
40
  * for no reason.
@@ -37,9 +37,9 @@ export interface SvgReadyTerminals {
37
37
  * data is current for what is on screen, or the fetch reached a terminal state.
38
38
  *
39
39
  * Single-sourced for the same reason as `computeDisplayPhase`: every display
40
- * family expresses freshness differently — spatial coverage (per-region),
41
- * viewport-snapshot compare (global), signature compare (arc / dotplot /
42
- * synteny) — but the *policy* wrapping it is identical, and each of the five
40
+ * family expresses freshness differently — spatial coverage (per-region), a
41
+ * signature compare (global, dotplot, synteny) — but the *policy* wrapping it
42
+ * is identical, and each of the five
43
43
  * hand-written copies this replaced was one place to forget a terminal and hang
44
44
  * the export, or to forget freshness and capture a stale viewport (both have
45
45
  * shipped; see agent-docs/reference/SVG_EXPORT.md).
@@ -55,10 +55,11 @@ export declare function computeSvgReady({ error, regionTooLarge, extraTerminal,
55
55
  * Off-screen renderers (SVG export, headless jbrowse-img) must wait until the
56
56
  * display reaches a terminal state before reading its data. That whole policy
57
57
  * lives in `svgReady`; this is the one shared way to await it, so renderers
58
- * never re-inline `data != null || error || …`. No time bound: `svgReady` is a
59
- * terminal state (data loaded, or error / too-large), so it resolves once the
60
- * fetch it observes settles. If a throwing `svgReady` getter rejects the wait,
61
- * that error propagates faithfully rather than being masked.
58
+ * never re-inline `data != null || error || …`. `svgReady` is a terminal state
59
+ * (data loaded, or error / too-large / canceled), so it resolves once the fetch
60
+ * it observes settles; the half-hour `timeoutMs` is only a backstop for a gate
61
+ * that cannot converge. If a throwing `svgReady` getter rejects the wait, that
62
+ * error propagates faithfully rather than being masked.
62
63
  *
63
64
  * It then fails the export if the terminal it settled on was the error
64
65
  * (`throwOnExportErrors`, below, for why that is fatal), making this the exact
@@ -94,6 +95,7 @@ export declare function awaitSvgReady(model: Pick<SvgExportable, 'svgReady' | 'e
94
95
  export declare function awaitViewInitialized(view: {
95
96
  initialized: boolean;
96
97
  error: unknown;
98
+ pendingLaunch?: unknown;
97
99
  }): Promise<void>;
98
100
  /**
99
101
  * How the export answers "a track failed": by failing. A track whose data won't
@@ -17,9 +17,9 @@ const SVG_READY_TIMEOUT_MS = 1_800_000;
17
17
  * data is current for what is on screen, or the fetch reached a terminal state.
18
18
  *
19
19
  * Single-sourced for the same reason as `computeDisplayPhase`: every display
20
- * family expresses freshness differently — spatial coverage (per-region),
21
- * viewport-snapshot compare (global), signature compare (arc / dotplot /
22
- * synteny) — but the *policy* wrapping it is identical, and each of the five
20
+ * family expresses freshness differently — spatial coverage (per-region), a
21
+ * signature compare (global, dotplot, synteny) — but the *policy* wrapping it
22
+ * is identical, and each of the five
23
23
  * hand-written copies this replaced was one place to forget a terminal and hang
24
24
  * the export, or to forget freshness and capture a stale viewport (both have
25
25
  * shipped; see agent-docs/reference/SVG_EXPORT.md).
@@ -37,10 +37,11 @@ export function computeSvgReady({ error, regionTooLarge, extraTerminal, fetchCan
37
37
  * Off-screen renderers (SVG export, headless jbrowse-img) must wait until the
38
38
  * display reaches a terminal state before reading its data. That whole policy
39
39
  * lives in `svgReady`; this is the one shared way to await it, so renderers
40
- * never re-inline `data != null || error || …`. No time bound: `svgReady` is a
41
- * terminal state (data loaded, or error / too-large), so it resolves once the
42
- * fetch it observes settles. If a throwing `svgReady` getter rejects the wait,
43
- * that error propagates faithfully rather than being masked.
40
+ * never re-inline `data != null || error || …`. `svgReady` is a terminal state
41
+ * (data loaded, or error / too-large / canceled), so it resolves once the fetch
42
+ * it observes settles; the half-hour `timeoutMs` is only a backstop for a gate
43
+ * that cannot converge. If a throwing `svgReady` getter rejects the wait, that
44
+ * error propagates faithfully rather than being masked.
44
45
  *
45
46
  * It then fails the export if the terminal it settled on was the error
46
47
  * (`throwOnExportErrors`, below, for why that is fatal), making this the exact
@@ -12,10 +12,12 @@ export declare function svgTrackName(track: {
12
12
  configuration: AnyConfigurationModel;
13
13
  }, session: TrackCatalog): string;
14
14
  /**
15
- * Tell the user which visible tracks the export left out because their display
16
- * type implements no `renderSvg`. Called once per export, after the renders —
17
- * the stacked views flatten every row's `skippedTracks` into one call rather
18
- * than notifying per row.
15
+ * Tell the user which visible tracks the export left out, by default because
16
+ * their display type implements no `renderSvg`. Called once per reason per
17
+ * export, after the renders — the stacked views flatten every row's
18
+ * `skippedTracks` into one call rather than notifying per row.
19
+ *
20
+ * A track shown in several rows is named once.
19
21
  *
20
22
  * Skipping is deliberate (see `SvgExportTrack.renderSvg`), so this is
21
23
  * informational rather than an error. But it is not silent: a figure that is
@@ -24,4 +26,4 @@ export declare function svgTrackName(track: {
24
26
  */
25
27
  export declare function notifySkippedSvgTracks(session: NotificationSink & TrackCatalog, skipped: {
26
28
  configuration: AnyConfigurationModel;
27
- }[]): void;
29
+ }[], reason?: string): void;
@@ -12,20 +12,23 @@ export function svgTrackName(track, session) {
12
12
  return coarseStripHTML(getTrackName(track.configuration, session));
13
13
  }
14
14
  /**
15
- * Tell the user which visible tracks the export left out because their display
16
- * type implements no `renderSvg`. Called once per export, after the renders —
17
- * the stacked views flatten every row's `skippedTracks` into one call rather
18
- * than notifying per row.
15
+ * Tell the user which visible tracks the export left out, by default because
16
+ * their display type implements no `renderSvg`. Called once per reason per
17
+ * export, after the renders — the stacked views flatten every row's
18
+ * `skippedTracks` into one call rather than notifying per row.
19
+ *
20
+ * A track shown in several rows is named once.
19
21
  *
20
22
  * Skipping is deliberate (see `SvgExportTrack.renderSvg`), so this is
21
23
  * informational rather than an error. But it is not silent: a figure that is
22
24
  * quietly short a track is worse than one whose author was told why, and the
23
25
  * reader of the file has no way to tell the difference afterwards.
24
26
  */
25
- export function notifySkippedSvgTracks(session, skipped) {
26
- if (skipped.length === 0) {
27
- return;
27
+ export function notifySkippedSvgTracks(session, skipped, reason) {
28
+ const names = [...new Set(skipped.map(t => svgTrackName(t, session)))];
29
+ if (names.length > 0) {
30
+ const why = reason ??
31
+ `${names.length === 1 ? 'Its display type does' : 'Their display types do'} not support SVG export.`;
32
+ session.notify(`Not included in the SVG: ${names.join(', ')}. ${why}`, 'info');
28
33
  }
29
- const names = skipped.map(t => svgTrackName(t, session)).join(', ');
30
- session.notify(`Not included in the SVG: ${names}. ${skipped.length === 1 ? 'Its display type does' : 'Their display types do'} not support SVG export.`, 'info');
31
34
  }
@@ -1,78 +1,10 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { ThemeProvider } from '@mui/material';
3
- import { StyleThemeProvider } from '../ui/PaletteContext.js';
4
- import { resolveStyleTheme } from '../ui/styleTheme.js';
5
- import { createJBrowseTheme } from '../ui/theme.js';
6
- import { resetSvgClipIds } from '../util/SvgCanvas.js';
7
- import { renderToStaticMarkup } from '../util/renderToStaticMarkup.js';
8
2
  import { SVGExportRoot } from './SvgExport.js';
9
- // Coordinates computed as bp/bpPerPx land in attributes as long floats
10
- // (`-32.4816`) or floating-point noise (`242.23839999999998`), bloating exports
11
- // with sub-pixel precision no renderer needs. Round numbers inside a fixed
12
- // whitelist of numeric attributes, so a track label or id that happens to look
13
- // numeric is never a candidate for rewriting. Geometry gets 2 decimals
14
- // (sub-pixel); opacity keeps 3 so a faint 0.01 mark can't collapse to 0.
15
- const COORD_ATTRS = [
16
- 'x',
17
- 'y',
18
- 'x1',
19
- 'y1',
20
- 'x2',
21
- 'y2',
22
- 'cx',
23
- 'cy',
24
- 'r',
25
- 'rx',
26
- 'ry',
27
- 'dx',
28
- 'dy',
29
- 'width',
30
- 'height',
31
- 'd',
32
- 'points',
33
- 'transform',
34
- 'gradientTransform',
35
- 'offset',
36
- 'viewBox',
37
- 'font-size',
38
- 'stroke-width',
39
- 'stroke-dashoffset',
40
- 'stroke-dasharray',
41
- ];
42
- const OPACITY_ATTRS = [
43
- 'opacity',
44
- 'fill-opacity',
45
- 'stroke-opacity',
46
- 'stop-opacity',
47
- 'flood-opacity',
48
- ];
49
- function makeRounder(attrs, digits) {
50
- const re = new RegExp(`\\b(${attrs.join('|')})="([^"]*)"`, 'g');
51
- return (svg) => svg.replaceAll(re, (_, name, value) => {
52
- const rounded = value.replaceAll(/-?\d+\.\d{3,}(?:e-?\d+)?/gi, n => String(Number.parseFloat(Number(n).toFixed(digits))));
53
- return `${name}="${rounded}"`;
54
- });
55
- }
56
- const roundCoords = makeRounder(COORD_ATTRS, 2);
57
- const roundOpacity = makeRounder(OPACITY_ATTRS, 3);
58
- function roundSvgNumbers(svg) {
59
- return roundOpacity(roundCoords(svg));
60
- }
61
- // The identical tail every view's `renderToSvg` ends in: resolve the export
62
- // theme into a provider, apply the caller-supplied Wrapper, wrap the content in
63
- // the root <svg>, and serialize to a markup string. Callers keep their own
64
- // layout math and children — only this boilerplate lives here.
3
+ import { SvgThemeProviders } from './SvgThemeProviders.js';
4
+ import { serializeSvg } from './serializeSvg.js';
5
+ // The identical tail every view's `renderToSvg` ends in: the export theme's
6
+ // providers, the caller-supplied Wrapper, the root <svg>, and serialization to
7
+ // a file's markup. Callers keep their own layout math and children.
65
8
  export function wrapSvgExport({ theme, width, height, margin, fontFamily, Wrapper = ({ children }) => children, children, }) {
66
- // One document, one clip-id numbering run. The counter SvgCanvas draws from is
67
- // document-global because SVG ids are, so left alone it also spans documents
68
- // and numbers each export from wherever the last one stopped — see
69
- // resetSvgClipIds. This is the only place that can reset it: the render below
70
- // is synchronous, so it is the one moment a whole document's ids are minted
71
- // with no other export able to interleave.
72
- resetSvgClipIds();
73
- // Both providers, from the same options — the export renders outside every
74
- // React tree the app mounted, so a `makeStyles` component here would
75
- // otherwise style itself from the *default* style theme and quietly ignore
76
- // the theme the user picked in the export dialog.
77
- return roundSvgNumbers(renderToStaticMarkup(_jsx(ThemeProvider, { theme: createJBrowseTheme(theme), children: _jsx(StyleThemeProvider, { theme: resolveStyleTheme({ configTheme: theme }), children: _jsx(Wrapper, { children: _jsx(SVGExportRoot, { width: width, height: height, margin: margin, fontFamily: fontFamily, children: children }) }) }) })));
9
+ return serializeSvg(_jsx(SvgThemeProviders, { theme: theme, children: _jsx(Wrapper, { children: _jsx(SVGExportRoot, { width: width, height: height, margin: margin, fontFamily: fontFamily, children: children }) }) }));
78
10
  }
@@ -33,15 +33,12 @@ export default function AddCustomPluginDialog({ onClose, onAdd, }) {
33
33
  const [umdPluginName, setUMDPluginName] = useState('');
34
34
  const [umdPluginUrl, setUMDPluginUrl] = useState('');
35
35
  const [esmPluginUrl, setESMPluginUrl] = useState('');
36
- const [cjsPluginUrl, setCJSPluginUrl] = useState('');
37
36
  const [advancedOptionsOpen, setAdvancedOptionsOpen] = useState(false);
38
- const ready = Boolean((umdPluginName && umdPluginUrl) || esmPluginUrl || cjsPluginUrl);
37
+ const ready = Boolean((umdPluginName && umdPluginUrl) || esmPluginUrl);
39
38
  return (_jsx(SubmitDialog, { open: true, maxWidth: "sm", fullWidth: true, title: "Add custom plugin", submitDisabled: !ready, onCancel: onClose, onSubmit: () => {
40
39
  const definition = umdPluginName && umdPluginUrl
41
40
  ? { name: umdPluginName, umdUrl: umdPluginUrl }
42
- : esmPluginUrl
43
- ? { esmUrl: esmPluginUrl }
44
- : { cjsUrl: cjsPluginUrl };
41
+ : { esmUrl: esmPluginUrl };
45
42
  if (onAdd(definition)) {
46
43
  onClose();
47
44
  }
@@ -53,9 +50,7 @@ export default function AddCustomPluginDialog({ onClose, onAdd, }) {
53
50
  setAdvancedOptionsOpen(!advancedOptionsOpen);
54
51
  }, children: [_jsx(IconButton, { className: cx(classes.expand, {
55
52
  [classes.expandOpen]: advancedOptionsOpen,
56
- }), "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. If your plugin is in another format, or you have additional builds you want to add (such as a CJS build for using NodeJS APIs in desktop), you can enter the URLs for those builds below." }), _jsx(TextField, { label: "ESM build URL", variant: "outlined", fullWidth: true, margin: "dense", value: esmPluginUrl, onChange: event => {
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 => {
57
54
  setESMPluginUrl(event.target.value);
58
- } }), _jsx(TextField, { label: "CJS build URL", variant: "outlined", fullWidth: true, margin: "dense", value: cjsPluginUrl, onChange: event => {
59
- setCJSPluginUrl(event.target.value);
60
55
  } })] }) })] }) }));
61
56
  }
@@ -0,0 +1,45 @@
1
+ import type { AbstractSessionModel } from '../util/types/index.ts';
2
+ /**
3
+ * One element that says whether the whole app has finished, and what is open.
4
+ *
5
+ * `[data-app-phase="ready"]` is the entire readiness contract for anything
6
+ * driving JBrowse from outside — a screenshot tool, a test, an agent. Wait for
7
+ * that selector and you are done; there is no chain to assemble and no
8
+ * per-display census to take.
9
+ *
10
+ * Why it exists when `data-view-phase` and `data-display-phase` already do:
11
+ * those are per-element and NEGATIVE. Asking them "is everything finished"
12
+ * means asserting that no element carries the loading value, which is equally
13
+ * true of an app that has not started — and the gap is real, measured at about
14
+ * a second on a two-track session. A positive attribute cannot be satisfied
15
+ * early, because something has to render it.
16
+ *
17
+ * The census attributes beside it — `data-app-views`, `data-app-assemblies`,
18
+ * `data-app-tracks` (the latter two JSON arrays) — publish WHAT is open the
19
+ * same way the phase publishes whether it is done, so an outside reader asking
20
+ * "is the track I requested actually open" reads one element instead of
21
+ * walking `window.JBrowseSession` with its own copy of the view nesting. The
22
+ * walk itself is `openViews`/`openTracks` over each view's declared
23
+ * `ownViews`/`ownTracks`, so this component knows nothing about which property
24
+ * a container view keeps its children on either.
25
+ *
26
+ * Its own component, and `hidden`, for two reasons: an observer here subscribes
27
+ * to every view's phase without re-rendering the app shell around it, and a
28
+ * marker that is never drawn cannot be mistaken for UI or shift a layout. It is
29
+ * still found by `querySelector`, which is what reads it.
30
+ *
31
+ * **What it is silent about**: a display in a TERMINAL state. `error` and
32
+ * `canceled` are finished states, so this reads `ready` over a display whose
33
+ * fetch failed or that the user stopped — correctly, since nothing is still
34
+ * working, and a user's cancel is durable until Retry. A capture wants more than
35
+ * that: it wants a picture, and neither banner is one. The capture census after
36
+ * this is what draws that line: it names every `data-display-drawn="false"`,
37
+ * which the two comparative canvases publish from their stricter `settled` gate
38
+ * (see `comparativeReadiness` in `@jbrowse/synteny-core`, which holds both
39
+ * answers and says why an error separates them), and every
40
+ * `data-display-phase="canceled"`.
41
+ */
42
+ declare const AppReadyMarker: ({ session, }: {
43
+ session: AbstractSessionModel;
44
+ }) => import("react").JSX.Element;
45
+ export default AppReadyMarker;
@@ -0,0 +1,89 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { observer } from 'mobx-react';
3
+ import { openTracks, openViews } from '../util/openViews.js';
4
+ function trackLoading(track) {
5
+ return track.displays.some(d => d.displayPhase === 'loading');
6
+ }
7
+ /**
8
+ * A view whose init failed (its assembly was never found) stays uninitialized
9
+ * for good and paints its error, so like a display's terminal phase it is
10
+ * finished, not pending: without this the whole app read `loading` for as long
11
+ * as that view was open, and every settle answered false with no reason.
12
+ *
13
+ * `pendingLaunch` is the third term and the one that was missing. `initialized`
14
+ * goes true mid-launch — LGV's flips the moment displayedRegions land, while
15
+ * the same apply pass still has the spec's tracks to attach — and `showLoading`
16
+ * goes false at the same moment, deliberately, so the reader sees the
17
+ * navigated view rather than a spinner while its tracks arrive. That left a
18
+ * window, exactly as wide as attaching the tracks, in which the marker said
19
+ * `ready` over a session missing everything it had been asked for.
20
+ * `whenViewSettled` states the same rule for the callers that await a single
21
+ * view, and says why in more detail. Not shared as one predicate: that one
22
+ * requires `initialized`, while absent here means not loading, and an adapter
23
+ * between the two null rules would read as agreement it does not have.
24
+ *
25
+ * `showImportForm` excuses the `initialized` term, and only that one. The
26
+ * comparative views spell `initialized` as "every row exists and is ready" —
27
+ * LinearSyntenyView's wants `views.length > 0`, dotplot's wants regions on both
28
+ * axes — so a view clicked into existence through `Add -> Linear synteny view`
29
+ * reads uninitialized for as long as its form is up, which is until a person
30
+ * fills it in. The app sat at `loading` behind every import-form figure. The
31
+ * other two terms keep their meaning: `showLoading` is the spinner the form
32
+ * yields to, and `showImportForm` is already false while a launch is pending.
33
+ */
34
+ function viewLoading(view) {
35
+ const flags = view;
36
+ return (flags.error === undefined &&
37
+ (flags.showLoading === true ||
38
+ flags.pendingLaunch !== undefined ||
39
+ (flags.initialized === false && flags.showImportForm !== true)));
40
+ }
41
+ /**
42
+ * One element that says whether the whole app has finished, and what is open.
43
+ *
44
+ * `[data-app-phase="ready"]` is the entire readiness contract for anything
45
+ * driving JBrowse from outside — a screenshot tool, a test, an agent. Wait for
46
+ * that selector and you are done; there is no chain to assemble and no
47
+ * per-display census to take.
48
+ *
49
+ * Why it exists when `data-view-phase` and `data-display-phase` already do:
50
+ * those are per-element and NEGATIVE. Asking them "is everything finished"
51
+ * means asserting that no element carries the loading value, which is equally
52
+ * true of an app that has not started — and the gap is real, measured at about
53
+ * a second on a two-track session. A positive attribute cannot be satisfied
54
+ * early, because something has to render it.
55
+ *
56
+ * The census attributes beside it — `data-app-views`, `data-app-assemblies`,
57
+ * `data-app-tracks` (the latter two JSON arrays) — publish WHAT is open the
58
+ * same way the phase publishes whether it is done, so an outside reader asking
59
+ * "is the track I requested actually open" reads one element instead of
60
+ * walking `window.JBrowseSession` with its own copy of the view nesting. The
61
+ * walk itself is `openViews`/`openTracks` over each view's declared
62
+ * `ownViews`/`ownTracks`, so this component knows nothing about which property
63
+ * a container view keeps its children on either.
64
+ *
65
+ * Its own component, and `hidden`, for two reasons: an observer here subscribes
66
+ * to every view's phase without re-rendering the app shell around it, and a
67
+ * marker that is never drawn cannot be mistaken for UI or shift a layout. It is
68
+ * still found by `querySelector`, which is what reads it.
69
+ *
70
+ * **What it is silent about**: a display in a TERMINAL state. `error` and
71
+ * `canceled` are finished states, so this reads `ready` over a display whose
72
+ * fetch failed or that the user stopped — correctly, since nothing is still
73
+ * working, and a user's cancel is durable until Retry. A capture wants more than
74
+ * that: it wants a picture, and neither banner is one. The capture census after
75
+ * this is what draws that line: it names every `data-display-drawn="false"`,
76
+ * which the two comparative canvases publish from their stricter `settled` gate
77
+ * (see `comparativeReadiness` in `@jbrowse/synteny-core`, which holds both
78
+ * answers and says why an error separates them), and every
79
+ * `data-display-phase="canceled"`.
80
+ */
81
+ const AppReadyMarker = observer(function AppReadyMarker({ session, }) {
82
+ const views = openViews(session);
83
+ const tracks = openTracks(session);
84
+ const loading = views.some(viewLoading) || tracks.some(trackLoading);
85
+ return (_jsx("span", { hidden: true, "data-testid": "app-ready-marker", "data-app-phase": loading ? 'loading' : 'ready', "data-app-views": session.views.length, "data-app-assemblies": JSON.stringify([
86
+ ...new Set(views.flatMap(v => v.assemblyNames ?? [])),
87
+ ]), "data-app-tracks": JSON.stringify(tracks.map(t => t.configuration.trackId ?? '(unnamed)')) }));
88
+ });
89
+ export default AppReadyMarker;
@@ -9,7 +9,7 @@ export interface BaseExportSvgOptions {
9
9
  declare const _default: ({ model, handleClose, exportSvg, children, checkboxes, }: {
10
10
  model: IAnyStateTreeNode;
11
11
  handleClose: () => void;
12
- exportSvg: (opts: BaseExportSvgOptions) => Promise<void>;
12
+ exportSvg: (opts: BaseExportSvgOptions) => Promise<unknown>;
13
13
  children?: React.ReactNode;
14
14
  checkboxes?: React.ReactNode;
15
15
  }) => import("react").JSX.Element;