@jbrowse/core 5.0.0-beta.1 → 5.0.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1709 -390
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +37 -14
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +49 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.js +8 -5
- package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
- package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
- package/esm/BaseFeatureWidget/formatDetails.js +62 -83
- package/esm/BaseFeatureWidget/index.d.ts +2 -1
- package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
- package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
- package/esm/BaseFeatureWidget/types.d.ts +12 -6
- package/esm/BaseFeatureWidget/util.d.ts +0 -10
- package/esm/BaseFeatureWidget/util.js +0 -17
- package/esm/CorePlugin.js +34 -3
- package/esm/PluginLoader.d.ts +24 -13
- package/esm/PluginLoader.js +167 -51
- package/esm/PluginManager.d.ts +130 -24
- package/esm/PluginManager.js +180 -32
- package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
- package/esm/ReExports/MuiDataGridReExports.js +2 -2
- package/esm/ReExports/coreModules.generated.d.ts +2 -0
- package/esm/ReExports/coreModules.generated.js +530 -0
- package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/coreWorkerModules.generated.js +490 -0
- package/esm/ReExports/frameworkModules.d.ts +2 -0
- package/esm/ReExports/frameworkModules.js +68 -0
- package/esm/ReExports/frameworkShared.d.ts +12 -0
- package/esm/ReExports/frameworkShared.js +16 -0
- package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
- package/esm/ReExports/list.js +528 -79
- package/esm/ReExports/modules.d.ts +1 -1
- package/esm/ReExports/modules.js +10 -165
- package/esm/ReExports/registry.d.ts +1 -0
- package/esm/ReExports/registry.js +23 -5
- package/esm/ReExports/uiStub.d.ts +3 -0
- package/esm/ReExports/uiStub.js +33 -0
- package/esm/ReExports/workerModules.d.ts +2 -0
- package/esm/ReExports/workerModules.js +11 -0
- package/esm/TextSearch/TextSearchManager.d.ts +27 -13
- package/esm/TextSearch/TextSearchManager.js +77 -36
- package/esm/TextSearch/places.d.ts +12 -0
- package/esm/TextSearch/places.js +94 -0
- package/esm/assemblyManager/assembly.d.ts +21 -19
- package/esm/assemblyManager/assembly.js +28 -26
- package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
- package/esm/assemblyManager/assemblyAdapters.js +8 -2
- package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
- package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
- package/esm/assemblyManager/assemblyManager.d.ts +35 -180
- package/esm/assemblyManager/assemblyManager.js +47 -51
- package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
- package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
- package/esm/assemblyManager/geneticCodes.js +2 -5
- package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
- package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
- package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
- package/esm/assemblyManager/indexAssemblyNames.js +22 -0
- package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
- package/esm/assemblyManager/loadRefNameMap.js +4 -9
- package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
- package/esm/assemblyManager/refNameMapKey.js +12 -0
- package/esm/checkPlugins.d.ts +2 -0
- package/esm/checkPlugins.js +38 -17
- package/esm/configuration/bamIndexFields.d.ts +49 -0
- package/esm/configuration/bamIndexFields.js +41 -0
- package/esm/configuration/configurationSchema.d.ts +101 -71
- package/esm/configuration/configurationSchema.js +207 -134
- package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
- package/esm/configuration/configurationSchemaUnion.js +56 -0
- package/esm/configuration/configurationSlot.d.ts +150 -60
- package/esm/configuration/configurationSlot.js +103 -75
- package/esm/configuration/fillLocations.d.ts +14 -0
- package/esm/configuration/fillLocations.js +14 -0
- package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
- package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
- package/esm/configuration/formatDetailsConfigSchema.js +10 -13
- package/esm/configuration/fullConfSnapshot.d.ts +4 -19
- package/esm/configuration/fullConfSnapshot.js +30 -52
- package/esm/configuration/getConf.d.ts +45 -41
- package/esm/configuration/getConf.js +111 -44
- package/esm/configuration/index.d.ts +26 -11
- package/esm/configuration/index.js +16 -7
- package/esm/configuration/indexType.d.ts +26 -0
- package/esm/configuration/indexType.js +38 -0
- package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
- package/esm/configuration/mergeFormatCallbacks.js +13 -10
- package/esm/configuration/plot.d.ts +61 -0
- package/esm/configuration/plot.js +142 -0
- package/esm/configuration/readConfObject.d.ts +2 -24
- package/esm/configuration/readConfObject.js +20 -63
- package/esm/configuration/requirements.d.ts +37 -0
- package/esm/configuration/requirements.js +88 -0
- package/esm/configuration/schemaRegistry.d.ts +32 -15
- package/esm/configuration/schemaRegistry.js +33 -35
- package/esm/configuration/schemaTypes.d.ts +21 -5
- package/esm/configuration/schemaTypes.js +66 -55
- package/esm/configuration/slotFacade.d.ts +12 -29
- package/esm/configuration/slotFacade.js +44 -23
- package/esm/configuration/snapshotPreprocess.d.ts +43 -0
- package/esm/configuration/snapshotPreprocess.js +161 -0
- package/esm/configuration/tabixIndexFields.d.ts +30 -4
- package/esm/configuration/tabixIndexFields.js +21 -4
- package/esm/configuration/tabixShorthand.d.ts +34 -17
- package/esm/configuration/tabixShorthand.js +49 -22
- package/esm/configuration/types.d.ts +182 -43
- package/esm/configuration/uriShorthand.d.ts +9 -0
- package/esm/configuration/uriShorthand.js +16 -0
- package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
- package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
- package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
- package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
- package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
- package/esm/data_adapters/BaseAdapter/index.js +1 -0
- package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
- package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
- package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
- package/esm/data_adapters/BaseAdapter/stats.js +52 -13
- package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
- package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
- package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
- package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
- package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
- package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
- package/esm/data_adapters/dataAdapterCache.js +44 -10
- package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
- package/esm/data_adapters/getFeatureAdapter.js +8 -8
- package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
- package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
- package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
- package/esm/pluggableElementTypes/AdapterType.js +1 -1
- package/esm/pluggableElementTypes/DisplayType.d.ts +53 -16
- package/esm/pluggableElementTypes/DisplayType.js +28 -12
- package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
- package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
- package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
- package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
- package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
- package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
- package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
- package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
- package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
- package/esm/pluggableElementTypes/ViewType.js +32 -4
- package/esm/pluggableElementTypes/WidgetType.d.ts +6 -0
- package/esm/pluggableElementTypes/WidgetType.js +6 -0
- package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
- package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
- package/esm/pluggableElementTypes/extendElementType.js +9 -5
- package/esm/pluggableElementTypes/index.d.ts +2 -1
- package/esm/pluggableElementTypes/index.js +2 -9
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
- package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +122 -28
- package/esm/pluggableElementTypes/models/BaseDisplayModel.js +155 -11
- package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
- package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
- package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +87 -18
- package/esm/pluggableElementTypes/models/BaseViewModel.js +54 -11
- package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
- package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
- package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
- package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
- package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
- package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
- package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
- package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
- package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
- package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
- package/esm/pluggableElementTypes/models/index.d.ts +2 -3
- package/esm/pluggableElementTypes/models/index.js +2 -3
- package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
- package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
- package/esm/pluginDefinitions.d.ts +34 -7
- package/esm/pluginDefinitions.js +54 -20
- package/esm/rpc/BaseRpcDriver.d.ts +2 -2
- package/esm/rpc/BaseRpcDriver.js +25 -30
- package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
- package/esm/rpc/MainThreadRpcDriver.js +13 -8
- package/esm/rpc/RpcClient.d.ts +18 -6
- package/esm/rpc/RpcClient.js +51 -16
- package/esm/rpc/RpcManager.d.ts +14 -10
- package/esm/rpc/RpcManager.js +11 -1
- package/esm/rpc/RpcRegistry.d.ts +40 -7
- package/esm/rpc/RpcServer.d.ts +3 -1
- package/esm/rpc/RpcServer.js +19 -12
- package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
- package/esm/rpc/WebWorkerRpcDriver.js +64 -68
- package/esm/rpc/byteBudget.d.ts +20 -5
- package/esm/rpc/byteBudget.js +16 -5
- package/esm/rpc/configSchema.d.ts +7 -21
- package/esm/rpc/coreRpcMethods.d.ts +4 -0
- package/esm/rpc/coreRpcMethods.js +4 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
- package/esm/rpc/methods/CoreGetExportData.js +3 -4
- package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
- package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
- package/esm/rpc/methods/CoreGetFeatures.js +3 -5
- package/esm/rpc/methods/CoreGetRefNames.js +2 -12
- package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
- package/esm/rpc/methods/CoreGetSequence.js +2 -2
- package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
- package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
- package/esm/rpc/methods/layerFeatures.d.ts +33 -0
- package/esm/rpc/methods/layerFeatures.js +29 -0
- package/esm/svg/SvgExport.js +6 -7
- package/esm/svg/SvgThemeProviders.d.ts +12 -0
- package/esm/svg/SvgThemeProviders.js +15 -0
- package/esm/svg/exportViewSvg.d.ts +28 -0
- package/esm/svg/exportViewSvg.js +13 -0
- package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
- package/esm/svg/normalizeSvgMarkup.js +99 -0
- package/esm/svg/serializeSvg.d.ts +7 -0
- package/esm/svg/serializeSvg.js +11 -0
- package/esm/svg/svgId.d.ts +1 -1
- package/esm/svg/svgId.js +1 -1
- package/esm/svg/svgReady.d.ts +9 -7
- package/esm/svg/svgReady.js +8 -7
- package/esm/svg/trackNames.d.ts +7 -5
- package/esm/svg/trackNames.js +12 -9
- package/esm/svg/wrapSvgExport.js +6 -74
- package/esm/ui/AddCustomPluginDialog.js +3 -8
- package/esm/ui/AppReadyMarker.d.ts +45 -0
- package/esm/ui/AppReadyMarker.js +89 -0
- package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
- package/esm/ui/CascadingMenu.js +181 -104
- package/esm/ui/DropDownMenu.js +2 -1
- package/esm/ui/ErrorBanner.js +1 -1
- package/esm/ui/ErrorBoundary.d.ts +2 -2
- package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
- package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
- package/esm/ui/ExportSvgDialog.d.ts +1 -1
- package/esm/ui/FileDropZone.js +2 -1
- package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
- package/esm/ui/HoverMenu.d.ts +1 -2
- package/esm/ui/HoverMenu.js +6 -3
- package/esm/ui/JexlFilterDialog.d.ts +13 -10
- package/esm/ui/JexlFilterDialog.js +122 -50
- package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
- package/esm/ui/JexlFilterRowEditors.js +90 -0
- package/esm/ui/LazyBaseTooltip.d.ts +4 -0
- package/esm/ui/LazyBaseTooltip.js +9 -0
- package/esm/ui/LegendSwatchGlyph.js +26 -21
- package/esm/ui/LoadingOverlay.d.ts +14 -0
- package/esm/ui/LoadingOverlay.js +4 -2
- package/esm/ui/MenuTypes.d.ts +23 -53
- package/esm/ui/MenuTypes.js +3 -0
- package/esm/ui/MonospaceTextField.d.ts +2 -1
- package/esm/ui/MonospaceTextField.js +23 -20
- package/esm/ui/PaletteContext.d.ts +10 -5
- package/esm/ui/PaletteContext.js +44 -6
- package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
- package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
- package/esm/ui/RefNameAutocomplete/index.js +8 -2
- package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/util.js +42 -1
- package/esm/ui/ResizeHandle.d.ts +3 -1
- package/esm/ui/ResizeHandle.js +44 -11
- package/esm/ui/ScrollChrome.d.ts +13 -0
- package/esm/ui/ScrollChrome.js +11 -0
- package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
- package/esm/ui/ScrollEdgeShadow.js +14 -35
- package/esm/ui/ScrollZoomToggle.d.ts +4 -27
- package/esm/ui/ScrollZoomToggle.js +34 -51
- package/esm/ui/SessionJsonPanel.d.ts +3 -0
- package/esm/ui/SessionJsonPanel.js +14 -0
- package/esm/ui/SettingsChangesTable.d.ts +1 -0
- package/esm/ui/SettingsChangesTable.js +49 -11
- package/esm/ui/ShareLinkField.d.ts +1 -3
- package/esm/ui/ShareLinkField.js +13 -40
- package/esm/ui/SizeSliderRow.d.ts +1 -3
- package/esm/ui/SizeSliderRow.js +4 -6
- package/esm/ui/SnackbarModel.js +79 -67
- package/esm/ui/StatusProgressBar.js +2 -2
- package/esm/ui/SvgColorLegend.d.ts +9 -4
- package/esm/ui/SvgColorLegend.js +82 -41
- package/esm/ui/VerticalScrollbar.d.ts +13 -34
- package/esm/ui/VerticalScrollbar.js +29 -83
- package/esm/ui/ViewLoadingScreen.d.ts +5 -4
- package/esm/ui/ViewLoadingScreen.js +8 -32
- package/esm/ui/colorScale.d.ts +92 -0
- package/esm/ui/colorScale.js +72 -0
- package/esm/ui/colors.d.ts +64 -0
- package/esm/ui/colors.js +230 -1
- package/esm/ui/hoverBoxStyle.d.ts +14 -2
- package/esm/ui/hoverBoxStyle.js +17 -2
- package/esm/ui/index.d.ts +12 -12
- package/esm/ui/index.js +14 -22
- package/esm/ui/launchViewMenu.js +15 -5
- package/esm/ui/legendMenuItem.d.ts +10 -32
- package/esm/ui/legendMenuItem.js +9 -36
- package/esm/ui/legendSpec.d.ts +15 -8
- package/esm/ui/legendSpec.js +14 -23
- package/esm/ui/makeSizeMenu.d.ts +0 -6
- package/esm/ui/makeSizeMenu.js +6 -30
- package/esm/ui/measureLegendText.js +1 -1
- package/esm/ui/menuItemAdornment.d.ts +9 -20
- package/esm/ui/menuItemAdornment.js +10 -32
- package/esm/ui/menuItems.d.ts +2 -7
- package/esm/ui/menuItems.js +1 -6
- package/esm/ui/multiTrackMenuItems.d.ts +6 -0
- package/esm/ui/palette.d.ts +118 -116
- package/esm/ui/palette.js +114 -75
- package/esm/ui/replaceViewAction.d.ts +1 -1
- package/esm/ui/replaceViewAction.js +1 -1
- package/esm/ui/theme.d.ts +43 -119
- package/esm/ui/theme.js +62 -78
- package/esm/ui/toggleMenuItems.d.ts +1 -3
- package/esm/ui/toggleMenuItems.js +6 -5
- package/esm/ui/useAssemblySelection.d.ts +4 -4
- package/esm/ui/viewHeaderHeight.d.ts +1 -0
- package/esm/ui/viewHeaderHeight.js +1 -0
- package/esm/util/Base1DUtils.d.ts +5 -3
- package/esm/util/Base1DUtils.js +14 -6
- package/esm/util/Base1DViewModel.d.ts +2 -1
- package/esm/util/Base1DViewModel.js +3 -2
- package/esm/util/SvgCanvas.d.ts +15 -13
- package/esm/util/SvgCanvas.js +76 -56
- package/esm/util/TimeTraveller.d.ts +3 -0
- package/esm/util/TimeTraveller.js +34 -2
- package/esm/util/aborting.d.ts +39 -0
- package/esm/util/aborting.js +88 -6
- package/esm/util/adapterMetadata.d.ts +1 -1
- package/esm/util/adapterMetadata.js +6 -5
- package/esm/util/addAndShowTrack.d.ts +2 -5
- package/esm/util/addAndShowTrack.js +5 -1
- package/esm/util/addRelativeUris.d.ts +17 -5
- package/esm/util/addRelativeUris.js +46 -10
- package/esm/util/addTrackFromWidget.d.ts +2 -5
- package/esm/util/addTrackFromWidget.js +5 -4
- package/esm/util/aggregateFieldName.d.ts +10 -0
- package/esm/util/aggregateFieldName.js +8 -0
- package/esm/util/analytics.js +46 -13
- package/esm/util/animationAllowed.d.ts +9 -0
- package/esm/util/animationAllowed.js +13 -0
- package/esm/util/applyRowResizeWheel.d.ts +10 -5
- package/esm/util/applyRowResizeWheel.js +10 -21
- package/esm/util/bandHeight.d.ts +10 -0
- package/esm/util/bandHeight.js +29 -0
- package/esm/util/bandLayout.d.ts +4 -4
- package/esm/util/bandLayout.js +4 -4
- package/esm/util/baseDisplayConfig.d.ts +8 -0
- package/esm/util/baseDisplayConfig.js +27 -0
- package/esm/util/bezierConnector.d.ts +4 -3
- package/esm/util/bezierConnector.js +38 -45
- package/esm/util/bgzfWorkerPool.d.ts +20 -74
- package/esm/util/bgzfWorkerPool.js +20 -74
- package/esm/util/binnedAggregate.d.ts +17 -0
- package/esm/util/binnedAggregate.js +275 -0
- package/esm/util/cacheBudgets.d.ts +22 -19
- package/esm/util/cacheBudgets.js +22 -19
- package/esm/util/cachedSetup.d.ts +16 -6
- package/esm/util/cachedSetup.js +108 -38
- package/esm/util/categoricalField.d.ts +56 -0
- package/esm/util/categoricalField.js +73 -0
- package/esm/util/cellMatches.d.ts +23 -0
- package/esm/util/cellMatches.js +264 -0
- package/esm/util/cellsStep.d.ts +29 -0
- package/esm/util/cellsStep.js +437 -0
- package/esm/util/clampToContig.d.ts +17 -0
- package/esm/util/clampToContig.js +19 -0
- package/esm/util/coarseStripHTML.js +1 -2
- package/esm/util/color/cssColorsLevel4.d.ts +1 -0
- package/esm/util/color/cssColorsLevel4.js +1 -0
- package/esm/util/color/index.d.ts +5 -3
- package/esm/util/color/index.js +7 -4
- package/esm/util/colorBits.d.ts +3 -3
- package/esm/util/colorBits.js +19 -44
- package/esm/util/colorRamp.d.ts +49 -5
- package/esm/util/colorRamp.js +169 -18
- package/esm/util/colorScale.d.ts +156 -0
- package/esm/util/colorScale.js +243 -0
- package/esm/util/colorSchemes.d.ts +21 -0
- package/esm/util/colorSchemes.js +30 -0
- package/esm/util/copyToClipboard.js +8 -1
- package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
- package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
- package/esm/util/createSvgRasterCanvas.d.ts +10 -0
- package/esm/util/cssColorParse.d.ts +15 -0
- package/esm/util/cssColorParse.js +53 -0
- package/esm/util/diagonalizeRegions.d.ts +2 -3
- package/esm/util/diagonalizeRegions.js +8 -13
- package/esm/util/expandLooseSearchIndex.d.ts +19 -0
- package/esm/util/expandLooseSearchIndex.js +29 -0
- package/esm/util/featureTable.d.ts +224 -0
- package/esm/util/featureTable.js +366 -0
- package/esm/util/featureTransforms.d.ts +81 -0
- package/esm/util/featureTransforms.js +1231 -0
- package/esm/util/featureTypes.d.ts +24 -0
- package/esm/util/featureTypes.js +35 -0
- package/esm/util/fetchAndMaybeUnzip.js +16 -9
- package/esm/util/fetchContext.d.ts +7 -8
- package/esm/util/fetchContext.js +3 -3
- package/esm/util/fetchHub.d.ts +4 -2
- package/esm/util/fetchHub.js +2 -2
- package/esm/util/fetchPhases.d.ts +10 -10
- package/esm/util/fetchSeq.d.ts +2 -3
- package/esm/util/fetchSeq.js +2 -2
- package/esm/util/fieldReader.d.ts +17 -0
- package/esm/util/fieldReader.js +62 -0
- package/esm/util/formatBytes.js +1 -1
- package/esm/util/formatGuessers.d.ts +25 -14
- package/esm/util/formatGuessers.js +42 -27
- package/esm/util/formatRelativeTime.js +1 -1
- package/esm/util/freezeDeep.d.ts +8 -10
- package/esm/util/freezeDeep.js +8 -10
- package/esm/util/getLocationUri.d.ts +2 -1
- package/esm/util/getLocationUri.js +8 -2
- package/esm/util/groupKeys.d.ts +76 -0
- package/esm/util/groupKeys.js +156 -0
- package/esm/util/highlights.d.ts +10 -6
- package/esm/util/highlights.js +12 -25
- package/esm/util/hooks.d.ts +31 -2
- package/esm/util/hooks.js +72 -3
- package/esm/util/index.d.ts +11 -11
- package/esm/util/index.js +11 -10
- package/esm/util/indexCandidates.d.ts +1 -31
- package/esm/util/indexCandidates.js +5 -63
- package/esm/util/installFetch.d.ts +77 -37
- package/esm/util/installFetch.js +65 -38
- package/esm/util/installInitAutorun.d.ts +14 -13
- package/esm/util/installInitAutorun.js +17 -17
- package/esm/util/installPrerequisiteFetch.d.ts +115 -0
- package/esm/util/installPrerequisiteFetch.js +111 -0
- package/esm/util/intervals.js +9 -4
- package/esm/util/io/index.js +22 -15
- package/esm/util/isDataCurrent.d.ts +7 -5
- package/esm/util/isDataCurrent.js +9 -6
- package/esm/util/isTextEntryFocused.d.ts +7 -0
- package/esm/util/isTextEntryFocused.js +16 -0
- package/esm/util/jexl.js +24 -21
- package/esm/util/jexlFilterRows.d.ts +89 -0
- package/esm/util/jexlFilterRows.js +252 -0
- package/esm/util/jexlFilters.d.ts +32 -57
- package/esm/util/jexlFilters.js +31 -29
- package/esm/util/jexlStrings.d.ts +3 -4
- package/esm/util/jexlStrings.js +2 -3
- package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
- package/esm/util/layouts/GranularRectLayout.js +25 -8
- package/esm/util/lazyAfterAttach.d.ts +13 -0
- package/esm/util/lazyAfterAttach.js +31 -0
- package/esm/util/lazyWithPreload.d.ts +19 -0
- package/esm/util/lazyWithPreload.js +27 -0
- package/esm/util/legendCandidates.d.ts +72 -0
- package/esm/util/legendCandidates.js +138 -0
- package/esm/util/locString.js +5 -2
- package/esm/util/localStorage.js +4 -4
- package/esm/util/markEncoding.d.ts +150 -0
- package/esm/util/markEncoding.js +885 -0
- package/esm/util/markEncodingTypes.d.ts +595 -0
- package/esm/util/markEncodingTypes.js +8 -0
- package/esm/util/mst-reflection.d.ts +2 -20
- package/esm/util/mst-reflection.js +3 -53
- package/esm/util/mstUtils.d.ts +31 -23
- package/esm/util/mstUtils.js +39 -24
- package/esm/util/numericUtils.d.ts +7 -0
- package/esm/util/numericUtils.js +16 -0
- package/esm/util/numericValue.d.ts +14 -0
- package/esm/util/numericValue.js +34 -0
- package/esm/util/openFeatureWidget.d.ts +5 -0
- package/esm/util/openFeatureWidget.js +2 -2
- package/esm/util/openViews.d.ts +17 -0
- package/esm/util/openViews.js +22 -0
- package/esm/util/parentWalk.d.ts +1 -1
- package/esm/util/parentWalk.js +1 -1
- package/esm/util/parseLineByLine.d.ts +4 -5
- package/esm/util/parseLineByLine.js +8 -14
- package/esm/util/pluginStore.d.ts +6 -8
- package/esm/util/pluginStore.js +17 -16
- package/esm/util/preloadComponent.d.ts +5 -0
- package/esm/util/preloadComponent.js +11 -0
- package/esm/util/progress.d.ts +22 -22
- package/esm/util/progress.js +27 -26
- package/esm/util/quantileExtent.d.ts +49 -0
- package/esm/util/quantileExtent.js +162 -0
- package/esm/util/range.d.ts +13 -9
- package/esm/util/range.js +17 -8
- package/esm/util/renameRegions.d.ts +26 -6
- package/esm/util/renameRegions.js +68 -54
- package/esm/util/renderToStaticMarkup.js +24 -14
- package/esm/util/rxjs.d.ts +23 -8
- package/esm/util/rxjs.js +61 -15
- package/esm/util/samplesTsv.d.ts +49 -0
- package/esm/util/samplesTsv.js +86 -0
- package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
- package/esm/util/scheduleDetachedDestroy.js +24 -0
- package/esm/util/scrollLatch.d.ts +1 -0
- package/esm/util/scrollLatch.js +8 -0
- package/esm/util/selectEncodedFeature.d.ts +16 -0
- package/esm/util/selectEncodedFeature.js +34 -0
- package/esm/util/sessionSharing.d.ts +7 -5
- package/esm/util/sessionSharing.js +23 -23
- package/esm/util/shapeNameList.d.ts +2 -0
- package/esm/util/shapeNameList.js +6 -0
- package/esm/util/shapeNames.d.ts +7 -0
- package/esm/util/shapeNames.js +11 -0
- package/esm/util/simpleFeature.d.ts +0 -1
- package/esm/util/springAnimate.js +1 -1
- package/esm/util/starFusion.d.ts +26 -0
- package/esm/util/starFusion.js +37 -0
- package/esm/util/stepTables.d.ts +96 -0
- package/esm/util/stepTables.js +277 -0
- package/esm/util/svAlt.d.ts +145 -0
- package/esm/util/svAlt.js +364 -0
- package/esm/util/svgColorProps.d.ts +11 -0
- package/esm/util/svgColorProps.js +28 -1
- package/esm/util/systemColorScheme.d.ts +12 -0
- package/esm/util/systemColorScheme.js +27 -0
- package/esm/util/tabix.d.ts +19 -10
- package/esm/util/tabix.js +19 -14
- package/esm/util/thresholdScale.d.ts +91 -0
- package/esm/util/thresholdScale.js +166 -0
- package/esm/util/timeGate.d.ts +4 -5
- package/esm/util/timeGate.js +4 -5
- package/esm/util/trackConfigDelta.d.ts +26 -26
- package/esm/util/trackConfigDelta.js +63 -47
- package/esm/util/tracks.d.ts +120 -66
- package/esm/util/tracks.js +501 -151
- package/esm/util/translateTranscript.d.ts +44 -0
- package/esm/util/translateTranscript.js +102 -0
- package/esm/util/types/data.d.ts +0 -2
- package/esm/util/types/index.d.ts +121 -22
- package/esm/util/types/index.js +9 -0
- package/esm/util/types/mst.d.ts +3 -0
- package/esm/util/types/mst.js +4 -0
- package/esm/util/types/renameIds.d.ts +1 -0
- package/esm/util/types/renameIds.js +29 -0
- package/esm/util/types/services.d.ts +1 -1
- package/esm/util/unknownSnapshotKeys.d.ts +53 -0
- package/esm/util/unknownSnapshotKeys.js +76 -0
- package/esm/util/useFeatureSequence.js +5 -5
- package/esm/util/useFetch.d.ts +3 -4
- package/esm/util/useFetch.js +19 -10
- package/esm/util/useFetchPlugins.d.ts +6 -2
- package/esm/util/useFetchPlugins.js +7 -3
- package/esm/util/usePanZoom.js +10 -3
- package/esm/util/usePanelVirtualScroll.d.ts +7 -35
- package/esm/util/usePanelVirtualScroll.js +9 -36
- package/esm/util/useRafCommit.js +1 -0
- package/esm/util/useRowVirtualScroll.d.ts +6 -29
- package/esm/util/useRowVirtualScroll.js +8 -49
- package/esm/util/useVirtualScrollWheel.d.ts +20 -4
- package/esm/util/useVirtualScrollWheel.js +40 -74
- package/esm/util/viewHighlights.d.ts +3 -0
- package/esm/util/viewHighlights.js +5 -0
- package/esm/util/viewStatus.d.ts +47 -15
- package/esm/util/viewStatus.js +34 -0
- package/esm/util/wheelZoom.d.ts +7 -1
- package/esm/util/wheelZoom.js +85 -19
- package/esm/util/whenViewSettled.d.ts +55 -8
- package/esm/util/whenViewSettled.js +56 -7
- package/esm/util/withFeatureDetails.js +4 -0
- package/esm/util/withLaunchInput.d.ts +174 -0
- package/esm/util/withLaunchInput.js +274 -0
- package/package.json +75 -24
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
- package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
- package/esm/ReExports/BaseFeatureDetails.js +0 -10
- package/esm/ReExports/index.d.ts +0 -1
- package/esm/ReExports/index.js +0 -1
- package/esm/ReExports/publicUtil.d.ts +0 -1
- package/esm/ReExports/publicUtil.js +0 -28
- package/esm/configuration/promotableDefaults.d.ts +0 -199
- package/esm/configuration/promotableDefaults.js +0 -326
- package/esm/configuration/promotablePin.d.ts +0 -55
- package/esm/configuration/promotablePin.js +0 -1
- package/esm/configuration/promotableResolve.d.ts +0 -108
- package/esm/configuration/promotableResolve.js +0 -117
- package/esm/configuration/promotableSlots.d.ts +0 -12
- package/esm/configuration/promotableSlots.js +0 -45
- package/esm/configuration/slotShape.d.ts +0 -12
- package/esm/configuration/slotShape.js +0 -84
- package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
- package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
- package/esm/ui/PinAdornment.d.ts +0 -5
- package/esm/ui/PinAdornment.js +0 -79
- package/esm/ui/SvgGradientLegend.d.ts +0 -26
- package/esm/ui/SvgGradientLegend.js +0 -26
- package/esm/ui/highlightChipReveal.d.ts +0 -32
- package/esm/ui/highlightChipReveal.js +0 -39
- package/esm/ui/promotableMenuItems.d.ts +0 -19
- package/esm/ui/promotableMenuItems.js +0 -89
- package/esm/ui/promotablePinCoverage.d.ts +0 -44
- package/esm/ui/promotablePinCoverage.js +0 -87
- package/esm/util/applyInitSettings.d.ts +0 -79
- package/esm/util/applyInitSettings.js +0 -91
- package/esm/util/openDisplays.d.ts +0 -23
- package/esm/util/openDisplays.js +0 -79
- package/esm/util/stopToken.d.ts +0 -211
- package/esm/util/stopToken.js +0 -438
- /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import CloseIcon from '@mui/icons-material/Close';
|
|
3
|
+
import { Autocomplete, IconButton, ListItemText, MenuItem, TextField, } from '@mui/material';
|
|
4
|
+
import { OPERATORS, stripJexlPrefix, typedField, withField, withOp, } from '../util/jexlFilterRows.js';
|
|
5
|
+
import { makeStyles } from '../util/tss-react/index.js';
|
|
6
|
+
import MonospaceTextField from './MonospaceTextField.js';
|
|
7
|
+
const useStyles = makeStyles()(theme => ({
|
|
8
|
+
row: {
|
|
9
|
+
display: 'flex',
|
|
10
|
+
alignItems: 'flex-start',
|
|
11
|
+
gap: theme.spacing(1),
|
|
12
|
+
marginBottom: theme.spacing(1),
|
|
13
|
+
},
|
|
14
|
+
field: {
|
|
15
|
+
width: 220,
|
|
16
|
+
flexShrink: 0,
|
|
17
|
+
},
|
|
18
|
+
op: {
|
|
19
|
+
width: 130,
|
|
20
|
+
flexShrink: 0,
|
|
21
|
+
},
|
|
22
|
+
value: {
|
|
23
|
+
flex: 1,
|
|
24
|
+
},
|
|
25
|
+
expression: {
|
|
26
|
+
width: 24,
|
|
27
|
+
flexShrink: 0,
|
|
28
|
+
textAlign: 'center',
|
|
29
|
+
fontStyle: 'italic',
|
|
30
|
+
fontFamily: 'serif',
|
|
31
|
+
fontSize: 18,
|
|
32
|
+
paddingTop: 6,
|
|
33
|
+
color: theme.palette.text.secondary,
|
|
34
|
+
},
|
|
35
|
+
}));
|
|
36
|
+
export function compileError(line, jexl) {
|
|
37
|
+
try {
|
|
38
|
+
jexl.compile(stripJexlPrefix(line.trim()));
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
return e instanceof Error ? e.message : String(e);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function RemoveButton({ onClick }) {
|
|
46
|
+
return (_jsx(IconButton, { size: "small", "aria-label": "Remove condition", onClick: onClick, children: _jsx(CloseIcon, { fontSize: "small" }) }));
|
|
47
|
+
}
|
|
48
|
+
function ValueInput({ row, onChange, }) {
|
|
49
|
+
const { classes } = useStyles();
|
|
50
|
+
const { field, op, value } = row;
|
|
51
|
+
if (op === 'set' || op === '!set') {
|
|
52
|
+
return _jsx("div", { className: classes.value });
|
|
53
|
+
}
|
|
54
|
+
const suggestions = field?.values ?? [];
|
|
55
|
+
if (op === 'in') {
|
|
56
|
+
return (_jsx(Autocomplete, { className: classes.value, size: "small", multiple: true, freeSolo: true, autoSelect: true, options: suggestions, value: [value].flat(), onChange: (_, next) => {
|
|
57
|
+
onChange({ ...row, value: next });
|
|
58
|
+
}, renderInput: params => (_jsx(TextField, { ...params, placeholder: "Values, Enter after each" })) }));
|
|
59
|
+
}
|
|
60
|
+
const text = [value].flat()[0] ?? '';
|
|
61
|
+
return suggestions.length > 0 && op !== '~' ? (_jsx(Autocomplete, { className: classes.value, size: "small", freeSolo: true, options: suggestions, inputValue: text, onInputChange: (_, next) => {
|
|
62
|
+
onChange({ ...row, value: next });
|
|
63
|
+
}, renderInput: params => _jsx(TextField, { ...params, placeholder: "Value" }) })) : (_jsx(TextField, { className: classes.value, size: "small", placeholder: op === '~' ? 'Regular expression' : 'Value', type: field?.type === 'number' ? 'number' : 'text', disabled: !field, value: text, onChange: event => {
|
|
64
|
+
onChange({ ...row, value: event.target.value });
|
|
65
|
+
} }));
|
|
66
|
+
}
|
|
67
|
+
export function ConditionRowEditor({ row, choices, onChange, onRemove, }) {
|
|
68
|
+
const { classes } = useStyles();
|
|
69
|
+
const { field } = row;
|
|
70
|
+
const grouped = choices.some(choice => choice.group);
|
|
71
|
+
return (_jsxs("div", { className: classes.row, children: [_jsx(Autocomplete, { className: classes.field, size: "small", freeSolo: true, autoSelect: true, options: choices, groupBy: grouped ? choice => choice.group ?? '' : undefined, getOptionLabel: choice => typeof choice === 'string' ? choice : choice.label, getOptionKey: choice => typeof choice === 'string' ? choice : choice.key, isOptionEqualToValue: (a, b) => typeof b !== 'string' && a.key === b.key, value: field ?? null, onChange: (_, next) => {
|
|
72
|
+
const chosen = typeof next !== 'string'
|
|
73
|
+
? next
|
|
74
|
+
: next === field?.label
|
|
75
|
+
? field
|
|
76
|
+
: (choices.find(choice => choice.label === next) ??
|
|
77
|
+
typedField(next));
|
|
78
|
+
if (chosen && chosen.key !== field?.key) {
|
|
79
|
+
onChange(withField(row, chosen));
|
|
80
|
+
}
|
|
81
|
+
}, renderOption: ({ key, ...props }, choice) => (_jsx("li", { ...props, children: _jsx(ListItemText, { primary: choice.label, secondary: choice.description }) }, key)), renderInput: params => _jsx(TextField, { ...params, placeholder: "Field" }) }), _jsx(TextField, { className: classes.op, select: true, size: "small", disabled: !field, value: row.op, helperText: field?.multi ? 'any value' : undefined, onChange: event => {
|
|
82
|
+
onChange(withOp(row, event.target.value));
|
|
83
|
+
}, children: OPERATORS[field?.type ?? 'any'].map(({ op, label }) => (_jsx(MenuItem, { value: op, children: label }, op))) }), _jsx(ValueInput, { row: row, onChange: onChange }), _jsx(RemoveButton, { onClick: onRemove })] }));
|
|
84
|
+
}
|
|
85
|
+
export function TextRowEditor({ row, jexl, onChange, onRemove, }) {
|
|
86
|
+
const { classes } = useStyles();
|
|
87
|
+
return (_jsxs("div", { className: classes.row, children: [_jsx("div", { className: classes.expression, title: "An expression the field pickers cannot show", children: "\u0192" }), _jsx(MonospaceTextField, { className: classes.value, variant: "standard", fullWidth: true, value: row.text, error: compileError(row.text, jexl), onChange: text => {
|
|
88
|
+
onChange({ ...row, text });
|
|
89
|
+
} }), _jsx(RemoveButton, { onClick: onRemove })] }));
|
|
90
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Suspense, lazy } from 'react';
|
|
3
|
+
// The tooltip, behind its own chunk: @floating-ui is ~266KB and this is what
|
|
4
|
+
// lets the ui barrel export it without putting that on the startup path. A
|
|
5
|
+
// consumer that wants the eager component deep-imports './BaseTooltip.tsx'.
|
|
6
|
+
const Lazy = lazy(() => import('./BaseTooltip.js'));
|
|
7
|
+
export default function LazyBaseTooltip(props) {
|
|
8
|
+
return (_jsx(Suspense, { fallback: null, children: _jsx(Lazy, { ...props }) }));
|
|
9
|
+
}
|
|
@@ -1,25 +1,30 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
//
|
|
6
|
-
//
|
|
2
|
+
import { appendGlyph } from '@jbrowse/render-core/marks/glyphPaint';
|
|
3
|
+
import { DIAMOND_GLYPH_SCALE } from '@jbrowse/render-core/shaders/pointMarkConsts';
|
|
4
|
+
import { SHAPE_CODES } from '../util/shapeNames.js';
|
|
5
|
+
// The point mark's own painter, recorded as SVG path data, so the key draws
|
|
6
|
+
// the glyph the plot draws. The diamond paints wider than its diameter and
|
|
7
|
+
// is scaled down to fit the box.
|
|
8
|
+
function glyphPathData(shape, size, x, y) {
|
|
9
|
+
const d = [];
|
|
10
|
+
const path = {
|
|
11
|
+
moveTo: (px, py) => d.push(`M${px} ${py}`),
|
|
12
|
+
lineTo: (px, py) => d.push(`L${px} ${py}`),
|
|
13
|
+
closePath: () => d.push('Z'),
|
|
14
|
+
rect: (px, py, w, h) => d.push(`M${px} ${py}h${w}v${h}h${-w}Z`),
|
|
15
|
+
arc: (cx, cy, r) => d.push(`A${r} ${r} 0 1 0 ${cx - r} ${cy}A${r} ${r} 0 1 0 ${cx + r} ${cy}Z`),
|
|
16
|
+
};
|
|
17
|
+
const diameter = shape === 'diamond' ? size / DIAMOND_GLYPH_SCALE : size;
|
|
18
|
+
appendGlyph(path, SHAPE_CODES[shape], x + size / 2, y + size / 2, diameter);
|
|
19
|
+
return d.join('');
|
|
20
|
+
}
|
|
21
|
+
// The one place that decides what a legend swatch looks like. Returns a bare
|
|
22
|
+
// shape rather than a rooted <svg>, so the floating legend (which wraps it in an
|
|
23
|
+
// inline <svg>) and the SVG export (which drops it into a row <g>) draw the
|
|
24
|
+
// identical box.
|
|
7
25
|
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
26
|
+
// The shape fills the `size` box from (x, y) so a caller can lay swatches out on
|
|
27
|
+
// a fixed pitch.
|
|
10
28
|
export function LegendSwatchGlyph({ swatch, size, x = 0, y = 0, }) {
|
|
11
|
-
|
|
12
|
-
// Thin enough to read as a stroke next to a solid block, thick enough to
|
|
13
|
-
// carry a color at 10-12px.
|
|
14
|
-
const strokeWidth = Math.max(2, Math.round(size / 5));
|
|
15
|
-
if (mark === 'line') {
|
|
16
|
-
return (_jsx("line", { x1: x, x2: x + size, y1: y + size / 2, y2: y + size / 2, stroke: color, strokeWidth: strokeWidth }));
|
|
17
|
-
}
|
|
18
|
-
if (mark === 'curve') {
|
|
19
|
-
// An arc bulging up out of the box's lower corners, which is the shape of
|
|
20
|
-
// the connector itself — a pair of endpoints with the curve between them.
|
|
21
|
-
const inset = strokeWidth / 2;
|
|
22
|
-
return (_jsx("path", { d: `M${x},${y + size - inset} Q${x + size / 2},${y - size / 3} ${x + size},${y + size - inset}`, fill: "none", stroke: color, strokeWidth: strokeWidth }));
|
|
23
|
-
}
|
|
24
|
-
return _jsx("rect", { x: x, y: y, width: size, height: size, fill: color });
|
|
29
|
+
return swatch.shape ? (_jsx("path", { d: glyphPathData(swatch.shape, size, x, y), fill: swatch.color })) : (_jsx("rect", { x: x, y: y, width: size, height: size, fill: swatch.color }));
|
|
25
30
|
}
|
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns false, then flips true once `active` has stayed true continuously for
|
|
3
|
+
* `delayMs`. Each activation gets a fresh delay, and the flag drops the moment
|
|
4
|
+
* `active` does.
|
|
5
|
+
*
|
|
6
|
+
* Keyed on a count of RISING edges rather than on `active` itself, so the
|
|
7
|
+
* falling edge does no work at all. A display refetching through a wheel zoom
|
|
8
|
+
* flips `active` several times a second — it finishes a fetch, waits out the
|
|
9
|
+
* debounce, starts the next — and an effect depending on `active` tore its timer
|
|
10
|
+
* down and built a new one on each of those, twice over, for a scrim that by
|
|
11
|
+
* construction never appears. Deriving the flag from a comparison instead means
|
|
12
|
+
* one `setTimeout` per loading pulse, which is the floor for these semantics.
|
|
13
|
+
*/
|
|
14
|
+
export declare function useDelayedFlag(active: boolean, delayMs: number): boolean;
|
|
1
15
|
export default function LoadingOverlay({ statusMessage, progress, isVisible, immediate, canceled, onCancel, onRetry, }: {
|
|
2
16
|
statusMessage?: string;
|
|
3
17
|
progress?: number;
|
package/esm/ui/LoadingOverlay.js
CHANGED
|
@@ -27,7 +27,7 @@ const flashDelayMs = 250;
|
|
|
27
27
|
* construction never appears. Deriving the flag from a comparison instead means
|
|
28
28
|
* one `setTimeout` per loading pulse, which is the floor for these semantics.
|
|
29
29
|
*/
|
|
30
|
-
function useDelayedFlag(active, delayMs) {
|
|
30
|
+
export function useDelayedFlag(active, delayMs) {
|
|
31
31
|
const [previous, setPrevious] = useState(active);
|
|
32
32
|
const [activation, setActivation] = useState(0);
|
|
33
33
|
if (previous !== active) {
|
|
@@ -129,7 +129,9 @@ export default function LoadingOverlay({ statusMessage, progress, isVisible, imm
|
|
|
129
129
|
// swallow clicks/hovers over the top-center of every track it overlays. There
|
|
130
130
|
// is no fade transition, so mount/unmount is visually identical to toggling
|
|
131
131
|
// opacity anyway.
|
|
132
|
-
|
|
132
|
+
// `loading-overlay` is a readiness selector meaning work in flight, so the
|
|
133
|
+
// canceled state, which is finished, publishes its own
|
|
134
|
+
return shown ? (_jsx("span", { className: classes.overlay, "data-testid": canceled ? 'loading-overlay-canceled' : 'loading-overlay', children: _jsx("span", { className: classes.content, children: canceled ? (_jsxs("span", { className: classes.row, children: [_jsx("span", { className: classes.text, children: "Loading canceled" }), onRetry ? (_jsx(Tooltip, { title: "Retry", children: _jsx(IconButton, { size: "small", "data-testid": "loading-overlay-retry", onClick: () => {
|
|
133
135
|
onRetry();
|
|
134
136
|
}, children: _jsx(RefreshIcon, { fontSize: "inherit" }) }) })) : null] })) : (_jsxs(_Fragment, { children: [_jsxs("span", { className: classes.row, children: [_jsxs("span", { className: classes.text, children: [progressLabel(statusMessage || 'Loading', progress), hasProgress ? null : _jsx(LoadingDots, {})] }), onCancel && cancelable ? (_jsx(Tooltip, { title: "Cancel", children: _jsx(IconButton, { size: "small", "data-testid": "loading-overlay-cancel", onClick: () => {
|
|
135
137
|
onCancel();
|
package/esm/ui/MenuTypes.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { Pin } from '../configuration/promotablePin.ts';
|
|
2
1
|
/** #menuItem divider | a horizontal rule; not clickable */
|
|
3
2
|
export interface MenuDivider {
|
|
4
3
|
priority?: number;
|
|
@@ -12,7 +11,15 @@ export interface MenuSubHeader {
|
|
|
12
11
|
}
|
|
13
12
|
export type MenuItemClickHandler = (...args: any[]) => void;
|
|
14
13
|
export interface BaseMenuItem {
|
|
15
|
-
/**
|
|
14
|
+
/**
|
|
15
|
+
* #menuField stable identifier; keys the row, and finds it again from a test
|
|
16
|
+
*
|
|
17
|
+
* Worth setting on a row the menu cannot otherwise tell apart — one whose
|
|
18
|
+
* `label` is an element, or one a list may repeat the text of. A level's keys
|
|
19
|
+
* are unique either way (`rowKeys` suffixes a repeat), so this is what keeps a
|
|
20
|
+
* row's React identity when the rows around it reorder rather than something
|
|
21
|
+
* the menu needs to draw correctly.
|
|
22
|
+
*/
|
|
16
23
|
id?: string;
|
|
17
24
|
/** #menuField the row's text */
|
|
18
25
|
label: React.ReactNode;
|
|
@@ -51,7 +58,7 @@ export interface BaseMenuItem {
|
|
|
51
58
|
*/
|
|
52
59
|
keepMenuOpen?: boolean;
|
|
53
60
|
/**
|
|
54
|
-
* #menuField arbitrary trailing content
|
|
61
|
+
* #menuField arbitrary trailing content
|
|
55
62
|
*
|
|
56
63
|
* Extra content rendered at the trailing (right) edge of the row, after the
|
|
57
64
|
* checkbox/radio decoration and help icon — e.g. a secondary toggle. The
|
|
@@ -59,56 +66,10 @@ export interface BaseMenuItem {
|
|
|
59
66
|
* onClick or dismiss the menu.
|
|
60
67
|
*
|
|
61
68
|
* An **element**, so a module that sets it drags React and whatever it renders
|
|
62
|
-
* into its own graph.
|
|
63
|
-
*
|
|
64
|
-
* a description instead. Prefer `pin`; reach for this only when the
|
|
65
|
-
* content is genuinely arbitrary.
|
|
69
|
+
* into its own graph. Reach for it only when the content is genuinely
|
|
70
|
+
* arbitrary — synteny's and wiggle's colour swatches are what it exists for.
|
|
66
71
|
*/
|
|
67
72
|
endAdornment?: React.ReactNode;
|
|
68
|
-
/**
|
|
69
|
-
* #menuField the "apply this to all open tracks of this type" pin; set it with a promotable builder
|
|
70
|
-
*
|
|
71
|
-
* The trailing "default for all tracks of this type" pin, as a **description**
|
|
72
|
-
* rather than an element — the renderer builds `PinAdornment` from
|
|
73
|
-
* it. Same rule as a `TrackControlProps` icon name (reference/DISPLAYCHROME.md):
|
|
74
|
-
* menu-item builders are called from state models and menu modules, which are
|
|
75
|
-
* eager, so an element here puts MUI's `ToggleButton`, `Tooltip` and two icons
|
|
76
|
-
* into every host's first paint. It did, until 2026-08-05; see
|
|
77
|
-
* reference/EAGER_BUNDLE.md.
|
|
78
|
-
*
|
|
79
|
-
* Set it through `promotableToggleItem` / `promotableRadioItems` (or
|
|
80
|
-
* `promotableRadioItem` for a lone row), not by hand.
|
|
81
|
-
*
|
|
82
|
-
* A `type: 'custom'` row (`makePromotableSizeMenu`) draws its own pin inside
|
|
83
|
-
* its rendered content and still sets this — the declaration is what lets a
|
|
84
|
-
* built menu be asked which promotable slots it offers a pin for at all. Such
|
|
85
|
-
* a row is excluded from the trailing-column reservation; see
|
|
86
|
-
* `hasMenuItemAdornment`.
|
|
87
|
-
*/
|
|
88
|
-
pin?: MenuItemPin;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* A row's pin declaration: the {@link Pin} `makePin` built, plus the one thing
|
|
92
|
-
* the row knows and the pin doesn't — what to call the setting.
|
|
93
|
-
*
|
|
94
|
-
* **`control` holds the pin by reference; don't flatten this into
|
|
95
|
-
* `interface MenuItemPin extends Pin`.** That was tried, to save the hop every
|
|
96
|
-
* reader spells (`item.pin.control.active`), and it turns the declaration into a
|
|
97
|
-
* *copy* of the control — so a `Pin` whose `toggle` resolves anything through
|
|
98
|
-
* `this` silently mutates the copy and the real control never changes. Nothing in
|
|
99
|
-
* `Pin` promises copy-safety: `makePin` happens to close over what it needs, but
|
|
100
|
-
* the interface is a plain object a plugin can build by hand, and the failure is
|
|
101
|
-
* a pin that draws correctly and does nothing. Two hops in `pinnedSlots` and
|
|
102
|
-
* `menuItemAdornment` is the whole cost of not having that.
|
|
103
|
-
*/
|
|
104
|
-
export interface MenuItemPin {
|
|
105
|
-
control: Pin;
|
|
106
|
-
/**
|
|
107
|
-
* Names the setting in the pin's tooltip and aria-label. Carried here rather
|
|
108
|
-
* than read off the row's `label`, which is a `ReactNode` and may not be a
|
|
109
|
-
* string; a pin that can't name what it promotes reads as a bug.
|
|
110
|
-
*/
|
|
111
|
-
label: string;
|
|
112
73
|
}
|
|
113
74
|
/** #menuItem normal | an action row; the default when `type` is omitted */
|
|
114
75
|
export interface NormalMenuItem extends BaseMenuItem {
|
|
@@ -127,11 +88,20 @@ export interface RadioMenuItem extends BaseMenuItem {
|
|
|
127
88
|
checked: boolean;
|
|
128
89
|
onClick: MenuItemClickHandler;
|
|
129
90
|
}
|
|
130
|
-
/**
|
|
91
|
+
/**
|
|
92
|
+
* #menuItem subMenu | nests another `MenuItem[]`, or a function building one, to any depth
|
|
93
|
+
*
|
|
94
|
+
* The function form is called when the submenu opens (or a walker asks for its
|
|
95
|
+
* rows), not when the parent menu is built — for a submenu whose rows cost a
|
|
96
|
+
* scan of the display's data to name. Read the field through `resolveSubMenu`
|
|
97
|
+
* rather than by hand, so the two forms stay one thing to the renderer and to
|
|
98
|
+
* every test helper that flattens a menu.
|
|
99
|
+
*/
|
|
131
100
|
export interface SubMenuItem extends BaseMenuItem {
|
|
132
101
|
type?: 'subMenu';
|
|
133
|
-
subMenu: MenuItem[];
|
|
102
|
+
subMenu: MenuItem[] | (() => MenuItem[]);
|
|
134
103
|
}
|
|
104
|
+
export declare function resolveSubMenu(item: SubMenuItem): MenuItem[];
|
|
135
105
|
/**
|
|
136
106
|
* #menuItem custom | renders arbitrary React content inline, e.g. a slider
|
|
137
107
|
*
|
package/esm/ui/MenuTypes.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { TextFieldProps } from '@mui/material';
|
|
2
|
-
export default function MonospaceTextField({ value, onChange, error, label, children, style, className, readOnly, variant, ...rest }: {
|
|
2
|
+
export default function MonospaceTextField({ value, onChange, error, label, children, style, className, readOnly, inputTestId, helperText, variant, ...rest }: {
|
|
3
3
|
value: string;
|
|
4
4
|
onChange?: (value: string) => void;
|
|
5
5
|
error?: unknown;
|
|
6
6
|
label?: React.ReactNode;
|
|
7
7
|
children?: React.ReactNode;
|
|
8
8
|
readOnly?: boolean;
|
|
9
|
+
inputTestId?: string;
|
|
9
10
|
} & Omit<TextFieldProps, 'value' | 'onChange' | 'error' | 'slotProps'>): import("react").JSX.Element;
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { InputLabel, TextField
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { InputLabel, TextField } from '@mui/material';
|
|
3
3
|
import { makeStyles } from '../util/tss-react/index.js';
|
|
4
|
+
import { alpha } from './palette.js';
|
|
4
5
|
const monospaceFontFamily = 'Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace';
|
|
5
6
|
const useStyles = makeStyles()(theme => ({
|
|
6
|
-
error: {
|
|
7
|
-
color: theme.palette.error.main,
|
|
8
|
-
fontSize: '0.8em',
|
|
9
|
-
},
|
|
10
7
|
container: {
|
|
11
8
|
width: '100%',
|
|
12
9
|
overflowX: 'auto',
|
|
@@ -18,20 +15,26 @@ const useStyles = makeStyles()(theme => ({
|
|
|
18
15
|
background: alpha(theme.palette.error.main, 0.15),
|
|
19
16
|
},
|
|
20
17
|
}));
|
|
21
|
-
// Monospace multiline TextField for code/jexl/JSON/sequence content.
|
|
22
|
-
//
|
|
23
|
-
//
|
|
18
|
+
// Monospace multiline TextField for code/jexl/JSON/sequence content. A parse
|
|
19
|
+
// error turns it red and takes the helper text's place under the field, so
|
|
20
|
+
// the text does not move while it flips between valid and invalid. `children`
|
|
24
21
|
// render below the field (e.g. a description or help button).
|
|
25
|
-
export default function MonospaceTextField({ value, onChange, error, label, children, style, className, readOnly, variant = 'outlined', ...rest }) {
|
|
22
|
+
export default function MonospaceTextField({ value, onChange, error, label, children, style, className, readOnly, inputTestId, helperText, variant = 'outlined', ...rest }) {
|
|
26
23
|
const { classes, cx } = useStyles();
|
|
27
|
-
return (_jsxs(
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
24
|
+
return (_jsxs("div", { className: classes.container, children: [label ? _jsx(InputLabel, { shrink: true, children: label }) : null, _jsx(TextField, { ...rest, variant: variant, multiline: true, error: !!error, helperText: error ? `${error}` : helperText, value: value, onChange: event => {
|
|
25
|
+
onChange?.(event.target.value);
|
|
26
|
+
}, className: cx(className, error ? classes.errorField : undefined), style: style, slotProps: {
|
|
27
|
+
input: {
|
|
28
|
+
readOnly,
|
|
29
|
+
classes: {
|
|
30
|
+
input: classes.field,
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
htmlInput: {
|
|
34
|
+
'data-testid': inputTestId,
|
|
35
|
+
spellCheck: false,
|
|
36
|
+
autoCorrect: 'off',
|
|
37
|
+
autoCapitalize: 'off',
|
|
38
|
+
},
|
|
39
|
+
} }), children] }));
|
|
37
40
|
}
|
|
@@ -39,9 +39,9 @@ export interface ThemeModeSession {
|
|
|
39
39
|
* follow its dark mode mounts {@link SessionPaletteProvider}, which is this
|
|
40
40
|
* hook and the provider in one.
|
|
41
41
|
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
42
|
+
* Pass no mode and JBrowse follows the page: its declared CSS `color-scheme`
|
|
43
|
+
* when that names one of light or dark, the OS preference otherwise, tracking
|
|
44
|
+
* both. A host whose mode lives somewhere a stylesheet cannot see passes it.
|
|
45
45
|
*
|
|
46
46
|
* **Both halves are load-bearing, which is why the pairing is published as a
|
|
47
47
|
* component.** The palette is what *React* draws with; the config `theme` slot
|
|
@@ -55,7 +55,7 @@ export interface ThemeModeSession {
|
|
|
55
55
|
* the previous palette. That is a frame on a canvas that is about to be
|
|
56
56
|
* redrawn anyway; it is not somewhere to add a suspense boundary.
|
|
57
57
|
*/
|
|
58
|
-
export declare function useSessionPalette(session: ThemeModeSession, mode
|
|
58
|
+
export declare function useSessionPalette(session: ThemeModeSession, mode?: 'light' | 'dark'): JBrowsePalette;
|
|
59
59
|
/**
|
|
60
60
|
* #api
|
|
61
61
|
* Make JBrowse follow the host's light/dark state — the whole of it, in one
|
|
@@ -67,6 +67,11 @@ export declare function useSessionPalette(session: ThemeModeSession, mode: 'ligh
|
|
|
67
67
|
* </SessionPaletteProvider>
|
|
68
68
|
* ```
|
|
69
69
|
*
|
|
70
|
+
* `mode` is optional. Left out, JBrowse follows the page's declared
|
|
71
|
+
* `color-scheme` — so a host whose dark-mode toggle sets it, as most do, mounts
|
|
72
|
+
* this with a session and nothing else — and the OS preference where the page
|
|
73
|
+
* declares none.
|
|
74
|
+
*
|
|
70
75
|
* A component rather than a documented pair of calls because the pair has a
|
|
71
76
|
* half that can be left out with nothing to show for it. `PaletteProvider` is
|
|
72
77
|
* the name a host reaches for, and it colors the React side alone; the session
|
|
@@ -80,6 +85,6 @@ export declare function useSessionPalette(session: ThemeModeSession, mode: 'ligh
|
|
|
80
85
|
*/
|
|
81
86
|
export declare function SessionPaletteProvider({ session, mode, children, }: {
|
|
82
87
|
session: ThemeModeSession;
|
|
83
|
-
mode
|
|
88
|
+
mode?: 'light' | 'dark';
|
|
84
89
|
children: ReactNode;
|
|
85
90
|
}): import("react").JSX.Element;
|
package/esm/ui/PaletteContext.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { createContext, use, useEffect, useMemo } from 'react';
|
|
2
|
+
import { createContext, use, useEffect, useMemo, useSyncExternalStore, } from 'react';
|
|
3
|
+
import { onColorSchemeChange, prefersDarkColorScheme, } from '../util/systemColorScheme.js';
|
|
3
4
|
import { defaultStyleTheme } from './styleTheme.js';
|
|
4
5
|
/**
|
|
5
6
|
* How a React component asks for JBrowse's design tokens.
|
|
@@ -47,6 +48,37 @@ export function useStyleTheme() {
|
|
|
47
48
|
export function usePalette() {
|
|
48
49
|
return useStyleTheme().palette;
|
|
49
50
|
}
|
|
51
|
+
function subscribeToColorScheme(onChange) {
|
|
52
|
+
const unsubscribe = onColorSchemeChange(onChange);
|
|
53
|
+
const observer = typeof MutationObserver === 'function'
|
|
54
|
+
? new MutationObserver(onChange)
|
|
55
|
+
: undefined;
|
|
56
|
+
observer?.observe(document.documentElement, { attributes: true });
|
|
57
|
+
return () => {
|
|
58
|
+
unsubscribe();
|
|
59
|
+
observer?.disconnect();
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// The page's declared `color-scheme`, as the browser resolves it for form
|
|
63
|
+
// controls: a page that declares only one of light or dark gets that one, and
|
|
64
|
+
// one that declares both, or neither, gets the OS preference.
|
|
65
|
+
function readColorScheme() {
|
|
66
|
+
const declared = getComputedStyle(document.documentElement)
|
|
67
|
+
.getPropertyValue('color-scheme')
|
|
68
|
+
.split(/\s+/)
|
|
69
|
+
.filter((word) => ['light', 'dark'].includes(word));
|
|
70
|
+
return declared.length === 1
|
|
71
|
+
? declared[0]
|
|
72
|
+
: prefersDarkColorScheme()
|
|
73
|
+
? 'dark'
|
|
74
|
+
: 'light';
|
|
75
|
+
}
|
|
76
|
+
const alwaysLight = () => 'light';
|
|
77
|
+
const subscribeToNothing = () => () => { };
|
|
78
|
+
function useResolvedMode(mode) {
|
|
79
|
+
const systemMode = useSyncExternalStore(mode === undefined ? subscribeToColorScheme : subscribeToNothing, mode === undefined ? readColorScheme : alwaysLight, alwaysLight);
|
|
80
|
+
return mode === undefined ? systemMode : mode;
|
|
81
|
+
}
|
|
50
82
|
/**
|
|
51
83
|
* Point a session at light or dark and get back the palette it resolves to,
|
|
52
84
|
* for a host that wants the palette itself — to read a color out of, or to
|
|
@@ -54,9 +86,9 @@ export function usePalette() {
|
|
|
54
86
|
* follow its dark mode mounts {@link SessionPaletteProvider}, which is this
|
|
55
87
|
* hook and the provider in one.
|
|
56
88
|
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
89
|
+
* Pass no mode and JBrowse follows the page: its declared CSS `color-scheme`
|
|
90
|
+
* when that names one of light or dark, the OS preference otherwise, tracking
|
|
91
|
+
* both. A host whose mode lives somewhere a stylesheet cannot see passes it.
|
|
60
92
|
*
|
|
61
93
|
* **Both halves are load-bearing, which is why the pairing is published as a
|
|
62
94
|
* component.** The palette is what *React* draws with; the config `theme` slot
|
|
@@ -71,9 +103,10 @@ export function usePalette() {
|
|
|
71
103
|
* redrawn anyway; it is not somewhere to add a suspense boundary.
|
|
72
104
|
*/
|
|
73
105
|
export function useSessionPalette(session, mode) {
|
|
106
|
+
const resolved = useResolvedMode(mode);
|
|
74
107
|
useEffect(() => {
|
|
75
|
-
session.setThemeMode(
|
|
76
|
-
}, [session,
|
|
108
|
+
session.setThemeMode(resolved);
|
|
109
|
+
}, [session, resolved]);
|
|
77
110
|
return session.palette;
|
|
78
111
|
}
|
|
79
112
|
/**
|
|
@@ -87,6 +120,11 @@ export function useSessionPalette(session, mode) {
|
|
|
87
120
|
* </SessionPaletteProvider>
|
|
88
121
|
* ```
|
|
89
122
|
*
|
|
123
|
+
* `mode` is optional. Left out, JBrowse follows the page's declared
|
|
124
|
+
* `color-scheme` — so a host whose dark-mode toggle sets it, as most do, mounts
|
|
125
|
+
* this with a session and nothing else — and the OS preference where the page
|
|
126
|
+
* declares none.
|
|
127
|
+
*
|
|
90
128
|
* A component rather than a documented pair of calls because the pair has a
|
|
91
129
|
* half that can be left out with nothing to show for it. `PaletteProvider` is
|
|
92
130
|
* the name a host reaches for, and it colors the React side alone; the session
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Assembly } from '../../assemblyManager/assembly.ts';
|
|
2
|
+
import type { TrackCatalog } from '../../util/index.ts';
|
|
3
|
+
import type { Option } from './util.ts';
|
|
4
|
+
import type { HTMLAttributes, Key } from 'react';
|
|
5
|
+
declare const SearchOption: ({ props, option, session, assembly, }: {
|
|
6
|
+
props: HTMLAttributes<HTMLLIElement> & {
|
|
7
|
+
key: Key;
|
|
8
|
+
};
|
|
9
|
+
option: Option;
|
|
10
|
+
session: TrackCatalog;
|
|
11
|
+
assembly?: Assembly;
|
|
12
|
+
}) => import("react").JSX.Element;
|
|
13
|
+
export default SearchOption;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { observer } from 'mobx-react';
|
|
3
|
+
import { groupByPlace } from '../../TextSearch/places.js';
|
|
4
|
+
import { getTrackName } from '../../util/tracks.js';
|
|
5
|
+
import { makeStyles } from '../../util/tss-react/index.js';
|
|
6
|
+
import { optionDetail } from './util.js';
|
|
7
|
+
const useStyles = makeStyles()(theme => ({
|
|
8
|
+
row: {
|
|
9
|
+
display: 'flex',
|
|
10
|
+
alignItems: 'baseline',
|
|
11
|
+
gap: theme.spacing(2),
|
|
12
|
+
},
|
|
13
|
+
label: {
|
|
14
|
+
flexShrink: 0,
|
|
15
|
+
whiteSpace: 'nowrap',
|
|
16
|
+
},
|
|
17
|
+
detail: {
|
|
18
|
+
marginLeft: 'auto',
|
|
19
|
+
minWidth: 0,
|
|
20
|
+
overflow: 'hidden',
|
|
21
|
+
textOverflow: 'ellipsis',
|
|
22
|
+
whiteSpace: 'nowrap',
|
|
23
|
+
fontSize: '0.8em',
|
|
24
|
+
color: theme.palette.text.secondary,
|
|
25
|
+
},
|
|
26
|
+
}));
|
|
27
|
+
const SearchOption = observer(function SearchOption({ props, option, session, assembly, }) {
|
|
28
|
+
const { classes, cx } = useStyles();
|
|
29
|
+
const { key, className, ...rest } = props;
|
|
30
|
+
const { result } = option;
|
|
31
|
+
const detail = optionDetail(result, {
|
|
32
|
+
trackNameOf: trackId => {
|
|
33
|
+
const conf = session.getTrackById(trackId);
|
|
34
|
+
return conf ? getTrackName(conf, session) : undefined;
|
|
35
|
+
},
|
|
36
|
+
lengthOf: refName => {
|
|
37
|
+
const index = assembly?.refNameToIndex?.get(refName);
|
|
38
|
+
const region = index === undefined ? undefined : assembly?.regions?.[index];
|
|
39
|
+
return region ? region.end - region.start : undefined;
|
|
40
|
+
},
|
|
41
|
+
placesOf: results => groupByPlace(results, assembly),
|
|
42
|
+
});
|
|
43
|
+
return (_jsxs("li", { className: cx(className, classes.row), ...rest, children: [_jsx("span", { className: classes.label, children: result.getDisplayString() }), detail ? _jsx("span", { className: classes.detail, children: detail }) : null] }, key));
|
|
44
|
+
});
|
|
45
|
+
export default SearchOption;
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import type BaseResult from '../../TextSearch/BaseResults.ts';
|
|
2
2
|
import type { AbstractSessionModel } from '../../util/index.ts';
|
|
3
|
-
import type { StopToken } from '../../util/stopToken.ts';
|
|
4
3
|
import type { CSSProperties, ReactNode } from 'react';
|
|
5
4
|
declare const RefNameAutocomplete: ({ session, assemblyName, value, fetchResults, onSelect, onChange, minWidth, maxWidth, adornmentWidth, style, endAdornment, helperText, inputStyle, }: {
|
|
6
5
|
session: AbstractSessionModel;
|
|
7
6
|
assemblyName?: string;
|
|
8
7
|
value?: string;
|
|
9
|
-
fetchResults: (query: string,
|
|
8
|
+
fetchResults: (query: string, signal?: AbortSignal) => Promise<BaseResult[]>;
|
|
10
9
|
onSelect?: (region: BaseResult) => void;
|
|
11
10
|
onChange?: (val: string) => void;
|
|
12
11
|
minWidth?: number;
|
|
@@ -4,6 +4,7 @@ import { Autocomplete, TextField } from '@mui/material';
|
|
|
4
4
|
import { observer } from 'mobx-react';
|
|
5
5
|
import { useDebounce } from '../../util/hooks.js';
|
|
6
6
|
import { useFetch } from '../../util/useFetch.js';
|
|
7
|
+
import SearchOption from './SearchOption.js';
|
|
7
8
|
import { cap, coerceToResult, getDeduplicatedResult, getInputWidth, getOptionLabel, getRefNameOptions, } from './util.js';
|
|
8
9
|
const RefNameAutocomplete = observer(function RefNameAutocomplete({ session, assemblyName, value, fetchResults, onSelect, onChange, minWidth = 200, maxWidth = 550, adornmentWidth, style, endAdornment, helperText, inputStyle, }) {
|
|
9
10
|
const { assemblyManager } = session;
|
|
@@ -24,7 +25,7 @@ const RefNameAutocomplete = observer(function RefNameAutocomplete({ session, ass
|
|
|
24
25
|
// the named parameters below cannot be destructured out of
|
|
25
26
|
shouldSearch
|
|
26
27
|
? ['refNameSearch', assemblyName, debouncedSearch]
|
|
27
|
-
: null, async (_tag, _assembly, query,
|
|
28
|
+
: null, async (_tag, _assembly, query, signal) => getDeduplicatedResult(await fetchResults(query, signal)), {
|
|
28
29
|
onError: e => {
|
|
29
30
|
session.notifyError(`${e}`, e);
|
|
30
31
|
},
|
|
@@ -71,7 +72,12 @@ const RefNameAutocomplete = observer(function RefNameAutocomplete({ session, ass
|
|
|
71
72
|
style: inputStyle,
|
|
72
73
|
...(endAdornment !== undefined && { endAdornment }),
|
|
73
74
|
},
|
|
74
|
-
}, placeholder: "Search for location" })), getOptionLabel: getOptionLabel
|
|
75
|
+
}, placeholder: "Search for location" })), getOptionLabel: getOptionLabel, slotProps: {
|
|
76
|
+
popper: {
|
|
77
|
+
placement: 'bottom-start',
|
|
78
|
+
style: { width: 'max-content', minWidth: width, maxWidth: 480 },
|
|
79
|
+
},
|
|
80
|
+
}, renderOption: (props, option) => (_jsx(SearchOption, { props: props, option: option, session: session, assembly: assembly }, props.key)) }));
|
|
75
81
|
});
|
|
76
82
|
export default RefNameAutocomplete;
|
|
77
83
|
export { default as RefNameAutocompleteEndAdornment } from './EndAdornment.js';
|