@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.
- package/README.md +1709 -390
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -5
- 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 +37 -14
- 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 +49 -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/SequenceFeatureDetails/useSequenceData.js +8 -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 +34 -3
- 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 +530 -0
- package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/coreWorkerModules.generated.js +490 -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 +528 -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 +26 -11
- package/esm/configuration/index.js +16 -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/plot.d.ts +61 -0
- package/esm/configuration/plot.js +142 -0
- 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 +53 -16
- package/esm/pluggableElementTypes/DisplayType.js +28 -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/WidgetType.d.ts +6 -0
- package/esm/pluggableElementTypes/WidgetType.js +6 -0
- 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 +2 -9
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
- package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +122 -28
- package/esm/pluggableElementTypes/models/BaseDisplayModel.js +155 -11
- package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
- package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
- package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +87 -18
- package/esm/pluggableElementTypes/models/BaseViewModel.js +54 -11
- 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 -50
- 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/TimeTraveller.d.ts +3 -0
- package/esm/util/TimeTraveller.js +34 -2
- 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/baseDisplayConfig.d.ts +8 -0
- package/esm/util/baseDisplayConfig.js +27 -0
- 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 +16 -6
- package/esm/util/cachedSetup.js +108 -38
- package/esm/util/categoricalField.d.ts +56 -0
- package/esm/util/categoricalField.js +73 -0
- package/esm/util/cellMatches.d.ts +23 -0
- package/esm/util/cellMatches.js +264 -0
- package/esm/util/cellsStep.d.ts +29 -0
- package/esm/util/cellsStep.js +437 -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/copyToClipboard.js +8 -1
- 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 +81 -0
- package/esm/util/featureTransforms.js +1231 -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/formatBytes.js +1 -1
- package/esm/util/formatGuessers.d.ts +25 -14
- package/esm/util/formatGuessers.js +42 -27
- package/esm/util/formatRelativeTime.js +1 -1
- package/esm/util/freezeDeep.d.ts +8 -10
- package/esm/util/freezeDeep.js +8 -10
- package/esm/util/getLocationUri.d.ts +2 -1
- package/esm/util/getLocationUri.js +8 -2
- package/esm/util/groupKeys.d.ts +76 -0
- package/esm/util/groupKeys.js +156 -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/intervals.js +9 -4
- package/esm/util/io/index.js +22 -15
- 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 +32 -57
- package/esm/util/jexlFilters.js +31 -29
- 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/locString.js +5 -2
- package/esm/util/localStorage.js +4 -4
- package/esm/util/markEncoding.d.ts +150 -0
- package/esm/util/markEncoding.js +885 -0
- package/esm/util/markEncodingTypes.d.ts +595 -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/springAnimate.js +1 -1
- package/esm/util/starFusion.d.ts +26 -0
- package/esm/util/starFusion.js +37 -0
- package/esm/util/stepTables.d.ts +96 -0
- package/esm/util/stepTables.js +277 -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 +19 -10
- package/esm/util/tabix.js +19 -14
- 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 +120 -66
- package/esm/util/tracks.js +501 -151
- 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 +53 -0
- package/esm/util/unknownSnapshotKeys.js +76 -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/usePanZoom.js +10 -3
- package/esm/util/usePanelVirtualScroll.d.ts +7 -35
- package/esm/util/usePanelVirtualScroll.js +9 -36
- package/esm/util/useRafCommit.js +1 -0
- 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/withFeatureDetails.js +4 -0
- package/esm/util/withLaunchInput.d.ts +174 -0
- package/esm/util/withLaunchInput.js +274 -0
- package/package.json +75 -24
- 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,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The scales a colour object paints through, in a module that imports
|
|
3
|
+
* nothing: `jbrowse validate` carries a copy of it, so the validator and the
|
|
4
|
+
* displays read one statement.
|
|
5
|
+
*/
|
|
6
|
+
/** How a colour object maps its `field`; `none` paints `value`. */
|
|
7
|
+
export const COLOR_SCALES = [
|
|
8
|
+
'none',
|
|
9
|
+
'categorical',
|
|
10
|
+
'linear',
|
|
11
|
+
'log',
|
|
12
|
+
'threshold',
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* The scale that maps no field: each feature paints the colour it carries, and
|
|
16
|
+
* the key names the colours `domain` lists. Only a display whose features
|
|
17
|
+
* carry colours of their own declares it.
|
|
18
|
+
*/
|
|
19
|
+
export const IDENTITY_SCALE = 'identity';
|
|
20
|
+
const CATEGORICAL_PRESET = { scale: 'categorical' };
|
|
21
|
+
/**
|
|
22
|
+
* The fields whose values have names, an order and colours of their own on
|
|
23
|
+
* every display, beneath each display's own presets. Red forward and blue
|
|
24
|
+
* reverse is what the synteny ribbons paint too. The SV classes are
|
|
25
|
+
* `svClassOf`'s, deletion red and duplication blue as dbVar and gnomAD-SV
|
|
26
|
+
* paint them, insertion the pileup's purple, and the rest kept apart under
|
|
27
|
+
* deuteranopia and protanopia. A record with no class files under `''`, so
|
|
28
|
+
* each display keeps its own no-value colour for it.
|
|
29
|
+
*/
|
|
30
|
+
export const UNIVERSAL_FIELD_PRESETS = {
|
|
31
|
+
strand: {
|
|
32
|
+
scale: 'categorical',
|
|
33
|
+
missing: '0',
|
|
34
|
+
domain: ['1', '-1', '0'],
|
|
35
|
+
range: ['tomato', 'cornflowerblue', 'goldenrod'],
|
|
36
|
+
labels: ['Forward strand', 'Reverse strand', 'No strand'],
|
|
37
|
+
},
|
|
38
|
+
svType: {
|
|
39
|
+
scale: 'categorical',
|
|
40
|
+
domain: ['DEL', 'DUP', 'INS', 'INV', 'CNV', 'TR', 'BND', 'CPX', 'OTHER'],
|
|
41
|
+
range: [
|
|
42
|
+
'#e41a1c',
|
|
43
|
+
'#377eb8',
|
|
44
|
+
'#800080',
|
|
45
|
+
'#ff7f00',
|
|
46
|
+
'#7e6148',
|
|
47
|
+
'#e7298a',
|
|
48
|
+
'#17becf',
|
|
49
|
+
'#66a61e',
|
|
50
|
+
'#000000',
|
|
51
|
+
],
|
|
52
|
+
labels: [
|
|
53
|
+
'Deletion',
|
|
54
|
+
'Duplication',
|
|
55
|
+
'Insertion',
|
|
56
|
+
'Inversion',
|
|
57
|
+
'Copy-number variable',
|
|
58
|
+
'Tandem repeat',
|
|
59
|
+
'Breakend / translocation',
|
|
60
|
+
'Complex',
|
|
61
|
+
'Other / mixed',
|
|
62
|
+
],
|
|
63
|
+
title: 'SV type',
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
/** The universal preset of `field`, if it has one. */
|
|
67
|
+
export function universalPresetOf(field) {
|
|
68
|
+
return Object.hasOwn(UNIVERSAL_FIELD_PRESETS, field)
|
|
69
|
+
? UNIVERSAL_FIELD_PRESETS[field]
|
|
70
|
+
: undefined;
|
|
71
|
+
}
|
|
72
|
+
/** Every field categorical while `scale` is unset, with nothing preset. */
|
|
73
|
+
export const CATEGORICAL_FIELD_PRESETS = {
|
|
74
|
+
'*': CATEGORICAL_PRESET,
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* What a feature's field paints through while `scale` is unset: `score` a
|
|
78
|
+
* ramp, any other field categories.
|
|
79
|
+
*/
|
|
80
|
+
export const FEATURE_FIELD_PRESETS = {
|
|
81
|
+
score: { scale: 'linear' },
|
|
82
|
+
'*': CATEGORICAL_PRESET,
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* A field's preset under `presets`: its own, else a universal one, else
|
|
86
|
+
* `*`'s, else categorical.
|
|
87
|
+
*/
|
|
88
|
+
export function presetOf(presets, field) {
|
|
89
|
+
return ((Object.hasOwn(presets, field)
|
|
90
|
+
? presets[field]
|
|
91
|
+
: (universalPresetOf(field) ?? presets['*'])) ?? CATEGORICAL_PRESET);
|
|
92
|
+
}
|
|
93
|
+
/** What a field paints through under `presets` while `scale` is unset. */
|
|
94
|
+
export function fieldScaleOf(presets, field) {
|
|
95
|
+
return presetOf(presets, field).scale;
|
|
96
|
+
}
|
|
97
|
+
function unwritten(value) {
|
|
98
|
+
return value === undefined || (Array.isArray(value) && value.length === 0);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* A colour object with its field's preset under it: each member the preset
|
|
102
|
+
* names and the config leaves unwritten, an empty list counting as unwritten.
|
|
103
|
+
* Only while the colour paints through the preset's own scale, so the cuts of
|
|
104
|
+
* a threshold preset never reach a field read through a ramp. A categorical
|
|
105
|
+
* preset's `range` and `labels` name its `domain`'s values in order, so they
|
|
106
|
+
* fill only while `domain` does too: a written order keeps each value's own
|
|
107
|
+
* colour and name.
|
|
108
|
+
*/
|
|
109
|
+
export function withPreset(color, presets) {
|
|
110
|
+
const field = color.field ?? '';
|
|
111
|
+
const preset = presetOf(presets, field);
|
|
112
|
+
if (!field || (color.scale ?? preset.scale) !== preset.scale) {
|
|
113
|
+
return color;
|
|
114
|
+
}
|
|
115
|
+
const written = new Map(Object.entries(color));
|
|
116
|
+
const ordered = preset.scale !== 'categorical' ||
|
|
117
|
+
!preset.domain ||
|
|
118
|
+
unwritten(written.get('domain'));
|
|
119
|
+
const filled = Object.entries(preset).filter(([key]) => key !== 'scale' &&
|
|
120
|
+
key !== 'missing' &&
|
|
121
|
+
(ordered || (key !== 'range' && key !== 'labels')) &&
|
|
122
|
+
unwritten(written.get(key)));
|
|
123
|
+
return filled.length > 0 ? { ...color, ...Object.fromEntries(filled) } : color;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* The scale a colour object paints through: `none` while no `field` is
|
|
127
|
+
* named, else its own `scale`, or `fieldScale` where that is unset.
|
|
128
|
+
*/
|
|
129
|
+
export function paintedScale({ scale, field }, fieldScale) {
|
|
130
|
+
return field ? (scale ?? fieldScale) : 'none';
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* What a quantitative scale's ends say together that neither can refuse
|
|
134
|
+
* alone: a `domainMax` below its `domainMin`, which every such scale draws in
|
|
135
|
+
* order either way, and a `domainQuantile` outside 0.5 to 1, where the quantile
|
|
136
|
+
* an open end follows is clamped. `reverse` is whether the scale turns round by
|
|
137
|
+
* a member of its own, which is then the spelling to point at.
|
|
138
|
+
*/
|
|
139
|
+
export function scaleEndProblems({ domainMin, domainMax, domainQuantile }, { reverse = false } = {}) {
|
|
140
|
+
return [
|
|
141
|
+
...(domainMin !== undefined &&
|
|
142
|
+
domainMax !== undefined &&
|
|
143
|
+
domainMin > domainMax
|
|
144
|
+
? [
|
|
145
|
+
{
|
|
146
|
+
rule: 'domain-ends',
|
|
147
|
+
slot: 'domainMax',
|
|
148
|
+
message: `domainMax is below domainMin: the scale spans the two in order either way${reverse ? ', and reverse is what turns it round' : ''}`,
|
|
149
|
+
},
|
|
150
|
+
]
|
|
151
|
+
: []),
|
|
152
|
+
...(domainQuantile !== undefined &&
|
|
153
|
+
!(domainQuantile >= 0.5 && domainQuantile <= 1)
|
|
154
|
+
? [
|
|
155
|
+
{
|
|
156
|
+
rule: 'domain-quantile',
|
|
157
|
+
slot: 'domainQuantile',
|
|
158
|
+
message: 'domainQuantile is a fraction from 0.5 to 1, not a percent: 1 follows the extremes and 0.99 clips the outermost 1% at each end; above 1 reads as 1 and below 0.5 as 0.5',
|
|
159
|
+
},
|
|
160
|
+
]
|
|
161
|
+
: []),
|
|
162
|
+
];
|
|
163
|
+
}
|
|
164
|
+
/** Problems as the lines a display's corner notice lists, under the setting that holds the scale. */
|
|
165
|
+
export function noticeLines(setting, problems) {
|
|
166
|
+
return problems.map(({ slot, message }) => `${setting}.${slot}: ${message}`);
|
|
167
|
+
}
|
|
168
|
+
function pinned(entry) {
|
|
169
|
+
return entry !== '' && Number.isFinite(Number(entry));
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* What a colour object's slots say together that no single slot can refuse,
|
|
173
|
+
* since the config editor writes one slot at a time (ADR-133), read with its
|
|
174
|
+
* field's preset under it. A display shows these as a notice and draws what
|
|
175
|
+
* it can. A threshold naming no cuts leaves its intervals to the display —
|
|
176
|
+
* the alignments insert-size band samples its cuts, the wiggle plot cuts at
|
|
177
|
+
* its origin — so its `labels` go uncounted.
|
|
178
|
+
*/
|
|
179
|
+
export function colorProblems(written, presets) {
|
|
180
|
+
const color = withPreset(written, presets);
|
|
181
|
+
const { domain = [] } = color;
|
|
182
|
+
const { range = [] } = written;
|
|
183
|
+
const scale = color.scale === IDENTITY_SCALE
|
|
184
|
+
? IDENTITY_SCALE
|
|
185
|
+
: paintedScale({ scale: color.scale, field: color.field ?? '' }, fieldScaleOf(presets, color.field ?? ''));
|
|
186
|
+
const problems = [];
|
|
187
|
+
if (scale === 'threshold') {
|
|
188
|
+
if (domain.some((cut, i) => !pinned(cut) || Number(cut) <= Number(domain[i - 1]))) {
|
|
189
|
+
problems.push({
|
|
190
|
+
rule: 'threshold-cuts',
|
|
191
|
+
slot: 'domain',
|
|
192
|
+
message: 'threshold cuts are distinct numbers, read in ascending order, with the range running from the lowest interval; a repeated cut leaves an interval no value falls in',
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
if (domain.length > 0 &&
|
|
196
|
+
range.length > 0 &&
|
|
197
|
+
range.length !== domain.length + 1) {
|
|
198
|
+
problems.push({
|
|
199
|
+
rule: 'threshold-range',
|
|
200
|
+
slot: 'range',
|
|
201
|
+
message: `${domain.length} threshold ${domain.length === 1 ? 'cut makes' : 'cuts make'} ${domain.length + 1} intervals, one colour each, and range lists ${range.length}: a missing colour comes from the default palette and an extra one is never read`,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (scale === 'linear' || scale === 'log') {
|
|
206
|
+
if (domain.length > 0) {
|
|
207
|
+
problems.push({
|
|
208
|
+
rule: 'ramp-domain',
|
|
209
|
+
slot: 'domain',
|
|
210
|
+
message: "a linear or log scale reads no domain, which is a categorical scale's order and a threshold scale's cuts; a ramp's ends are domainMin and domainMax where the colour has them",
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
problems.push(...scaleEndProblems(color, { reverse: true }));
|
|
214
|
+
}
|
|
215
|
+
const { labels = [] } = color;
|
|
216
|
+
const named = scale === 'categorical' || scale === IDENTITY_SCALE
|
|
217
|
+
? domain.length
|
|
218
|
+
: scale === 'threshold'
|
|
219
|
+
? domain.length + 1
|
|
220
|
+
: undefined;
|
|
221
|
+
const cutsFromData = scale === 'threshold' && domain.length === 0;
|
|
222
|
+
if (labels.length > 0 &&
|
|
223
|
+
!cutsFromData &&
|
|
224
|
+
(named === undefined || labels.length > named)) {
|
|
225
|
+
const what = scale === 'categorical'
|
|
226
|
+
? 'value'
|
|
227
|
+
: scale === IDENTITY_SCALE
|
|
228
|
+
? 'colour'
|
|
229
|
+
: 'interval';
|
|
230
|
+
problems.push({
|
|
231
|
+
rule: 'labels-domain',
|
|
232
|
+
slot: 'labels',
|
|
233
|
+
message: named === undefined
|
|
234
|
+
? "labels names a categorical scale's values, a threshold scale's intervals or an identity scale's colours, and this colour paints none of them"
|
|
235
|
+
: `labels names one ${what} each, and ${labels.length} ${labels.length === 1 ? 'label names' : 'labels name'} ${named} ${named === 1 ? what : `${what}s`}: a label past them names nothing`,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
return problems;
|
|
239
|
+
}
|
|
240
|
+
/** `colorProblems` as the lines a display's corner notice lists, under `color`. */
|
|
241
|
+
export function colorNotices(color, presets) {
|
|
242
|
+
return noticeLines('color', colorProblems(color, presets));
|
|
243
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #api
|
|
3
|
+
* The named ramps a continuous colour scale's `scheme` takes, each one a stop
|
|
4
|
+
* table in `colorRamp.ts` that every ramp baker reads, so no display can name
|
|
5
|
+
* a scheme nothing bakes. `viridis`, `magma`, `inferno` and `cividis` are
|
|
6
|
+
* matplotlib's perceptual ramps, dark at the low end; `juicebox` fades from
|
|
7
|
+
* transparent to red, as Juicebox paints contacts; `fall` runs white through
|
|
8
|
+
* yellow and red to black, as HiGlass does; `reds` and `blues` are
|
|
9
|
+
* ColorBrewer's, from white; `redblue` and `purpleorange` diverge through
|
|
10
|
+
* white, ColorBrewer's RdBu and PuOr.
|
|
11
|
+
*/
|
|
12
|
+
export declare const COLOR_SCHEMES: readonly ['viridis', 'magma', 'inferno', 'cividis', 'juicebox', 'fall', 'reds', 'blues', 'redblue', 'purpleorange'];
|
|
13
|
+
/** #api */
|
|
14
|
+
export type ColorSchemeName = (typeof COLOR_SCHEMES)[number];
|
|
15
|
+
/**
|
|
16
|
+
* #api
|
|
17
|
+
* The ramp a continuous scale samples while it names no `range` and no
|
|
18
|
+
* `scheme`, so a declaration spelling it out and one leaving it unset resolve
|
|
19
|
+
* alike.
|
|
20
|
+
*/
|
|
21
|
+
export declare const DEFAULT_COLOR_SCHEME: ColorSchemeName;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #api
|
|
3
|
+
* The named ramps a continuous colour scale's `scheme` takes, each one a stop
|
|
4
|
+
* table in `colorRamp.ts` that every ramp baker reads, so no display can name
|
|
5
|
+
* a scheme nothing bakes. `viridis`, `magma`, `inferno` and `cividis` are
|
|
6
|
+
* matplotlib's perceptual ramps, dark at the low end; `juicebox` fades from
|
|
7
|
+
* transparent to red, as Juicebox paints contacts; `fall` runs white through
|
|
8
|
+
* yellow and red to black, as HiGlass does; `reds` and `blues` are
|
|
9
|
+
* ColorBrewer's, from white; `redblue` and `purpleorange` diverge through
|
|
10
|
+
* white, ColorBrewer's RdBu and PuOr.
|
|
11
|
+
*/
|
|
12
|
+
export const COLOR_SCHEMES = [
|
|
13
|
+
'viridis',
|
|
14
|
+
'magma',
|
|
15
|
+
'inferno',
|
|
16
|
+
'cividis',
|
|
17
|
+
'juicebox',
|
|
18
|
+
'fall',
|
|
19
|
+
'reds',
|
|
20
|
+
'blues',
|
|
21
|
+
'redblue',
|
|
22
|
+
'purpleorange',
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* #api
|
|
26
|
+
* The ramp a continuous scale samples while it names no `range` and no
|
|
27
|
+
* `scheme`, so a declaration spelling it out and one leaving it unset resolve
|
|
28
|
+
* alike.
|
|
29
|
+
*/
|
|
30
|
+
export const DEFAULT_COLOR_SCHEME = 'viridis';
|
|
@@ -7,7 +7,14 @@ export default async function copyToClipboard(text, options = {}) {
|
|
|
7
7
|
// navigator.clipboard is only present in secure contexts; isSecureContext is
|
|
8
8
|
// the real gate, so insecure http:// falls through to execCommand below
|
|
9
9
|
if (format === 'text/plain' && window.isSecureContext) {
|
|
10
|
-
|
|
10
|
+
try {
|
|
11
|
+
await navigator.clipboard.writeText(text);
|
|
12
|
+
}
|
|
13
|
+
catch (e) {
|
|
14
|
+
if (!execCommandCopy(text, format)) {
|
|
15
|
+
throw e;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
11
18
|
}
|
|
12
19
|
else if (!execCommandCopy(text, format)) {
|
|
13
20
|
throw new Error('the browser rejected the clipboard write');
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { RpcStatus, StatusWindow } from './progress.ts';
|
|
2
|
-
import type { StopToken } from './stopToken.ts';
|
|
3
2
|
import type { IStateTreeNode } from '@jbrowse/mobx-state-tree';
|
|
4
3
|
/**
|
|
5
4
|
* Where a rotation reports, in the one of two modes the host is actually in.
|
|
@@ -13,19 +12,20 @@ import type { IStateTreeNode } from '@jbrowse/mobx-state-tree';
|
|
|
13
12
|
*/
|
|
14
13
|
export type StatusReporter = {
|
|
15
14
|
/**
|
|
16
|
-
* The host's own window, present on any display composing
|
|
17
|
-
*
|
|
18
|
-
*
|
|
15
|
+
* The host's own window, present on any display composing `FetchMixin`.
|
|
16
|
+
* The rotation reports through it rather than opening a SECOND on the
|
|
17
|
+
* same status field — which is what one-window-per-owner exists to
|
|
19
18
|
* prevent.
|
|
20
19
|
*/
|
|
21
20
|
statusWindow: StatusWindow;
|
|
22
21
|
setStatusMessage?: never;
|
|
23
22
|
} | {
|
|
24
23
|
/**
|
|
25
|
-
* The sink for the window the rotation opens for itself
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* {@link createStatusChannel} holder.
|
|
24
|
+
* The sink for the window the rotation opens for itself: the mode of a
|
|
25
|
+
* fetch on a host with no window of its own — the prerequisite reads,
|
|
26
|
+
* chord, the breakpoint overlay — along with every
|
|
27
|
+
* {@link createStatusChannel} holder. The comparative displays this
|
|
28
|
+
* helper was written for lend a window now (ADR-105).
|
|
29
29
|
*/
|
|
30
30
|
setStatusMessage: (status?: RpcStatus) => void;
|
|
31
31
|
statusWindow?: never;
|
|
@@ -50,8 +50,7 @@ export interface StatusChannel {
|
|
|
50
50
|
}
|
|
51
51
|
export declare function createStatusChannel(): StatusChannel;
|
|
52
52
|
export interface ActiveFetch {
|
|
53
|
-
|
|
54
|
-
stopToken: StopToken;
|
|
53
|
+
signal: AbortSignal;
|
|
55
54
|
/**
|
|
56
55
|
* True only while this is still the most recent fetch AND `self` is alive.
|
|
57
56
|
* Gate every post-await write — result commit, error set — on it so a
|
|
@@ -72,31 +71,29 @@ export interface ActiveFetch {
|
|
|
72
71
|
* other operation on the host is still reporting.
|
|
73
72
|
*
|
|
74
73
|
* Both together, because a caller doing it by hand gets a subset.
|
|
75
|
-
* `isCurrent` is `
|
|
76
|
-
* never rotates its own
|
|
74
|
+
* `isCurrent` is `signal === current && isAlive`, and a run that *completes*
|
|
75
|
+
* never rotates its own signal — so without this the guard stays open past the
|
|
77
76
|
* work and a trailing write lands on top of a hand-written
|
|
78
77
|
* `setStatusMessage(undefined)` up to a window later.
|
|
79
78
|
*
|
|
80
|
-
* A
|
|
81
|
-
*
|
|
82
|
-
* opened its own slot by then, so the label the user is looking at survives.
|
|
79
|
+
* A superseded run's slot is already retired by the `begin()` that replaced
|
|
80
|
+
* it, so its `end()` only closes the guard.
|
|
83
81
|
*/
|
|
84
82
|
end: () => void;
|
|
85
83
|
}
|
|
86
84
|
/**
|
|
87
|
-
* Latest-wins
|
|
85
|
+
* Latest-wins abort rotation for a fetch that runs in a bare `autorun`
|
|
88
86
|
* rather than through `FetchMixin.runFetch` (which welds the same mechanics to
|
|
89
87
|
* `fetchGeneration`, so it's only for viewport-driven LGV fetches). Each
|
|
90
|
-
* `begin()` aborts the prior fetch
|
|
91
|
-
* `isCurrent()` guard that captures this run
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
* token by hand.
|
|
88
|
+
* `begin()` aborts the prior fetch and returns a fresh signal plus an
|
|
89
|
+
* `isCurrent()` guard that captures this run — gate every post-await write on
|
|
90
|
+
* it and a superseded or torn-down fetch can never clobber fresher data. The
|
|
91
|
+
* guard is the return value, so a caller can't forget to compare by hand.
|
|
95
92
|
*
|
|
96
93
|
* `end()` in the run's `finally` is the other half, and for the same reason —
|
|
97
94
|
* see {@link ActiveFetch.end} for the two things it does together.
|
|
98
95
|
*
|
|
99
|
-
* Owns the
|
|
96
|
+
* Owns the controller and the status channel; the caller keeps its own
|
|
100
97
|
* loading/error/commit side-effects. Three holders: `FetchMixin` as a member
|
|
101
98
|
* (so `cancelFetch` can reach it), `installFetch` one per installation (every
|
|
102
99
|
* other fetch in the tree runs on that skeleton), and the synteny diagonalize
|
|
@@ -110,7 +107,8 @@ export interface ActiveFetch {
|
|
|
110
107
|
* passes a {@link createStatusChannel}, which is one volatile instead of two
|
|
111
108
|
* fields and an action.
|
|
112
109
|
*/
|
|
113
|
-
export
|
|
110
|
+
export type AbortRotation = ReturnType<typeof createAbortRotation>;
|
|
111
|
+
export declare function createAbortRotation(self: IStateTreeNode, report: StatusReporter): {
|
|
114
112
|
begin(): ActiveFetch;
|
|
115
113
|
cancel: () => void;
|
|
116
114
|
dispose(): void;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { isAlive } from '@jbrowse/mobx-state-tree';
|
|
2
2
|
import { observable, runInAction } from 'mobx';
|
|
3
3
|
import { createStatusWindow, statusFraction, statusMessageText, } from './progress.js';
|
|
4
|
-
import { createStopToken, stopStopToken } from './stopToken.js';
|
|
5
4
|
export function createStatusChannel() {
|
|
6
5
|
// MobX rather than MST, so this is a value a model can hold rather than a
|
|
7
6
|
// node it has to parent. A volatile is `observable.ref`, so the fields have
|
|
@@ -28,35 +27,8 @@ export function createStatusChannel() {
|
|
|
28
27
|
},
|
|
29
28
|
};
|
|
30
29
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
* rather than through `FetchMixin.runFetch` (which welds the same mechanics to
|
|
34
|
-
* `fetchGeneration`, so it's only for viewport-driven LGV fetches). Each
|
|
35
|
-
* `begin()` aborts the prior fetch's token and returns a fresh one plus an
|
|
36
|
-
* `isCurrent()` guard that captures this run's token — gate every post-await
|
|
37
|
-
* write on it and a superseded or torn-down fetch can never clobber fresher
|
|
38
|
-
* data. The guard is the return value, so a caller can't forget to compare a
|
|
39
|
-
* token by hand.
|
|
40
|
-
*
|
|
41
|
-
* `end()` in the run's `finally` is the other half, and for the same reason —
|
|
42
|
-
* see {@link ActiveFetch.end} for the two things it does together.
|
|
43
|
-
*
|
|
44
|
-
* Owns the token mechanics and the status channel; the caller keeps its own
|
|
45
|
-
* loading/error/commit side-effects. Three holders: `FetchMixin` as a member
|
|
46
|
-
* (so `cancelFetch` can reach it), `installFetch` one per installation (every
|
|
47
|
-
* other fetch in the tree runs on that skeleton), and the synteny diagonalize
|
|
48
|
-
* progress wrapper (`withDiagonalizeProgress`) directly.
|
|
49
|
-
*
|
|
50
|
-
* `report` is passed rather than read off `self`, so where the status lands is
|
|
51
|
-
* the caller's decision and not a shape this imposes. A display passes itself —
|
|
52
|
-
* its status fields are part of its own API, and one composing `FetchMixin`
|
|
53
|
-
* passes the model-wide window along with them (see `StatusReporter`).
|
|
54
|
-
* Anything with one operation to narrate and no status vocabulary of its own
|
|
55
|
-
* passes a {@link createStatusChannel}, which is one volatile instead of two
|
|
56
|
-
* fields and an action.
|
|
57
|
-
*/
|
|
58
|
-
export function createStopTokenRotation(self, report) {
|
|
59
|
-
let currentStopToken;
|
|
30
|
+
export function createAbortRotation(self, report) {
|
|
31
|
+
let current;
|
|
60
32
|
// The host's window when it has one, so a display composing `FetchMixin` has
|
|
61
33
|
// one window rather than two writing one field; our own otherwise. Lent means
|
|
62
34
|
// this fetch is one slot beside the host's others rather than a second writer
|
|
@@ -76,8 +48,8 @@ export function createStopTokenRotation(self, report) {
|
|
|
76
48
|
/**
|
|
77
49
|
* Stop the in-flight fetch without starting one, and retire its slot.
|
|
78
50
|
*
|
|
79
|
-
* Dropping `
|
|
80
|
-
*
|
|
51
|
+
* Dropping `current` rather than only aborting it is what closes every
|
|
52
|
+
* outstanding guard: `isCurrent` compares against this field, so one
|
|
81
53
|
* assignment makes a fetch already past its await stale, whether it is the one
|
|
82
54
|
* being cancelled or a superseded predecessor still unwinding.
|
|
83
55
|
*
|
|
@@ -88,10 +60,8 @@ export function createStopTokenRotation(self, report) {
|
|
|
88
60
|
* works: `addDisposer(self, rotation.dispose)` is a shape callers reach for.
|
|
89
61
|
*/
|
|
90
62
|
const cancel = () => {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
currentStopToken = undefined;
|
|
94
|
-
}
|
|
63
|
+
current?.abort();
|
|
64
|
+
current = undefined;
|
|
95
65
|
// a fetch in flight when this is called never reaches its `finally`, and a
|
|
96
66
|
// slot nobody retires goes on voting
|
|
97
67
|
openStream?.clear();
|
|
@@ -99,27 +69,26 @@ export function createStopTokenRotation(self, report) {
|
|
|
99
69
|
};
|
|
100
70
|
return {
|
|
101
71
|
begin() {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
const stopToken = createStopToken();
|
|
106
|
-
currentStopToken = stopToken;
|
|
72
|
+
current?.abort();
|
|
73
|
+
const controller = new AbortController();
|
|
74
|
+
current = controller;
|
|
107
75
|
// `ended` is the term a completed fetch has no other way to express: the
|
|
108
|
-
//
|
|
109
|
-
// finished still holds the current
|
|
76
|
+
// controller comparison catches a SUPERSEDED one, but a fetch that simply
|
|
77
|
+
// finished still holds the current one. The stream reads it as well as
|
|
110
78
|
// the caller's commit guard, which is why both go through this closure.
|
|
111
79
|
let ended = false;
|
|
112
|
-
const isCurrent = () => !ended &&
|
|
113
|
-
// Opened
|
|
114
|
-
//
|
|
115
|
-
//
|
|
116
|
-
//
|
|
117
|
-
//
|
|
118
|
-
//
|
|
80
|
+
const isCurrent = () => !ended && controller === current && isAlive(self);
|
|
81
|
+
// Opened before the superseded slot retires, so the window is never idle
|
|
82
|
+
// across the handover and the label on screen survives it (ADR-080).
|
|
83
|
+
// Retired here rather than left to the superseded run's `finally`, which
|
|
84
|
+
// comes only when its work settles — and a CRAM record read, or a shared
|
|
85
|
+
// `cachedSetup` parse the replacement rejoins, runs on past the abort,
|
|
86
|
+
// its last reading summed into this fetch's bar the whole time.
|
|
119
87
|
const stream = statusWindow.open({ isCurrent });
|
|
88
|
+
openStream?.clear();
|
|
120
89
|
openStream = stream;
|
|
121
90
|
return {
|
|
122
|
-
|
|
91
|
+
signal: controller.signal,
|
|
123
92
|
isCurrent,
|
|
124
93
|
statusCallback: stream.statusCallback,
|
|
125
94
|
end() {
|
|
@@ -134,7 +103,7 @@ export function createStopTokenRotation(self, report) {
|
|
|
134
103
|
cancel,
|
|
135
104
|
dispose() {
|
|
136
105
|
cancel();
|
|
137
|
-
// the window outlives the
|
|
106
|
+
// the window outlives the fetch: a trailing write is queued on a timer,
|
|
138
107
|
// and while the sink's `isCurrent` makes it a no-op rather than a write to
|
|
139
108
|
// a dead node, the timer itself still stands for up to a window past
|
|
140
109
|
// teardown. Only ours — resetting a lent one drops a write the host's
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
export interface SvgRasterCanvasOpts {
|
|
2
|
+
/**
|
|
3
|
+
* headless canvas factory for `rasterizeLayers` (jbrowse-img passes one);
|
|
4
|
+
* without it the raster path needs a DOM canvas
|
|
5
|
+
*/
|
|
2
6
|
createCanvas?: (width: number, height: number) => HTMLCanvasElement;
|
|
7
|
+
/**
|
|
8
|
+
* decodes SVG markup into an image a `createCanvas` canvas can draw, where
|
|
9
|
+
* the environment's `Image` cannot (node, jsdom). A headless decoder draws
|
|
10
|
+
* vectors only, so markup headed for it carries no rasterized layers.
|
|
11
|
+
*/
|
|
12
|
+
decodeSvg?: (markup: string) => Promise<CanvasImageSource>;
|
|
3
13
|
}
|
|
4
14
|
export declare function createSvgRasterCanvas(width: number, height: number, opts: SvgRasterCanvasOpts | undefined): {
|
|
5
15
|
canvas: HTMLCanvasElement;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Color } from './color-bits/core.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Normalize a bare BED color triple to canonical "r,g,b", or undefined if the
|
|
4
|
+
* string isn't one. Each component must be in range: the underlying parser
|
|
5
|
+
* masks to 8 bits, so a bogus "999,0,0" would otherwise *wrap* to 231 and paint
|
|
6
|
+
* a plausible-looking but wrong color rather than being caught.
|
|
7
|
+
*/
|
|
8
|
+
export declare function bedTriple(str: string): string | undefined;
|
|
9
|
+
export declare function parseCssColorOr(color: string, fallback: Color): Color;
|
|
10
|
+
/**
|
|
11
|
+
* Whether the painters read `color` as a color — a CSS name, hex, functional
|
|
12
|
+
* form, `transparent` or a BED triple — rather than as the invalid sentinel.
|
|
13
|
+
* What a `color` config slot admits.
|
|
14
|
+
*/
|
|
15
|
+
export declare function isCssColor(color: string): boolean;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { newColor } from './color-bits/core.js';
|
|
2
|
+
import { parse } from './color-bits/parse.js';
|
|
3
|
+
import { namedColorToHex } from './color/cssColorsLevel4.js';
|
|
4
|
+
// Split out of colorBits.ts so a config slot can ask "is this a color?" without
|
|
5
|
+
// taking that module's re-export of render-core's packers: the closure ceiling
|
|
6
|
+
// in scripts/moduleClosure.test.ts is what says so.
|
|
7
|
+
// A bare BED color triple ("255,0,0"), which is not a CSS color but is what
|
|
8
|
+
// BED-family adapters put on the feature verbatim. The spec has no spaces, but
|
|
9
|
+
// tolerate them rather than silently ignoring an otherwise-usable color.
|
|
10
|
+
const BED_TRIPLE = /^(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})$/;
|
|
11
|
+
/**
|
|
12
|
+
* Normalize a bare BED color triple to canonical "r,g,b", or undefined if the
|
|
13
|
+
* string isn't one. Each component must be in range: the underlying parser
|
|
14
|
+
* masks to 8 bits, so a bogus "999,0,0" would otherwise *wrap* to 231 and paint
|
|
15
|
+
* a plausible-looking but wrong color rather than being caught.
|
|
16
|
+
*/
|
|
17
|
+
export function bedTriple(str) {
|
|
18
|
+
const m = BED_TRIPLE.exec(str.trim());
|
|
19
|
+
const rgb = m?.slice(1, 4).map(Number);
|
|
20
|
+
return rgb?.every(n => n <= 255) ? rgb.join(',') : undefined;
|
|
21
|
+
}
|
|
22
|
+
function tryParseCssColor(color) {
|
|
23
|
+
const str = color.trim().toLowerCase();
|
|
24
|
+
if (str === 'transparent') {
|
|
25
|
+
return newColor(0, 0, 0, 0);
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const hex = namedColorToHex(str);
|
|
29
|
+
const triple = bedTriple(str);
|
|
30
|
+
return parse(hex ? hex : triple ? `rgb(${triple})` : str);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Resolve a CSS color string to a Color: honors named colors, `transparent`,
|
|
37
|
+
// and bare BED color triples, and returns `fallback` on malformed-but-nonempty
|
|
38
|
+
// input. `parse` throws on e.g. an empty "rgb()"; callers pass a fallback so one
|
|
39
|
+
// bad per-feature color can't crash a whole render/RPC. An out-of-range triple
|
|
40
|
+
// is left to throw into `fallback` (magenta) rather than wrapping to a wrong
|
|
41
|
+
// color — the same rule featureItemRgb applies, so a jexl callback reading an
|
|
42
|
+
// itemRgb column and the automatic path agree on what counts as a color.
|
|
43
|
+
export function parseCssColorOr(color, fallback) {
|
|
44
|
+
return tryParseCssColor(color) ?? fallback;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Whether the painters read `color` as a color — a CSS name, hex, functional
|
|
48
|
+
* form, `transparent` or a BED triple — rather than as the invalid sentinel.
|
|
49
|
+
* What a `color` config slot admits.
|
|
50
|
+
*/
|
|
51
|
+
export function isCssColor(color) {
|
|
52
|
+
return tryParseCssColor(color) !== undefined;
|
|
53
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { StatusCallback } from './progress.ts';
|
|
2
|
-
import type { StopToken } from './stopToken.ts';
|
|
3
2
|
import type { Region } from './types/data.ts';
|
|
4
3
|
export interface AlignmentData {
|
|
5
4
|
refRefName: string;
|
|
@@ -17,7 +16,7 @@ export interface DiagonalizationResult {
|
|
|
17
16
|
regionsReversed: number;
|
|
18
17
|
};
|
|
19
18
|
}
|
|
20
|
-
export declare function diagonalizeRegions(alignments: AlignmentData[], referenceRegions: Region[], currentRegions: Region[], {
|
|
21
|
-
|
|
19
|
+
export declare function diagonalizeRegions(alignments: AlignmentData[], referenceRegions: Region[], currentRegions: Region[], { signal, statusCallback, }?: {
|
|
20
|
+
signal?: AbortSignal;
|
|
22
21
|
statusCallback?: StatusCallback;
|
|
23
22
|
}): Promise<DiagonalizationResult>;
|