@jbrowse/core 5.0.0-beta.1 → 5.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1476 -265
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +16 -9
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +50 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
- package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
- package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
- package/esm/BaseFeatureWidget/formatDetails.js +62 -83
- package/esm/BaseFeatureWidget/index.d.ts +2 -1
- package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
- package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
- package/esm/BaseFeatureWidget/types.d.ts +12 -6
- package/esm/BaseFeatureWidget/util.d.ts +0 -10
- package/esm/BaseFeatureWidget/util.js +0 -17
- package/esm/CorePlugin.js +2 -2
- package/esm/PluginLoader.d.ts +24 -13
- package/esm/PluginLoader.js +167 -51
- package/esm/PluginManager.d.ts +130 -24
- package/esm/PluginManager.js +180 -32
- package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
- package/esm/ReExports/MuiDataGridReExports.js +2 -2
- package/esm/ReExports/coreModules.generated.d.ts +2 -0
- package/esm/ReExports/coreModules.generated.js +528 -0
- package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/coreWorkerModules.generated.js +488 -0
- package/esm/ReExports/frameworkModules.d.ts +2 -0
- package/esm/ReExports/frameworkModules.js +68 -0
- package/esm/ReExports/frameworkShared.d.ts +12 -0
- package/esm/ReExports/frameworkShared.js +16 -0
- package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
- package/esm/ReExports/list.js +527 -79
- package/esm/ReExports/modules.d.ts +1 -1
- package/esm/ReExports/modules.js +10 -165
- package/esm/ReExports/registry.d.ts +1 -0
- package/esm/ReExports/registry.js +23 -5
- package/esm/ReExports/uiStub.d.ts +3 -0
- package/esm/ReExports/uiStub.js +33 -0
- package/esm/ReExports/workerModules.d.ts +2 -0
- package/esm/ReExports/workerModules.js +11 -0
- package/esm/TextSearch/TextSearchManager.d.ts +27 -13
- package/esm/TextSearch/TextSearchManager.js +77 -36
- package/esm/TextSearch/places.d.ts +12 -0
- package/esm/TextSearch/places.js +94 -0
- package/esm/assemblyManager/assembly.d.ts +21 -19
- package/esm/assemblyManager/assembly.js +28 -26
- package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
- package/esm/assemblyManager/assemblyAdapters.js +8 -2
- package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
- package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
- package/esm/assemblyManager/assemblyManager.d.ts +35 -180
- package/esm/assemblyManager/assemblyManager.js +47 -51
- package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
- package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
- package/esm/assemblyManager/geneticCodes.js +2 -5
- package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
- package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
- package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
- package/esm/assemblyManager/indexAssemblyNames.js +22 -0
- package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
- package/esm/assemblyManager/loadRefNameMap.js +4 -9
- package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
- package/esm/assemblyManager/refNameMapKey.js +12 -0
- package/esm/checkPlugins.d.ts +2 -0
- package/esm/checkPlugins.js +38 -17
- package/esm/configuration/bamIndexFields.d.ts +49 -0
- package/esm/configuration/bamIndexFields.js +41 -0
- package/esm/configuration/configurationSchema.d.ts +101 -71
- package/esm/configuration/configurationSchema.js +207 -134
- package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
- package/esm/configuration/configurationSchemaUnion.js +56 -0
- package/esm/configuration/configurationSlot.d.ts +150 -60
- package/esm/configuration/configurationSlot.js +103 -75
- package/esm/configuration/fillLocations.d.ts +14 -0
- package/esm/configuration/fillLocations.js +14 -0
- package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
- package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
- package/esm/configuration/formatDetailsConfigSchema.js +10 -13
- package/esm/configuration/fullConfSnapshot.d.ts +4 -19
- package/esm/configuration/fullConfSnapshot.js +30 -52
- package/esm/configuration/getConf.d.ts +45 -41
- package/esm/configuration/getConf.js +111 -44
- package/esm/configuration/index.d.ts +24 -11
- package/esm/configuration/index.js +15 -7
- package/esm/configuration/indexType.d.ts +26 -0
- package/esm/configuration/indexType.js +38 -0
- package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
- package/esm/configuration/mergeFormatCallbacks.js +13 -10
- package/esm/configuration/readConfObject.d.ts +2 -24
- package/esm/configuration/readConfObject.js +20 -63
- package/esm/configuration/requirements.d.ts +37 -0
- package/esm/configuration/requirements.js +88 -0
- package/esm/configuration/schemaRegistry.d.ts +32 -15
- package/esm/configuration/schemaRegistry.js +33 -35
- package/esm/configuration/schemaTypes.d.ts +21 -5
- package/esm/configuration/schemaTypes.js +66 -55
- package/esm/configuration/slotFacade.d.ts +12 -29
- package/esm/configuration/slotFacade.js +44 -23
- package/esm/configuration/snapshotPreprocess.d.ts +43 -0
- package/esm/configuration/snapshotPreprocess.js +161 -0
- package/esm/configuration/tabixIndexFields.d.ts +30 -4
- package/esm/configuration/tabixIndexFields.js +21 -4
- package/esm/configuration/tabixShorthand.d.ts +34 -17
- package/esm/configuration/tabixShorthand.js +49 -22
- package/esm/configuration/types.d.ts +182 -43
- package/esm/configuration/uriShorthand.d.ts +9 -0
- package/esm/configuration/uriShorthand.js +16 -0
- package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
- package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
- package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
- package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
- package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
- package/esm/data_adapters/BaseAdapter/index.js +1 -0
- package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
- package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
- package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
- package/esm/data_adapters/BaseAdapter/stats.js +52 -13
- package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
- package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
- package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
- package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
- package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
- package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
- package/esm/data_adapters/dataAdapterCache.js +44 -10
- package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
- package/esm/data_adapters/getFeatureAdapter.js +8 -8
- package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
- package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
- package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
- package/esm/pluggableElementTypes/AdapterType.js +1 -1
- package/esm/pluggableElementTypes/DisplayType.d.ts +46 -16
- package/esm/pluggableElementTypes/DisplayType.js +22 -12
- package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
- package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
- package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
- package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
- package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
- package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
- package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
- package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
- package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
- package/esm/pluggableElementTypes/ViewType.js +32 -4
- package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
- package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
- package/esm/pluggableElementTypes/extendElementType.js +9 -5
- package/esm/pluggableElementTypes/index.d.ts +2 -1
- package/esm/pluggableElementTypes/index.js +1 -1
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
- package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +65 -27
- package/esm/pluggableElementTypes/models/BaseDisplayModel.js +72 -10
- package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
- package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
- package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +85 -16
- package/esm/pluggableElementTypes/models/BaseViewModel.js +53 -10
- package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
- package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
- package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
- package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
- package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
- package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
- package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
- package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
- package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
- package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
- package/esm/pluggableElementTypes/models/index.d.ts +2 -3
- package/esm/pluggableElementTypes/models/index.js +2 -3
- package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
- package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
- package/esm/pluginDefinitions.d.ts +34 -7
- package/esm/pluginDefinitions.js +54 -20
- package/esm/rpc/BaseRpcDriver.d.ts +2 -2
- package/esm/rpc/BaseRpcDriver.js +25 -30
- package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
- package/esm/rpc/MainThreadRpcDriver.js +13 -8
- package/esm/rpc/RpcClient.d.ts +18 -6
- package/esm/rpc/RpcClient.js +51 -16
- package/esm/rpc/RpcManager.d.ts +14 -10
- package/esm/rpc/RpcManager.js +11 -1
- package/esm/rpc/RpcRegistry.d.ts +40 -7
- package/esm/rpc/RpcServer.d.ts +3 -1
- package/esm/rpc/RpcServer.js +19 -12
- package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
- package/esm/rpc/WebWorkerRpcDriver.js +64 -68
- package/esm/rpc/byteBudget.d.ts +20 -5
- package/esm/rpc/byteBudget.js +16 -5
- package/esm/rpc/configSchema.d.ts +7 -21
- package/esm/rpc/coreRpcMethods.d.ts +4 -0
- package/esm/rpc/coreRpcMethods.js +4 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
- package/esm/rpc/methods/CoreGetExportData.js +3 -4
- package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
- package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
- package/esm/rpc/methods/CoreGetFeatures.js +3 -5
- package/esm/rpc/methods/CoreGetRefNames.js +2 -12
- package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
- package/esm/rpc/methods/CoreGetSequence.js +2 -2
- package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
- package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
- package/esm/rpc/methods/layerFeatures.d.ts +33 -0
- package/esm/rpc/methods/layerFeatures.js +29 -0
- package/esm/svg/SvgExport.js +6 -7
- package/esm/svg/SvgThemeProviders.d.ts +12 -0
- package/esm/svg/SvgThemeProviders.js +15 -0
- package/esm/svg/exportViewSvg.d.ts +28 -0
- package/esm/svg/exportViewSvg.js +13 -0
- package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
- package/esm/svg/normalizeSvgMarkup.js +99 -0
- package/esm/svg/serializeSvg.d.ts +7 -0
- package/esm/svg/serializeSvg.js +11 -0
- package/esm/svg/svgId.d.ts +1 -1
- package/esm/svg/svgId.js +1 -1
- package/esm/svg/svgReady.d.ts +9 -7
- package/esm/svg/svgReady.js +8 -7
- package/esm/svg/trackNames.d.ts +7 -5
- package/esm/svg/trackNames.js +12 -9
- package/esm/svg/wrapSvgExport.js +6 -74
- package/esm/ui/AddCustomPluginDialog.js +3 -8
- package/esm/ui/AppReadyMarker.d.ts +45 -0
- package/esm/ui/AppReadyMarker.js +89 -0
- package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
- package/esm/ui/CascadingMenu.js +181 -104
- package/esm/ui/DropDownMenu.js +2 -1
- package/esm/ui/ErrorBanner.js +1 -1
- package/esm/ui/ErrorBoundary.d.ts +2 -2
- package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
- package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
- package/esm/ui/ExportSvgDialog.d.ts +1 -1
- package/esm/ui/FileDropZone.js +2 -1
- package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
- package/esm/ui/HoverMenu.d.ts +1 -2
- package/esm/ui/HoverMenu.js +6 -3
- package/esm/ui/JexlFilterDialog.d.ts +13 -10
- package/esm/ui/JexlFilterDialog.js +122 -49
- package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
- package/esm/ui/JexlFilterRowEditors.js +90 -0
- package/esm/ui/LazyBaseTooltip.d.ts +4 -0
- package/esm/ui/LazyBaseTooltip.js +9 -0
- package/esm/ui/LegendSwatchGlyph.js +26 -21
- package/esm/ui/LoadingOverlay.d.ts +14 -0
- package/esm/ui/LoadingOverlay.js +4 -2
- package/esm/ui/MenuTypes.d.ts +23 -53
- package/esm/ui/MenuTypes.js +3 -0
- package/esm/ui/MonospaceTextField.d.ts +2 -1
- package/esm/ui/MonospaceTextField.js +23 -20
- package/esm/ui/PaletteContext.d.ts +10 -5
- package/esm/ui/PaletteContext.js +44 -6
- package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
- package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
- package/esm/ui/RefNameAutocomplete/index.js +8 -2
- package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/util.js +42 -1
- package/esm/ui/ResizeHandle.d.ts +3 -1
- package/esm/ui/ResizeHandle.js +44 -11
- package/esm/ui/ScrollChrome.d.ts +13 -0
- package/esm/ui/ScrollChrome.js +11 -0
- package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
- package/esm/ui/ScrollEdgeShadow.js +14 -35
- package/esm/ui/ScrollZoomToggle.d.ts +4 -27
- package/esm/ui/ScrollZoomToggle.js +34 -51
- package/esm/ui/SessionJsonPanel.d.ts +3 -0
- package/esm/ui/SessionJsonPanel.js +14 -0
- package/esm/ui/SettingsChangesTable.d.ts +1 -0
- package/esm/ui/SettingsChangesTable.js +49 -11
- package/esm/ui/ShareLinkField.d.ts +1 -3
- package/esm/ui/ShareLinkField.js +13 -40
- package/esm/ui/SizeSliderRow.d.ts +1 -3
- package/esm/ui/SizeSliderRow.js +4 -6
- package/esm/ui/SnackbarModel.js +79 -67
- package/esm/ui/StatusProgressBar.js +2 -2
- package/esm/ui/SvgColorLegend.d.ts +9 -4
- package/esm/ui/SvgColorLegend.js +82 -41
- package/esm/ui/VerticalScrollbar.d.ts +13 -34
- package/esm/ui/VerticalScrollbar.js +29 -83
- package/esm/ui/ViewLoadingScreen.d.ts +5 -4
- package/esm/ui/ViewLoadingScreen.js +8 -32
- package/esm/ui/colorScale.d.ts +92 -0
- package/esm/ui/colorScale.js +72 -0
- package/esm/ui/colors.d.ts +64 -0
- package/esm/ui/colors.js +230 -1
- package/esm/ui/hoverBoxStyle.d.ts +14 -2
- package/esm/ui/hoverBoxStyle.js +17 -2
- package/esm/ui/index.d.ts +12 -12
- package/esm/ui/index.js +14 -22
- package/esm/ui/launchViewMenu.js +15 -5
- package/esm/ui/legendMenuItem.d.ts +10 -32
- package/esm/ui/legendMenuItem.js +9 -36
- package/esm/ui/legendSpec.d.ts +15 -8
- package/esm/ui/legendSpec.js +14 -23
- package/esm/ui/makeSizeMenu.d.ts +0 -6
- package/esm/ui/makeSizeMenu.js +6 -30
- package/esm/ui/measureLegendText.js +1 -1
- package/esm/ui/menuItemAdornment.d.ts +9 -20
- package/esm/ui/menuItemAdornment.js +10 -32
- package/esm/ui/menuItems.d.ts +2 -7
- package/esm/ui/menuItems.js +1 -6
- package/esm/ui/multiTrackMenuItems.d.ts +6 -0
- package/esm/ui/palette.d.ts +118 -116
- package/esm/ui/palette.js +114 -75
- package/esm/ui/replaceViewAction.d.ts +1 -1
- package/esm/ui/replaceViewAction.js +1 -1
- package/esm/ui/theme.d.ts +43 -119
- package/esm/ui/theme.js +62 -78
- package/esm/ui/toggleMenuItems.d.ts +1 -3
- package/esm/ui/toggleMenuItems.js +6 -5
- package/esm/ui/useAssemblySelection.d.ts +4 -4
- package/esm/ui/viewHeaderHeight.d.ts +1 -0
- package/esm/ui/viewHeaderHeight.js +1 -0
- package/esm/util/Base1DUtils.d.ts +5 -3
- package/esm/util/Base1DUtils.js +14 -6
- package/esm/util/Base1DViewModel.d.ts +2 -1
- package/esm/util/Base1DViewModel.js +3 -2
- package/esm/util/SvgCanvas.d.ts +15 -13
- package/esm/util/SvgCanvas.js +76 -56
- package/esm/util/aborting.d.ts +39 -0
- package/esm/util/aborting.js +88 -6
- package/esm/util/adapterMetadata.d.ts +1 -1
- package/esm/util/adapterMetadata.js +6 -5
- package/esm/util/addAndShowTrack.d.ts +2 -5
- package/esm/util/addAndShowTrack.js +5 -1
- package/esm/util/addRelativeUris.d.ts +17 -5
- package/esm/util/addRelativeUris.js +46 -10
- package/esm/util/addTrackFromWidget.d.ts +2 -5
- package/esm/util/addTrackFromWidget.js +5 -4
- package/esm/util/aggregateFieldName.d.ts +10 -0
- package/esm/util/aggregateFieldName.js +8 -0
- package/esm/util/analytics.js +46 -13
- package/esm/util/animationAllowed.d.ts +9 -0
- package/esm/util/animationAllowed.js +13 -0
- package/esm/util/applyRowResizeWheel.d.ts +10 -5
- package/esm/util/applyRowResizeWheel.js +10 -21
- package/esm/util/bandHeight.d.ts +10 -0
- package/esm/util/bandHeight.js +29 -0
- package/esm/util/bandLayout.d.ts +4 -4
- package/esm/util/bandLayout.js +4 -4
- package/esm/util/bezierConnector.d.ts +4 -3
- package/esm/util/bezierConnector.js +38 -45
- package/esm/util/bgzfWorkerPool.d.ts +20 -74
- package/esm/util/bgzfWorkerPool.js +20 -74
- package/esm/util/binnedAggregate.d.ts +17 -0
- package/esm/util/binnedAggregate.js +275 -0
- package/esm/util/cacheBudgets.d.ts +22 -19
- package/esm/util/cacheBudgets.js +22 -19
- package/esm/util/cachedSetup.d.ts +1 -1
- package/esm/util/cachedSetup.js +2 -2
- package/esm/util/categoricalField.d.ts +56 -0
- package/esm/util/categoricalField.js +73 -0
- package/esm/util/clampToContig.d.ts +17 -0
- package/esm/util/clampToContig.js +19 -0
- package/esm/util/coarseStripHTML.js +1 -2
- package/esm/util/color/cssColorsLevel4.d.ts +1 -0
- package/esm/util/color/cssColorsLevel4.js +1 -0
- package/esm/util/color/index.d.ts +5 -3
- package/esm/util/color/index.js +7 -4
- package/esm/util/colorBits.d.ts +3 -3
- package/esm/util/colorBits.js +19 -44
- package/esm/util/colorRamp.d.ts +49 -5
- package/esm/util/colorRamp.js +169 -18
- package/esm/util/colorScale.d.ts +156 -0
- package/esm/util/colorScale.js +243 -0
- package/esm/util/colorSchemes.d.ts +21 -0
- package/esm/util/colorSchemes.js +30 -0
- package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
- package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
- package/esm/util/createSvgRasterCanvas.d.ts +10 -0
- package/esm/util/cssColorParse.d.ts +15 -0
- package/esm/util/cssColorParse.js +53 -0
- package/esm/util/diagonalizeRegions.d.ts +2 -3
- package/esm/util/diagonalizeRegions.js +8 -13
- package/esm/util/expandLooseSearchIndex.d.ts +19 -0
- package/esm/util/expandLooseSearchIndex.js +29 -0
- package/esm/util/featureTable.d.ts +224 -0
- package/esm/util/featureTable.js +366 -0
- package/esm/util/featureTransforms.d.ts +80 -0
- package/esm/util/featureTransforms.js +1579 -0
- package/esm/util/featureTypes.d.ts +24 -0
- package/esm/util/featureTypes.js +35 -0
- package/esm/util/fetchAndMaybeUnzip.js +16 -9
- package/esm/util/fetchContext.d.ts +7 -8
- package/esm/util/fetchContext.js +3 -3
- package/esm/util/fetchHub.d.ts +4 -2
- package/esm/util/fetchHub.js +2 -2
- package/esm/util/fetchPhases.d.ts +10 -10
- package/esm/util/fetchSeq.d.ts +2 -3
- package/esm/util/fetchSeq.js +2 -2
- package/esm/util/fieldReader.d.ts +17 -0
- package/esm/util/fieldReader.js +62 -0
- package/esm/util/freezeDeep.d.ts +8 -10
- package/esm/util/freezeDeep.js +8 -10
- package/esm/util/groupKeys.d.ts +77 -0
- package/esm/util/groupKeys.js +155 -0
- package/esm/util/highlights.d.ts +10 -6
- package/esm/util/highlights.js +12 -25
- package/esm/util/hooks.d.ts +31 -2
- package/esm/util/hooks.js +72 -3
- package/esm/util/index.d.ts +11 -11
- package/esm/util/index.js +11 -10
- package/esm/util/indexCandidates.d.ts +1 -31
- package/esm/util/indexCandidates.js +5 -63
- package/esm/util/installFetch.d.ts +77 -37
- package/esm/util/installFetch.js +65 -38
- package/esm/util/installInitAutorun.d.ts +14 -13
- package/esm/util/installInitAutorun.js +17 -17
- package/esm/util/installPrerequisiteFetch.d.ts +115 -0
- package/esm/util/installPrerequisiteFetch.js +111 -0
- package/esm/util/io/index.js +19 -14
- package/esm/util/isDataCurrent.d.ts +7 -5
- package/esm/util/isDataCurrent.js +9 -6
- package/esm/util/isTextEntryFocused.d.ts +7 -0
- package/esm/util/isTextEntryFocused.js +16 -0
- package/esm/util/jexl.js +24 -21
- package/esm/util/jexlFilterRows.d.ts +89 -0
- package/esm/util/jexlFilterRows.js +252 -0
- package/esm/util/jexlFilters.d.ts +20 -27
- package/esm/util/jexlFilters.js +23 -11
- package/esm/util/jexlStrings.d.ts +3 -4
- package/esm/util/jexlStrings.js +2 -3
- package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
- package/esm/util/layouts/GranularRectLayout.js +25 -8
- package/esm/util/lazyAfterAttach.d.ts +13 -0
- package/esm/util/lazyAfterAttach.js +31 -0
- package/esm/util/lazyWithPreload.d.ts +19 -0
- package/esm/util/lazyWithPreload.js +27 -0
- package/esm/util/legendCandidates.d.ts +72 -0
- package/esm/util/legendCandidates.js +138 -0
- package/esm/util/localStorage.js +4 -4
- package/esm/util/markEncoding.d.ts +150 -0
- package/esm/util/markEncoding.js +845 -0
- package/esm/util/markEncodingTypes.d.ts +588 -0
- package/esm/util/markEncodingTypes.js +8 -0
- package/esm/util/mst-reflection.d.ts +2 -20
- package/esm/util/mst-reflection.js +3 -53
- package/esm/util/mstUtils.d.ts +31 -23
- package/esm/util/mstUtils.js +39 -24
- package/esm/util/numericUtils.d.ts +7 -0
- package/esm/util/numericUtils.js +16 -0
- package/esm/util/numericValue.d.ts +14 -0
- package/esm/util/numericValue.js +34 -0
- package/esm/util/openFeatureWidget.d.ts +5 -0
- package/esm/util/openFeatureWidget.js +2 -2
- package/esm/util/openViews.d.ts +17 -0
- package/esm/util/openViews.js +22 -0
- package/esm/util/parentWalk.d.ts +1 -1
- package/esm/util/parentWalk.js +1 -1
- package/esm/util/parseLineByLine.d.ts +4 -5
- package/esm/util/parseLineByLine.js +8 -14
- package/esm/util/pluginStore.d.ts +6 -8
- package/esm/util/pluginStore.js +17 -16
- package/esm/util/preloadComponent.d.ts +5 -0
- package/esm/util/preloadComponent.js +11 -0
- package/esm/util/progress.d.ts +22 -22
- package/esm/util/progress.js +27 -26
- package/esm/util/quantileExtent.d.ts +49 -0
- package/esm/util/quantileExtent.js +162 -0
- package/esm/util/range.d.ts +13 -9
- package/esm/util/range.js +17 -8
- package/esm/util/renameRegions.d.ts +26 -6
- package/esm/util/renameRegions.js +68 -54
- package/esm/util/renderToStaticMarkup.js +24 -14
- package/esm/util/rxjs.d.ts +23 -8
- package/esm/util/rxjs.js +61 -15
- package/esm/util/samplesTsv.d.ts +49 -0
- package/esm/util/samplesTsv.js +86 -0
- package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
- package/esm/util/scheduleDetachedDestroy.js +24 -0
- package/esm/util/scrollLatch.d.ts +1 -0
- package/esm/util/scrollLatch.js +8 -0
- package/esm/util/selectEncodedFeature.d.ts +16 -0
- package/esm/util/selectEncodedFeature.js +34 -0
- package/esm/util/sessionSharing.d.ts +7 -5
- package/esm/util/sessionSharing.js +23 -23
- package/esm/util/shapeNameList.d.ts +2 -0
- package/esm/util/shapeNameList.js +6 -0
- package/esm/util/shapeNames.d.ts +7 -0
- package/esm/util/shapeNames.js +11 -0
- package/esm/util/simpleFeature.d.ts +0 -1
- package/esm/util/starFusion.d.ts +26 -0
- package/esm/util/starFusion.js +37 -0
- package/esm/util/stepTables.d.ts +82 -0
- package/esm/util/stepTables.js +243 -0
- package/esm/util/svAlt.d.ts +145 -0
- package/esm/util/svAlt.js +364 -0
- package/esm/util/svgColorProps.d.ts +11 -0
- package/esm/util/svgColorProps.js +28 -1
- package/esm/util/systemColorScheme.d.ts +12 -0
- package/esm/util/systemColorScheme.js +27 -0
- package/esm/util/tabix.d.ts +13 -8
- package/esm/util/tabix.js +17 -12
- package/esm/util/thresholdScale.d.ts +91 -0
- package/esm/util/thresholdScale.js +166 -0
- package/esm/util/timeGate.d.ts +4 -5
- package/esm/util/timeGate.js +4 -5
- package/esm/util/trackConfigDelta.d.ts +26 -26
- package/esm/util/trackConfigDelta.js +63 -47
- package/esm/util/tracks.d.ts +121 -40
- package/esm/util/tracks.js +497 -112
- package/esm/util/translateTranscript.d.ts +44 -0
- package/esm/util/translateTranscript.js +102 -0
- package/esm/util/types/data.d.ts +0 -2
- package/esm/util/types/index.d.ts +121 -22
- package/esm/util/types/index.js +9 -0
- package/esm/util/types/mst.d.ts +3 -0
- package/esm/util/types/mst.js +4 -0
- package/esm/util/types/renameIds.d.ts +1 -0
- package/esm/util/types/renameIds.js +29 -0
- package/esm/util/types/services.d.ts +1 -1
- package/esm/util/unknownSnapshotKeys.d.ts +51 -0
- package/esm/util/unknownSnapshotKeys.js +82 -0
- package/esm/util/useFeatureSequence.js +5 -5
- package/esm/util/useFetch.d.ts +3 -4
- package/esm/util/useFetch.js +19 -10
- package/esm/util/useFetchPlugins.d.ts +6 -2
- package/esm/util/useFetchPlugins.js +7 -3
- package/esm/util/usePanelVirtualScroll.d.ts +7 -35
- package/esm/util/usePanelVirtualScroll.js +9 -36
- package/esm/util/useRowVirtualScroll.d.ts +6 -29
- package/esm/util/useRowVirtualScroll.js +8 -49
- package/esm/util/useVirtualScrollWheel.d.ts +20 -4
- package/esm/util/useVirtualScrollWheel.js +40 -74
- package/esm/util/viewHighlights.d.ts +3 -0
- package/esm/util/viewHighlights.js +5 -0
- package/esm/util/viewStatus.d.ts +47 -15
- package/esm/util/viewStatus.js +34 -0
- package/esm/util/wheelZoom.d.ts +7 -1
- package/esm/util/wheelZoom.js +85 -19
- package/esm/util/whenViewSettled.d.ts +55 -8
- package/esm/util/whenViewSettled.js +56 -7
- package/esm/util/withLaunchInput.d.ts +174 -0
- package/esm/util/withLaunchInput.js +274 -0
- package/package.json +70 -20
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
- package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
- package/esm/ReExports/BaseFeatureDetails.js +0 -10
- package/esm/ReExports/index.d.ts +0 -1
- package/esm/ReExports/index.js +0 -1
- package/esm/ReExports/publicUtil.d.ts +0 -1
- package/esm/ReExports/publicUtil.js +0 -28
- package/esm/configuration/promotableDefaults.d.ts +0 -199
- package/esm/configuration/promotableDefaults.js +0 -326
- package/esm/configuration/promotablePin.d.ts +0 -55
- package/esm/configuration/promotablePin.js +0 -1
- package/esm/configuration/promotableResolve.d.ts +0 -108
- package/esm/configuration/promotableResolve.js +0 -117
- package/esm/configuration/promotableSlots.d.ts +0 -12
- package/esm/configuration/promotableSlots.js +0 -45
- package/esm/configuration/slotShape.d.ts +0 -12
- package/esm/configuration/slotShape.js +0 -84
- package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
- package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
- package/esm/ui/PinAdornment.d.ts +0 -5
- package/esm/ui/PinAdornment.js +0 -79
- package/esm/ui/SvgGradientLegend.d.ts +0 -26
- package/esm/ui/SvgGradientLegend.js +0 -26
- package/esm/ui/highlightChipReveal.d.ts +0 -32
- package/esm/ui/highlightChipReveal.js +0 -39
- package/esm/ui/promotableMenuItems.d.ts +0 -19
- package/esm/ui/promotableMenuItems.js +0 -89
- package/esm/ui/promotablePinCoverage.d.ts +0 -44
- package/esm/ui/promotablePinCoverage.js +0 -87
- package/esm/util/applyInitSettings.d.ts +0 -79
- package/esm/util/applyInitSettings.js +0 -91
- package/esm/util/openDisplays.d.ts +0 -23
- package/esm/util/openDisplays.js +0 -79
- package/esm/util/stopToken.d.ts +0 -211
- package/esm/util/stopToken.js +0 -438
- /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { getType } from '@jbrowse/mobx-state-tree';
|
|
2
|
+
import { getNotificationSink } from './sessionServices.js';
|
|
3
|
+
/** what a diagnostic calls the view: its snapshot `type`, or the model name */
|
|
4
|
+
export function viewLabel(self) {
|
|
5
|
+
return self.type ?? getType(self).name;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* What every surface calls this mistake. A session spec launches a view without
|
|
9
|
+
* ever building a snapshot, so it classifies its own keys and reports them
|
|
10
|
+
* through its own session rather than through the sink below — one wording, so
|
|
11
|
+
* a typo reads the same whether it was written in a config or in a URL.
|
|
12
|
+
*/
|
|
13
|
+
export function unknownKeysMessage(label, keys) {
|
|
14
|
+
return `${label} ignored unknown key(s): ${keys.join(', ')}`;
|
|
15
|
+
}
|
|
16
|
+
/** The action `setter-only` names: `height` -> `setHeight`. */
|
|
17
|
+
export function displaySetterName(key) {
|
|
18
|
+
return `set${key[0].toUpperCase()}${key.slice(1)}`;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* What a surface calls a key the display has an action for but no slot. Its own
|
|
22
|
+
* sentence rather than `unknownKeysMessage`'s: the display does take the
|
|
23
|
+
* setting, just not written this way, and saying "unknown key" over a key whose
|
|
24
|
+
* setter we name in the same breath contradicts itself.
|
|
25
|
+
*/
|
|
26
|
+
export function setterOnlyMessage(label, keys) {
|
|
27
|
+
return `${label} did not apply ${keys.join(', ')}: no config slot takes ${keys.length > 1 ? 'them' : 'it'}. Call ${keys.map(displaySetterName).join(', ')} on the display instead.`;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Name the keys a view was handed and could not place, from the partition
|
|
31
|
+
* `withLaunchInput` runs on the snapshot.
|
|
32
|
+
*/
|
|
33
|
+
export function reportUnknownKeys(self, keys) {
|
|
34
|
+
if (!keys.length) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const message = unknownKeysMessage(viewLabel(self), keys);
|
|
38
|
+
console.warn(message);
|
|
39
|
+
try {
|
|
40
|
+
getNotificationSink(self).notify(message, 'warning');
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// a view built outside a session has nowhere to put it
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Name the row lists a view refused whole. `withLaunchInput` splits an authored
|
|
48
|
+
* array into the recipes a launcher resolves and the built snapshots MST
|
|
49
|
+
* restores, per entry — but a row list is indexed against the view's `levels`
|
|
50
|
+
* and per-level tracks, so a list holding both kinds has no correct split and
|
|
51
|
+
* is refused rather than renumbered.
|
|
52
|
+
*/
|
|
53
|
+
export function reportMalformedRows(self, keys) {
|
|
54
|
+
if (!keys.length) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const message = `${viewLabel(self)} refused ${keys.join(', ')}: the list mixes built view snapshots with recipes to open one, and the rows index against the levels between them. Write all of them one way.`;
|
|
58
|
+
console.warn(message);
|
|
59
|
+
try {
|
|
60
|
+
getNotificationSink(self).notify(message, 'warning');
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// a view built outside a session has nowhere to put it
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* What every surface calls v4's nested `init`. v5 takes every setting directly
|
|
68
|
+
* on the view object and unwraps the nesting on the way in, so the settings
|
|
69
|
+
* still arrive — this names the spelling to fix while they do.
|
|
70
|
+
*/
|
|
71
|
+
export function legacyInitMessage(label) {
|
|
72
|
+
return `${label} nests its settings under "init", which is deprecated: write every setting directly on the view object.`;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Name a snapshot that still writes v4's nested `init`. The console alone,
|
|
76
|
+
* unlike the two reporters above: the settings were applied, so there is
|
|
77
|
+
* nothing for a visitor to act on and a warning toast over a working view is
|
|
78
|
+
* noise. `jbrowse validate` is where the author of the config hears about it.
|
|
79
|
+
*/
|
|
80
|
+
export function reportLegacyInit(self) {
|
|
81
|
+
console.warn(legacyInitMessage(viewLabel(self)));
|
|
82
|
+
}
|
|
@@ -12,10 +12,10 @@ export function useFeatureSequence({ session, start, end, refName, upDownBp, for
|
|
|
12
12
|
start,
|
|
13
13
|
end,
|
|
14
14
|
upDownBp,
|
|
15
|
-
|
|
15
|
+
forceLoad,
|
|
16
16
|
]
|
|
17
17
|
: null, guard
|
|
18
|
-
? async (_name, _asm, _ref, _start, _end, _upDown, _force,
|
|
18
|
+
? async (_name, _asm, _ref, _start, _end, _upDown, _force, signal, statusCallback) => {
|
|
19
19
|
const { session: s, assemblyName: asmName } = guard;
|
|
20
20
|
if (!forceLoad && end - start > BPLIMIT) {
|
|
21
21
|
return {
|
|
@@ -32,7 +32,7 @@ export function useFeatureSequence({ session, start, end, refName, upDownBp, for
|
|
|
32
32
|
refName,
|
|
33
33
|
assemblyName: asmName,
|
|
34
34
|
session: s,
|
|
35
|
-
|
|
35
|
+
signal,
|
|
36
36
|
statusCallback: slot(),
|
|
37
37
|
}),
|
|
38
38
|
upDownBp > 0
|
|
@@ -42,7 +42,7 @@ export function useFeatureSequence({ session, start, end, refName, upDownBp, for
|
|
|
42
42
|
refName,
|
|
43
43
|
assemblyName: asmName,
|
|
44
44
|
session: s,
|
|
45
|
-
|
|
45
|
+
signal,
|
|
46
46
|
statusCallback: slot(),
|
|
47
47
|
})
|
|
48
48
|
: Promise.resolve(''),
|
|
@@ -53,7 +53,7 @@ export function useFeatureSequence({ session, start, end, refName, upDownBp, for
|
|
|
53
53
|
refName,
|
|
54
54
|
assemblyName: asmName,
|
|
55
55
|
session: s,
|
|
56
|
-
|
|
56
|
+
signal,
|
|
57
57
|
statusCallback: slot(),
|
|
58
58
|
})
|
|
59
59
|
: Promise.resolve(''),
|
package/esm/util/useFetch.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { RpcStatus, StatusCallback } from './progress.ts';
|
|
2
|
-
import type { StopToken } from './stopToken.ts';
|
|
3
2
|
export type FetchKey = string | readonly unknown[] | null | undefined | false;
|
|
4
3
|
type FetchingKey<Key> = Exclude<Key, null | undefined | false>;
|
|
5
4
|
/**
|
|
@@ -10,8 +9,8 @@ type FetchingKey<Key> = Exclude<Key, null | undefined | false>;
|
|
|
10
9
|
* single argument (`useGenomesData`). Most fetchers close over what they need
|
|
11
10
|
* and declare no parameters at all, which stays assignable either way.
|
|
12
11
|
*
|
|
13
|
-
* A
|
|
14
|
-
* created per fetch and
|
|
12
|
+
* A signal and a status callback follow the key arguments. The signal is
|
|
13
|
+
* created per fetch and aborted when the key changes or the component unmounts,
|
|
15
14
|
* so a fetcher that forwards it to an RPC cancels the worker instead of leaving
|
|
16
15
|
* it grinding on an answer nobody is waiting for. The callback is what the RPC's
|
|
17
16
|
* own progress comes back through, and it surfaces on the hook's `status` — a
|
|
@@ -19,7 +18,7 @@ type FetchingKey<Key> = Exclude<Key, null | undefined | false>;
|
|
|
19
18
|
* works, instead of a bare spinner over an uninterruptible whole-chromosome
|
|
20
19
|
* read. Fetchers that take neither are unaffected.
|
|
21
20
|
*/
|
|
22
|
-
type FetcherArgs<Key> = FetchingKey<Key> extends readonly unknown[] ? [...FetchingKey<Key>,
|
|
21
|
+
type FetcherArgs<Key> = FetchingKey<Key> extends readonly unknown[] ? [...FetchingKey<Key>, AbortSignal, StatusCallback] : [FetchingKey<Key>, AbortSignal, StatusCallback];
|
|
23
22
|
interface FetchState<Data> {
|
|
24
23
|
data: Data | undefined;
|
|
25
24
|
error: unknown;
|
package/esm/util/useFetch.js
CHANGED
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
2
2
|
import { createStatusWindow } from './progress.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
//
|
|
6
|
-
|
|
3
|
+
// The whole key as the "don't fetch" sentinel: `cond && [...]`, `cond ? [...] :
|
|
4
|
+
// null`. `false` belongs here and NOT in the element check below, which is what
|
|
5
|
+
// this used to share with it.
|
|
6
|
+
const isNoKey = (k) => k === null || k === undefined || k === false;
|
|
7
|
+
// An element that has not resolved yet — an offset still being computed, an
|
|
8
|
+
// assembly still loading. **`false` is not one of them**: it is a resolved
|
|
9
|
+
// boolean, and a caller with a `false`-valued setting in its key meant to fetch
|
|
10
|
+
// under that setting. Sharing one predicate with the sentinel above made every
|
|
11
|
+
// such key unfetchable, which the MAF sequence widget shipped — its
|
|
12
|
+
// `includeInsertions` defaults to `false`, so the widget sat on its loading
|
|
13
|
+
// animation forever and issued no RPC at all. `SaveTrackData` hit the same
|
|
14
|
+
// thing and encoded its boolean as a string rather than fixing it here.
|
|
15
|
+
const isUnresolved = (k) => k === null || k === undefined;
|
|
7
16
|
function serializeKey(key) {
|
|
8
|
-
return
|
|
17
|
+
return isNoKey(key) || (Array.isArray(key) && key.some(isUnresolved))
|
|
9
18
|
? null
|
|
10
19
|
: JSON.stringify(key);
|
|
11
20
|
}
|
|
@@ -85,7 +94,7 @@ export function useFetch(key, fetcher, options = {}) {
|
|
|
85
94
|
// fetch resolved is a different case, and the stream's own `clear` drops
|
|
86
95
|
// that one.)
|
|
87
96
|
let settled = false;
|
|
88
|
-
const
|
|
97
|
+
const controller = new AbortController();
|
|
89
98
|
// A refetch under the same key — mutate(), or the cross-component
|
|
90
99
|
// mutate(key) — is the same question asked again, so what is on screen is
|
|
91
100
|
// a stale answer to it rather than an answer to something else: leave it
|
|
@@ -107,7 +116,7 @@ export function useFetch(key, fetcher, options = {}) {
|
|
|
107
116
|
setStatus(undefined);
|
|
108
117
|
// The runtime counterpart of FetcherArgs: an array key becomes one
|
|
109
118
|
// argument per element, anything else a single argument, then the stop
|
|
110
|
-
//
|
|
119
|
+
// signal and the status callback. A conditional type over an unresolved
|
|
111
120
|
// `Key` can't be discharged
|
|
112
121
|
// inside the function body, so the parameter list is erased for this one
|
|
113
122
|
// call — callers still get the precise arity, and the looseness stops
|
|
@@ -127,7 +136,7 @@ export function useFetch(key, fetcher, options = {}) {
|
|
|
127
136
|
const { statusCallback, clear: clearStatus } = statusWindow.open({
|
|
128
137
|
isCurrent: () => alive && !settled,
|
|
129
138
|
});
|
|
130
|
-
const args = [...keyArgs,
|
|
139
|
+
const args = [...keyArgs, controller.signal, statusCallback];
|
|
131
140
|
const call = fetcher;
|
|
132
141
|
Promise.resolve()
|
|
133
142
|
.then(() => call(...args))
|
|
@@ -151,9 +160,9 @@ export function useFetch(key, fetcher, options = {}) {
|
|
|
151
160
|
});
|
|
152
161
|
return () => {
|
|
153
162
|
alive = false;
|
|
154
|
-
// the
|
|
163
|
+
// the signal's lifetime is this fetch's. An abort rejection lands in the
|
|
155
164
|
// catch above with alive already false, so it never surfaces as an error
|
|
156
|
-
|
|
165
|
+
controller.abort();
|
|
157
166
|
// and the window's lifetime is too: `alive` already makes a queued
|
|
158
167
|
// trailing write a no-op, but the timer behind it would otherwise stand
|
|
159
168
|
// for up to a window past unmount
|
|
@@ -1,12 +1,16 @@
|
|
|
1
|
-
import type { JBrowsePlugin } from './types/data.ts';
|
|
2
1
|
/**
|
|
3
2
|
* The plugin store listing. Shared by every surface that installs plugins (the
|
|
4
3
|
* in-session plugin store widget, Desktop's global plugins dialog) so they read
|
|
5
4
|
* the same manifest version and get the same integrity hashes and compatibility
|
|
6
5
|
* ranges — a second copy of this fetch is how one of them silently ends up on
|
|
7
6
|
* the unhashed v1 list.
|
|
7
|
+
*
|
|
8
|
+
* Through `fetchPlugins`, which memoizes its request, rather than fetching the
|
|
9
|
+
* url directly: `useFetch` holds no data cache, so every open of the store
|
|
10
|
+
* widget was a fresh round trip beside whatever the boot path had already
|
|
11
|
+
* asked for.
|
|
8
12
|
*/
|
|
9
13
|
export declare function useFetchPlugins(): {
|
|
10
|
-
plugins: JBrowsePlugin[] | undefined;
|
|
14
|
+
plugins: import("./index.ts").JBrowsePlugin[] | undefined;
|
|
11
15
|
error: unknown;
|
|
12
16
|
};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { fetchJson } from './fetchJson.js';
|
|
1
|
+
import { fetchPlugins } from '../checkPlugins.js';
|
|
3
2
|
import { useFetch } from './useFetch.js';
|
|
4
3
|
/**
|
|
5
4
|
* The plugin store listing. Shared by every surface that installs plugins (the
|
|
@@ -7,8 +6,13 @@ import { useFetch } from './useFetch.js';
|
|
|
7
6
|
* the same manifest version and get the same integrity hashes and compatibility
|
|
8
7
|
* ranges — a second copy of this fetch is how one of them silently ends up on
|
|
9
8
|
* the unhashed v1 list.
|
|
9
|
+
*
|
|
10
|
+
* Through `fetchPlugins`, which memoizes its request, rather than fetching the
|
|
11
|
+
* url directly: `useFetch` holds no data cache, so every open of the store
|
|
12
|
+
* widget was a fresh round trip beside whatever the boot path had already
|
|
13
|
+
* asked for.
|
|
10
14
|
*/
|
|
11
15
|
export function useFetchPlugins() {
|
|
12
|
-
const { data, error } = useFetch('jbrowse-plugin-store-v2',
|
|
16
|
+
const { data, error } = useFetch('jbrowse-plugin-store-v2', fetchPlugins);
|
|
13
17
|
return { plugins: data?.plugins, error };
|
|
14
18
|
}
|
|
@@ -1,37 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
scrollTop: number;
|
|
3
|
-
scrollableHeight: number;
|
|
4
|
-
setScrollTop: (n: number) => void;
|
|
5
|
-
}
|
|
1
|
+
import type { VirtualScrollModel } from './useVirtualScrollWheel.ts';
|
|
6
2
|
/**
|
|
7
|
-
* Wheel gestures over a **scrolled canvas panel** — the alignments pileup
|
|
8
|
-
*
|
|
9
|
-
* once `scrollZoom` has
|
|
10
|
-
* left to the browser and the view's pinch-zoom.
|
|
11
|
-
*
|
|
12
|
-
* These panels paint a fixed-size canvas at `-scrollTop` rather than living in a
|
|
13
|
-
* DOM overflow container, so nothing scrolls them without this. The latch (inside
|
|
14
|
-
* `applyScroll`) owns `preventDefault` but never `stopPropagation`, so a diagonal
|
|
15
|
-
* wheel still bubbles its horizontal component to the LGV for panning.
|
|
16
|
-
*
|
|
17
|
-
* ADR-027 keeps wheel-*intent* dispatch per handler, because the panels do not
|
|
18
|
-
* agree on what a gesture means. This is the second of the two rules that
|
|
19
|
-
* survived that split — the row-stack rule (`useRowVirtualScroll`, where `shift`
|
|
20
|
-
* resizes) is the other — and the two displays sharing it had byte-identical
|
|
21
|
-
* copies differing only in which getter named the viewport. The canvas display
|
|
22
|
-
* converged here when it moved off a native overflow container; the ADR's table
|
|
23
|
-
* still described its pre-virtual-scroll rule and has been corrected.
|
|
24
|
-
*
|
|
25
|
-
* `scrollZoom` and `viewportHeight` are inputs rather than reads off the model,
|
|
26
|
-
* so core needs no view typing and each display keeps naming its own viewport
|
|
27
|
-
* (the pileup's excludes the sticky coverage band; the canvas display's is the
|
|
28
|
-
* whole track).
|
|
29
|
-
*
|
|
30
|
-
* `panel` is the element wrapping the canvas AND the DOM overlays drawn over it,
|
|
31
|
-
* never the canvas alone — see `useVirtualScrollWheel`, which says why.
|
|
3
|
+
* Wheel gestures over a **scrolled canvas panel** — the alignments pileup, the
|
|
4
|
+
* canvas feature display, multi-way synteny: a plain wheel scrolls it, `shift`
|
|
5
|
+
* still scrolls it once `scrollZoom` has given the plain wheel to the view, and
|
|
6
|
+
* ctrl/meta is left to the browser and the view's pinch-zoom. The row-stack
|
|
7
|
+
* rule, where `shift` resizes, is `useRowVirtualScroll` (ADR-027).
|
|
32
8
|
*/
|
|
33
|
-
export declare function usePanelVirtualScroll(panel: HTMLElement | null, model:
|
|
34
|
-
viewportHeight: number;
|
|
35
|
-
scrollZoom: boolean;
|
|
36
|
-
}): void;
|
|
37
|
-
export {};
|
|
9
|
+
export declare function usePanelVirtualScroll(panel: HTMLElement | null, model: VirtualScrollModel, scrollZoom: boolean): void;
|
|
@@ -1,42 +1,15 @@
|
|
|
1
1
|
import { useVirtualScrollWheel } from './useVirtualScrollWheel.js';
|
|
2
2
|
/**
|
|
3
|
-
* Wheel gestures over a **scrolled canvas panel** — the alignments pileup
|
|
4
|
-
*
|
|
5
|
-
* once `scrollZoom` has
|
|
6
|
-
* left to the browser and the view's pinch-zoom.
|
|
7
|
-
*
|
|
8
|
-
* These panels paint a fixed-size canvas at `-scrollTop` rather than living in a
|
|
9
|
-
* DOM overflow container, so nothing scrolls them without this. The latch (inside
|
|
10
|
-
* `applyScroll`) owns `preventDefault` but never `stopPropagation`, so a diagonal
|
|
11
|
-
* wheel still bubbles its horizontal component to the LGV for panning.
|
|
12
|
-
*
|
|
13
|
-
* ADR-027 keeps wheel-*intent* dispatch per handler, because the panels do not
|
|
14
|
-
* agree on what a gesture means. This is the second of the two rules that
|
|
15
|
-
* survived that split — the row-stack rule (`useRowVirtualScroll`, where `shift`
|
|
16
|
-
* resizes) is the other — and the two displays sharing it had byte-identical
|
|
17
|
-
* copies differing only in which getter named the viewport. The canvas display
|
|
18
|
-
* converged here when it moved off a native overflow container; the ADR's table
|
|
19
|
-
* still described its pre-virtual-scroll rule and has been corrected.
|
|
20
|
-
*
|
|
21
|
-
* `scrollZoom` and `viewportHeight` are inputs rather than reads off the model,
|
|
22
|
-
* so core needs no view typing and each display keeps naming its own viewport
|
|
23
|
-
* (the pileup's excludes the sticky coverage band; the canvas display's is the
|
|
24
|
-
* whole track).
|
|
25
|
-
*
|
|
26
|
-
* `panel` is the element wrapping the canvas AND the DOM overlays drawn over it,
|
|
27
|
-
* never the canvas alone — see `useVirtualScrollWheel`, which says why.
|
|
3
|
+
* Wheel gestures over a **scrolled canvas panel** — the alignments pileup, the
|
|
4
|
+
* canvas feature display, multi-way synteny: a plain wheel scrolls it, `shift`
|
|
5
|
+
* still scrolls it once `scrollZoom` has given the plain wheel to the view, and
|
|
6
|
+
* ctrl/meta is left to the browser and the view's pinch-zoom. The row-stack
|
|
7
|
+
* rule, where `shift` resizes, is `useRowVirtualScroll` (ADR-027).
|
|
28
8
|
*/
|
|
29
|
-
export function usePanelVirtualScroll(panel, model,
|
|
30
|
-
useVirtualScrollWheel(panel, (e,
|
|
31
|
-
if ((scrollZoom
|
|
32
|
-
|
|
9
|
+
export function usePanelVirtualScroll(panel, model, scrollZoom) {
|
|
10
|
+
useVirtualScrollWheel(panel, model, (e, scroll) => {
|
|
11
|
+
if ((!scrollZoom || e.shiftKey) && !e.ctrlKey && !e.metaKey) {
|
|
12
|
+
scroll();
|
|
33
13
|
}
|
|
34
|
-
applyScroll(e, {
|
|
35
|
-
scrollTop: model.scrollTop,
|
|
36
|
-
viewportHeight,
|
|
37
|
-
scrollableHeight: model.scrollableHeight,
|
|
38
|
-
}, n => {
|
|
39
|
-
model.setScrollTop(n);
|
|
40
|
-
});
|
|
41
14
|
});
|
|
42
15
|
}
|
|
@@ -1,32 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
effectiveRowHeight: number;
|
|
3
|
-
scrollTop: number;
|
|
4
|
-
nrow: number;
|
|
5
|
-
scrollableHeight: number;
|
|
6
|
-
setRowHeight: (n: number) => void;
|
|
7
|
-
setScrollTop: (n: number) => void;
|
|
8
|
-
}
|
|
1
|
+
import type { RowResizeTarget } from './applyRowResizeWheel.ts';
|
|
9
2
|
/**
|
|
10
3
|
* Wheel gestures over a **row-stack** panel — the multi-sample variant displays
|
|
11
|
-
* and MAF: `shift`+wheel resizes the rows
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* These panels paint a fixed-size canvas at `-scrollTop` rather than living in a
|
|
16
|
-
* DOM overflow container, so nothing scrolls them without this.
|
|
17
|
-
*
|
|
18
|
-
* ADR-027 keeps wheel-*intent* dispatch per handler, because the four panels do
|
|
19
|
-
* not agree on what a gesture means — and that still holds. This is the one rule
|
|
20
|
-
* two of them genuinely share, which the ADR states outright ("same rule as the
|
|
21
|
-
* variant displays, and deliberately so: same sample-row shape, same coupled
|
|
22
|
-
* row-height axis"). It is unified for exactly that reason, and no further: the
|
|
23
|
-
* pileup / canvas-basic rule (`shift` scrolls, nothing resizes) stays where it
|
|
24
|
-
* is. `scrollZoom` and `viewportHeight` are inputs rather than reads off the
|
|
25
|
-
* model, so core needs no view typing and each display keeps naming its own
|
|
26
|
-
* rows-area height.
|
|
4
|
+
* and MAF: `shift`+wheel resizes the rows, keeping the row under the cursor
|
|
5
|
+
* put, and a plain wheel scrolls them unless `scrollZoom` gave it to the view.
|
|
6
|
+
* ctrl/meta is the browser's zoom whatever else is held. The canvas-panel rule,
|
|
7
|
+
* where `shift` scrolls, is `usePanelVirtualScroll` (ADR-027).
|
|
27
8
|
*/
|
|
28
|
-
export declare function useRowVirtualScroll(el: HTMLElement | null, model:
|
|
29
|
-
viewportHeight: number;
|
|
30
|
-
scrollZoom: boolean;
|
|
31
|
-
}): void;
|
|
32
|
-
export {};
|
|
9
|
+
export declare function useRowVirtualScroll(el: HTMLElement | null, model: RowResizeTarget, scrollZoom: boolean): void;
|
|
@@ -2,62 +2,21 @@ import { applyRowResizeWheel } from './applyRowResizeWheel.js';
|
|
|
2
2
|
import { useVirtualScrollWheel } from './useVirtualScrollWheel.js';
|
|
3
3
|
/**
|
|
4
4
|
* Wheel gestures over a **row-stack** panel — the multi-sample variant displays
|
|
5
|
-
* and MAF: `shift`+wheel resizes the rows
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* These panels paint a fixed-size canvas at `-scrollTop` rather than living in a
|
|
10
|
-
* DOM overflow container, so nothing scrolls them without this.
|
|
11
|
-
*
|
|
12
|
-
* ADR-027 keeps wheel-*intent* dispatch per handler, because the four panels do
|
|
13
|
-
* not agree on what a gesture means — and that still holds. This is the one rule
|
|
14
|
-
* two of them genuinely share, which the ADR states outright ("same rule as the
|
|
15
|
-
* variant displays, and deliberately so: same sample-row shape, same coupled
|
|
16
|
-
* row-height axis"). It is unified for exactly that reason, and no further: the
|
|
17
|
-
* pileup / canvas-basic rule (`shift` scrolls, nothing resizes) stays where it
|
|
18
|
-
* is. `scrollZoom` and `viewportHeight` are inputs rather than reads off the
|
|
19
|
-
* model, so core needs no view typing and each display keeps naming its own
|
|
20
|
-
* rows-area height.
|
|
5
|
+
* and MAF: `shift`+wheel resizes the rows, keeping the row under the cursor
|
|
6
|
+
* put, and a plain wheel scrolls them unless `scrollZoom` gave it to the view.
|
|
7
|
+
* ctrl/meta is the browser's zoom whatever else is held. The canvas-panel rule,
|
|
8
|
+
* where `shift` scrolls, is `usePanelVirtualScroll` (ADR-027).
|
|
21
9
|
*/
|
|
22
|
-
export function useRowVirtualScroll(el, model,
|
|
23
|
-
useVirtualScrollWheel(el, (e,
|
|
24
|
-
// ctrl/meta is the browser's own zoom (and the view's pinch-zoom) and is
|
|
25
|
-
// never ours, whatever else is held. Tested first rather than only in the
|
|
26
|
-
// scroll branch: ctrl+shift+wheel used to reach the resize below, which
|
|
27
|
-
// `preventDefault`s — so a row-stack display swallowed page zoom where
|
|
28
|
-
// every other display passes it through.
|
|
10
|
+
export function useRowVirtualScroll(el, model, scrollZoom) {
|
|
11
|
+
useVirtualScrollWheel(el, model, (e, scroll, rowsEl) => {
|
|
29
12
|
if (e.ctrlKey || e.metaKey) {
|
|
30
13
|
return;
|
|
31
14
|
}
|
|
32
15
|
if (e.shiftKey) {
|
|
33
|
-
|
|
34
|
-
// the gesture meaningful: the fit height is exactly the floor it shrinks
|
|
35
|
-
// to, so there is nothing to zoom while the sentinel is set.
|
|
36
|
-
applyRowResizeWheel(e, rowsEl, {
|
|
37
|
-
effectiveRowHeight: model.effectiveRowHeight,
|
|
38
|
-
scrollTop: model.scrollTop,
|
|
39
|
-
nrow: model.nrow,
|
|
40
|
-
viewportHeight,
|
|
41
|
-
setRowHeight: n => {
|
|
42
|
-
model.setRowHeight(n);
|
|
43
|
-
},
|
|
44
|
-
setScrollTop: n => {
|
|
45
|
-
model.setScrollTop(n);
|
|
46
|
-
},
|
|
47
|
-
});
|
|
16
|
+
applyRowResizeWheel(e, rowsEl, model);
|
|
48
17
|
}
|
|
49
18
|
else if (!scrollZoom) {
|
|
50
|
-
|
|
51
|
-
// the track (`scrollableHeight === 0`, always true in fit-to-height mode)
|
|
52
|
-
// the wheel reaches the view and zooms or scrolls the page exactly as it
|
|
53
|
-
// does over any other track. Same for the explicit zoom gestures.
|
|
54
|
-
applyScroll(e, {
|
|
55
|
-
scrollTop: model.scrollTop,
|
|
56
|
-
viewportHeight,
|
|
57
|
-
scrollableHeight: model.scrollableHeight,
|
|
58
|
-
}, n => {
|
|
59
|
-
model.setScrollTop(n);
|
|
60
|
-
});
|
|
19
|
+
scroll();
|
|
61
20
|
}
|
|
62
21
|
});
|
|
63
22
|
}
|
|
@@ -1,7 +1,23 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* What a virtually scrolled panel reads and writes. `TrackHeightMixin`
|
|
3
|
+
* implements it, so a display passes itself.
|
|
4
|
+
*/
|
|
5
|
+
export interface VirtualScrollModel {
|
|
2
6
|
scrollTop: number;
|
|
3
|
-
|
|
7
|
+
/** 0 when the content fits; never sub-pixel */
|
|
4
8
|
scrollableHeight: number;
|
|
9
|
+
scrollViewportHeight: number;
|
|
10
|
+
setScrollTop: (scrollTop: number) => void;
|
|
5
11
|
}
|
|
6
|
-
|
|
7
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Non-passive wheel wiring for a canvas-backed virtual scroll. Owns the scroll
|
|
14
|
+
* latch (and so `preventDefault`), per-frame coalescing of `setScrollTop`, and
|
|
15
|
+
* the listener lifecycle. `onWheel` decides what the gesture means and calls
|
|
16
|
+
* `scroll` when it means scrolling `model`.
|
|
17
|
+
*
|
|
18
|
+
* **Bind this to the panel, not to the `<canvas>`.** A canvas holds no DOM
|
|
19
|
+
* children, so the clickable overlays drawn over it are siblings, and a wheel
|
|
20
|
+
* over one never reaches a listener on the canvas. Overlays that run their own
|
|
21
|
+
* gestures opt out with `[data-gesture-owner]`.
|
|
22
|
+
*/
|
|
23
|
+
export declare function useVirtualScrollWheel(panel: HTMLElement | null, model: VirtualScrollModel, onWheel: (e: WheelEvent, scroll: () => void, panel: HTMLElement) => void): void;
|
|
@@ -1,95 +1,61 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useEffect, useMemo, useRef } from 'react';
|
|
2
2
|
import { createFrameCoalescer } from './frameCoalescer.js';
|
|
3
3
|
import { trackPointerPresence } from './pointerPresence.js';
|
|
4
4
|
import { createScrollLatch } from './scrollLatch.js';
|
|
5
5
|
import { useEventCallback } from './useEventCallback.js';
|
|
6
6
|
import { normalizeWheelDelta } from './wheelZoom.js';
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
// now, and a few of those are controls rather than content: the display's own
|
|
11
|
-
// `VerticalScrollbar` (which scrolls the panel itself, from its own listener),
|
|
12
|
-
// the pileup's band resize handles, a floating legend. Those keep the gesture
|
|
13
|
-
// they already had instead of being absorbed the moment the panel grew to cover
|
|
14
|
-
// them.
|
|
15
|
-
//
|
|
16
|
-
// The marker element ITSELF is a panel at the one call site that is one — the
|
|
17
|
-
// scrollbar binds this hook to its own marked track — so an owner that IS the
|
|
18
|
-
// panel does not count. Nor does one ABOVE it: `TrackContainer` stamps the
|
|
19
|
-
// marker once for its whole overlay layer, and `closest` walking out of the
|
|
20
|
-
// panel into that would otherwise disown every wheel a display gets.
|
|
7
|
+
// An owner that IS the panel (the scrollbar binds this hook to its own marked
|
|
8
|
+
// track) or sits ABOVE it (`TrackContainer` marks its whole overlay layer) does
|
|
9
|
+
// not count.
|
|
21
10
|
function claimedInside(panel, target) {
|
|
22
11
|
const owner = target instanceof Element ? target.closest('[data-gesture-owner]') : null;
|
|
23
12
|
return owner !== null && owner !== panel && panel.contains(owner);
|
|
24
13
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
// wheel event over them targets. That event bubbles past the canvas entirely, so
|
|
38
|
-
// a listener bound to the canvas never sees it and the gesture falls through to
|
|
39
|
-
// the page mid-scroll. Bound to the element containing both, the wheel is the
|
|
40
|
-
// panel's wherever inside it the cursor happens to be. `trackPointerPresence`
|
|
41
|
-
// below keys off the same element, and `mouseenter`/`mouseleave` ignore
|
|
42
|
-
// descendant transitions — so crossing onto an overlay no longer reads as
|
|
43
|
-
// leaving the panel either.
|
|
44
|
-
//
|
|
45
|
-
// What keeps a panel safe to widen is `claimedInside` above: it covers its
|
|
46
|
-
// overlays, and yields the ones that run gestures of their own.
|
|
47
|
-
export function useVirtualScrollWheel(panel,
|
|
48
|
-
// `el` is the element the listener is bound to, handed back non-null: a
|
|
49
|
-
// gesture measuring against its own box (the row-resize pin) would otherwise
|
|
50
|
-
// re-assert the nullable it was passed, at the one call site that cannot be
|
|
51
|
-
// reached with a null.
|
|
52
|
-
onWheel) {
|
|
14
|
+
/**
|
|
15
|
+
* Non-passive wheel wiring for a canvas-backed virtual scroll. Owns the scroll
|
|
16
|
+
* latch (and so `preventDefault`), per-frame coalescing of `setScrollTop`, and
|
|
17
|
+
* the listener lifecycle. `onWheel` decides what the gesture means and calls
|
|
18
|
+
* `scroll` when it means scrolling `model`.
|
|
19
|
+
*
|
|
20
|
+
* **Bind this to the panel, not to the `<canvas>`.** A canvas holds no DOM
|
|
21
|
+
* children, so the clickable overlays drawn over it are siblings, and a wheel
|
|
22
|
+
* over one never reaches a listener on the canvas. Overlays that run their own
|
|
23
|
+
* gestures opt out with `[data-gesture-owner]`.
|
|
24
|
+
*/
|
|
25
|
+
export function useVirtualScrollWheel(panel, model, onWheel) {
|
|
53
26
|
const latch = useMemo(() => createScrollLatch(), []);
|
|
54
27
|
const frame = useMemo(() => createFrameCoalescer(), []);
|
|
55
|
-
// The
|
|
56
|
-
//
|
|
57
|
-
// sees monotonically advancing offsets and no delta is lost to a
|
|
58
|
-
// not-yet-committed model read.
|
|
28
|
+
// The offset as it advances across one frame's events, so the latch sees
|
|
29
|
+
// every delta before the model has committed any of them.
|
|
59
30
|
const runningRef = useRef(0);
|
|
60
|
-
const applyScroll = useCallback((e, { scrollTop, viewportHeight, scrollableHeight }, commit) => {
|
|
61
|
-
if (scrollableHeight <= 0) {
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
// A fresh frame (nothing pending) re-syncs to the model's live scrollTop;
|
|
65
|
-
// within a frame `running` keeps advancing from the last latched offset.
|
|
66
|
-
if (!frame.pending) {
|
|
67
|
-
runningRef.current = scrollTop;
|
|
68
|
-
}
|
|
69
|
-
const dy = normalizeWheelDelta(e.deltaY, e.deltaMode, viewportHeight);
|
|
70
|
-
const next = latch.scroll(e, runningRef.current, dy, scrollableHeight);
|
|
71
|
-
if (next !== null) {
|
|
72
|
-
runningRef.current = next;
|
|
73
|
-
// The first move of a frame schedules the commit; later moves only
|
|
74
|
-
// advance `running`, so the frame ends with a single setScrollTop (one
|
|
75
|
-
// repaint) carrying the accumulated offset.
|
|
76
|
-
frame.schedule(() => {
|
|
77
|
-
commit(runningRef.current);
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
}, [latch, frame]);
|
|
81
31
|
const handleWheel = useEventCallback((e, el) => {
|
|
82
|
-
onWheel(e,
|
|
32
|
+
onWheel(e, () => {
|
|
33
|
+
// A sideways-dominant gesture is the view's pan unless this panel has
|
|
34
|
+
// already latched it; ties go vertical, as in the view.
|
|
35
|
+
const sideways = Math.abs(e.deltaX) > Math.abs(e.deltaY);
|
|
36
|
+
const { scrollableHeight, scrollViewportHeight } = model;
|
|
37
|
+
if (scrollableHeight <= 0 || (sideways && !latch.holds(e))) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (!frame.pending) {
|
|
41
|
+
runningRef.current = model.scrollTop;
|
|
42
|
+
}
|
|
43
|
+
const dy = normalizeWheelDelta(e.deltaY, e.deltaMode, scrollViewportHeight);
|
|
44
|
+
const next = latch.scroll(e, runningRef.current, dy, scrollableHeight);
|
|
45
|
+
if (next !== null) {
|
|
46
|
+
runningRef.current = next;
|
|
47
|
+
frame.schedule(() => {
|
|
48
|
+
model.setScrollTop(runningRef.current);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}, el);
|
|
83
52
|
});
|
|
84
53
|
useEffect(() => {
|
|
85
54
|
if (!panel) {
|
|
86
55
|
return undefined;
|
|
87
56
|
}
|
|
88
|
-
//
|
|
89
|
-
// pointer
|
|
90
|
-
// and reset the latch so the next in-panel gesture starts clean. Without
|
|
91
|
-
// this the panel stays stuck to per-track scroll after the mouse has left —
|
|
92
|
-
// worst in embedded, where the outer page is the thing that should scroll.
|
|
57
|
+
// The browser keeps targeting a gesture at the element it began on after
|
|
58
|
+
// the pointer leaves; release those to the page.
|
|
93
59
|
const presence = trackPointerPresence(panel, () => {
|
|
94
60
|
latch.reset();
|
|
95
61
|
});
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { HighlightType } from './highlights.ts';
|
|
2
|
+
import type { AssemblyNameResolver } from './tracks.ts';
|
|
3
|
+
export declare function highlightsOnAssemblies(highlights: readonly HighlightType[], assemblyNames: Iterable<string>, assemblyManager: AssemblyNameResolver): HighlightType[];
|