@jbrowse/core 5.0.0-beta.1 → 5.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1476 -265
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +16 -9
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +50 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
- package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
- package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
- package/esm/BaseFeatureWidget/formatDetails.js +62 -83
- package/esm/BaseFeatureWidget/index.d.ts +2 -1
- package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
- package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
- package/esm/BaseFeatureWidget/types.d.ts +12 -6
- package/esm/BaseFeatureWidget/util.d.ts +0 -10
- package/esm/BaseFeatureWidget/util.js +0 -17
- package/esm/CorePlugin.js +2 -2
- package/esm/PluginLoader.d.ts +24 -13
- package/esm/PluginLoader.js +167 -51
- package/esm/PluginManager.d.ts +130 -24
- package/esm/PluginManager.js +180 -32
- package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
- package/esm/ReExports/MuiDataGridReExports.js +2 -2
- package/esm/ReExports/coreModules.generated.d.ts +2 -0
- package/esm/ReExports/coreModules.generated.js +528 -0
- package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/coreWorkerModules.generated.js +488 -0
- package/esm/ReExports/frameworkModules.d.ts +2 -0
- package/esm/ReExports/frameworkModules.js +68 -0
- package/esm/ReExports/frameworkShared.d.ts +12 -0
- package/esm/ReExports/frameworkShared.js +16 -0
- package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
- package/esm/ReExports/list.js +527 -79
- package/esm/ReExports/modules.d.ts +1 -1
- package/esm/ReExports/modules.js +10 -165
- package/esm/ReExports/registry.d.ts +1 -0
- package/esm/ReExports/registry.js +23 -5
- package/esm/ReExports/uiStub.d.ts +3 -0
- package/esm/ReExports/uiStub.js +33 -0
- package/esm/ReExports/workerModules.d.ts +2 -0
- package/esm/ReExports/workerModules.js +11 -0
- package/esm/TextSearch/TextSearchManager.d.ts +27 -13
- package/esm/TextSearch/TextSearchManager.js +77 -36
- package/esm/TextSearch/places.d.ts +12 -0
- package/esm/TextSearch/places.js +94 -0
- package/esm/assemblyManager/assembly.d.ts +21 -19
- package/esm/assemblyManager/assembly.js +28 -26
- package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
- package/esm/assemblyManager/assemblyAdapters.js +8 -2
- package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
- package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
- package/esm/assemblyManager/assemblyManager.d.ts +35 -180
- package/esm/assemblyManager/assemblyManager.js +47 -51
- package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
- package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
- package/esm/assemblyManager/geneticCodes.js +2 -5
- package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
- package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
- package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
- package/esm/assemblyManager/indexAssemblyNames.js +22 -0
- package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
- package/esm/assemblyManager/loadRefNameMap.js +4 -9
- package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
- package/esm/assemblyManager/refNameMapKey.js +12 -0
- package/esm/checkPlugins.d.ts +2 -0
- package/esm/checkPlugins.js +38 -17
- package/esm/configuration/bamIndexFields.d.ts +49 -0
- package/esm/configuration/bamIndexFields.js +41 -0
- package/esm/configuration/configurationSchema.d.ts +101 -71
- package/esm/configuration/configurationSchema.js +207 -134
- package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
- package/esm/configuration/configurationSchemaUnion.js +56 -0
- package/esm/configuration/configurationSlot.d.ts +150 -60
- package/esm/configuration/configurationSlot.js +103 -75
- package/esm/configuration/fillLocations.d.ts +14 -0
- package/esm/configuration/fillLocations.js +14 -0
- package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
- package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
- package/esm/configuration/formatDetailsConfigSchema.js +10 -13
- package/esm/configuration/fullConfSnapshot.d.ts +4 -19
- package/esm/configuration/fullConfSnapshot.js +30 -52
- package/esm/configuration/getConf.d.ts +45 -41
- package/esm/configuration/getConf.js +111 -44
- package/esm/configuration/index.d.ts +24 -11
- package/esm/configuration/index.js +15 -7
- package/esm/configuration/indexType.d.ts +26 -0
- package/esm/configuration/indexType.js +38 -0
- package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
- package/esm/configuration/mergeFormatCallbacks.js +13 -10
- package/esm/configuration/readConfObject.d.ts +2 -24
- package/esm/configuration/readConfObject.js +20 -63
- package/esm/configuration/requirements.d.ts +37 -0
- package/esm/configuration/requirements.js +88 -0
- package/esm/configuration/schemaRegistry.d.ts +32 -15
- package/esm/configuration/schemaRegistry.js +33 -35
- package/esm/configuration/schemaTypes.d.ts +21 -5
- package/esm/configuration/schemaTypes.js +66 -55
- package/esm/configuration/slotFacade.d.ts +12 -29
- package/esm/configuration/slotFacade.js +44 -23
- package/esm/configuration/snapshotPreprocess.d.ts +43 -0
- package/esm/configuration/snapshotPreprocess.js +161 -0
- package/esm/configuration/tabixIndexFields.d.ts +30 -4
- package/esm/configuration/tabixIndexFields.js +21 -4
- package/esm/configuration/tabixShorthand.d.ts +34 -17
- package/esm/configuration/tabixShorthand.js +49 -22
- package/esm/configuration/types.d.ts +182 -43
- package/esm/configuration/uriShorthand.d.ts +9 -0
- package/esm/configuration/uriShorthand.js +16 -0
- package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
- package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
- package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
- package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
- package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
- package/esm/data_adapters/BaseAdapter/index.js +1 -0
- package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
- package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
- package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
- package/esm/data_adapters/BaseAdapter/stats.js +52 -13
- package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
- package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
- package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
- package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
- package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
- package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
- package/esm/data_adapters/dataAdapterCache.js +44 -10
- package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
- package/esm/data_adapters/getFeatureAdapter.js +8 -8
- package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
- package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
- package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
- package/esm/pluggableElementTypes/AdapterType.js +1 -1
- package/esm/pluggableElementTypes/DisplayType.d.ts +46 -16
- package/esm/pluggableElementTypes/DisplayType.js +22 -12
- package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
- package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
- package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
- package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
- package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
- package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
- package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
- package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
- package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
- package/esm/pluggableElementTypes/ViewType.js +32 -4
- package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
- package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
- package/esm/pluggableElementTypes/extendElementType.js +9 -5
- package/esm/pluggableElementTypes/index.d.ts +2 -1
- package/esm/pluggableElementTypes/index.js +1 -1
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
- package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +65 -27
- package/esm/pluggableElementTypes/models/BaseDisplayModel.js +72 -10
- package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
- package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
- package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +85 -16
- package/esm/pluggableElementTypes/models/BaseViewModel.js +53 -10
- package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
- package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
- package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
- package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
- package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
- package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
- package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
- package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
- package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
- package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
- package/esm/pluggableElementTypes/models/index.d.ts +2 -3
- package/esm/pluggableElementTypes/models/index.js +2 -3
- package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
- package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
- package/esm/pluginDefinitions.d.ts +34 -7
- package/esm/pluginDefinitions.js +54 -20
- package/esm/rpc/BaseRpcDriver.d.ts +2 -2
- package/esm/rpc/BaseRpcDriver.js +25 -30
- package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
- package/esm/rpc/MainThreadRpcDriver.js +13 -8
- package/esm/rpc/RpcClient.d.ts +18 -6
- package/esm/rpc/RpcClient.js +51 -16
- package/esm/rpc/RpcManager.d.ts +14 -10
- package/esm/rpc/RpcManager.js +11 -1
- package/esm/rpc/RpcRegistry.d.ts +40 -7
- package/esm/rpc/RpcServer.d.ts +3 -1
- package/esm/rpc/RpcServer.js +19 -12
- package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
- package/esm/rpc/WebWorkerRpcDriver.js +64 -68
- package/esm/rpc/byteBudget.d.ts +20 -5
- package/esm/rpc/byteBudget.js +16 -5
- package/esm/rpc/configSchema.d.ts +7 -21
- package/esm/rpc/coreRpcMethods.d.ts +4 -0
- package/esm/rpc/coreRpcMethods.js +4 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
- package/esm/rpc/methods/CoreGetExportData.js +3 -4
- package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
- package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
- package/esm/rpc/methods/CoreGetFeatures.js +3 -5
- package/esm/rpc/methods/CoreGetRefNames.js +2 -12
- package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
- package/esm/rpc/methods/CoreGetSequence.js +2 -2
- package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
- package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
- package/esm/rpc/methods/layerFeatures.d.ts +33 -0
- package/esm/rpc/methods/layerFeatures.js +29 -0
- package/esm/svg/SvgExport.js +6 -7
- package/esm/svg/SvgThemeProviders.d.ts +12 -0
- package/esm/svg/SvgThemeProviders.js +15 -0
- package/esm/svg/exportViewSvg.d.ts +28 -0
- package/esm/svg/exportViewSvg.js +13 -0
- package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
- package/esm/svg/normalizeSvgMarkup.js +99 -0
- package/esm/svg/serializeSvg.d.ts +7 -0
- package/esm/svg/serializeSvg.js +11 -0
- package/esm/svg/svgId.d.ts +1 -1
- package/esm/svg/svgId.js +1 -1
- package/esm/svg/svgReady.d.ts +9 -7
- package/esm/svg/svgReady.js +8 -7
- package/esm/svg/trackNames.d.ts +7 -5
- package/esm/svg/trackNames.js +12 -9
- package/esm/svg/wrapSvgExport.js +6 -74
- package/esm/ui/AddCustomPluginDialog.js +3 -8
- package/esm/ui/AppReadyMarker.d.ts +45 -0
- package/esm/ui/AppReadyMarker.js +89 -0
- package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
- package/esm/ui/CascadingMenu.js +181 -104
- package/esm/ui/DropDownMenu.js +2 -1
- package/esm/ui/ErrorBanner.js +1 -1
- package/esm/ui/ErrorBoundary.d.ts +2 -2
- package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
- package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
- package/esm/ui/ExportSvgDialog.d.ts +1 -1
- package/esm/ui/FileDropZone.js +2 -1
- package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
- package/esm/ui/HoverMenu.d.ts +1 -2
- package/esm/ui/HoverMenu.js +6 -3
- package/esm/ui/JexlFilterDialog.d.ts +13 -10
- package/esm/ui/JexlFilterDialog.js +122 -49
- package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
- package/esm/ui/JexlFilterRowEditors.js +90 -0
- package/esm/ui/LazyBaseTooltip.d.ts +4 -0
- package/esm/ui/LazyBaseTooltip.js +9 -0
- package/esm/ui/LegendSwatchGlyph.js +26 -21
- package/esm/ui/LoadingOverlay.d.ts +14 -0
- package/esm/ui/LoadingOverlay.js +4 -2
- package/esm/ui/MenuTypes.d.ts +23 -53
- package/esm/ui/MenuTypes.js +3 -0
- package/esm/ui/MonospaceTextField.d.ts +2 -1
- package/esm/ui/MonospaceTextField.js +23 -20
- package/esm/ui/PaletteContext.d.ts +10 -5
- package/esm/ui/PaletteContext.js +44 -6
- package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
- package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
- package/esm/ui/RefNameAutocomplete/index.js +8 -2
- package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/util.js +42 -1
- package/esm/ui/ResizeHandle.d.ts +3 -1
- package/esm/ui/ResizeHandle.js +44 -11
- package/esm/ui/ScrollChrome.d.ts +13 -0
- package/esm/ui/ScrollChrome.js +11 -0
- package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
- package/esm/ui/ScrollEdgeShadow.js +14 -35
- package/esm/ui/ScrollZoomToggle.d.ts +4 -27
- package/esm/ui/ScrollZoomToggle.js +34 -51
- package/esm/ui/SessionJsonPanel.d.ts +3 -0
- package/esm/ui/SessionJsonPanel.js +14 -0
- package/esm/ui/SettingsChangesTable.d.ts +1 -0
- package/esm/ui/SettingsChangesTable.js +49 -11
- package/esm/ui/ShareLinkField.d.ts +1 -3
- package/esm/ui/ShareLinkField.js +13 -40
- package/esm/ui/SizeSliderRow.d.ts +1 -3
- package/esm/ui/SizeSliderRow.js +4 -6
- package/esm/ui/SnackbarModel.js +79 -67
- package/esm/ui/StatusProgressBar.js +2 -2
- package/esm/ui/SvgColorLegend.d.ts +9 -4
- package/esm/ui/SvgColorLegend.js +82 -41
- package/esm/ui/VerticalScrollbar.d.ts +13 -34
- package/esm/ui/VerticalScrollbar.js +29 -83
- package/esm/ui/ViewLoadingScreen.d.ts +5 -4
- package/esm/ui/ViewLoadingScreen.js +8 -32
- package/esm/ui/colorScale.d.ts +92 -0
- package/esm/ui/colorScale.js +72 -0
- package/esm/ui/colors.d.ts +64 -0
- package/esm/ui/colors.js +230 -1
- package/esm/ui/hoverBoxStyle.d.ts +14 -2
- package/esm/ui/hoverBoxStyle.js +17 -2
- package/esm/ui/index.d.ts +12 -12
- package/esm/ui/index.js +14 -22
- package/esm/ui/launchViewMenu.js +15 -5
- package/esm/ui/legendMenuItem.d.ts +10 -32
- package/esm/ui/legendMenuItem.js +9 -36
- package/esm/ui/legendSpec.d.ts +15 -8
- package/esm/ui/legendSpec.js +14 -23
- package/esm/ui/makeSizeMenu.d.ts +0 -6
- package/esm/ui/makeSizeMenu.js +6 -30
- package/esm/ui/measureLegendText.js +1 -1
- package/esm/ui/menuItemAdornment.d.ts +9 -20
- package/esm/ui/menuItemAdornment.js +10 -32
- package/esm/ui/menuItems.d.ts +2 -7
- package/esm/ui/menuItems.js +1 -6
- package/esm/ui/multiTrackMenuItems.d.ts +6 -0
- package/esm/ui/palette.d.ts +118 -116
- package/esm/ui/palette.js +114 -75
- package/esm/ui/replaceViewAction.d.ts +1 -1
- package/esm/ui/replaceViewAction.js +1 -1
- package/esm/ui/theme.d.ts +43 -119
- package/esm/ui/theme.js +62 -78
- package/esm/ui/toggleMenuItems.d.ts +1 -3
- package/esm/ui/toggleMenuItems.js +6 -5
- package/esm/ui/useAssemblySelection.d.ts +4 -4
- package/esm/ui/viewHeaderHeight.d.ts +1 -0
- package/esm/ui/viewHeaderHeight.js +1 -0
- package/esm/util/Base1DUtils.d.ts +5 -3
- package/esm/util/Base1DUtils.js +14 -6
- package/esm/util/Base1DViewModel.d.ts +2 -1
- package/esm/util/Base1DViewModel.js +3 -2
- package/esm/util/SvgCanvas.d.ts +15 -13
- package/esm/util/SvgCanvas.js +76 -56
- package/esm/util/aborting.d.ts +39 -0
- package/esm/util/aborting.js +88 -6
- package/esm/util/adapterMetadata.d.ts +1 -1
- package/esm/util/adapterMetadata.js +6 -5
- package/esm/util/addAndShowTrack.d.ts +2 -5
- package/esm/util/addAndShowTrack.js +5 -1
- package/esm/util/addRelativeUris.d.ts +17 -5
- package/esm/util/addRelativeUris.js +46 -10
- package/esm/util/addTrackFromWidget.d.ts +2 -5
- package/esm/util/addTrackFromWidget.js +5 -4
- package/esm/util/aggregateFieldName.d.ts +10 -0
- package/esm/util/aggregateFieldName.js +8 -0
- package/esm/util/analytics.js +46 -13
- package/esm/util/animationAllowed.d.ts +9 -0
- package/esm/util/animationAllowed.js +13 -0
- package/esm/util/applyRowResizeWheel.d.ts +10 -5
- package/esm/util/applyRowResizeWheel.js +10 -21
- package/esm/util/bandHeight.d.ts +10 -0
- package/esm/util/bandHeight.js +29 -0
- package/esm/util/bandLayout.d.ts +4 -4
- package/esm/util/bandLayout.js +4 -4
- package/esm/util/bezierConnector.d.ts +4 -3
- package/esm/util/bezierConnector.js +38 -45
- package/esm/util/bgzfWorkerPool.d.ts +20 -74
- package/esm/util/bgzfWorkerPool.js +20 -74
- package/esm/util/binnedAggregate.d.ts +17 -0
- package/esm/util/binnedAggregate.js +275 -0
- package/esm/util/cacheBudgets.d.ts +22 -19
- package/esm/util/cacheBudgets.js +22 -19
- package/esm/util/cachedSetup.d.ts +1 -1
- package/esm/util/cachedSetup.js +2 -2
- package/esm/util/categoricalField.d.ts +56 -0
- package/esm/util/categoricalField.js +73 -0
- package/esm/util/clampToContig.d.ts +17 -0
- package/esm/util/clampToContig.js +19 -0
- package/esm/util/coarseStripHTML.js +1 -2
- package/esm/util/color/cssColorsLevel4.d.ts +1 -0
- package/esm/util/color/cssColorsLevel4.js +1 -0
- package/esm/util/color/index.d.ts +5 -3
- package/esm/util/color/index.js +7 -4
- package/esm/util/colorBits.d.ts +3 -3
- package/esm/util/colorBits.js +19 -44
- package/esm/util/colorRamp.d.ts +49 -5
- package/esm/util/colorRamp.js +169 -18
- package/esm/util/colorScale.d.ts +156 -0
- package/esm/util/colorScale.js +243 -0
- package/esm/util/colorSchemes.d.ts +21 -0
- package/esm/util/colorSchemes.js +30 -0
- package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
- package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
- package/esm/util/createSvgRasterCanvas.d.ts +10 -0
- package/esm/util/cssColorParse.d.ts +15 -0
- package/esm/util/cssColorParse.js +53 -0
- package/esm/util/diagonalizeRegions.d.ts +2 -3
- package/esm/util/diagonalizeRegions.js +8 -13
- package/esm/util/expandLooseSearchIndex.d.ts +19 -0
- package/esm/util/expandLooseSearchIndex.js +29 -0
- package/esm/util/featureTable.d.ts +224 -0
- package/esm/util/featureTable.js +366 -0
- package/esm/util/featureTransforms.d.ts +80 -0
- package/esm/util/featureTransforms.js +1579 -0
- package/esm/util/featureTypes.d.ts +24 -0
- package/esm/util/featureTypes.js +35 -0
- package/esm/util/fetchAndMaybeUnzip.js +16 -9
- package/esm/util/fetchContext.d.ts +7 -8
- package/esm/util/fetchContext.js +3 -3
- package/esm/util/fetchHub.d.ts +4 -2
- package/esm/util/fetchHub.js +2 -2
- package/esm/util/fetchPhases.d.ts +10 -10
- package/esm/util/fetchSeq.d.ts +2 -3
- package/esm/util/fetchSeq.js +2 -2
- package/esm/util/fieldReader.d.ts +17 -0
- package/esm/util/fieldReader.js +62 -0
- package/esm/util/freezeDeep.d.ts +8 -10
- package/esm/util/freezeDeep.js +8 -10
- package/esm/util/groupKeys.d.ts +77 -0
- package/esm/util/groupKeys.js +155 -0
- package/esm/util/highlights.d.ts +10 -6
- package/esm/util/highlights.js +12 -25
- package/esm/util/hooks.d.ts +31 -2
- package/esm/util/hooks.js +72 -3
- package/esm/util/index.d.ts +11 -11
- package/esm/util/index.js +11 -10
- package/esm/util/indexCandidates.d.ts +1 -31
- package/esm/util/indexCandidates.js +5 -63
- package/esm/util/installFetch.d.ts +77 -37
- package/esm/util/installFetch.js +65 -38
- package/esm/util/installInitAutorun.d.ts +14 -13
- package/esm/util/installInitAutorun.js +17 -17
- package/esm/util/installPrerequisiteFetch.d.ts +115 -0
- package/esm/util/installPrerequisiteFetch.js +111 -0
- package/esm/util/io/index.js +19 -14
- package/esm/util/isDataCurrent.d.ts +7 -5
- package/esm/util/isDataCurrent.js +9 -6
- package/esm/util/isTextEntryFocused.d.ts +7 -0
- package/esm/util/isTextEntryFocused.js +16 -0
- package/esm/util/jexl.js +24 -21
- package/esm/util/jexlFilterRows.d.ts +89 -0
- package/esm/util/jexlFilterRows.js +252 -0
- package/esm/util/jexlFilters.d.ts +20 -27
- package/esm/util/jexlFilters.js +23 -11
- package/esm/util/jexlStrings.d.ts +3 -4
- package/esm/util/jexlStrings.js +2 -3
- package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
- package/esm/util/layouts/GranularRectLayout.js +25 -8
- package/esm/util/lazyAfterAttach.d.ts +13 -0
- package/esm/util/lazyAfterAttach.js +31 -0
- package/esm/util/lazyWithPreload.d.ts +19 -0
- package/esm/util/lazyWithPreload.js +27 -0
- package/esm/util/legendCandidates.d.ts +72 -0
- package/esm/util/legendCandidates.js +138 -0
- package/esm/util/localStorage.js +4 -4
- package/esm/util/markEncoding.d.ts +150 -0
- package/esm/util/markEncoding.js +845 -0
- package/esm/util/markEncodingTypes.d.ts +588 -0
- package/esm/util/markEncodingTypes.js +8 -0
- package/esm/util/mst-reflection.d.ts +2 -20
- package/esm/util/mst-reflection.js +3 -53
- package/esm/util/mstUtils.d.ts +31 -23
- package/esm/util/mstUtils.js +39 -24
- package/esm/util/numericUtils.d.ts +7 -0
- package/esm/util/numericUtils.js +16 -0
- package/esm/util/numericValue.d.ts +14 -0
- package/esm/util/numericValue.js +34 -0
- package/esm/util/openFeatureWidget.d.ts +5 -0
- package/esm/util/openFeatureWidget.js +2 -2
- package/esm/util/openViews.d.ts +17 -0
- package/esm/util/openViews.js +22 -0
- package/esm/util/parentWalk.d.ts +1 -1
- package/esm/util/parentWalk.js +1 -1
- package/esm/util/parseLineByLine.d.ts +4 -5
- package/esm/util/parseLineByLine.js +8 -14
- package/esm/util/pluginStore.d.ts +6 -8
- package/esm/util/pluginStore.js +17 -16
- package/esm/util/preloadComponent.d.ts +5 -0
- package/esm/util/preloadComponent.js +11 -0
- package/esm/util/progress.d.ts +22 -22
- package/esm/util/progress.js +27 -26
- package/esm/util/quantileExtent.d.ts +49 -0
- package/esm/util/quantileExtent.js +162 -0
- package/esm/util/range.d.ts +13 -9
- package/esm/util/range.js +17 -8
- package/esm/util/renameRegions.d.ts +26 -6
- package/esm/util/renameRegions.js +68 -54
- package/esm/util/renderToStaticMarkup.js +24 -14
- package/esm/util/rxjs.d.ts +23 -8
- package/esm/util/rxjs.js +61 -15
- package/esm/util/samplesTsv.d.ts +49 -0
- package/esm/util/samplesTsv.js +86 -0
- package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
- package/esm/util/scheduleDetachedDestroy.js +24 -0
- package/esm/util/scrollLatch.d.ts +1 -0
- package/esm/util/scrollLatch.js +8 -0
- package/esm/util/selectEncodedFeature.d.ts +16 -0
- package/esm/util/selectEncodedFeature.js +34 -0
- package/esm/util/sessionSharing.d.ts +7 -5
- package/esm/util/sessionSharing.js +23 -23
- package/esm/util/shapeNameList.d.ts +2 -0
- package/esm/util/shapeNameList.js +6 -0
- package/esm/util/shapeNames.d.ts +7 -0
- package/esm/util/shapeNames.js +11 -0
- package/esm/util/simpleFeature.d.ts +0 -1
- package/esm/util/starFusion.d.ts +26 -0
- package/esm/util/starFusion.js +37 -0
- package/esm/util/stepTables.d.ts +82 -0
- package/esm/util/stepTables.js +243 -0
- package/esm/util/svAlt.d.ts +145 -0
- package/esm/util/svAlt.js +364 -0
- package/esm/util/svgColorProps.d.ts +11 -0
- package/esm/util/svgColorProps.js +28 -1
- package/esm/util/systemColorScheme.d.ts +12 -0
- package/esm/util/systemColorScheme.js +27 -0
- package/esm/util/tabix.d.ts +13 -8
- package/esm/util/tabix.js +17 -12
- package/esm/util/thresholdScale.d.ts +91 -0
- package/esm/util/thresholdScale.js +166 -0
- package/esm/util/timeGate.d.ts +4 -5
- package/esm/util/timeGate.js +4 -5
- package/esm/util/trackConfigDelta.d.ts +26 -26
- package/esm/util/trackConfigDelta.js +63 -47
- package/esm/util/tracks.d.ts +121 -40
- package/esm/util/tracks.js +497 -112
- package/esm/util/translateTranscript.d.ts +44 -0
- package/esm/util/translateTranscript.js +102 -0
- package/esm/util/types/data.d.ts +0 -2
- package/esm/util/types/index.d.ts +121 -22
- package/esm/util/types/index.js +9 -0
- package/esm/util/types/mst.d.ts +3 -0
- package/esm/util/types/mst.js +4 -0
- package/esm/util/types/renameIds.d.ts +1 -0
- package/esm/util/types/renameIds.js +29 -0
- package/esm/util/types/services.d.ts +1 -1
- package/esm/util/unknownSnapshotKeys.d.ts +51 -0
- package/esm/util/unknownSnapshotKeys.js +82 -0
- package/esm/util/useFeatureSequence.js +5 -5
- package/esm/util/useFetch.d.ts +3 -4
- package/esm/util/useFetch.js +19 -10
- package/esm/util/useFetchPlugins.d.ts +6 -2
- package/esm/util/useFetchPlugins.js +7 -3
- package/esm/util/usePanelVirtualScroll.d.ts +7 -35
- package/esm/util/usePanelVirtualScroll.js +9 -36
- package/esm/util/useRowVirtualScroll.d.ts +6 -29
- package/esm/util/useRowVirtualScroll.js +8 -49
- package/esm/util/useVirtualScrollWheel.d.ts +20 -4
- package/esm/util/useVirtualScrollWheel.js +40 -74
- package/esm/util/viewHighlights.d.ts +3 -0
- package/esm/util/viewHighlights.js +5 -0
- package/esm/util/viewStatus.d.ts +47 -15
- package/esm/util/viewStatus.js +34 -0
- package/esm/util/wheelZoom.d.ts +7 -1
- package/esm/util/wheelZoom.js +85 -19
- package/esm/util/whenViewSettled.d.ts +55 -8
- package/esm/util/whenViewSettled.js +56 -7
- package/esm/util/withLaunchInput.d.ts +174 -0
- package/esm/util/withLaunchInput.js +274 -0
- package/package.json +70 -20
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
- package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
- package/esm/ReExports/BaseFeatureDetails.js +0 -10
- package/esm/ReExports/index.d.ts +0 -1
- package/esm/ReExports/index.js +0 -1
- package/esm/ReExports/publicUtil.d.ts +0 -1
- package/esm/ReExports/publicUtil.js +0 -28
- package/esm/configuration/promotableDefaults.d.ts +0 -199
- package/esm/configuration/promotableDefaults.js +0 -326
- package/esm/configuration/promotablePin.d.ts +0 -55
- package/esm/configuration/promotablePin.js +0 -1
- package/esm/configuration/promotableResolve.d.ts +0 -108
- package/esm/configuration/promotableResolve.js +0 -117
- package/esm/configuration/promotableSlots.d.ts +0 -12
- package/esm/configuration/promotableSlots.js +0 -45
- package/esm/configuration/slotShape.d.ts +0 -12
- package/esm/configuration/slotShape.js +0 -84
- package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
- package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
- package/esm/ui/PinAdornment.d.ts +0 -5
- package/esm/ui/PinAdornment.js +0 -79
- package/esm/ui/SvgGradientLegend.d.ts +0 -26
- package/esm/ui/SvgGradientLegend.js +0 -26
- package/esm/ui/highlightChipReveal.d.ts +0 -32
- package/esm/ui/highlightChipReveal.js +0 -39
- package/esm/ui/promotableMenuItems.d.ts +0 -19
- package/esm/ui/promotableMenuItems.js +0 -89
- package/esm/ui/promotablePinCoverage.d.ts +0 -44
- package/esm/ui/promotablePinCoverage.js +0 -87
- package/esm/util/applyInitSettings.d.ts +0 -79
- package/esm/util/applyInitSettings.js +0 -91
- package/esm/util/openDisplays.d.ts +0 -23
- package/esm/util/openDisplays.js +0 -79
- package/esm/util/stopToken.d.ts +0 -211
- package/esm/util/stopToken.js +0 -438
- /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
|
+
* ` `, 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(' ', ' ');
|
|
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
|
+
}
|
package/esm/svg/svgId.d.ts
CHANGED
|
@@ -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 `
|
|
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 `
|
|
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.
|
package/esm/svg/svgReady.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
42
|
-
*
|
|
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 || …`.
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
* that
|
|
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
|
package/esm/svg/svgReady.js
CHANGED
|
@@ -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
|
-
*
|
|
22
|
-
*
|
|
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 || …`.
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* that
|
|
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
|
package/esm/svg/trackNames.d.ts
CHANGED
|
@@ -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
|
|
16
|
-
* type implements no `renderSvg`. Called once per
|
|
17
|
-
* the stacked views flatten every row's
|
|
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;
|
package/esm/svg/trackNames.js
CHANGED
|
@@ -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
|
|
16
|
-
* type implements no `renderSvg`. Called once per
|
|
17
|
-
* the stacked views flatten every row's
|
|
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
|
-
|
|
27
|
-
|
|
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
|
}
|
package/esm/svg/wrapSvgExport.js
CHANGED
|
@@ -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
|
-
|
|
10
|
-
|
|
11
|
-
//
|
|
12
|
-
//
|
|
13
|
-
//
|
|
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
|
-
|
|
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
|
|
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.
|
|
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<
|
|
12
|
+
exportSvg: (opts: BaseExportSvgOptions) => Promise<unknown>;
|
|
13
13
|
children?: React.ReactNode;
|
|
14
14
|
checkboxes?: React.ReactNode;
|
|
15
15
|
}) => import("react").JSX.Element;
|