@jbrowse/core 5.0.0-beta.13 → 5.0.0-beta.14
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 +365 -69
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +4 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +4 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseAttributes.d.ts +2 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseAttributes.js +4 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.d.ts +2 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +4 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCoreDetails.d.ts +2 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCoreDetails.js +4 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +5 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +6 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +2 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +4 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.js +4 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +2 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureWash.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureWash.js +4 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +4 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldName.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldName.js +4 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +4 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +4 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +4 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/UriField.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/UriField.js +4 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceBody.d.ts +3 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceBody.js +4 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.js +10 -19
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceLegend.d.ts +3 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceLegend.js +4 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequencePanel.js +4 -4
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/HelpDialog.d.ts +3 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/HelpDialog.js +4 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.d.ts +1 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.js +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceTypeSelector.d.ts +1 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceTypeSelector.js +15 -36
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.d.ts +3 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +4 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/featureTypeUtil.d.ts +2 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/featureTypeUtil.js +22 -6
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +13 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +28 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/SequenceDisplay.js +2 -2
- package/esm/BaseFeatureWidget/stateModelFactory.d.ts +2 -0
- package/esm/PluginManager.d.ts +1 -0
- package/esm/PluginManager.js +6 -0
- package/esm/ReExports/coreModules.generated.js +538 -524
- package/esm/ReExports/coreWorkerModules.generated.js +454 -441
- package/esm/ReExports/lazify.js +3 -2
- package/esm/ReExports/list.js +15 -6
- package/esm/ReExports/names.d.ts +1 -0
- package/esm/ReExports/names.generated.d.ts +2 -0
- package/esm/ReExports/names.generated.js +566 -0
- package/esm/ReExports/names.js +3 -0
- package/esm/assemblyManager/assembly.d.ts +9 -0
- package/esm/assemblyManager/assembly.js +13 -0
- package/esm/assemblyManager/assemblyConfigSchema.d.ts +6 -1
- package/esm/assemblyManager/assemblyConfigSchema.js +23 -22
- package/esm/assemblyManager/assemblyManager.d.ts +11 -0
- package/esm/assemblyManager/assemblyManager.js +2 -0
- package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +9 -0
- package/esm/assemblyManager/expandAssemblyConfigShorthand.js +23 -0
- package/esm/checkPlugins.js +10 -4
- package/esm/configuration/configurationSchema.d.ts +18 -5
- package/esm/configuration/configurationSchema.js +9 -7
- package/esm/configuration/configurationSchemaUnion.d.ts +2 -1
- package/esm/configuration/configurationSchemaUnion.js +2 -1
- package/esm/configuration/configurationSlot.js +4 -4
- package/esm/configuration/fillLocations.d.ts +4 -2
- package/esm/configuration/fillLocations.js +9 -3
- package/esm/configuration/formatAboutConfigSchema.d.ts +2 -2
- package/esm/configuration/formatAboutConfigSchema.js +2 -2
- package/esm/configuration/formatDetailsConfigSchema.d.ts +2 -2
- package/esm/configuration/formatDetailsConfigSchema.js +5 -5
- package/esm/configuration/getConf.js +13 -4
- package/esm/configuration/index.d.ts +1 -1
- package/esm/configuration/index.js +1 -1
- package/esm/configuration/plot.d.ts +2 -2
- package/esm/configuration/plot.js +32 -18
- package/esm/configuration/schemaRegistry.d.ts +0 -2
- package/esm/configuration/slotFacade.js +2 -2
- package/esm/configuration/snapshotPreprocess.d.ts +42 -18
- package/esm/configuration/snapshotPreprocess.js +94 -34
- package/esm/configuration/tabixShorthand.js +1 -3
- package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +7 -0
- package/esm/data_adapters/BaseAdapter/BaseAdapter.js +7 -0
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +0 -22
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +0 -55
- package/esm/data_adapters/BaseAdapter/index.d.ts +0 -1
- package/esm/data_adapters/BaseAdapter/index.js +0 -1
- package/esm/data_adapters/BaseAdapter/rowSources.d.ts +2 -2
- package/esm/data_adapters/BaseAdapter/types.d.ts +1 -0
- package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +2 -0
- package/esm/data_adapters/CytobandAdapter/configSchema.js +5 -0
- package/esm/data_adapters/dataAdapterCache.d.ts +25 -13
- package/esm/data_adapters/dataAdapterCache.js +68 -24
- package/esm/data_adapters/getFeatureAdapter.d.ts +9 -0
- package/esm/data_adapters/getFeatureAdapter.js +17 -0
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +2 -0
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.js +2 -0
- package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +40 -6
- package/esm/pluggableElementTypes/models/BaseDisplayModel.js +56 -8
- package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +3 -3
- package/esm/pluggableElementTypes/models/BaseTrackModel.js +7 -6
- package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +2 -0
- package/esm/pluggableElementTypes/models/BaseViewModel.js +2 -0
- package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +3 -0
- package/esm/pluggableElementTypes/models/InternetAccountModel.js +3 -0
- package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +3 -0
- package/esm/pluggableElementTypes/models/baseConnectionConfig.js +3 -0
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +3 -1
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.js +3 -1
- package/esm/pluggableElementTypes/models/baseTrackConfig.js +9 -1
- package/esm/pluggableElementTypes/models/components/SaveTrackData.js +2 -2
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +1 -1
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +1 -1
- package/esm/pluginDefinitions.d.ts +7 -0
- package/esm/pluginDefinitions.js +20 -0
- package/esm/rpc/RpcRegistry.d.ts +0 -10
- package/esm/rpc/byteBudget.d.ts +8 -0
- package/esm/rpc/byteBudget.js +13 -0
- package/esm/rpc/configSchema.d.ts +2 -0
- package/esm/rpc/configSchema.js +3 -1
- package/esm/rpc/coreRpcMethods.d.ts +0 -1
- package/esm/rpc/coreRpcMethods.js +0 -1
- package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +2 -2
- package/esm/rpc/methods/CoreGetEncodedLayers.js +7 -5
- package/esm/rpc/methods/layerFeatures.d.ts +9 -6
- package/esm/rpc/methods/layerFeatures.js +21 -5
- package/esm/ui/ActionLink.d.ts +3 -2
- package/esm/ui/ActionLink.js +4 -2
- package/esm/ui/AddCustomPluginDialog.d.ts +3 -2
- package/esm/ui/AddCustomPluginDialog.js +6 -4
- package/esm/ui/BaseTooltip.d.ts +3 -2
- package/esm/ui/BaseTooltip.js +4 -2
- package/esm/ui/CascadingMenu.js +14 -12
- package/esm/ui/CascadingMenuButton.d.ts +2 -2
- package/esm/ui/CascadingMenuButton.js +5 -4
- package/esm/ui/CascadingMenuHelpDialog.d.ts +3 -2
- package/esm/ui/CascadingMenuHelpDialog.js +4 -2
- package/esm/ui/CascadingMenuHelpIconButton.d.ts +4 -3
- package/esm/ui/CascadingMenuHelpIconButton.js +9 -5
- package/esm/ui/ColorPicker.d.ts +5 -4
- package/esm/ui/ColorPicker.js +6 -4
- package/esm/ui/ContextMenu.d.ts +1 -1
- package/esm/ui/ContextMenu.js +1 -1
- package/esm/ui/CopyToClipboardButton.d.ts +3 -2
- package/esm/ui/CopyToClipboardButton.js +4 -2
- package/esm/ui/Crosshairs.js +13 -10
- package/esm/ui/DOMPurifySanitizedHTML.d.ts +3 -2
- package/esm/ui/DOMPurifySanitizedHTML.js +4 -2
- package/esm/ui/DataGridFlexContainer.d.ts +3 -2
- package/esm/ui/DataGridFlexContainer.js +4 -2
- package/esm/ui/Dialog.d.ts +1 -1
- package/esm/ui/Dialog.js +5 -4
- package/esm/ui/DropDownMenu.js +2 -2
- package/esm/ui/EditableTypography.d.ts +1 -1
- package/esm/ui/EditableTypography.js +3 -2
- package/esm/ui/ErrorActions.d.ts +3 -2
- package/esm/ui/ErrorActions.js +4 -2
- package/esm/ui/ErrorBanner.d.ts +2 -2
- package/esm/ui/ErrorBanner.js +3 -2
- package/esm/ui/ErrorBar.d.ts +3 -2
- package/esm/ui/ErrorBar.js +4 -2
- package/esm/ui/ErrorMessage.d.ts +3 -2
- package/esm/ui/ErrorMessage.js +4 -2
- package/esm/ui/ErrorMessageStackTraceContents.d.ts +3 -2
- package/esm/ui/ErrorMessageStackTraceContents.js +4 -2
- package/esm/ui/ErrorMessageStackTraceDialog.d.ts +3 -2
- package/esm/ui/ErrorMessageStackTraceDialog.js +4 -2
- package/esm/ui/ErrorOverlay.d.ts +3 -2
- package/esm/ui/ErrorOverlay.js +4 -2
- package/esm/ui/ExportSvgDialog.d.ts +3 -2
- package/esm/ui/ExportSvgDialog.js +4 -2
- package/esm/ui/ExternalLink.d.ts +2 -1
- package/esm/ui/ExternalLink.js +4 -2
- package/esm/ui/FactoryResetDialog.d.ts +3 -2
- package/esm/ui/FactoryResetDialog.js +4 -2
- package/esm/ui/FatalErrorDialog.d.ts +3 -2
- package/esm/ui/FatalErrorDialog.js +6 -4
- package/esm/ui/FileDropZone.d.ts +3 -2
- package/esm/ui/FileDropZone.js +4 -2
- package/esm/ui/FileSelector/LocalFileChooser.js +4 -4
- package/esm/ui/FileSelector/LocationInput.d.ts +3 -2
- package/esm/ui/FileSelector/LocationInput.js +4 -2
- package/esm/ui/FileSelector/SourceTypeSelector.d.ts +3 -2
- package/esm/ui/FileSelector/SourceTypeSelector.js +8 -6
- package/esm/ui/GpuFallbackButton.d.ts +3 -2
- package/esm/ui/GpuFallbackButton.js +4 -2
- package/esm/ui/HoverMenu.d.ts +2 -2
- package/esm/ui/HoverMenu.js +7 -3
- package/esm/ui/HoverTooltip.d.ts +3 -2
- package/esm/ui/HoverTooltip.js +4 -2
- package/esm/ui/Icons.d.ts +5 -5
- package/esm/ui/Icons.js +11 -10
- package/esm/ui/InlineMenuControls.d.ts +2 -2
- package/esm/ui/InlineMenuControls.js +4 -3
- package/esm/ui/JexlFilterRowEditors.d.ts +4 -4
- package/esm/ui/JexlFilterRowEditors.js +9 -8
- package/esm/ui/LabeledCheckbox.d.ts +3 -2
- package/esm/ui/LabeledCheckbox.js +4 -2
- package/esm/ui/LazyBaseTooltip.d.ts +12 -3
- package/esm/ui/LazyBaseTooltip.js +4 -2
- package/esm/ui/LegendSwatchGlyph.js +1 -0
- package/esm/ui/LoadingDots.d.ts +2 -1
- package/esm/ui/LoadingDots.js +4 -2
- package/esm/ui/LoadingEllipses.d.ts +5 -2
- package/esm/ui/LoadingEllipses.js +5 -3
- package/esm/ui/LoadingOverlay.d.ts +3 -2
- package/esm/ui/LoadingOverlay.js +4 -2
- package/esm/ui/LoadingProgress.d.ts +3 -2
- package/esm/ui/LoadingProgress.js +4 -2
- package/esm/ui/Logo.d.ts +2 -2
- package/esm/ui/Logo.js +9 -8
- package/esm/ui/MenuItemChevron.d.ts +2 -2
- package/esm/ui/MenuItemChevron.js +3 -2
- package/esm/ui/MenuItemEndDecoration.d.ts +2 -2
- package/esm/ui/MenuItemEndDecoration.js +3 -2
- package/esm/ui/MenuItemTrailing.d.ts +2 -2
- package/esm/ui/MenuItemTrailing.js +7 -6
- package/esm/ui/MenuTypes.d.ts +21 -1
- package/esm/ui/MenuTypes.js +20 -0
- package/esm/ui/MonospaceTextField.d.ts +3 -2
- package/esm/ui/MonospaceTextField.js +4 -2
- package/esm/ui/NumberTextField.d.ts +2 -2
- package/esm/ui/NumberTextField.js +4 -2
- package/esm/ui/PaletteContext.d.ts +11 -9
- package/esm/ui/PaletteContext.js +33 -18
- package/esm/ui/PluginStoreCard.d.ts +3 -2
- package/esm/ui/PluginStoreCard.js +4 -2
- package/esm/ui/PopoverPicker.d.ts +3 -2
- package/esm/ui/PopoverPicker.js +4 -2
- package/esm/ui/PrerenderedCanvas.d.ts +2 -2
- package/esm/ui/PrerenderedCanvas.js +3 -2
- package/esm/ui/RedErrorMessageBox.d.ts +3 -2
- package/esm/ui/RedErrorMessageBox.js +4 -2
- package/esm/ui/RefNameAutocomplete/EndAdornment.d.ts +3 -2
- package/esm/ui/RefNameAutocomplete/EndAdornment.js +4 -2
- package/esm/ui/RefNameAutocomplete/HelpDialog.d.ts +3 -2
- package/esm/ui/RefNameAutocomplete/HelpDialog.js +4 -2
- package/esm/ui/ReplaceCurrentViewButton.d.ts +3 -2
- package/esm/ui/ReplaceCurrentViewButton.js +4 -2
- package/esm/ui/ResizeHandle.d.ts +2 -2
- package/esm/ui/ResizeHandle.js +3 -2
- package/esm/ui/SanitizedHTML.d.ts +3 -2
- package/esm/ui/SanitizedHTML.js +6 -4
- package/esm/ui/ScrollChrome.d.ts +3 -2
- package/esm/ui/ScrollChrome.js +4 -2
- package/esm/ui/ScrollEdgeShadow.d.ts +2 -2
- package/esm/ui/ScrollEdgeShadow.js +2 -2
- package/esm/ui/SessionJsonPanel.d.ts +3 -2
- package/esm/ui/SessionJsonPanel.js +4 -2
- package/esm/ui/ShareLinkField.d.ts +3 -2
- package/esm/ui/ShareLinkField.js +4 -2
- package/esm/ui/SingleSlider.d.ts +2 -2
- package/esm/ui/SingleSlider.js +4 -2
- package/esm/ui/SliderTooltip.d.ts +2 -1
- package/esm/ui/SliderTooltip.js +4 -2
- package/esm/ui/SnackbarContents.d.ts +3 -2
- package/esm/ui/SnackbarContents.js +4 -2
- package/esm/ui/SnackbarModel.d.ts +2 -0
- package/esm/ui/SnackbarModel.js +2 -0
- package/esm/ui/StackTraceButton.d.ts +3 -2
- package/esm/ui/StackTraceButton.js +4 -2
- package/esm/ui/StatusProgressBar.d.ts +3 -2
- package/esm/ui/StatusProgressBar.js +4 -2
- package/esm/ui/SubmitForm.d.ts +2 -1
- package/esm/ui/SubmitForm.js +4 -2
- package/esm/ui/SvgColorLegend.d.ts +3 -4
- package/esm/ui/SvgColorLegend.js +27 -18
- package/esm/ui/TagTextField.d.ts +2 -2
- package/esm/ui/TagTextField.js +4 -2
- package/esm/ui/ViewLoadingScreen.d.ts +3 -2
- package/esm/ui/ViewLoadingScreen.js +4 -2
- package/esm/ui/colorScale.d.ts +5 -1
- package/esm/ui/colorScale.js +12 -10
- package/esm/ui/colors.d.ts +3 -3
- package/esm/ui/colors.js +7 -7
- package/esm/ui/filterMenuItems.d.ts +10 -31
- package/esm/ui/filterMenuItems.js +13 -14
- package/esm/ui/index.d.ts +1 -1
- package/esm/ui/index.js +1 -1
- package/esm/ui/launchTargetsMenuItem.js +9 -13
- package/esm/ui/legendMenuItem.d.ts +4 -4
- package/esm/ui/legendMenuItem.js +4 -4
- package/esm/ui/menuItemAdornment.d.ts +1 -1
- package/esm/ui/menuItemAdornment.js +1 -1
- package/esm/ui/menuItems.d.ts +1 -1
- package/esm/ui/menuItems.js +1 -1
- package/esm/ui/menuLabels.d.ts +2 -2
- package/esm/ui/menuLabels.js +2 -2
- package/esm/ui/palette.d.ts +2 -2
- package/esm/ui/palette.js +10 -10
- package/esm/ui/radioSubMenu.d.ts +5 -3
- package/esm/ui/radioSubMenu.js +2 -2
- package/esm/ui/rampKey.d.ts +15 -0
- package/esm/ui/rampKey.js +17 -0
- package/esm/ui/showSubMenu.d.ts +0 -5
- package/esm/ui/showSubMenu.js +6 -15
- package/esm/ui/theme.d.ts +2 -2
- package/esm/ui/theme.js +1 -1
- package/esm/ui/useAssemblySelection.d.ts +2 -0
- package/esm/ui/useMouseTracking.d.ts +8 -20
- package/esm/ui/useMouseTracking.js +23 -62
- package/esm/ui/usePlacedMenuFocus.d.ts +19 -0
- package/esm/ui/usePlacedMenuFocus.js +28 -0
- package/esm/util/Base1DViewModel.d.ts +5 -3
- package/esm/util/Base1DViewModel.js +5 -3
- package/esm/util/SvgCanvas.js +1 -1
- package/esm/util/aggregateFieldName.d.ts +1 -10
- package/esm/util/aggregateFieldName.js +1 -8
- package/esm/util/analytics.d.ts +4 -6
- package/esm/util/analytics.js +143 -12
- package/esm/util/bezierConnector.d.ts +20 -0
- package/esm/util/bezierConnector.js +34 -100
- package/esm/util/cacheBudgets.d.ts +3 -0
- package/esm/util/cacheBudgets.js +3 -0
- package/esm/util/categoricalField.d.ts +2 -2
- package/esm/util/categoricalField.js +3 -3
- package/esm/util/color/index.d.ts +1 -1
- package/esm/util/color/index.js +2 -2
- package/esm/util/color-bits/bit.js +1 -1
- package/esm/util/color-bits/parse.js +6 -6
- package/esm/util/colorBits.d.ts +15 -4
- package/esm/util/colorBits.js +38 -15
- package/esm/util/colorRamp.d.ts +3 -3
- package/esm/util/colorRamp.js +14 -2
- package/esm/util/colorScale.d.ts +114 -20
- package/esm/util/colorScale.js +124 -26
- package/esm/util/colorSchemes.d.ts +6 -4
- package/esm/util/colorSchemes.js +6 -3
- package/esm/util/createSvgRasterCanvas.d.ts +14 -1
- package/esm/util/createSvgRasterCanvas.js +36 -12
- package/esm/util/diagonalizeRegions.js +18 -9
- package/esm/util/featureTransforms.d.ts +2 -2
- package/esm/util/featureTransforms.js +85 -135
- package/esm/util/fileHandleStore.js +5 -0
- package/esm/util/groupKeys.d.ts +5 -4
- package/esm/util/groupKeys.js +15 -9
- package/esm/util/index.js +1 -1
- package/esm/util/installFetch.d.ts +2 -2
- package/esm/util/installPrerequisiteFetch.d.ts +8 -3
- package/esm/util/installPrerequisiteFetch.js +9 -7
- package/esm/util/io/RemoteFileWithRangeCache.d.ts +1 -1
- package/esm/util/io/RemoteFileWithRangeCache.js +1 -1
- package/esm/util/jexl.js +1 -1
- package/esm/util/layouts/GranularRectLayout.d.ts +19 -3
- package/esm/util/layouts/GranularRectLayout.js +57 -34
- package/esm/util/leadingEdgeAutorun.d.ts +9 -1
- package/esm/util/leadingEdgeAutorun.js +5 -2
- package/esm/util/markEncoding.d.ts +10 -8
- package/esm/util/markEncoding.js +50 -12
- package/esm/util/markEncodingTypes.d.ts +74 -20
- package/esm/util/originCut.d.ts +14 -0
- package/esm/util/originCut.js +19 -0
- package/esm/util/paintLayer.d.ts +1 -1
- package/esm/util/paintLayer.js +4 -3
- package/esm/util/pathSeries.d.ts +18 -0
- package/esm/util/pathSeries.js +143 -0
- package/esm/util/pressOwner.d.ts +20 -0
- package/esm/util/pressOwner.js +26 -0
- package/esm/util/quantileExtent.d.ts +3 -3
- package/esm/util/quantileExtent.js +3 -3
- package/esm/util/rowStackGeometry.d.ts +1 -1
- package/esm/util/rowStackGeometry.js +1 -1
- package/esm/util/sessionActivity.d.ts +36 -0
- package/esm/util/sessionActivity.js +88 -0
- package/esm/util/stepOutputs.d.ts +165 -0
- package/esm/util/stepOutputs.js +201 -0
- package/esm/util/stepTables.d.ts +7 -3
- package/esm/util/stepTables.js +86 -3
- package/esm/util/thresholdScale.d.ts +1 -1
- package/esm/util/thresholdScale.js +1 -1
- package/esm/util/tracks.js +1 -1
- package/esm/util/usePanZoom.js +4 -10
- package/esm/util/windowStep.d.ts +6 -0
- package/esm/util/windowStep.js +153 -0
- package/package.json +23 -15
- package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +0 -40
- package/esm/data_adapters/BaseAdapter/featureDensity.js +0 -31
- package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +0 -11
- package/esm/rpc/methods/CoreGetFeatureDensity.js +0 -22
|
@@ -162,7 +162,7 @@ export function createBaseTrackConfig(pluginManager) {
|
|
|
162
162
|
},
|
|
163
163
|
/**
|
|
164
164
|
* #slot
|
|
165
|
-
*
|
|
165
|
+
* The source of this track's data. Its `type` names the adapter for
|
|
166
166
|
* the file format (`BamAdapter`, `Gff3TabixAdapter`, ...) and the rest of
|
|
167
167
|
* the object is that adapter's own slots — see the adapter pages for
|
|
168
168
|
* each. Most adapters also accept a `uri` shorthand in place of writing
|
|
@@ -258,5 +258,13 @@ export function createBaseTrackConfig(pluginManager) {
|
|
|
258
258
|
*/
|
|
259
259
|
explicitIdentifier: 'trackId',
|
|
260
260
|
explicitlyTyped: true,
|
|
261
|
+
closed: true,
|
|
262
|
+
// v1.3 wrote the text-search adapter and its attributes on the track,
|
|
263
|
+
// before `textSearching`
|
|
264
|
+
retired: {
|
|
265
|
+
rpcDriverName: () => ({}),
|
|
266
|
+
textSearchAdapter: () => ({}),
|
|
267
|
+
textSearchIndexingAttributes: () => ({}),
|
|
268
|
+
},
|
|
261
269
|
});
|
|
262
270
|
}
|
|
@@ -56,7 +56,7 @@ function useTrackDataExport({ model, regions, regionStr, type, options, }) {
|
|
|
56
56
|
* The format picker, owning the per-format help text and the dialog that shows
|
|
57
57
|
* it — nothing above needs to know a format can carry one.
|
|
58
58
|
*/
|
|
59
|
-
function FormatSelector({ options, type, setType, usedAdapterExport, }) {
|
|
59
|
+
const FormatSelector = observer(function FormatSelector({ options, type, setType, usedAdapterExport, }) {
|
|
60
60
|
const { classes } = useStyles();
|
|
61
61
|
const [helpText, setHelpText] = useState();
|
|
62
62
|
return (_jsxs(FormControl, { children: [_jsx(FormLabel, { children: `File type${usedAdapterExport ? ' (adapter export)' : ''}` }), _jsx(RadioGroup, { value: type, onChange: e => {
|
|
@@ -66,7 +66,7 @@ function FormatSelector({ options, type, setType, usedAdapterExport, }) {
|
|
|
66
66
|
}, title: "Show help for this format", children: _jsx(HelpOutlineIcon, { fontSize: "small" }) })) : null] }, key))) }), _jsx(InfoDialog, { open: helpText !== undefined, onClose: () => {
|
|
67
67
|
setHelpText(undefined);
|
|
68
68
|
}, title: "Format Information", children: _jsx(DialogContentText, { children: helpText }) })] }));
|
|
69
|
-
}
|
|
69
|
+
});
|
|
70
70
|
/**
|
|
71
71
|
* What the preview pane says — the export itself only once there is one, and
|
|
72
72
|
* before that whichever of the four other states the dialog is in. In
|
|
@@ -8,7 +8,7 @@ export interface DisplaySnapshot {
|
|
|
8
8
|
/**
|
|
9
9
|
* Route each shorthand `displayDefaults: {...}` setting to the display types
|
|
10
10
|
* whose member of that name takes its value: `color: 'red'` reaches every
|
|
11
|
-
* display with a
|
|
11
|
+
* display with a color, `color: { field: 'type' }` only those whose color
|
|
12
12
|
* maps a field, and a spelling a display retired reaches that display as the
|
|
13
13
|
* members it became. `reached` names the displays each key went to. A key no
|
|
14
14
|
* display knows is an `unknownKeys` entry, and one every display that knows it
|
|
@@ -35,7 +35,7 @@ function verdictOf(schema, key, value) {
|
|
|
35
35
|
/**
|
|
36
36
|
* Route each shorthand `displayDefaults: {...}` setting to the display types
|
|
37
37
|
* whose member of that name takes its value: `color: 'red'` reaches every
|
|
38
|
-
* display with a
|
|
38
|
+
* display with a color, `color: { field: 'type' }` only those whose color
|
|
39
39
|
* maps a field, and a spelling a display retired reaches that display as the
|
|
40
40
|
* members it became. `reached` names the displays each key went to. A key no
|
|
41
41
|
* display knows is an `unknownKeys` entry, and one every display that knows it
|
|
@@ -129,6 +129,13 @@ export declare function pluginDescriptionString(d: PluginDefinition): string;
|
|
|
129
129
|
* the same plugin just because neither has a url.
|
|
130
130
|
*/
|
|
131
131
|
export declare function maybePluginUrl(d: PluginDefinition): string | undefined;
|
|
132
|
+
/**
|
|
133
|
+
* The absolute url PluginLoader fetches the definition from: a `umdLoc` or
|
|
134
|
+
* `esmLoc` against its own `baseUri`, any other form against the page. Trust
|
|
135
|
+
* decisions key on this rather than `maybePluginUrl`, under which one relative
|
|
136
|
+
* `plugin.js` names a different file in every config that lists it.
|
|
137
|
+
*/
|
|
138
|
+
export declare function resolvedPluginUrl(d: PluginDefinition, pageUri?: string | undefined): string | undefined;
|
|
132
139
|
export declare function pluginUrl(d: PluginDefinition): string;
|
|
133
140
|
/**
|
|
134
141
|
* Whether a definition loads from exactly `url` — the question behind "which
|
package/esm/pluginDefinitions.js
CHANGED
|
@@ -114,6 +114,26 @@ export function maybePluginUrl(d) {
|
|
|
114
114
|
return undefined;
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* The absolute url PluginLoader fetches the definition from: a `umdLoc` or
|
|
119
|
+
* `esmLoc` against its own `baseUri`, any other form against the page. Trust
|
|
120
|
+
* decisions key on this rather than `maybePluginUrl`, under which one relative
|
|
121
|
+
* `plugin.js` names a different file in every config that lists it.
|
|
122
|
+
*/
|
|
123
|
+
export function resolvedPluginUrl(d, pageUri = typeof location === 'undefined' ? undefined : location.href) {
|
|
124
|
+
const url = maybePluginUrl(d);
|
|
125
|
+
const base = 'umdLoc' in d
|
|
126
|
+
? d.umdLoc.baseUri
|
|
127
|
+
: 'esmLoc' in d
|
|
128
|
+
? d.esmLoc.baseUri
|
|
129
|
+
: pageUri;
|
|
130
|
+
try {
|
|
131
|
+
return url === undefined ? undefined : new URL(url, base).href;
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
117
137
|
export function pluginUrl(d) {
|
|
118
138
|
return maybePluginUrl(d) ?? 'unknown url';
|
|
119
139
|
}
|
package/esm/rpc/RpcRegistry.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { FeatureDensity } from '../data_adapters/BaseAdapter/featureDensity.ts';
|
|
2
1
|
import type { CoreGetEncodedLayersArgs, EncodedLayersResult } from '../util/markEncodingTypes.ts';
|
|
3
2
|
import type { StatusCallback } from '../util/progress.ts';
|
|
4
3
|
import type { UnwrapRpcResult } from '../util/rpc.ts';
|
|
@@ -64,15 +63,6 @@ export interface RpcRegistry {
|
|
|
64
63
|
};
|
|
65
64
|
return: number | undefined;
|
|
66
65
|
};
|
|
67
|
-
CoreGetFeatureDensity: {
|
|
68
|
-
args: {
|
|
69
|
-
adapterConfig: Record<string, unknown>;
|
|
70
|
-
regions: RegionLike[];
|
|
71
|
-
bpPerPx: number;
|
|
72
|
-
headers?: Record<string, string>;
|
|
73
|
-
};
|
|
74
|
-
return: FeatureDensity[] | undefined;
|
|
75
|
-
};
|
|
76
66
|
CoreGetInfo: {
|
|
77
67
|
args: {
|
|
78
68
|
adapterConfig: Record<string, unknown>;
|
package/esm/rpc/byteBudget.d.ts
CHANGED
|
@@ -42,6 +42,14 @@ export declare function isRegionRefused(result: unknown): result is RegionTooLar
|
|
|
42
42
|
export declare function isRegionTooLargeError(error: unknown): error is Error;
|
|
43
43
|
/** Undefined, never 0, when no region could be measured. */
|
|
44
44
|
export declare function largestRegionBytes(perRegion: (number | undefined)[]): number | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* The regions' index-only byte estimates summed, for a reader that holds
|
|
47
|
+
* every region at once; undefined, never 0, when no region could be measured.
|
|
48
|
+
*/
|
|
49
|
+
export declare function totalRegionBytes(dataAdapter: ByteMeasurableAdapter, regions: AugmentedRegion[], opts?: {
|
|
50
|
+
signal?: AbortSignal;
|
|
51
|
+
statusCallback?: StatusCallback;
|
|
52
|
+
}): Promise<number | undefined>;
|
|
45
53
|
/** A non-positive declared limit means "no opinion" (htsget reports 0). */
|
|
46
54
|
export declare function adapterByteLimit(declared: unknown, fallback: number): number;
|
|
47
55
|
export declare function overByteBudget(bytes: number | undefined, byteLimit: number | undefined): bytes is number;
|
package/esm/rpc/byteBudget.js
CHANGED
|
@@ -23,6 +23,19 @@ export function largestRegionBytes(perRegion) {
|
|
|
23
23
|
}
|
|
24
24
|
return largest;
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* The regions' index-only byte estimates summed, for a reader that holds
|
|
28
|
+
* every region at once; undefined, never 0, when no region could be measured.
|
|
29
|
+
*/
|
|
30
|
+
export async function totalRegionBytes(dataAdapter, regions, opts) {
|
|
31
|
+
let total;
|
|
32
|
+
for (const bytes of await Promise.all(regions.map(region => dataAdapter.getRegionByteSize([region], opts)))) {
|
|
33
|
+
if (bytes !== undefined) {
|
|
34
|
+
total = (total ?? 0) + bytes;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return total;
|
|
38
|
+
}
|
|
26
39
|
/** A non-positive declared limit means "no opinion" (htsget reports 0). */
|
|
27
40
|
export function adapterByteLimit(declared, fallback) {
|
|
28
41
|
return typeof declared === 'number' && declared > 0 ? declared : fallback;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* #config RpcOptions
|
|
3
3
|
* #category root
|
|
4
|
+
* Chooses whether data fetching runs on the main thread or in web workers, and
|
|
5
|
+
* how many workers to start. Found on the root config as `configuration.rpc`.
|
|
4
6
|
*/
|
|
5
7
|
declare const _default: import("../configuration/configurationSchema.ts").ConfigurationSchemaType<{
|
|
6
8
|
readonly defaultDriver: {
|
package/esm/rpc/configSchema.js
CHANGED
|
@@ -2,11 +2,13 @@ import { ConfigurationSchema } from '../configuration/index.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* #config RpcOptions
|
|
4
4
|
* #category root
|
|
5
|
+
* Chooses whether data fetching runs on the main thread or in web workers, and
|
|
6
|
+
* how many workers to start. Found on the root config as `configuration.rpc`.
|
|
5
7
|
*/
|
|
6
8
|
export default ConfigurationSchema('RpcOptions', {
|
|
7
9
|
/**
|
|
8
10
|
* #slot
|
|
9
|
-
*
|
|
11
|
+
* The RPC backend. Empty means "use the host application's
|
|
10
12
|
* default" (web/desktop default to the web worker driver, embedded/headless
|
|
11
13
|
* to the main thread). Every call in the session runs on the driver this
|
|
12
14
|
* names; there is no per-track or per-call override.
|
|
@@ -8,6 +8,5 @@ export { default as CoreGetSequence } from './methods/CoreGetSequence.ts';
|
|
|
8
8
|
export { default as CoreFreeResources } from './methods/CoreFreeResources.ts';
|
|
9
9
|
export { default as CoreLoadTrackCode } from './methods/CoreLoadTrackCode.ts';
|
|
10
10
|
export { default as CoreGetRegionByteEstimate } from './methods/CoreGetRegionByteEstimate.ts';
|
|
11
|
-
export { default as CoreGetFeatureDensity } from './methods/CoreGetFeatureDensity.ts';
|
|
12
11
|
export { default as CoreGetRegions } from './methods/CoreGetRegions.ts';
|
|
13
12
|
export { default as CoreGetExportData } from './methods/CoreGetExportData.ts';
|
|
@@ -8,6 +8,5 @@ export { default as CoreGetSequence } from './methods/CoreGetSequence.js';
|
|
|
8
8
|
export { default as CoreFreeResources } from './methods/CoreFreeResources.js';
|
|
9
9
|
export { default as CoreLoadTrackCode } from './methods/CoreLoadTrackCode.js';
|
|
10
10
|
export { default as CoreGetRegionByteEstimate } from './methods/CoreGetRegionByteEstimate.js';
|
|
11
|
-
export { default as CoreGetFeatureDensity } from './methods/CoreGetFeatureDensity.js';
|
|
12
11
|
export { default as CoreGetRegions } from './methods/CoreGetRegions.js';
|
|
13
12
|
export { default as CoreGetExportData } from './methods/CoreGetExportData.js';
|
|
@@ -6,9 +6,9 @@ import type { RpcExecuteArgs } from '../RpcRegistry.ts';
|
|
|
6
6
|
* split them by the facet where the request names one, run each layer's own
|
|
7
7
|
* steps (per section, under a facet), and evaluate the layer's encoding over
|
|
8
8
|
* what is left in the worker, where the `Feature` objects are, filling the
|
|
9
|
-
* lanes its mark reads. The
|
|
9
|
+
* lanes its mark reads. The colors come back packed, the scale tables
|
|
10
10
|
* resolved, and the main thread reads the same table for its legend that the
|
|
11
|
-
*
|
|
11
|
+
* colors were drawn from.
|
|
12
12
|
*/
|
|
13
13
|
export default class CoreGetEncodedLayers extends RpcMethodTypeWithRenameRegion<'CoreGetEncodedLayers'> {
|
|
14
14
|
name: 'CoreGetEncodedLayers';
|
|
@@ -10,9 +10,9 @@ import { layerFeatures } from './layerFeatures.js';
|
|
|
10
10
|
* split them by the facet where the request names one, run each layer's own
|
|
11
11
|
* steps (per section, under a facet), and evaluate the layer's encoding over
|
|
12
12
|
* what is left in the worker, where the `Feature` objects are, filling the
|
|
13
|
-
* lanes its mark reads. The
|
|
13
|
+
* lanes its mark reads. The colors come back packed, the scale tables
|
|
14
14
|
* resolved, and the main thread reads the same table for its legend that the
|
|
15
|
-
*
|
|
15
|
+
* colors were drawn from.
|
|
16
16
|
*/
|
|
17
17
|
export default class CoreGetEncodedLayers extends RpcMethodTypeWithRenameRegion {
|
|
18
18
|
name = 'CoreGetEncodedLayers';
|
|
@@ -34,10 +34,10 @@ export default class CoreGetEncodedLayers extends RpcMethodTypeWithRenameRegion
|
|
|
34
34
|
return tooLarge;
|
|
35
35
|
}
|
|
36
36
|
const { jexl } = pluginManager;
|
|
37
|
-
const { layers: layered, sections, zoomRange, notices, } = await layerFeatures(dataAdapter, args, jexl);
|
|
37
|
+
const { layers: layered, sections, zoomRange, notices, facts, } = await layerFeatures(dataAdapter, args, jexl);
|
|
38
38
|
const layers = requested.map((request, i) => {
|
|
39
|
-
const { table, row } = layered[i];
|
|
40
|
-
|
|
39
|
+
const { table, row, series, gapBp } = layered[i];
|
|
40
|
+
const encoded = encodeFeatures(table, { ...request.encoding, row, series }, request.lanes, {
|
|
41
41
|
jexl,
|
|
42
42
|
report: createProgressReporter({
|
|
43
43
|
label: 'Processing features',
|
|
@@ -46,6 +46,7 @@ export default class CoreGetEncodedLayers extends RpcMethodTypeWithRenameRegion
|
|
|
46
46
|
signal,
|
|
47
47
|
}),
|
|
48
48
|
});
|
|
49
|
+
return gapBp === undefined ? encoded : { ...encoded, gapBp };
|
|
49
50
|
});
|
|
50
51
|
const result = {
|
|
51
52
|
layers,
|
|
@@ -53,6 +54,7 @@ export default class CoreGetEncodedLayers extends RpcMethodTypeWithRenameRegion
|
|
|
53
54
|
bytes,
|
|
54
55
|
zoomRange,
|
|
55
56
|
...(notices.length > 0 ? { notices } : {}),
|
|
57
|
+
...(Object.keys(facts).length > 0 ? { facts } : {}),
|
|
56
58
|
};
|
|
57
59
|
return rpcResult(result, layers.flatMap(l => encodedChannelTransferables(l)));
|
|
58
60
|
}
|
|
@@ -11,23 +11,26 @@ import type { StatusCallback } from '../../util/progress.ts';
|
|
|
11
11
|
export interface LayerFeatures {
|
|
12
12
|
table: FeatureTable;
|
|
13
13
|
row: FieldRef | ArrayLike<number> | undefined;
|
|
14
|
+
/** Each row's series, for a layer whose request names a path. */
|
|
15
|
+
series?: Uint32Array;
|
|
16
|
+
/** The stretch a path breaks across, for a layer whose request names a path. */
|
|
17
|
+
gapBp?: number;
|
|
14
18
|
}
|
|
15
19
|
/**
|
|
16
20
|
* The table each layer of a `CoreGetEncodedLayers` request encodes: the
|
|
17
21
|
* region's features through the shared steps, split by the facet where the
|
|
18
22
|
* request names one, then through each layer's own steps, with each faceted
|
|
19
|
-
* layer's stacked rows beside it
|
|
20
|
-
* layer's table, so the same request
|
|
23
|
+
* layer's stacked rows beside it, and a path layer's rows in series order.
|
|
24
|
+
* An instance's `featureIndex` indexes its layer's table, so the same request
|
|
25
|
+
* answers which row an instance is.
|
|
21
26
|
*/
|
|
22
27
|
export declare function layerFeatures(dataAdapter: BaseFeatureDataAdapter, args: Pick<CoreGetEncodedLayersArgs, 'region' | 'layers' | 'transform' | 'facet' | 'bpPerPx' | 'opts'> & {
|
|
23
28
|
signal?: AbortSignal;
|
|
24
29
|
statusCallback?: StatusCallback;
|
|
25
30
|
}, jexl: JexlInstance): Promise<{
|
|
26
|
-
layers:
|
|
27
|
-
table: FeatureTable;
|
|
28
|
-
row: FieldRef | Uint32Array | undefined;
|
|
29
|
-
}[];
|
|
31
|
+
layers: LayerFeatures[];
|
|
30
32
|
sections: import("../../util/markEncodingTypes.ts").FacetSection[] | undefined;
|
|
31
33
|
zoomRange: import("../../data_adapters/BaseAdapter/zoomRange.ts").ZoomRange | undefined;
|
|
32
34
|
notices: string[];
|
|
35
|
+
facts: Record<string, unknown>;
|
|
33
36
|
}>;
|
|
@@ -1,23 +1,33 @@
|
|
|
1
1
|
import { checkAbortSignal } from '../../util/aborting.js';
|
|
2
2
|
import { layerTables } from '../../util/featureTransforms.js';
|
|
3
|
+
import { pathSeries } from '../../util/pathSeries.js';
|
|
3
4
|
import { updateStatus } from '../../util/progress.js';
|
|
4
5
|
/**
|
|
5
6
|
* The table each layer of a `CoreGetEncodedLayers` request encodes: the
|
|
6
7
|
* region's features through the shared steps, split by the facet where the
|
|
7
8
|
* request names one, then through each layer's own steps, with each faceted
|
|
8
|
-
* layer's stacked rows beside it
|
|
9
|
-
* layer's table, so the same request
|
|
9
|
+
* layer's stacked rows beside it, and a path layer's rows in series order.
|
|
10
|
+
* An instance's `featureIndex` indexes its layer's table, so the same request
|
|
11
|
+
* answers which row an instance is.
|
|
10
12
|
*/
|
|
11
13
|
export async function layerFeatures(dataAdapter, args, jexl) {
|
|
12
14
|
const { region, layers: requested, transform = [], facet, bpPerPx, opts, signal, statusCallback, } = args;
|
|
13
15
|
const notices = [];
|
|
14
|
-
const
|
|
16
|
+
const facts = {};
|
|
17
|
+
const fetchOpts = {
|
|
18
|
+
...opts,
|
|
19
|
+
bpPerPx,
|
|
20
|
+
statusCallback,
|
|
21
|
+
signal,
|
|
22
|
+
notices,
|
|
23
|
+
facts,
|
|
24
|
+
};
|
|
15
25
|
const [fetched, zoomRange] = await updateStatus('Downloading features', statusCallback, () => Promise.all([
|
|
16
26
|
dataAdapter.getFeatureTable(region, fetchOpts),
|
|
17
27
|
dataAdapter.getZoomRange(fetchOpts),
|
|
18
28
|
]));
|
|
19
29
|
checkAbortSignal(signal);
|
|
20
|
-
const
|
|
30
|
+
const tables = layerTables(fetched, {
|
|
21
31
|
transform,
|
|
22
32
|
facet,
|
|
23
33
|
layers: requested.map(r => ({
|
|
@@ -25,5 +35,11 @@ export async function layerFeatures(dataAdapter, args, jexl) {
|
|
|
25
35
|
row: r.encoding.row,
|
|
26
36
|
})),
|
|
27
37
|
}, jexl);
|
|
28
|
-
|
|
38
|
+
const layers = tables.layers.map((layer, i) => {
|
|
39
|
+
const { path, transform: own = [] } = requested[i];
|
|
40
|
+
return path
|
|
41
|
+
? pathSeries(layer.table, layer.row, path, [...transform, ...(facet?.transform ?? []), ...own], jexl)
|
|
42
|
+
: layer;
|
|
43
|
+
});
|
|
44
|
+
return { layers, sections: tables.sections, zoomRange, notices, facts };
|
|
29
45
|
}
|
package/esm/ui/ActionLink.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/** A Link that acts as a button — no real navigation, just calls onClick. */
|
|
2
|
-
|
|
2
|
+
declare const ActionLink: ({ onClick, children, className, title, }: {
|
|
3
3
|
onClick: () => void;
|
|
4
4
|
children: React.ReactNode;
|
|
5
5
|
className?: string;
|
|
6
6
|
title?: string;
|
|
7
|
-
})
|
|
7
|
+
}) => import("react").JSX.Element;
|
|
8
|
+
export default ActionLink;
|
package/esm/ui/ActionLink.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { Link } from '@mui/material';
|
|
3
|
+
import { observer } from 'mobx-react';
|
|
3
4
|
/** A Link that acts as a button — no real navigation, just calls onClick. */
|
|
4
|
-
|
|
5
|
+
const ActionLink = observer(function ActionLink({ onClick, children, className, title, }) {
|
|
5
6
|
return (_jsx(Link, { href: "#", className: className, title: title, onClick: (e) => {
|
|
6
7
|
e.preventDefault();
|
|
7
8
|
onClick();
|
|
8
9
|
}, children: children }));
|
|
9
|
-
}
|
|
10
|
+
});
|
|
11
|
+
export default ActionLink;
|
|
@@ -8,7 +8,8 @@ import type { PluginDefinition } from '../pluginDefinitions.ts';
|
|
|
8
8
|
* `onAdd` returns false to reject the definition and keep the dialog open (the
|
|
9
9
|
* plugin store rejects a name already installed).
|
|
10
10
|
*/
|
|
11
|
-
|
|
11
|
+
declare const AddCustomPluginDialog: ({ onClose, onAdd, }: {
|
|
12
12
|
onClose: () => void;
|
|
13
13
|
onAdd: (definition: PluginDefinition) => boolean;
|
|
14
|
-
})
|
|
14
|
+
}) => import("react").JSX.Element;
|
|
15
|
+
export default AddCustomPluginDialog;
|
|
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { useState } from 'react';
|
|
3
3
|
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
|
|
4
4
|
import { Collapse, DialogContentText, IconButton, TextField, } from '@mui/material';
|
|
5
|
+
import { observer } from 'mobx-react';
|
|
5
6
|
import { cx, makeStyles } from '../util/tss-react/index.js';
|
|
6
7
|
import SubmitDialog from './SubmitDialog.js';
|
|
7
8
|
const useStyles = makeStyles()({
|
|
@@ -28,7 +29,7 @@ const useStyles = makeStyles()({
|
|
|
28
29
|
* `onAdd` returns false to reject the definition and keep the dialog open (the
|
|
29
30
|
* plugin store rejects a name already installed).
|
|
30
31
|
*/
|
|
31
|
-
|
|
32
|
+
const AddCustomPluginDialog = observer(function AddCustomPluginDialog({ onClose, onAdd, }) {
|
|
32
33
|
const { classes } = useStyles();
|
|
33
34
|
const [umdPluginName, setUMDPluginName] = useState('');
|
|
34
35
|
const [umdPluginUrl, setUMDPluginUrl] = useState('');
|
|
@@ -44,13 +45,14 @@ export default function AddCustomPluginDialog({ onClose, onAdd, }) {
|
|
|
44
45
|
}
|
|
45
46
|
}, children: _jsxs("div", { className: classes.dialogContent, children: [_jsx(DialogContentText, { children: "Enter the name of the plugin and its URL. The name should match what is defined in the plugin's build." }), _jsx(TextField, { label: "Plugin name", variant: "outlined", fullWidth: true, margin: "dense", value: umdPluginName, onChange: event => {
|
|
46
47
|
setUMDPluginName(event.target.value);
|
|
47
|
-
} }), _jsx(TextField, { label: "Plugin URL", variant: "outlined", fullWidth: true, margin: "dense", value: umdPluginUrl, onChange: event => {
|
|
48
|
+
} }), _jsx(TextField, { label: "Plugin URL", "data-testid": "custom-plugin-url", variant: "outlined", fullWidth: true, margin: "dense", value: umdPluginUrl, onChange: event => {
|
|
48
49
|
setUMDPluginUrl(event.target.value);
|
|
49
50
|
} }), _jsxs(DialogContentText, { onClick: () => {
|
|
50
51
|
setAdvancedOptionsOpen(!advancedOptionsOpen);
|
|
51
52
|
}, children: [_jsx(IconButton, { className: cx(classes.expand, {
|
|
52
53
|
[classes.expandOpen]: advancedOptionsOpen,
|
|
53
|
-
}), "aria-expanded": advancedOptionsOpen, "aria-label": "show more", children: _jsx(ExpandMoreIcon, {}) }), "Advanced options"] }), _jsx(Collapse, { in: advancedOptionsOpen, children: _jsxs("div", { className: classes.dialogContent, children: [_jsx(DialogContentText, { children: "The above fields assume that the plugin is built in UMD format. For an ESM build, enter its URL here instead; it carries its own name, so the fields above stay empty." }), _jsx(TextField, { label: "ESM build URL", variant: "outlined", fullWidth: true, margin: "dense", value: esmPluginUrl, onChange: event => {
|
|
54
|
+
}), "aria-expanded": advancedOptionsOpen, "aria-label": "show more", children: _jsx(ExpandMoreIcon, {}) }), "Advanced options"] }), _jsx(Collapse, { in: advancedOptionsOpen, children: _jsxs("div", { className: classes.dialogContent, children: [_jsx(DialogContentText, { children: "The above fields assume that the plugin is built in UMD format. For an ESM build, enter its URL here instead; it carries its own name, so the fields above stay empty." }), _jsx(TextField, { label: "ESM build URL", "data-testid": "custom-plugin-esm-url", variant: "outlined", fullWidth: true, margin: "dense", value: esmPluginUrl, onChange: event => {
|
|
54
55
|
setESMPluginUrl(event.target.value);
|
|
55
56
|
} })] }) })] }) }));
|
|
56
|
-
}
|
|
57
|
+
});
|
|
58
|
+
export default AddCustomPluginDialog;
|
package/esm/ui/BaseTooltip.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type TooltipPlacement = 'top' | 'top-start' | 'top-end' | 'right' | 'right-start' | 'right-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end';
|
|
2
|
-
|
|
2
|
+
declare const BaseTooltip: ({ clientPoint: clientPointCoords, anchor, id, children, placement, }: {
|
|
3
3
|
placement?: TooltipPlacement;
|
|
4
4
|
/** Follow the pointer. The cursor-anchored mode, and the older of the two. */
|
|
5
5
|
clientPoint?: {
|
|
@@ -16,4 +16,5 @@ export default function BaseTooltip({ clientPoint: clientPointCoords, anchor, id
|
|
|
16
16
|
/** For a trigger pointing at this with `aria-describedby`. */
|
|
17
17
|
id?: string;
|
|
18
18
|
children: React.ReactNode;
|
|
19
|
-
})
|
|
19
|
+
}) => import("react").ReactPortal | null;
|
|
20
|
+
export default BaseTooltip;
|
package/esm/ui/BaseTooltip.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { useEffect, useState } from 'react';
|
|
3
3
|
import { autoUpdate, flip, offset, shift, useClientPoint, useFloating, useInteractions, } from '@floating-ui/react';
|
|
4
|
+
import { observer } from 'mobx-react';
|
|
4
5
|
import { createPortal } from 'react-dom';
|
|
5
6
|
import { useStyleTheme } from './PaletteContext.js';
|
|
6
7
|
import { alpha, grey } from './palette.js';
|
|
@@ -76,7 +77,7 @@ if (typeof window !== 'undefined') {
|
|
|
76
77
|
// from a point the pointer happens to be at. 15px off a button reads as a
|
|
77
78
|
// tooltip belonging to nothing in particular.
|
|
78
79
|
const ANCHOR_GAP_PX = 6;
|
|
79
|
-
|
|
80
|
+
const BaseTooltip = observer(function BaseTooltip({ clientPoint: clientPointCoords, anchor, id, children, placement = anchor ? 'top' : 'right', }) {
|
|
80
81
|
// The style theme is read for two things and neither is a Material import:
|
|
81
82
|
// the colors below, and the portal container a shadow-DOM embed configures
|
|
82
83
|
// through `MuiPopper.defaultProps.container` — the same slot every other
|
|
@@ -156,4 +157,5 @@ export default function BaseTooltip({ clientPoint: clientPointCoords, anchor, id
|
|
|
156
157
|
? 'hidden'
|
|
157
158
|
: undefined,
|
|
158
159
|
}, ...getFloatingProps(), children: children }), target);
|
|
159
|
-
}
|
|
160
|
+
});
|
|
161
|
+
export default BaseTooltip;
|
package/esm/ui/CascadingMenu.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { createContext,
|
|
2
|
+
import { createContext, use, useEffect, useMemo, useState } from 'react';
|
|
3
3
|
import { Divider, ListItemIcon, ListItemText, ListSubheader, Menu, MenuItem, Tooltip, } from '@mui/material';
|
|
4
4
|
import { observer } from 'mobx-react';
|
|
5
5
|
import { makeStyles } from '../util/tss-react/index.js';
|
|
@@ -8,6 +8,7 @@ import { MenuItemTrailing } from './MenuItemTrailing.js';
|
|
|
8
8
|
import { resolveSubMenu, staysOpenOnClick } from './MenuTypes.js';
|
|
9
9
|
import { hasMenuItemAdornment } from './menuItemAdornment.js';
|
|
10
10
|
import { isAimedAtPanel } from './submenuAim.js';
|
|
11
|
+
import { usePlacedMenuFocus } from './usePlacedMenuFocus.js';
|
|
11
12
|
// Compact section headers so tall menus (e.g. a display's flat "Show..."
|
|
12
13
|
// settings list with several subHeader-separated radio groups) stay short.
|
|
13
14
|
// Row heights are left at the MUI default.
|
|
@@ -266,9 +267,9 @@ function makeTestId(kind, label) {
|
|
|
266
267
|
}
|
|
267
268
|
// Leading icon slot shared by submenu rows and clickable rows; renders nothing
|
|
268
269
|
// when the item has no icon (the row insets instead to stay column-aligned).
|
|
269
|
-
function MenuItemLeadingIcon({ Icon, }) {
|
|
270
|
+
const MenuItemLeadingIcon = observer(function MenuItemLeadingIcon({ Icon, }) {
|
|
270
271
|
return Icon ? (_jsx(ListItemIcon, { children: _jsx(Icon, {}) })) : null;
|
|
271
|
-
}
|
|
272
|
+
});
|
|
272
273
|
// Which decoration columns the menu needs, computed menu-wide (true if ANY row
|
|
273
274
|
// needs it) so every row reserves matching slots and the decorations stack into
|
|
274
275
|
// aligned columns down the menu. Per list, so a submenu's own rows answer it for
|
|
@@ -322,7 +323,7 @@ function getMenuColumnFlags(menuItems) {
|
|
|
322
323
|
// Escape is the exception, and has to be: MUI's Modal reads it off the same
|
|
323
324
|
// React tree, so a row that swallowed every key left the menu with no way out
|
|
324
325
|
// for anyone whose focus was inside the slider.
|
|
325
|
-
function CustomMenuRow({ item, onHover, }) {
|
|
326
|
+
const CustomMenuRow = observer(function CustomMenuRow({ item, onHover, }) {
|
|
326
327
|
const { onCloseRoot } = useCascadingMenu();
|
|
327
328
|
return (_jsx("li", { style: { padding: '4px 16px' }, onMouseEnter: onHover, onMouseDown: e => {
|
|
328
329
|
e.stopPropagation();
|
|
@@ -331,15 +332,15 @@ function CustomMenuRow({ item, onHover, }) {
|
|
|
331
332
|
e.stopPropagation();
|
|
332
333
|
}
|
|
333
334
|
}, children: item.render(onCloseRoot) }));
|
|
334
|
-
}
|
|
335
|
+
});
|
|
335
336
|
// A disabled MenuItem has pointer-events:none, so a Tooltip placed directly on
|
|
336
337
|
// it never fires; the span wrapper (per MUI guidance) restores hover. Disabled
|
|
337
338
|
// rows aren't keyboard-focusable, so the extra wrapper doesn't affect menu
|
|
338
339
|
// navigation. Renders children untouched unless the item is disabled and has
|
|
339
340
|
// disabledHelpText.
|
|
340
|
-
function DisabledTooltip({ item, children, }) {
|
|
341
|
+
const DisabledTooltip = observer(function DisabledTooltip({ item, children, }) {
|
|
341
342
|
return item.disabled && item.disabledHelpText ? (_jsx(Tooltip, { title: item.disabledHelpText, placement: "left", children: _jsx("span", { children: children }) })) : (children);
|
|
342
|
-
}
|
|
343
|
+
});
|
|
343
344
|
// One submenu row: label (with optional leading icon), the same trailing
|
|
344
345
|
// decorations a clickable row draws, and the panel it opens.
|
|
345
346
|
//
|
|
@@ -349,7 +350,7 @@ function DisabledTooltip({ item, children, }) {
|
|
|
349
350
|
// toggle), whose content stops its own click so using it doesn't also open the
|
|
350
351
|
// submenu. Both go through `MenuItemTrailing`, so they land in the columns the
|
|
351
352
|
// clickable rows reserve rather than in a hand-assembled copy of them.
|
|
352
|
-
const CascadingSubmenu =
|
|
353
|
+
const CascadingSubmenu = observer(function CascadingSubmenu({ item, itemKey, inset, columns, open, hover, onNavigateBack, }) {
|
|
353
354
|
const { zIndex } = useCascadingMenu();
|
|
354
355
|
const [anchorEl, setAnchorEl] = useState(null);
|
|
355
356
|
// a rebuild can disable the row while its panel is up, and a disabled row has
|
|
@@ -392,7 +393,7 @@ const SubMenuList = observer(function SubMenuList({ item, onNavigateBack, }) {
|
|
|
392
393
|
// One clickable menu row: label (with optional leading icon) plus its trailing
|
|
393
394
|
// value/help/adornment decorations. The menu-wide `columns` flags let every row
|
|
394
395
|
// reserve matching decoration slots so the columns line up down the menu.
|
|
395
|
-
const CascadingMenuItem =
|
|
396
|
+
const CascadingMenuItem = observer(function CascadingMenuItem({ item, inset, columns, onNavigateBack, onHover, }) {
|
|
396
397
|
const { closeAfterItemClick, onMenuItemClick, onCloseRoot } = useCascadingMenu();
|
|
397
398
|
return (_jsx(DisabledTooltip, { item: item, children: _jsxs(MenuItem, { "data-testid": makeTestId('menuitem', item.label), disabled: item.disabled,
|
|
398
399
|
// A checkbox or radio row states its own value. The glyph
|
|
@@ -422,7 +423,7 @@ const CascadingMenuItem = memo(function CascadingMenuItem({ item, inset, columns
|
|
|
422
423
|
}
|
|
423
424
|
}, children: [_jsx(MenuItemLeadingIcon, { Icon: item.icon }), _jsx(ListItemText, { primary: item.label, secondary: item.subLabel, inset: inset }), _jsx(MenuItemTrailing, { item: item, columns: columns })] }) }));
|
|
424
425
|
});
|
|
425
|
-
function CascadingMenuList({ menuItems, onNavigateBack, }) {
|
|
426
|
+
const CascadingMenuList = observer(function CascadingMenuList({ menuItems, onNavigateBack, }) {
|
|
426
427
|
const { classes, cx } = useStyles();
|
|
427
428
|
const { openSubmenu, hover } = useSubmenuHover();
|
|
428
429
|
const { closeOnHover } = hover;
|
|
@@ -447,10 +448,11 @@ function CascadingMenuList({ menuItems, onNavigateBack, }) {
|
|
|
447
448
|
}
|
|
448
449
|
return (_jsx(CascadingMenuItem, { item: item, inset: hasIcon && !item.icon, columns: columns, onNavigateBack: onNavigateBack, onHover: closeOnHover }, key));
|
|
449
450
|
}) }));
|
|
450
|
-
}
|
|
451
|
+
});
|
|
451
452
|
const CascadingMenu = observer(function CascadingMenu({ onMenuItemClick, closeAfterItemClick = true, menuItems, open, onClose, anchorEl, anchorOrigin, transformOrigin, anchorReference, anchorPosition, style, }) {
|
|
452
453
|
const items = Array.isArray(menuItems) ? menuItems : menuItems();
|
|
453
|
-
|
|
454
|
+
const { onEntering, ...focus } = usePlacedMenuFocus();
|
|
455
|
+
return (_jsx(Menu, { ...focus, anchorEl: anchorEl, open: open, onClose: onClose, anchorOrigin: anchorOrigin, transformOrigin: transformOrigin, anchorReference: anchorReference, anchorPosition: anchorPosition, style: style, slotProps: { transition: { onEntering } }, children: _jsx(CascadingMenuContext, { value: {
|
|
454
456
|
closeAfterItemClick,
|
|
455
457
|
onMenuItemClick,
|
|
456
458
|
onCloseRoot: onClose,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { MenuItemsGetter } from './CascadingMenu.tsx';
|
|
2
2
|
import type { MenuItemClickHandler } from './MenuTypes.ts';
|
|
3
3
|
import type { PopoverOrigin } from '@mui/material';
|
|
4
|
-
declare
|
|
4
|
+
declare const CascadingMenuButton: ({ children, menuItems, closeAfterItemClick, stopPropagation, disabled, setOpen, ButtonComponent, onClick: onClickExtra, onMenuItemClick, anchorOrigin, transformOrigin, tooltip, ...rest }: {
|
|
5
5
|
children?: React.ReactNode;
|
|
6
6
|
menuItems: MenuItemsGetter;
|
|
7
7
|
closeAfterItemClick?: boolean;
|
|
@@ -20,5 +20,5 @@ declare function CascadingMenuButton({ children, menuItems, closeAfterItemClick,
|
|
|
20
20
|
transformOrigin?: PopoverOrigin;
|
|
21
21
|
tooltip?: string;
|
|
22
22
|
[key: string]: unknown;
|
|
23
|
-
})
|
|
23
|
+
}) => import("react").JSX.Element;
|
|
24
24
|
export default CascadingMenuButton;
|
|
@@ -2,6 +2,7 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
|
|
|
2
2
|
import { useState } from 'react';
|
|
3
3
|
import IconButton from '@mui/material/IconButton';
|
|
4
4
|
import Tooltip from '@mui/material/Tooltip';
|
|
5
|
+
import { observer } from 'mobx-react';
|
|
5
6
|
import CascadingMenu from './CascadingMenu.js';
|
|
6
7
|
// drop the menu below the trigger icon rather than overlapping it (MUI's
|
|
7
8
|
// default top/left anchor)
|
|
@@ -10,10 +11,10 @@ const dropdownTransformOrigin = { vertical: 'top', horizontal: 'left' };
|
|
|
10
11
|
// A disabled button has pointer-events:none, so a Tooltip placed directly on it
|
|
11
12
|
// never fires; wrap it in a span (per MUI guidance) to restore the hover. The
|
|
12
13
|
// wrapper is only added when disabled, so enabled buttons keep their layout.
|
|
13
|
-
function MaybeTooltip({ title, disabled, children, }) {
|
|
14
|
+
const MaybeTooltip = observer(function MaybeTooltip({ title, disabled, children, }) {
|
|
14
15
|
return title ? (_jsx(Tooltip, { title: title, children: disabled ? _jsx("span", { children: children }) : children })) : (children);
|
|
15
|
-
}
|
|
16
|
-
function CascadingMenuButton({ children, menuItems, closeAfterItemClick = true, stopPropagation, disabled, setOpen, ButtonComponent = IconButton, onClick: onClickExtra, onMenuItemClick = callback => {
|
|
16
|
+
});
|
|
17
|
+
const CascadingMenuButton = observer(function CascadingMenuButton({ children, menuItems, closeAfterItemClick = true, stopPropagation, disabled, setOpen, ButtonComponent = IconButton, onClick: onClickExtra, onMenuItemClick = callback => {
|
|
17
18
|
callback();
|
|
18
19
|
}, anchorOrigin = dropdownAnchorOrigin, transformOrigin = dropdownTransformOrigin, tooltip, ...rest }) {
|
|
19
20
|
const [anchorEl, setAnchorEl] = useState(null);
|
|
@@ -38,5 +39,5 @@ function CascadingMenuButton({ children, menuItems, closeAfterItemClick = true,
|
|
|
38
39
|
setAnchorEl(null);
|
|
39
40
|
setOpen?.(false);
|
|
40
41
|
}, anchorEl: anchorEl, anchorOrigin: anchorOrigin, transformOrigin: transformOrigin, menuItems: menuItems, closeAfterItemClick: closeAfterItemClick, onMenuItemClick: onMenuItemClick })) : null] }));
|
|
41
|
-
}
|
|
42
|
+
});
|
|
42
43
|
export default CascadingMenuButton;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
declare const CascadingMenuHelpDialog: ({ onClose, helpText, label, }: {
|
|
2
2
|
onClose: () => void;
|
|
3
3
|
helpText: React.ReactNode;
|
|
4
4
|
label?: React.ReactNode;
|
|
5
|
-
})
|
|
5
|
+
}) => import("react").JSX.Element;
|
|
6
|
+
export default CascadingMenuHelpDialog;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { observer } from 'mobx-react';
|
|
2
3
|
import InfoDialog from './InfoDialog.js';
|
|
3
|
-
|
|
4
|
+
const CascadingMenuHelpDialog = observer(function CascadingMenuHelpDialog({ onClose, helpText, label, }) {
|
|
4
5
|
return (_jsx(InfoDialog, { open: true, onClose: onClose, title: "Help", titleNode: label ? _jsxs(_Fragment, { children: ["Help: ", label] }) : undefined, onClick: e => {
|
|
5
6
|
e.stopPropagation();
|
|
6
7
|
}, onMouseDown: e => {
|
|
7
8
|
e.stopPropagation();
|
|
8
9
|
}, children: helpText }));
|
|
9
|
-
}
|
|
10
|
+
});
|
|
11
|
+
export default CascadingMenuHelpDialog;
|