@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
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Stamp `baseUri` next to every `uri` in a config
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
2
|
+
* Stamp `baseUri` next to every `uri` in a config, and beside a MultiWiggle
|
|
3
|
+
* `bigWigs` array of bare URI strings, so relative URIs resolve against the
|
|
4
|
+
* location the config itself was loaded from. A file written as a bare string
|
|
5
|
+
* where a location object can go (a search index, `refNameAliases`,
|
|
6
|
+
* `cytobands`, a `bedLocations` entry) has no object to stamp, so it becomes
|
|
7
|
+
* `{ uri, baseUri }`.
|
|
8
|
+
* jbrowse-web runs this when it fetches a config.json from a URL; anything that
|
|
9
|
+
* injects a fetched config as an object (a hub, a track hub connection, a
|
|
10
|
+
* headless render) has to run it too, or the config's relative data URIs
|
|
11
|
+
* resolve against the page.
|
|
7
12
|
*
|
|
8
13
|
* Lives in core because core is what consumes the result — the assembly config
|
|
9
14
|
* schema and expandAssemblyConfigShorthand read `baseUri` back out.
|
|
@@ -11,16 +16,47 @@
|
|
|
11
16
|
export function addRelativeUris(config, base) {
|
|
12
17
|
if (typeof config === 'object' && config !== null) {
|
|
13
18
|
for (const key of Object.keys(config)) {
|
|
14
|
-
|
|
15
|
-
|
|
19
|
+
const value = liftBareFiles(key, config[key]);
|
|
20
|
+
if (value !== config[key]) {
|
|
21
|
+
config[key] = value;
|
|
16
22
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
23
|
+
if (typeof value === 'object' && value !== null) {
|
|
24
|
+
addRelativeUris(value, base);
|
|
25
|
+
}
|
|
26
|
+
if (key === 'uri' || (key === 'bigWigs' && Array.isArray(value))) {
|
|
27
|
+
config.baseUri ??= base.href;
|
|
20
28
|
}
|
|
21
29
|
}
|
|
22
30
|
}
|
|
23
31
|
}
|
|
32
|
+
// the keys whose value may be a file written as a bare string, which has no
|
|
33
|
+
// object to carry a baseUri until it becomes `{ uri }`
|
|
34
|
+
const FILE_KEYS = new Set(['textSearchAdapter', 'refNameAliases', 'cytobands']);
|
|
35
|
+
const FILE_LIST_KEYS = new Set(['aggregateTextSearchAdapters', 'bedLocations']);
|
|
36
|
+
function liftBareFiles(key, value) {
|
|
37
|
+
const lift = (file) => typeof file === 'string' ? { uri: file } : file;
|
|
38
|
+
return FILE_KEYS.has(key)
|
|
39
|
+
? lift(value)
|
|
40
|
+
: FILE_LIST_KEYS.has(key) &&
|
|
41
|
+
Array.isArray(value) &&
|
|
42
|
+
value.some(file => typeof file === 'string')
|
|
43
|
+
? value.map(lift)
|
|
44
|
+
: value;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* A copy of `config` with every relative URI stamped against the page, which
|
|
48
|
+
* is what the page itself would resolve it against. An RPC worker started from
|
|
49
|
+
* a `blob:` URL has no such base, so a location it receives without one fails
|
|
50
|
+
* to parse there.
|
|
51
|
+
*/
|
|
52
|
+
export function withPageBaseUri(config) {
|
|
53
|
+
if (typeof document === 'undefined' || config === undefined) {
|
|
54
|
+
return config;
|
|
55
|
+
}
|
|
56
|
+
const copy = structuredClone(config);
|
|
57
|
+
addRelativeUris(copy, new URL(document.baseURI));
|
|
58
|
+
return copy;
|
|
59
|
+
}
|
|
24
60
|
/**
|
|
25
61
|
* Inverse of {@link addRelativeUris}: recursively delete every synthetic
|
|
26
62
|
* `baseUri` key (mutates in place), e.g. before serializing a config snapshot
|
|
@@ -82,13 +82,10 @@ export declare function addTrackFromWidget({ model, session, conf, }: {
|
|
|
82
82
|
name?: string;
|
|
83
83
|
assemblyNames?: (string | undefined)[];
|
|
84
84
|
};
|
|
85
|
-
}): (import("@jbrowse/mobx-state-tree").$EmptyObjectBrand & Partial<{
|
|
85
|
+
}): import("../configuration/types.ts").AnyConfigurationModel | (import("@jbrowse/mobx-state-tree").$EmptyObjectBrand & Partial<{
|
|
86
86
|
[x: string]: any;
|
|
87
87
|
}> & {
|
|
88
88
|
trackId: string;
|
|
89
89
|
name?: string;
|
|
90
90
|
assemblyNames?: (string | undefined)[];
|
|
91
|
-
}) |
|
|
92
|
-
setSubschema(slotName: string, data: Record<string, unknown>): any;
|
|
93
|
-
setSlot(slotName: string, value: unknown): void;
|
|
94
|
-
} & IStateTreeNode<import("../configuration/types.ts").AnyConfigurationSchemaType>) | undefined;
|
|
91
|
+
}) | undefined;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { coarseStripHTML } from './coarseStripHTML.js';
|
|
1
2
|
import { namesTemporaryAssembly } from './temporaryAssembly.js';
|
|
2
3
|
import { isSameAssemblyName } from './tracks.js';
|
|
3
4
|
import { isSessionModelWithWidgets, isSessionWithPublishTrackConf, } from './types/index.js';
|
|
@@ -65,10 +66,10 @@ export function addTrackFromWidget({ model, session, conf, }) {
|
|
|
65
66
|
const { trackContainer } = model;
|
|
66
67
|
if (namesTemporaryAssembly(session, conf)) {
|
|
67
68
|
if (!trackContainer) {
|
|
68
|
-
session.notify(`Could not add "${conf.name ?? conf.trackId}": the view it was being added to has closed, and it uses an assembly that only that view had.`, 'warning');
|
|
69
|
+
session.notify(`Could not add "${coarseStripHTML(conf.name ?? conf.trackId)}": the view it was being added to has closed, and it uses an assembly that only that view had.`, 'warning');
|
|
69
70
|
return undefined;
|
|
70
71
|
}
|
|
71
|
-
trackContainer.
|
|
72
|
+
void trackContainer.launchTrack(conf.trackId, {}, {}, conf);
|
|
72
73
|
finishAddTrack(model, session);
|
|
73
74
|
return conf;
|
|
74
75
|
}
|
|
@@ -77,11 +78,11 @@ export function addTrackFromWidget({ model, session, conf, }) {
|
|
|
77
78
|
return undefined;
|
|
78
79
|
}
|
|
79
80
|
if (containerDisplaysAssembly(trackContainer, conf.assemblyNames, session.assemblyManager)) {
|
|
80
|
-
trackContainer?.
|
|
81
|
+
void trackContainer?.launchTrack(conf.trackId);
|
|
81
82
|
}
|
|
82
83
|
else {
|
|
83
84
|
const assemblies = conf.assemblyNames?.filter(a => !!a) ?? [];
|
|
84
|
-
session.notify(`Added track "${conf.name ?? conf.trackId}" to the session, but it was not displayed because it uses ${assemblies.length
|
|
85
|
+
session.notify(`Added track "${coarseStripHTML(conf.name ?? conf.trackId)}" to the session, but it was not displayed because it uses ${assemblies.length
|
|
85
86
|
? `assembly "${assemblies.join('", "')}"`
|
|
86
87
|
: 'an assembly'}, which is not open in this view. Open a view for that assembly and use its track selector to display it.`, 'warning');
|
|
87
88
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The field an aggregate op writes: `as` where named, else `count` for a
|
|
3
|
+
* count, else `<op>_<field>`. Imports nothing, so the validator's copy of the
|
|
4
|
+
* mark rule list carries it unchanged.
|
|
5
|
+
*/
|
|
6
|
+
export declare function aggregateFieldName({ op, field, as, }: {
|
|
7
|
+
op: string;
|
|
8
|
+
field?: string;
|
|
9
|
+
as?: string;
|
|
10
|
+
}): string;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The field an aggregate op writes: `as` where named, else `count` for a
|
|
3
|
+
* count, else `<op>_<field>`. Imports nothing, so the validator's copy of the
|
|
4
|
+
* mark rule list carries it unchanged.
|
|
5
|
+
*/
|
|
6
|
+
export function aggregateFieldName({ op, field, as, }) {
|
|
7
|
+
return as || (op === 'count' || !field ? op : `${op}_${field}`);
|
|
8
|
+
}
|
package/esm/util/analytics.js
CHANGED
|
@@ -9,11 +9,10 @@ export async function writeAWSAnalytics(rootModel, initialTimestamp, sessionQuer
|
|
|
9
9
|
try {
|
|
10
10
|
const url = 'https://analytics.jbrowse.org/api/v1';
|
|
11
11
|
const multiAssemblyTracks = rootModel.jbrowse.tracks.filter(track => readConfObject(track, 'assemblyNames').length > 1).length;
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
// Canvas2D is counted as Canvas2D rather than as
|
|
15
|
-
//
|
|
16
|
-
// users end up on Canvas2D" unanswerable.
|
|
12
|
+
// The rung createGpuHal built where a display has built one by idle time,
|
|
13
|
+
// else the ladder's prediction with any page-wide pin applied — so a
|
|
14
|
+
// session that fell back to Canvas2D is counted as Canvas2D rather than as
|
|
15
|
+
// what the hardware could have done.
|
|
17
16
|
const capabilities = await getGraphicsCapabilities();
|
|
18
17
|
const renderer = effectiveRenderer(capabilities);
|
|
19
18
|
// The coarse bit only. `glRenderer` names the exact driver and stays local
|
|
@@ -120,14 +119,48 @@ export function doAnalytics(rootModel, initialTimestamp, initialSessionQuery) {
|
|
|
120
119
|
!analyticsSent &&
|
|
121
120
|
!readConfObject(rootModel.jbrowse.configuration, 'disableAnalytics')) {
|
|
122
121
|
analyticsSent = true;
|
|
123
|
-
//
|
|
124
|
-
//
|
|
125
|
-
//
|
|
126
|
-
//
|
|
127
|
-
//
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
122
|
+
// writeGAAnalytics injects Google's scripts and writeAWSAnalytics probes
|
|
123
|
+
// graphics capabilities, hundreds of ms of main-thread work together. Idle
|
|
124
|
+
// time alone is not late enough: a load spends most of its time idle,
|
|
125
|
+
// waiting on the network, so rIC ran them mid-boot. The writers measure
|
|
126
|
+
// loadTime up to when they run, so the start they get is moved forward by
|
|
127
|
+
// the wait, and loadTime still ends here.
|
|
128
|
+
const calledAt = Date.now();
|
|
129
|
+
afterAppReady(() => {
|
|
130
|
+
rIC(() => {
|
|
131
|
+
const start = initialTimestamp + (Date.now() - calledAt);
|
|
132
|
+
void writeAWSAnalytics(rootModel, start, initialSessionQuery);
|
|
133
|
+
void writeGAAnalytics(rootModel, start);
|
|
134
|
+
});
|
|
131
135
|
});
|
|
132
136
|
}
|
|
133
137
|
}
|
|
138
|
+
// `[data-app-phase="ready"]`, or a timeout for a page that never shows one
|
|
139
|
+
// (Desktop's start screen)
|
|
140
|
+
function afterAppReady(callback, maxWaitMs = 10_000) {
|
|
141
|
+
const isReady = () => document.querySelector('[data-app-phase="ready"]') !== null;
|
|
142
|
+
if (isReady()) {
|
|
143
|
+
callback();
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
let done = false;
|
|
147
|
+
const finish = () => {
|
|
148
|
+
if (!done) {
|
|
149
|
+
done = true;
|
|
150
|
+
observer.disconnect();
|
|
151
|
+
clearTimeout(timer);
|
|
152
|
+
callback();
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
const observer = new MutationObserver(() => {
|
|
156
|
+
if (isReady()) {
|
|
157
|
+
finish();
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
const timer = setTimeout(finish, maxWaitMs);
|
|
161
|
+
observer.observe(document.body, {
|
|
162
|
+
subtree: true,
|
|
163
|
+
childList: true,
|
|
164
|
+
attributeFilter: ['data-app-phase'],
|
|
165
|
+
});
|
|
166
|
+
}
|
|
@@ -15,3 +15,12 @@ import type { AnimationMode } from './types/index.ts';
|
|
|
15
15
|
* honors it.
|
|
16
16
|
*/
|
|
17
17
|
export declare function animationAllowed(mode: AnimationMode): boolean;
|
|
18
|
+
/** how long a layout morph takes from where it drew to where it now draws */
|
|
19
|
+
export declare const MORPH_DURATION_MS = 300;
|
|
20
|
+
export declare function easeInOutCubic(t: number): number;
|
|
21
|
+
/**
|
|
22
|
+
* The wall clock a morph is timed on. Falls back to the epoch clock rather than
|
|
23
|
+
* a constant where `performance` is missing: a clock that never advances
|
|
24
|
+
* leaves a frame loop at progress 0 forever.
|
|
25
|
+
*/
|
|
26
|
+
export declare function morphClockMs(): number;
|
|
@@ -20,3 +20,16 @@ export function animationAllowed(mode) {
|
|
|
20
20
|
return (hasFrameClock &&
|
|
21
21
|
(mode === 'enabled' || (mode === 'system' && !prefersReduced)));
|
|
22
22
|
}
|
|
23
|
+
/** how long a layout morph takes from where it drew to where it now draws */
|
|
24
|
+
export const MORPH_DURATION_MS = 300;
|
|
25
|
+
export function easeInOutCubic(t) {
|
|
26
|
+
return t < 0.5 ? 4 * t * t * t : 1 - (-2 * t + 2) ** 3 / 2;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The wall clock a morph is timed on. Falls back to the epoch clock rather than
|
|
30
|
+
* a constant where `performance` is missing: a clock that never advances
|
|
31
|
+
* leaves a frame loop at progress 0 forever.
|
|
32
|
+
*/
|
|
33
|
+
export function morphClockMs() {
|
|
34
|
+
return typeof performance === 'undefined' ? Date.now() : performance.now();
|
|
35
|
+
}
|
|
@@ -1,10 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
import type { VirtualScrollModel } from './useVirtualScrollWheel.ts';
|
|
2
|
+
export interface RowResizeTarget extends VirtualScrollModel {
|
|
3
|
+
/** resolved, never the 0/fit sentinel — this is divided by */
|
|
2
4
|
effectiveRowHeight: number;
|
|
3
|
-
scrollTop: number;
|
|
4
5
|
nrow: number;
|
|
5
|
-
viewportHeight: number;
|
|
6
6
|
setRowHeight: (n: number) => void;
|
|
7
|
-
setScrollTop: (n: number) => void;
|
|
8
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* shift+wheel over a row stack: resize the rows, pinning the row under the
|
|
10
|
+
* cursor. The floor is the fit height, so rows never shrink past filling the
|
|
11
|
+
* viewport. The cap stops a gesture but never moves rows on its own, so it
|
|
12
|
+
* rises to a current height already above it (a pinned `rowHeight` is
|
|
13
|
+
* unbounded).
|
|
14
|
+
*/
|
|
9
15
|
export declare function applyRowResizeWheel(e: WheelEvent, el: HTMLElement, model: RowResizeTarget): void;
|
|
10
|
-
export {};
|
|
@@ -1,30 +1,19 @@
|
|
|
1
|
-
// shift+wheel resizes the sample rows (a vertical-zoom gesture) rather than
|
|
2
|
-
// scrolling, keeping the row under the cursor pinned in place as the height
|
|
3
|
-
// changes. Shared by every row-stack display — both variant displays and MAF —
|
|
4
|
-
// so the gesture stays identical wherever rows have a resolved height and a
|
|
5
|
-
// scroll offset. setScrollTop clamps to the new scrollableHeight, so the raw
|
|
6
|
-
// target is passed through unclamped.
|
|
7
1
|
import { normalizeWheelDelta } from './wheelZoom.js';
|
|
8
2
|
const MAX_ROW_HEIGHT = 20;
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
// accumulate smoothly instead of the old sign-based ±1-per-event, which flew
|
|
12
|
-
// through the whole range on a trackpad's event flood.
|
|
3
|
+
// A mouse notch (~100px) nudges the height ~0.4px, and a trackpad's small
|
|
4
|
+
// deltas accumulate smoothly rather than flying through the range.
|
|
13
5
|
const RESIZE_PX_PER_WHEEL_PX = 1 / 240;
|
|
6
|
+
/**
|
|
7
|
+
* shift+wheel over a row stack: resize the rows, pinning the row under the
|
|
8
|
+
* cursor. The floor is the fit height, so rows never shrink past filling the
|
|
9
|
+
* viewport. The cap stops a gesture but never moves rows on its own, so it
|
|
10
|
+
* rises to a current height already above it (a pinned `rowHeight` is
|
|
11
|
+
* unbounded).
|
|
12
|
+
*/
|
|
14
13
|
export function applyRowResizeWheel(e, el, model) {
|
|
15
14
|
e.preventDefault();
|
|
16
|
-
// scroll up (deltaY < 0) grows rows; proportional to the normalized delta so
|
|
17
|
-
// the speed is consistent across mice/trackpads and finer than ±1/event.
|
|
18
15
|
const delta = -normalizeWheelDelta(e.deltaY, e.deltaMode) * RESIZE_PX_PER_WHEEL_PX;
|
|
19
|
-
|
|
20
|
-
const minRowHeight = model.viewportHeight / Math.max(1, model.nrow);
|
|
21
|
-
// The cap may stop the gesture going further; it may never move the rows on
|
|
22
|
-
// its own. So both heights that can already sit above MAX_ROW_HEIGHT raise
|
|
23
|
-
// it: the auto-fit floor (few samples), and the current height (a pinned
|
|
24
|
-
// `rowHeight` — the config slot and the "Custom..." dialog are both
|
|
25
|
-
// unbounded, and MAF's own docs example is 12 while a bases-mode row wants
|
|
26
|
-
// more). Without the second, a 40px pinned row met `min(20, 40.4)` on the
|
|
27
|
-
// first notch of a *grow* gesture and halved.
|
|
16
|
+
const minRowHeight = model.scrollViewportHeight / Math.max(1, model.nrow);
|
|
28
17
|
const maxRowHeight = Math.max(MAX_ROW_HEIGHT, minRowHeight, model.effectiveRowHeight);
|
|
29
18
|
const newRowHeight = Math.max(minRowHeight, Math.min(maxRowHeight, model.effectiveRowHeight + delta));
|
|
30
19
|
const mouseY = e.clientY - el.getBoundingClientRect().top;
|
package/esm/util/bandHeight.d.ts
CHANGED
|
@@ -51,3 +51,13 @@ export declare function boundBandHeight(n: number, { min, max }?: BandBounds): n
|
|
|
51
51
|
* display height so the plot below cannot be squashed to nothing
|
|
52
52
|
*/
|
|
53
53
|
export declare function clampBandHeight(current: number, target: number, bounds?: BandBounds): number;
|
|
54
|
+
/**
|
|
55
|
+
* #api core/util
|
|
56
|
+
* Heights after growing or shrinking a stack of bands by `distance` px in all:
|
|
57
|
+
* the one rule every whole-stack resize uses. Each band takes its share of the
|
|
58
|
+
* height it has above `floor`, so the tall bands give and take the most, and
|
|
59
|
+
* none goes below `floor`, or below its own height if it already sits under it
|
|
60
|
+
* (the {@link clampBandHeight} rule). Whole pixels, rounded by largest
|
|
61
|
+
* remainder, so the stack moves by exactly the rounded distance.
|
|
62
|
+
*/
|
|
63
|
+
export declare function scaleBandHeights(heights: number[], distance: number, floor?: number): number[];
|
package/esm/util/bandHeight.js
CHANGED
|
@@ -54,3 +54,32 @@ export function clampBandHeight(current, target, bounds = {}) {
|
|
|
54
54
|
const { min = MIN_BAND_HEIGHT } = bounds;
|
|
55
55
|
return boundBandHeight(target, { ...bounds, min: Math.min(min, current) });
|
|
56
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* #api core/util
|
|
59
|
+
* Heights after growing or shrinking a stack of bands by `distance` px in all:
|
|
60
|
+
* the one rule every whole-stack resize uses. Each band takes its share of the
|
|
61
|
+
* height it has above `floor`, so the tall bands give and take the most, and
|
|
62
|
+
* none goes below `floor`, or below its own height if it already sits under it
|
|
63
|
+
* (the {@link clampBandHeight} rule). Whole pixels, rounded by largest
|
|
64
|
+
* remainder, so the stack moves by exactly the rounded distance.
|
|
65
|
+
*/
|
|
66
|
+
export function scaleBandHeights(heights, distance, floor = MIN_BAND_HEIGHT) {
|
|
67
|
+
const floors = heights.map(h => Math.min(h, floor));
|
|
68
|
+
const room = heights.map((h, i) => h - floors[i]);
|
|
69
|
+
const roomTotal = room.reduce((a, b) => a + b, 0);
|
|
70
|
+
const target = Math.max(0, Math.round(roomTotal + distance));
|
|
71
|
+
const exact = room.map(r => roomTotal > 0 ? (r * target) / roomTotal : target / heights.length);
|
|
72
|
+
const whole = exact.map(e => Math.floor(e));
|
|
73
|
+
let left = target - whole.reduce((a, b) => a + b, 0);
|
|
74
|
+
const byRemainder = exact
|
|
75
|
+
.map((e, i) => ({ i, frac: e - whole[i] }))
|
|
76
|
+
.sort((a, b) => b.frac - a.frac);
|
|
77
|
+
for (const { i } of byRemainder) {
|
|
78
|
+
if (left <= 0) {
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
whole[i] = whole[i] + 1;
|
|
82
|
+
left -= 1;
|
|
83
|
+
}
|
|
84
|
+
return whole.map((w, i) => w + floors[i]);
|
|
85
|
+
}
|
package/esm/util/bandLayout.d.ts
CHANGED
|
@@ -39,11 +39,11 @@ export interface BandStack<K extends string> {
|
|
|
39
39
|
/**
|
|
40
40
|
* #api core/util
|
|
41
41
|
* Fold an ordered set of bands into tops and a bottom. The order is the
|
|
42
|
-
* argument, so a display states its band order exactly once
|
|
43
|
-
* and pick all
|
|
44
|
-
*
|
|
42
|
+
* argument, so a display states its band order exactly once. Reserve, paint
|
|
43
|
+
* and pick all call this function, so the reserved and painted positions
|
|
44
|
+
* cannot disagree.
|
|
45
45
|
*
|
|
46
|
-
* Only the fold is shared
|
|
46
|
+
* Only the fold is shared; the rest stays in each display. Per-lane
|
|
47
47
|
* iteration runs this once per lane, sticky-vs-scrolling is a property of how
|
|
48
48
|
* the result is projected to the screen, and a band drawn outside its
|
|
49
49
|
* reservation (an overlay) carries its own draw rect beside the stack.
|
package/esm/util/bandLayout.js
CHANGED
|
@@ -14,11 +14,11 @@ export function reservedPx(band) {
|
|
|
14
14
|
/**
|
|
15
15
|
* #api core/util
|
|
16
16
|
* Fold an ordered set of bands into tops and a bottom. The order is the
|
|
17
|
-
* argument, so a display states its band order exactly once
|
|
18
|
-
* and pick all
|
|
19
|
-
*
|
|
17
|
+
* argument, so a display states its band order exactly once. Reserve, paint
|
|
18
|
+
* and pick all call this function, so the reserved and painted positions
|
|
19
|
+
* cannot disagree.
|
|
20
20
|
*
|
|
21
|
-
* Only the fold is shared
|
|
21
|
+
* Only the fold is shared; the rest stays in each display. Per-lane
|
|
22
22
|
* iteration runs this once per lane, sticky-vs-scrolling is a property of how
|
|
23
23
|
* the result is projected to the screen, and a band drawn outside its
|
|
24
24
|
* reservation (an overlay) carries its own draw rect beside the stack.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #api core/util
|
|
3
|
+
* The base's entry for this display, hydrated, which a reset returns to and
|
|
4
|
+
* "is this the reader's" compares against: the config.json's, or the one a
|
|
5
|
+
* track the session owns was added with; empty in a session that keeps no
|
|
6
|
+
* base.
|
|
7
|
+
*/
|
|
8
|
+
export declare function baseDisplayConfig(self: object): Record<string, unknown>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { hasParent } from '@jbrowse/mobx-state-tree';
|
|
2
|
+
import { getConf } from '../configuration/getConf.js';
|
|
3
|
+
import { getContainingTrack, getSession } from './mstUtils.js';
|
|
4
|
+
import { isSessionWithBaseTrackConfig } from './types/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* #api core/util
|
|
7
|
+
* The base's entry for this display, hydrated, which a reset returns to and
|
|
8
|
+
* "is this the reader's" compares against: the config.json's, or the one a
|
|
9
|
+
* track the session owns was added with; empty in a session that keeps no
|
|
10
|
+
* base.
|
|
11
|
+
*/
|
|
12
|
+
export function baseDisplayConfig(self) {
|
|
13
|
+
if (!hasParent(self)) {
|
|
14
|
+
return {};
|
|
15
|
+
}
|
|
16
|
+
const session = getSession(self);
|
|
17
|
+
if (!isSessionWithBaseTrackConfig(session)) {
|
|
18
|
+
return {};
|
|
19
|
+
}
|
|
20
|
+
const base = session.baseTrackConfig(getConf(getContainingTrack(self), 'trackId'));
|
|
21
|
+
const { displayId } = self
|
|
22
|
+
.configuration;
|
|
23
|
+
const displays = base?.displays;
|
|
24
|
+
return ((Array.isArray(displays)
|
|
25
|
+
? displays.find(d => d.displayId === displayId)
|
|
26
|
+
: undefined) ?? {});
|
|
27
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export declare const
|
|
2
|
-
export declare
|
|
1
|
+
export declare const CUBIC_APEX_RATIO = 0.75;
|
|
2
|
+
export declare const BEZIER_CONNECTOR_MAX_REACH_PX = 110;
|
|
3
|
+
export declare function bezierConnectorPath({ x1, y1, x2, y2, s1, s2, leadingEnd2, reversed1, reversed2, maxHandlePx, dipPx, }: {
|
|
3
4
|
x1: number;
|
|
4
5
|
y1: number;
|
|
5
6
|
x2: number;
|
|
@@ -10,5 +11,5 @@ export declare function bezierConnectorPath({ x1, y1, x2, y2, s1, s2, leadingEnd
|
|
|
10
11
|
reversed1?: boolean;
|
|
11
12
|
reversed2?: boolean;
|
|
12
13
|
maxHandlePx?: number;
|
|
13
|
-
|
|
14
|
+
dipPx?: number;
|
|
14
15
|
}): string;
|
|
@@ -19,43 +19,38 @@ const SPAN_FACTOR = 0.3;
|
|
|
19
19
|
// its leading end: unbounded, that hook grows with the arc, and a full-width
|
|
20
20
|
// inversion flings a ~500px curl back across unrelated reads.
|
|
21
21
|
const MAX_HANDLE_PX = 200;
|
|
22
|
+
// A symmetric cubic's extreme sits 3/4 of the way from its baseline to its
|
|
23
|
+
// control points, so an arc asked to reach a given apex puts its controls 4/3
|
|
24
|
+
// past it. Exported because the sashimi overlay solves the same equation in the
|
|
25
|
+
// other direction, and the two spellings drifting apart would put the insert-
|
|
26
|
+
// size ruler's labels at heights nothing plots at.
|
|
27
|
+
export const CUBIC_APEX_RATIO = 0.75;
|
|
22
28
|
// Vertical bow applied to a connection whose two endpoints share (or nearly
|
|
23
29
|
// share) a row — e.g. a chain whose split segments are all laid out on one
|
|
24
30
|
// pileup row. Without it the horizontal-only handles collapse the cubic to a
|
|
25
31
|
// flat, invisible line lying on the row; the bow lifts the control points so
|
|
26
32
|
// the curve arcs into a visible hump. This is the control-point lift, not the
|
|
27
|
-
// height the curve reaches
|
|
28
|
-
// apexes at 0.75 * bow.
|
|
33
|
+
// height the curve reaches.
|
|
29
34
|
const MAX_BOW_PX = 30;
|
|
30
35
|
// A discordant connection bows *down* instead of up, so the two classes read
|
|
31
36
|
// apart at a glance. Both renderers follow this: BreakpointSplitView dips its
|
|
32
|
-
// same-level discordant links, and the pileup overlay dips every
|
|
33
|
-
// (
|
|
34
|
-
//
|
|
35
|
-
//
|
|
37
|
+
// same-level discordant links, and the pileup overlay dips every discordant
|
|
38
|
+
// curve it draws (a normal-orientation pair is a plain line, or bows up over its
|
|
39
|
+
// row where a hidden-segment one would lie on a chain's connecting line). Keep
|
|
40
|
+
// it that way — a renderer that opts out makes "below the reads" mean two
|
|
41
|
+
// different things in two views of the same data.
|
|
36
42
|
//
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
//
|
|
40
|
-
//
|
|
41
|
-
//
|
|
42
|
-
//
|
|
43
|
-
//
|
|
44
|
-
//
|
|
45
|
-
//
|
|
46
|
-
// cap point bottoms out at an identical depth, and at any plausible cap a
|
|
47
|
-
// typical view is mostly wider. This form stays strictly increasing in span at
|
|
48
|
-
// every width while staying bounded. DIP_HALF_SPAN_PX is the span at which the
|
|
49
|
-
// dip reaches half its maximum.
|
|
50
|
-
const MAX_DIP_PX = 110;
|
|
51
|
-
const DIP_HALF_SPAN_PX = 500;
|
|
52
|
-
// How far a curve can stray outside the band between its two endpoints. A cubic
|
|
53
|
-
// with both control points offset by `d` apexes at 0.75 * d, and the dip — the
|
|
54
|
-
// deeper of the two shaping terms — saturates toward MAX_DIP_PX, so this bounds
|
|
55
|
-
// both. A caller that culls off-screen curves has to pad its viewport test by
|
|
56
|
-
// this: the shaping is applied to the *control points*, so a curve whose two
|
|
43
|
+
// HOW DEEP is the renderer's call, not this file's. Depth is the mark's one free
|
|
44
|
+
// channel, and only the renderer knows the band the ink has to survive in — the
|
|
45
|
+
// pileup clips each section at its band bottom, and the split view bleeds a
|
|
46
|
+
// too-deep dip into the panel below. So callers pass the depth they want and
|
|
47
|
+
// `discordantDipPx` (@jbrowse/sv-core) is the law the two of them share.
|
|
48
|
+
// How far a curve can stray outside the band between its two endpoints. The dip
|
|
49
|
+
// is the deeper of the two shaping terms, so this is a ceiling on it, applied
|
|
50
|
+
// here rather than trusted to a caller: a culler pads its viewport test by this,
|
|
51
|
+
// and the shaping is applied to the *control points*, so a curve whose two
|
|
57
52
|
// endpoints both sit just outside the viewport can still have a visible body.
|
|
58
|
-
export const BEZIER_CONNECTOR_MAX_REACH_PX =
|
|
53
|
+
export const BEZIER_CONNECTOR_MAX_REACH_PX = 110;
|
|
59
54
|
// Sign (+1/-1) of an endpoint's horizontal control handle. The handle leaves a
|
|
60
55
|
// trailing (3') endpoint along the read's reading direction (`strand`); at a
|
|
61
56
|
// split junction's leading (5') endpoint it flips, so the curve arrives flowing
|
|
@@ -75,19 +70,6 @@ function shapingBudget(p1, p2) {
|
|
|
75
70
|
function bowHeight(p1, p2, budget) {
|
|
76
71
|
return Math.min(budget, Math.max(0, MAX_BOW_PX - Math.abs(p2.y - p1.y)));
|
|
77
72
|
}
|
|
78
|
-
// Negative = the control points drop below the reads (see MAX_DIP_PX). Keyed on
|
|
79
|
-
// horizontal span alone: two reads a few px apart describe a small event and get
|
|
80
|
-
// a small dip, however tall their track happens to be.
|
|
81
|
-
//
|
|
82
|
-
// Budget-clamped like the bow. At the current tuning the saturating curve
|
|
83
|
-
// already resolves under the budget at every span (worst ratio ~0.73, as span
|
|
84
|
-
// → 0), so this is inert — it's here so retuning MAX_DIP_PX / DIP_HALF_SPAN_PX
|
|
85
|
-
// can't silently reintroduce the fold-back squiggle SPAN_FACTOR exists to
|
|
86
|
-
// prevent. Pinned by 'the dip never outgrows its shaping budget'.
|
|
87
|
-
function dipHeight(p1, p2, budget) {
|
|
88
|
-
const span = Math.abs(p2.x - p1.x);
|
|
89
|
-
return -Math.min(budget, MAX_DIP_PX * (span / (span + DIP_HALF_SPAN_PX)));
|
|
90
|
-
}
|
|
91
73
|
function cubicPath(from, ctrl1, ctrl2, to) {
|
|
92
74
|
return `M ${from.x} ${from.y} C ${ctrl1.x} ${ctrl1.y} ${ctrl2.x} ${ctrl2.y} ${to.x} ${to.y}`;
|
|
93
75
|
}
|
|
@@ -95,14 +77,25 @@ export function bezierConnectorPath({ x1, y1, x2, y2, s1, s2,
|
|
|
95
77
|
// The second endpoint is a split junction's 5' leading edge (its handle flips
|
|
96
78
|
// to fold the curve into the next segment); false for a paired mate's 3' edge.
|
|
97
79
|
leadingEnd2 = false, reversed1 = false, reversed2 = false, maxHandlePx = MAX_HANDLE_PX,
|
|
98
|
-
//
|
|
99
|
-
//
|
|
100
|
-
//
|
|
101
|
-
|
|
80
|
+
// Depth, in px, of the dip a discordant connection draws instead of the bow a
|
|
81
|
+
// concordant one gets — aberrant pair orientation, or a split junction's
|
|
82
|
+
// strand flip, so the two classes are tellable apart by shape alone. It is
|
|
83
|
+
// the depth of the curve's APEX — what a caller can bound by the room it has —
|
|
84
|
+
// and CUBIC_APEX_RATIO converts it to the control-point drop that puts the ink
|
|
85
|
+
// there. Leave it out to bow up.
|
|
86
|
+
dipPx, }) {
|
|
102
87
|
const from = { x: x1, y: y1 };
|
|
103
88
|
const to = { x: x2, y: y2 };
|
|
104
89
|
const budget = shapingBudget(from, to);
|
|
105
90
|
const handle = Math.min(maxHandlePx, budget);
|
|
106
|
-
|
|
91
|
+
// The dip is deliberately not clamped to the budget, unlike the bow. The
|
|
92
|
+
// budget stops the cubic folding back over itself, and only the horizontal
|
|
93
|
+
// handles can do that — a vertical offset leaves x(t) monotonic however deep
|
|
94
|
+
// it goes, so a big event squeezed into a few px draws a narrow trough rather
|
|
95
|
+
// than a squiggle. Pinned by 'a dipped connection never overshoots its
|
|
96
|
+
// endpoints in x'.
|
|
97
|
+
const bow = dipPx === undefined
|
|
98
|
+
? bowHeight(from, to, budget)
|
|
99
|
+
: -Math.min(dipPx, BEZIER_CONNECTOR_MAX_REACH_PX) / CUBIC_APEX_RATIO;
|
|
107
100
|
return cubicPath(from, { x: x1 + handle * tangentSign(s1, false, reversed1), y: y1 - bow }, { x: x2 + handle * tangentSign(s2, leadingEnd2, reversed2), y: y2 - bow }, to);
|
|
108
101
|
}
|