@jbrowse/core 5.0.0-beta.1 → 5.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1476 -265
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +16 -9
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +50 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
- package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
- package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
- package/esm/BaseFeatureWidget/formatDetails.js +62 -83
- package/esm/BaseFeatureWidget/index.d.ts +2 -1
- package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
- package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
- package/esm/BaseFeatureWidget/types.d.ts +12 -6
- package/esm/BaseFeatureWidget/util.d.ts +0 -10
- package/esm/BaseFeatureWidget/util.js +0 -17
- package/esm/CorePlugin.js +2 -2
- package/esm/PluginLoader.d.ts +24 -13
- package/esm/PluginLoader.js +167 -51
- package/esm/PluginManager.d.ts +130 -24
- package/esm/PluginManager.js +180 -32
- package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
- package/esm/ReExports/MuiDataGridReExports.js +2 -2
- package/esm/ReExports/coreModules.generated.d.ts +2 -0
- package/esm/ReExports/coreModules.generated.js +528 -0
- package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/coreWorkerModules.generated.js +488 -0
- package/esm/ReExports/frameworkModules.d.ts +2 -0
- package/esm/ReExports/frameworkModules.js +68 -0
- package/esm/ReExports/frameworkShared.d.ts +12 -0
- package/esm/ReExports/frameworkShared.js +16 -0
- package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
- package/esm/ReExports/list.js +527 -79
- package/esm/ReExports/modules.d.ts +1 -1
- package/esm/ReExports/modules.js +10 -165
- package/esm/ReExports/registry.d.ts +1 -0
- package/esm/ReExports/registry.js +23 -5
- package/esm/ReExports/uiStub.d.ts +3 -0
- package/esm/ReExports/uiStub.js +33 -0
- package/esm/ReExports/workerModules.d.ts +2 -0
- package/esm/ReExports/workerModules.js +11 -0
- package/esm/TextSearch/TextSearchManager.d.ts +27 -13
- package/esm/TextSearch/TextSearchManager.js +77 -36
- package/esm/TextSearch/places.d.ts +12 -0
- package/esm/TextSearch/places.js +94 -0
- package/esm/assemblyManager/assembly.d.ts +21 -19
- package/esm/assemblyManager/assembly.js +28 -26
- package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
- package/esm/assemblyManager/assemblyAdapters.js +8 -2
- package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
- package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
- package/esm/assemblyManager/assemblyManager.d.ts +35 -180
- package/esm/assemblyManager/assemblyManager.js +47 -51
- package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
- package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
- package/esm/assemblyManager/geneticCodes.js +2 -5
- package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
- package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
- package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
- package/esm/assemblyManager/indexAssemblyNames.js +22 -0
- package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
- package/esm/assemblyManager/loadRefNameMap.js +4 -9
- package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
- package/esm/assemblyManager/refNameMapKey.js +12 -0
- package/esm/checkPlugins.d.ts +2 -0
- package/esm/checkPlugins.js +38 -17
- package/esm/configuration/bamIndexFields.d.ts +49 -0
- package/esm/configuration/bamIndexFields.js +41 -0
- package/esm/configuration/configurationSchema.d.ts +101 -71
- package/esm/configuration/configurationSchema.js +207 -134
- package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
- package/esm/configuration/configurationSchemaUnion.js +56 -0
- package/esm/configuration/configurationSlot.d.ts +150 -60
- package/esm/configuration/configurationSlot.js +103 -75
- package/esm/configuration/fillLocations.d.ts +14 -0
- package/esm/configuration/fillLocations.js +14 -0
- package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
- package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
- package/esm/configuration/formatDetailsConfigSchema.js +10 -13
- package/esm/configuration/fullConfSnapshot.d.ts +4 -19
- package/esm/configuration/fullConfSnapshot.js +30 -52
- package/esm/configuration/getConf.d.ts +45 -41
- package/esm/configuration/getConf.js +111 -44
- package/esm/configuration/index.d.ts +24 -11
- package/esm/configuration/index.js +15 -7
- package/esm/configuration/indexType.d.ts +26 -0
- package/esm/configuration/indexType.js +38 -0
- package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
- package/esm/configuration/mergeFormatCallbacks.js +13 -10
- package/esm/configuration/readConfObject.d.ts +2 -24
- package/esm/configuration/readConfObject.js +20 -63
- package/esm/configuration/requirements.d.ts +37 -0
- package/esm/configuration/requirements.js +88 -0
- package/esm/configuration/schemaRegistry.d.ts +32 -15
- package/esm/configuration/schemaRegistry.js +33 -35
- package/esm/configuration/schemaTypes.d.ts +21 -5
- package/esm/configuration/schemaTypes.js +66 -55
- package/esm/configuration/slotFacade.d.ts +12 -29
- package/esm/configuration/slotFacade.js +44 -23
- package/esm/configuration/snapshotPreprocess.d.ts +43 -0
- package/esm/configuration/snapshotPreprocess.js +161 -0
- package/esm/configuration/tabixIndexFields.d.ts +30 -4
- package/esm/configuration/tabixIndexFields.js +21 -4
- package/esm/configuration/tabixShorthand.d.ts +34 -17
- package/esm/configuration/tabixShorthand.js +49 -22
- package/esm/configuration/types.d.ts +182 -43
- package/esm/configuration/uriShorthand.d.ts +9 -0
- package/esm/configuration/uriShorthand.js +16 -0
- package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
- package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
- package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
- package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
- package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
- package/esm/data_adapters/BaseAdapter/index.js +1 -0
- package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
- package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
- package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
- package/esm/data_adapters/BaseAdapter/stats.js +52 -13
- package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
- package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
- package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
- package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
- package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
- package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
- package/esm/data_adapters/dataAdapterCache.js +44 -10
- package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
- package/esm/data_adapters/getFeatureAdapter.js +8 -8
- package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
- package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
- package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
- package/esm/pluggableElementTypes/AdapterType.js +1 -1
- package/esm/pluggableElementTypes/DisplayType.d.ts +46 -16
- package/esm/pluggableElementTypes/DisplayType.js +22 -12
- package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
- package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
- package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
- package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
- package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
- package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
- package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
- package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
- package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
- package/esm/pluggableElementTypes/ViewType.js +32 -4
- package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
- package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
- package/esm/pluggableElementTypes/extendElementType.js +9 -5
- package/esm/pluggableElementTypes/index.d.ts +2 -1
- package/esm/pluggableElementTypes/index.js +1 -1
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
- package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +65 -27
- package/esm/pluggableElementTypes/models/BaseDisplayModel.js +72 -10
- package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
- package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
- package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +85 -16
- package/esm/pluggableElementTypes/models/BaseViewModel.js +53 -10
- package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
- package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
- package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
- package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
- package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
- package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
- package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
- package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
- package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
- package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
- package/esm/pluggableElementTypes/models/index.d.ts +2 -3
- package/esm/pluggableElementTypes/models/index.js +2 -3
- package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
- package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
- package/esm/pluginDefinitions.d.ts +34 -7
- package/esm/pluginDefinitions.js +54 -20
- package/esm/rpc/BaseRpcDriver.d.ts +2 -2
- package/esm/rpc/BaseRpcDriver.js +25 -30
- package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
- package/esm/rpc/MainThreadRpcDriver.js +13 -8
- package/esm/rpc/RpcClient.d.ts +18 -6
- package/esm/rpc/RpcClient.js +51 -16
- package/esm/rpc/RpcManager.d.ts +14 -10
- package/esm/rpc/RpcManager.js +11 -1
- package/esm/rpc/RpcRegistry.d.ts +40 -7
- package/esm/rpc/RpcServer.d.ts +3 -1
- package/esm/rpc/RpcServer.js +19 -12
- package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
- package/esm/rpc/WebWorkerRpcDriver.js +64 -68
- package/esm/rpc/byteBudget.d.ts +20 -5
- package/esm/rpc/byteBudget.js +16 -5
- package/esm/rpc/configSchema.d.ts +7 -21
- package/esm/rpc/coreRpcMethods.d.ts +4 -0
- package/esm/rpc/coreRpcMethods.js +4 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
- package/esm/rpc/methods/CoreGetExportData.js +3 -4
- package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
- package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
- package/esm/rpc/methods/CoreGetFeatures.js +3 -5
- package/esm/rpc/methods/CoreGetRefNames.js +2 -12
- package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
- package/esm/rpc/methods/CoreGetSequence.js +2 -2
- package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
- package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
- package/esm/rpc/methods/layerFeatures.d.ts +33 -0
- package/esm/rpc/methods/layerFeatures.js +29 -0
- package/esm/svg/SvgExport.js +6 -7
- package/esm/svg/SvgThemeProviders.d.ts +12 -0
- package/esm/svg/SvgThemeProviders.js +15 -0
- package/esm/svg/exportViewSvg.d.ts +28 -0
- package/esm/svg/exportViewSvg.js +13 -0
- package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
- package/esm/svg/normalizeSvgMarkup.js +99 -0
- package/esm/svg/serializeSvg.d.ts +7 -0
- package/esm/svg/serializeSvg.js +11 -0
- package/esm/svg/svgId.d.ts +1 -1
- package/esm/svg/svgId.js +1 -1
- package/esm/svg/svgReady.d.ts +9 -7
- package/esm/svg/svgReady.js +8 -7
- package/esm/svg/trackNames.d.ts +7 -5
- package/esm/svg/trackNames.js +12 -9
- package/esm/svg/wrapSvgExport.js +6 -74
- package/esm/ui/AddCustomPluginDialog.js +3 -8
- package/esm/ui/AppReadyMarker.d.ts +45 -0
- package/esm/ui/AppReadyMarker.js +89 -0
- package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
- package/esm/ui/CascadingMenu.js +181 -104
- package/esm/ui/DropDownMenu.js +2 -1
- package/esm/ui/ErrorBanner.js +1 -1
- package/esm/ui/ErrorBoundary.d.ts +2 -2
- package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
- package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
- package/esm/ui/ExportSvgDialog.d.ts +1 -1
- package/esm/ui/FileDropZone.js +2 -1
- package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
- package/esm/ui/HoverMenu.d.ts +1 -2
- package/esm/ui/HoverMenu.js +6 -3
- package/esm/ui/JexlFilterDialog.d.ts +13 -10
- package/esm/ui/JexlFilterDialog.js +122 -49
- package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
- package/esm/ui/JexlFilterRowEditors.js +90 -0
- package/esm/ui/LazyBaseTooltip.d.ts +4 -0
- package/esm/ui/LazyBaseTooltip.js +9 -0
- package/esm/ui/LegendSwatchGlyph.js +26 -21
- package/esm/ui/LoadingOverlay.d.ts +14 -0
- package/esm/ui/LoadingOverlay.js +4 -2
- package/esm/ui/MenuTypes.d.ts +23 -53
- package/esm/ui/MenuTypes.js +3 -0
- package/esm/ui/MonospaceTextField.d.ts +2 -1
- package/esm/ui/MonospaceTextField.js +23 -20
- package/esm/ui/PaletteContext.d.ts +10 -5
- package/esm/ui/PaletteContext.js +44 -6
- package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
- package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
- package/esm/ui/RefNameAutocomplete/index.js +8 -2
- package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/util.js +42 -1
- package/esm/ui/ResizeHandle.d.ts +3 -1
- package/esm/ui/ResizeHandle.js +44 -11
- package/esm/ui/ScrollChrome.d.ts +13 -0
- package/esm/ui/ScrollChrome.js +11 -0
- package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
- package/esm/ui/ScrollEdgeShadow.js +14 -35
- package/esm/ui/ScrollZoomToggle.d.ts +4 -27
- package/esm/ui/ScrollZoomToggle.js +34 -51
- package/esm/ui/SessionJsonPanel.d.ts +3 -0
- package/esm/ui/SessionJsonPanel.js +14 -0
- package/esm/ui/SettingsChangesTable.d.ts +1 -0
- package/esm/ui/SettingsChangesTable.js +49 -11
- package/esm/ui/ShareLinkField.d.ts +1 -3
- package/esm/ui/ShareLinkField.js +13 -40
- package/esm/ui/SizeSliderRow.d.ts +1 -3
- package/esm/ui/SizeSliderRow.js +4 -6
- package/esm/ui/SnackbarModel.js +79 -67
- package/esm/ui/StatusProgressBar.js +2 -2
- package/esm/ui/SvgColorLegend.d.ts +9 -4
- package/esm/ui/SvgColorLegend.js +82 -41
- package/esm/ui/VerticalScrollbar.d.ts +13 -34
- package/esm/ui/VerticalScrollbar.js +29 -83
- package/esm/ui/ViewLoadingScreen.d.ts +5 -4
- package/esm/ui/ViewLoadingScreen.js +8 -32
- package/esm/ui/colorScale.d.ts +92 -0
- package/esm/ui/colorScale.js +72 -0
- package/esm/ui/colors.d.ts +64 -0
- package/esm/ui/colors.js +230 -1
- package/esm/ui/hoverBoxStyle.d.ts +14 -2
- package/esm/ui/hoverBoxStyle.js +17 -2
- package/esm/ui/index.d.ts +12 -12
- package/esm/ui/index.js +14 -22
- package/esm/ui/launchViewMenu.js +15 -5
- package/esm/ui/legendMenuItem.d.ts +10 -32
- package/esm/ui/legendMenuItem.js +9 -36
- package/esm/ui/legendSpec.d.ts +15 -8
- package/esm/ui/legendSpec.js +14 -23
- package/esm/ui/makeSizeMenu.d.ts +0 -6
- package/esm/ui/makeSizeMenu.js +6 -30
- package/esm/ui/measureLegendText.js +1 -1
- package/esm/ui/menuItemAdornment.d.ts +9 -20
- package/esm/ui/menuItemAdornment.js +10 -32
- package/esm/ui/menuItems.d.ts +2 -7
- package/esm/ui/menuItems.js +1 -6
- package/esm/ui/multiTrackMenuItems.d.ts +6 -0
- package/esm/ui/palette.d.ts +118 -116
- package/esm/ui/palette.js +114 -75
- package/esm/ui/replaceViewAction.d.ts +1 -1
- package/esm/ui/replaceViewAction.js +1 -1
- package/esm/ui/theme.d.ts +43 -119
- package/esm/ui/theme.js +62 -78
- package/esm/ui/toggleMenuItems.d.ts +1 -3
- package/esm/ui/toggleMenuItems.js +6 -5
- package/esm/ui/useAssemblySelection.d.ts +4 -4
- package/esm/ui/viewHeaderHeight.d.ts +1 -0
- package/esm/ui/viewHeaderHeight.js +1 -0
- package/esm/util/Base1DUtils.d.ts +5 -3
- package/esm/util/Base1DUtils.js +14 -6
- package/esm/util/Base1DViewModel.d.ts +2 -1
- package/esm/util/Base1DViewModel.js +3 -2
- package/esm/util/SvgCanvas.d.ts +15 -13
- package/esm/util/SvgCanvas.js +76 -56
- package/esm/util/aborting.d.ts +39 -0
- package/esm/util/aborting.js +88 -6
- package/esm/util/adapterMetadata.d.ts +1 -1
- package/esm/util/adapterMetadata.js +6 -5
- package/esm/util/addAndShowTrack.d.ts +2 -5
- package/esm/util/addAndShowTrack.js +5 -1
- package/esm/util/addRelativeUris.d.ts +17 -5
- package/esm/util/addRelativeUris.js +46 -10
- package/esm/util/addTrackFromWidget.d.ts +2 -5
- package/esm/util/addTrackFromWidget.js +5 -4
- package/esm/util/aggregateFieldName.d.ts +10 -0
- package/esm/util/aggregateFieldName.js +8 -0
- package/esm/util/analytics.js +46 -13
- package/esm/util/animationAllowed.d.ts +9 -0
- package/esm/util/animationAllowed.js +13 -0
- package/esm/util/applyRowResizeWheel.d.ts +10 -5
- package/esm/util/applyRowResizeWheel.js +10 -21
- package/esm/util/bandHeight.d.ts +10 -0
- package/esm/util/bandHeight.js +29 -0
- package/esm/util/bandLayout.d.ts +4 -4
- package/esm/util/bandLayout.js +4 -4
- package/esm/util/bezierConnector.d.ts +4 -3
- package/esm/util/bezierConnector.js +38 -45
- package/esm/util/bgzfWorkerPool.d.ts +20 -74
- package/esm/util/bgzfWorkerPool.js +20 -74
- package/esm/util/binnedAggregate.d.ts +17 -0
- package/esm/util/binnedAggregate.js +275 -0
- package/esm/util/cacheBudgets.d.ts +22 -19
- package/esm/util/cacheBudgets.js +22 -19
- package/esm/util/cachedSetup.d.ts +1 -1
- package/esm/util/cachedSetup.js +2 -2
- package/esm/util/categoricalField.d.ts +56 -0
- package/esm/util/categoricalField.js +73 -0
- package/esm/util/clampToContig.d.ts +17 -0
- package/esm/util/clampToContig.js +19 -0
- package/esm/util/coarseStripHTML.js +1 -2
- package/esm/util/color/cssColorsLevel4.d.ts +1 -0
- package/esm/util/color/cssColorsLevel4.js +1 -0
- package/esm/util/color/index.d.ts +5 -3
- package/esm/util/color/index.js +7 -4
- package/esm/util/colorBits.d.ts +3 -3
- package/esm/util/colorBits.js +19 -44
- package/esm/util/colorRamp.d.ts +49 -5
- package/esm/util/colorRamp.js +169 -18
- package/esm/util/colorScale.d.ts +156 -0
- package/esm/util/colorScale.js +243 -0
- package/esm/util/colorSchemes.d.ts +21 -0
- package/esm/util/colorSchemes.js +30 -0
- package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
- package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
- package/esm/util/createSvgRasterCanvas.d.ts +10 -0
- package/esm/util/cssColorParse.d.ts +15 -0
- package/esm/util/cssColorParse.js +53 -0
- package/esm/util/diagonalizeRegions.d.ts +2 -3
- package/esm/util/diagonalizeRegions.js +8 -13
- package/esm/util/expandLooseSearchIndex.d.ts +19 -0
- package/esm/util/expandLooseSearchIndex.js +29 -0
- package/esm/util/featureTable.d.ts +224 -0
- package/esm/util/featureTable.js +366 -0
- package/esm/util/featureTransforms.d.ts +80 -0
- package/esm/util/featureTransforms.js +1579 -0
- package/esm/util/featureTypes.d.ts +24 -0
- package/esm/util/featureTypes.js +35 -0
- package/esm/util/fetchAndMaybeUnzip.js +16 -9
- package/esm/util/fetchContext.d.ts +7 -8
- package/esm/util/fetchContext.js +3 -3
- package/esm/util/fetchHub.d.ts +4 -2
- package/esm/util/fetchHub.js +2 -2
- package/esm/util/fetchPhases.d.ts +10 -10
- package/esm/util/fetchSeq.d.ts +2 -3
- package/esm/util/fetchSeq.js +2 -2
- package/esm/util/fieldReader.d.ts +17 -0
- package/esm/util/fieldReader.js +62 -0
- package/esm/util/freezeDeep.d.ts +8 -10
- package/esm/util/freezeDeep.js +8 -10
- package/esm/util/groupKeys.d.ts +77 -0
- package/esm/util/groupKeys.js +155 -0
- package/esm/util/highlights.d.ts +10 -6
- package/esm/util/highlights.js +12 -25
- package/esm/util/hooks.d.ts +31 -2
- package/esm/util/hooks.js +72 -3
- package/esm/util/index.d.ts +11 -11
- package/esm/util/index.js +11 -10
- package/esm/util/indexCandidates.d.ts +1 -31
- package/esm/util/indexCandidates.js +5 -63
- package/esm/util/installFetch.d.ts +77 -37
- package/esm/util/installFetch.js +65 -38
- package/esm/util/installInitAutorun.d.ts +14 -13
- package/esm/util/installInitAutorun.js +17 -17
- package/esm/util/installPrerequisiteFetch.d.ts +115 -0
- package/esm/util/installPrerequisiteFetch.js +111 -0
- package/esm/util/io/index.js +19 -14
- package/esm/util/isDataCurrent.d.ts +7 -5
- package/esm/util/isDataCurrent.js +9 -6
- package/esm/util/isTextEntryFocused.d.ts +7 -0
- package/esm/util/isTextEntryFocused.js +16 -0
- package/esm/util/jexl.js +24 -21
- package/esm/util/jexlFilterRows.d.ts +89 -0
- package/esm/util/jexlFilterRows.js +252 -0
- package/esm/util/jexlFilters.d.ts +20 -27
- package/esm/util/jexlFilters.js +23 -11
- package/esm/util/jexlStrings.d.ts +3 -4
- package/esm/util/jexlStrings.js +2 -3
- package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
- package/esm/util/layouts/GranularRectLayout.js +25 -8
- package/esm/util/lazyAfterAttach.d.ts +13 -0
- package/esm/util/lazyAfterAttach.js +31 -0
- package/esm/util/lazyWithPreload.d.ts +19 -0
- package/esm/util/lazyWithPreload.js +27 -0
- package/esm/util/legendCandidates.d.ts +72 -0
- package/esm/util/legendCandidates.js +138 -0
- package/esm/util/localStorage.js +4 -4
- package/esm/util/markEncoding.d.ts +150 -0
- package/esm/util/markEncoding.js +845 -0
- package/esm/util/markEncodingTypes.d.ts +588 -0
- package/esm/util/markEncodingTypes.js +8 -0
- package/esm/util/mst-reflection.d.ts +2 -20
- package/esm/util/mst-reflection.js +3 -53
- package/esm/util/mstUtils.d.ts +31 -23
- package/esm/util/mstUtils.js +39 -24
- package/esm/util/numericUtils.d.ts +7 -0
- package/esm/util/numericUtils.js +16 -0
- package/esm/util/numericValue.d.ts +14 -0
- package/esm/util/numericValue.js +34 -0
- package/esm/util/openFeatureWidget.d.ts +5 -0
- package/esm/util/openFeatureWidget.js +2 -2
- package/esm/util/openViews.d.ts +17 -0
- package/esm/util/openViews.js +22 -0
- package/esm/util/parentWalk.d.ts +1 -1
- package/esm/util/parentWalk.js +1 -1
- package/esm/util/parseLineByLine.d.ts +4 -5
- package/esm/util/parseLineByLine.js +8 -14
- package/esm/util/pluginStore.d.ts +6 -8
- package/esm/util/pluginStore.js +17 -16
- package/esm/util/preloadComponent.d.ts +5 -0
- package/esm/util/preloadComponent.js +11 -0
- package/esm/util/progress.d.ts +22 -22
- package/esm/util/progress.js +27 -26
- package/esm/util/quantileExtent.d.ts +49 -0
- package/esm/util/quantileExtent.js +162 -0
- package/esm/util/range.d.ts +13 -9
- package/esm/util/range.js +17 -8
- package/esm/util/renameRegions.d.ts +26 -6
- package/esm/util/renameRegions.js +68 -54
- package/esm/util/renderToStaticMarkup.js +24 -14
- package/esm/util/rxjs.d.ts +23 -8
- package/esm/util/rxjs.js +61 -15
- package/esm/util/samplesTsv.d.ts +49 -0
- package/esm/util/samplesTsv.js +86 -0
- package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
- package/esm/util/scheduleDetachedDestroy.js +24 -0
- package/esm/util/scrollLatch.d.ts +1 -0
- package/esm/util/scrollLatch.js +8 -0
- package/esm/util/selectEncodedFeature.d.ts +16 -0
- package/esm/util/selectEncodedFeature.js +34 -0
- package/esm/util/sessionSharing.d.ts +7 -5
- package/esm/util/sessionSharing.js +23 -23
- package/esm/util/shapeNameList.d.ts +2 -0
- package/esm/util/shapeNameList.js +6 -0
- package/esm/util/shapeNames.d.ts +7 -0
- package/esm/util/shapeNames.js +11 -0
- package/esm/util/simpleFeature.d.ts +0 -1
- package/esm/util/starFusion.d.ts +26 -0
- package/esm/util/starFusion.js +37 -0
- package/esm/util/stepTables.d.ts +82 -0
- package/esm/util/stepTables.js +243 -0
- package/esm/util/svAlt.d.ts +145 -0
- package/esm/util/svAlt.js +364 -0
- package/esm/util/svgColorProps.d.ts +11 -0
- package/esm/util/svgColorProps.js +28 -1
- package/esm/util/systemColorScheme.d.ts +12 -0
- package/esm/util/systemColorScheme.js +27 -0
- package/esm/util/tabix.d.ts +13 -8
- package/esm/util/tabix.js +17 -12
- package/esm/util/thresholdScale.d.ts +91 -0
- package/esm/util/thresholdScale.js +166 -0
- package/esm/util/timeGate.d.ts +4 -5
- package/esm/util/timeGate.js +4 -5
- package/esm/util/trackConfigDelta.d.ts +26 -26
- package/esm/util/trackConfigDelta.js +63 -47
- package/esm/util/tracks.d.ts +121 -40
- package/esm/util/tracks.js +497 -112
- package/esm/util/translateTranscript.d.ts +44 -0
- package/esm/util/translateTranscript.js +102 -0
- package/esm/util/types/data.d.ts +0 -2
- package/esm/util/types/index.d.ts +121 -22
- package/esm/util/types/index.js +9 -0
- package/esm/util/types/mst.d.ts +3 -0
- package/esm/util/types/mst.js +4 -0
- package/esm/util/types/renameIds.d.ts +1 -0
- package/esm/util/types/renameIds.js +29 -0
- package/esm/util/types/services.d.ts +1 -1
- package/esm/util/unknownSnapshotKeys.d.ts +51 -0
- package/esm/util/unknownSnapshotKeys.js +82 -0
- package/esm/util/useFeatureSequence.js +5 -5
- package/esm/util/useFetch.d.ts +3 -4
- package/esm/util/useFetch.js +19 -10
- package/esm/util/useFetchPlugins.d.ts +6 -2
- package/esm/util/useFetchPlugins.js +7 -3
- package/esm/util/usePanelVirtualScroll.d.ts +7 -35
- package/esm/util/usePanelVirtualScroll.js +9 -36
- package/esm/util/useRowVirtualScroll.d.ts +6 -29
- package/esm/util/useRowVirtualScroll.js +8 -49
- package/esm/util/useVirtualScrollWheel.d.ts +20 -4
- package/esm/util/useVirtualScrollWheel.js +40 -74
- package/esm/util/viewHighlights.d.ts +3 -0
- package/esm/util/viewHighlights.js +5 -0
- package/esm/util/viewStatus.d.ts +47 -15
- package/esm/util/viewStatus.js +34 -0
- package/esm/util/wheelZoom.d.ts +7 -1
- package/esm/util/wheelZoom.js +85 -19
- package/esm/util/whenViewSettled.d.ts +55 -8
- package/esm/util/whenViewSettled.js +56 -7
- package/esm/util/withLaunchInput.d.ts +174 -0
- package/esm/util/withLaunchInput.js +274 -0
- package/package.json +70 -20
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
- package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
- package/esm/ReExports/BaseFeatureDetails.js +0 -10
- package/esm/ReExports/index.d.ts +0 -1
- package/esm/ReExports/index.js +0 -1
- package/esm/ReExports/publicUtil.d.ts +0 -1
- package/esm/ReExports/publicUtil.js +0 -28
- package/esm/configuration/promotableDefaults.d.ts +0 -199
- package/esm/configuration/promotableDefaults.js +0 -326
- package/esm/configuration/promotablePin.d.ts +0 -55
- package/esm/configuration/promotablePin.js +0 -1
- package/esm/configuration/promotableResolve.d.ts +0 -108
- package/esm/configuration/promotableResolve.js +0 -117
- package/esm/configuration/promotableSlots.d.ts +0 -12
- package/esm/configuration/promotableSlots.js +0 -45
- package/esm/configuration/slotShape.d.ts +0 -12
- package/esm/configuration/slotShape.js +0 -84
- package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
- package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
- package/esm/ui/PinAdornment.d.ts +0 -5
- package/esm/ui/PinAdornment.js +0 -79
- package/esm/ui/SvgGradientLegend.d.ts +0 -26
- package/esm/ui/SvgGradientLegend.js +0 -26
- package/esm/ui/highlightChipReveal.d.ts +0 -32
- package/esm/ui/highlightChipReveal.js +0 -39
- package/esm/ui/promotableMenuItems.d.ts +0 -19
- package/esm/ui/promotableMenuItems.js +0 -89
- package/esm/ui/promotablePinCoverage.d.ts +0 -44
- package/esm/ui/promotablePinCoverage.js +0 -87
- package/esm/util/applyInitSettings.d.ts +0 -79
- package/esm/util/applyInitSettings.js +0 -91
- package/esm/util/openDisplays.d.ts +0 -23
- package/esm/util/openDisplays.js +0 -79
- package/esm/util/stopToken.d.ts +0 -211
- package/esm/util/stopToken.js +0 -438
- /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
|
@@ -4,33 +4,24 @@ import type { Reversible } from '../ui/filterMenuItems.ts';
|
|
|
4
4
|
* The two-tier feature-filter contract, shared by every display offering a
|
|
5
5
|
* "Filter by..." row. Two tiers because the setting has two authors:
|
|
6
6
|
*
|
|
7
|
-
* - the **`
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* an empty list* — it replaces the config tier entirely, which is what makes
|
|
15
|
-
* "clear the filters an admin declared" expressible.
|
|
7
|
+
* - the **`filter` config slot**, which an admin declares in a track config:
|
|
8
|
+
* `jexlFilterConfigSchemaFields` in display-kit, spread by the canvas base
|
|
9
|
+
* display schema, the mark display schema and the shared multi-sample
|
|
10
|
+
* variant schema — the three whose models read it.
|
|
11
|
+
* - the **`filterSetting` display property**, which the dialog writes. Set —
|
|
12
|
+
* *even to an empty list* — it replaces the config tier entirely, which is
|
|
13
|
+
* what makes "clear the filters an admin declared" expressible.
|
|
16
14
|
*
|
|
17
|
-
*
|
|
18
|
-
* `LinearBasicDisplay` had both tiers, `LDDisplay` had the slot alone, and the
|
|
19
|
-
* multi-sample variant displays had a property literally named `jexlFilters`
|
|
20
|
-
* that shadowed the inherited slot, so a config filter on one of those tracks
|
|
21
|
-
* was read by nothing and reported no error. Neither of the last two prefixed,
|
|
22
|
-
* so a filter following the slot's own documented convention reached
|
|
23
|
-
* `stringToJexlExpression` unprefixed and threw inside the worker.
|
|
15
|
+
* Both hold `jexl:` expressions and refuse a bare string.
|
|
24
16
|
*/
|
|
25
17
|
export interface JexlFilterSource {
|
|
26
18
|
/**
|
|
27
|
-
* The dialog's override
|
|
28
|
-
*
|
|
19
|
+
* The dialog's override. `undefined` means "follow the config slot"; an
|
|
20
|
+
* empty array means "the user cleared them".
|
|
29
21
|
*/
|
|
30
|
-
|
|
22
|
+
filterSetting?: readonly string[];
|
|
31
23
|
/**
|
|
32
|
-
* The config tier
|
|
33
|
-
* `configuredJexlFilters(self)`. A member rather than a read this module does
|
|
24
|
+
* The config tier — in practice `configuredJexlFilters(self)`. A member rather than a read this module does
|
|
34
25
|
* itself, so the two things that consume this contract off a **duck-typed**
|
|
35
26
|
* model — LD's structural menu builder and its shape test — need no live
|
|
36
27
|
* config node to answer a count with.
|
|
@@ -45,17 +36,19 @@ export interface JexlFilterSource {
|
|
|
45
36
|
* cannot satisfy.
|
|
46
37
|
*/
|
|
47
38
|
export interface JexlFilterModel extends JexlFilterSource {
|
|
48
|
-
|
|
39
|
+
setFilter: (filters?: string[]) => void;
|
|
49
40
|
}
|
|
41
|
+
/** The `filterSetting` property, for a display model to declare. */
|
|
42
|
+
export declare const FilterSetting: import("@jbrowse/mobx-state-tree").IMaybe<import("@jbrowse/mobx-state-tree").IArrayType<import("@jbrowse/mobx-state-tree").ISimpleType<string>>>;
|
|
50
43
|
/**
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* prefixing happens once, here — this is what a display's `configuredFilters`
|
|
54
|
-
* member is.
|
|
44
|
+
* A snapshot's v4 `jexlFiltersSetting` as `filterSetting`, for the
|
|
45
|
+
* `preProcessSnapshot` of the model declaring {@link FilterSetting}.
|
|
55
46
|
*/
|
|
47
|
+
export declare function liftRetiredFilterSetting<T>(snap: T): T;
|
|
48
|
+
/** What the `filter` config slot alone declares: a display's `configuredFilters`. */
|
|
56
49
|
export declare function configuredJexlFilters(self: Parameters<typeof getConf>[0]): string[];
|
|
57
50
|
/**
|
|
58
|
-
* The filters actually applied
|
|
51
|
+
* The filters actually applied — the single source of truth
|
|
59
52
|
* for the worker (via `rpcProps`), for the "Filter by..." dialog (so config
|
|
60
53
|
* filters show up and are editable), and for the narrowing count below.
|
|
61
54
|
*/
|
package/esm/util/jexlFilters.js
CHANGED
|
@@ -1,25 +1,37 @@
|
|
|
1
1
|
// own module, not the configuration barrel: that barrel re-exports modules
|
|
2
2
|
// which import this one, and a value import back into it is the cycle shape
|
|
3
3
|
// `openFeatureWidget` documents
|
|
4
|
+
import { types } from '@jbrowse/mobx-state-tree';
|
|
4
5
|
import { getConf } from '../configuration/getConf.js';
|
|
5
6
|
import { ensureJexlPrefix } from './jexlStrings.js';
|
|
7
|
+
import { JexlExpressionString } from './types/mst.js';
|
|
8
|
+
/** The `filterSetting` property, for a display model to declare. */
|
|
9
|
+
export const FilterSetting = types.maybe(types.array(JexlExpressionString));
|
|
6
10
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* prefixing happens once, here — this is what a display's `configuredFilters`
|
|
10
|
-
* member is.
|
|
11
|
+
* A snapshot's v4 `jexlFiltersSetting` as `filterSetting`, for the
|
|
12
|
+
* `preProcessSnapshot` of the model declaring {@link FilterSetting}.
|
|
11
13
|
*/
|
|
14
|
+
export function liftRetiredFilterSetting(snap) {
|
|
15
|
+
if (!snap || typeof snap !== 'object' || !('jexlFiltersSetting' in snap)) {
|
|
16
|
+
return snap;
|
|
17
|
+
}
|
|
18
|
+
const { jexlFiltersSetting, ...rest } = snap;
|
|
19
|
+
return (Array.isArray(jexlFiltersSetting) && !('filterSetting' in rest)
|
|
20
|
+
? { ...rest, filterSetting: jexlFiltersSetting.map(ensureJexlPrefix) }
|
|
21
|
+
: rest);
|
|
22
|
+
}
|
|
23
|
+
/** What the `filter` config slot alone declares: a display's `configuredFilters`. */
|
|
12
24
|
export function configuredJexlFilters(self) {
|
|
13
|
-
return getConf(self, '
|
|
25
|
+
return getConf(self, 'filter');
|
|
14
26
|
}
|
|
15
27
|
/**
|
|
16
|
-
* The filters actually applied
|
|
28
|
+
* The filters actually applied — the single source of truth
|
|
17
29
|
* for the worker (via `rpcProps`), for the "Filter by..." dialog (so config
|
|
18
30
|
* filters show up and are editable), and for the narrowing count below.
|
|
19
31
|
*/
|
|
20
32
|
export function activeJexlFilters(self) {
|
|
21
|
-
const {
|
|
22
|
-
return
|
|
33
|
+
const { filterSetting } = self;
|
|
34
|
+
return filterSetting ? [...filterSetting] : self.configuredFilters();
|
|
23
35
|
}
|
|
24
36
|
/**
|
|
25
37
|
* The `Reversible` a display declares for its jexl filters.
|
|
@@ -34,16 +46,16 @@ export function activeJexlFilters(self) {
|
|
|
34
46
|
* restoring the config default, which the group clear already is.
|
|
35
47
|
*/
|
|
36
48
|
export function jexlFilterNarrowing(self) {
|
|
37
|
-
const override = self.
|
|
49
|
+
const override = self.filterSetting;
|
|
38
50
|
const configured = self.configuredFilters();
|
|
39
51
|
return {
|
|
40
52
|
count: override !== undefined &&
|
|
41
53
|
(override.length !== configured.length ||
|
|
42
|
-
override.some((f, i) =>
|
|
54
|
+
override.some((f, i) => f !== configured[i]))
|
|
43
55
|
? 1
|
|
44
56
|
: 0,
|
|
45
57
|
clear: () => {
|
|
46
|
-
self.
|
|
58
|
+
self.setFilter(undefined);
|
|
47
59
|
},
|
|
48
60
|
};
|
|
49
61
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export interface JexlExpression {
|
|
2
2
|
eval(context?: Record<string, unknown>): unknown;
|
|
3
|
-
|
|
3
|
+
readonly source?: string;
|
|
4
4
|
}
|
|
5
5
|
export interface JexlInstance {
|
|
6
6
|
compile(code: string): JexlExpression;
|
|
@@ -11,9 +11,8 @@ export declare function isJexl(str: unknown): str is string;
|
|
|
11
11
|
/** Add the `jexl:` prefix unless the string already carries it. */
|
|
12
12
|
export declare function ensureJexlPrefix(code: string): string;
|
|
13
13
|
/**
|
|
14
|
-
* Compile a `jexl:...` string to an Expression.
|
|
15
|
-
*
|
|
16
|
-
* wrapper.
|
|
14
|
+
* Compile a `jexl:...` string to an Expression. The jexl instance caches
|
|
15
|
+
* compilation, so this only strips the prefix.
|
|
17
16
|
*
|
|
18
17
|
* @param str - string of code like `jexl:...`
|
|
19
18
|
* @param jexl - the instance whose registered functions the expression may call
|
package/esm/util/jexlStrings.js
CHANGED
|
@@ -8,9 +8,8 @@ export function ensureJexlPrefix(code) {
|
|
|
8
8
|
return isJexl(code) ? code : `${JEXL_PREFIX}${code}`;
|
|
9
9
|
}
|
|
10
10
|
/**
|
|
11
|
-
* Compile a `jexl:...` string to an Expression.
|
|
12
|
-
*
|
|
13
|
-
* wrapper.
|
|
11
|
+
* Compile a `jexl:...` string to an Expression. The jexl instance caches
|
|
12
|
+
* compilation, so this only strips the prefix.
|
|
14
13
|
*
|
|
15
14
|
* @param str - string of code like `jexl:...`
|
|
16
15
|
* @param jexl - the instance whose registered functions the expression may call
|
|
@@ -17,9 +17,16 @@ export default class GranularRectLayout {
|
|
|
17
17
|
hardRowLimit?: number;
|
|
18
18
|
});
|
|
19
19
|
/**
|
|
20
|
+
* `lower` gives the rows lying wholly at or past `lower.top` px below the
|
|
21
|
+
* rect's top a span of their own.
|
|
22
|
+
*
|
|
20
23
|
* @returns top position for the rect, or Null if laying
|
|
21
24
|
* out the rect would exceed maxHeight
|
|
22
25
|
*/
|
|
23
|
-
addRect(id: string, left: number, right: number, height: number
|
|
26
|
+
addRect(id: string, left: number, right: number, height: number, lower?: {
|
|
27
|
+
top: number;
|
|
28
|
+
left: number;
|
|
29
|
+
right: number;
|
|
30
|
+
}): number | null;
|
|
24
31
|
private getOrCreateRow;
|
|
25
32
|
}
|
|
@@ -49,10 +49,13 @@ export default class GranularRectLayout {
|
|
|
49
49
|
this.maxHeight = Math.ceil(maxHeight / this.pitchY);
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
52
|
+
* `lower` gives the rows lying wholly at or past `lower.top` px below the
|
|
53
|
+
* rect's top a span of their own.
|
|
54
|
+
*
|
|
52
55
|
* @returns top position for the rect, or Null if laying
|
|
53
56
|
* out the rect would exceed maxHeight
|
|
54
57
|
*/
|
|
55
|
-
addRect(id, left, right, height) {
|
|
58
|
+
addRect(id, left, right, height, lower) {
|
|
56
59
|
const pitchX = this.pitchX;
|
|
57
60
|
const pitchY = this.pitchY;
|
|
58
61
|
// if we have already laid it out, return its layout
|
|
@@ -65,12 +68,19 @@ export default class GranularRectLayout {
|
|
|
65
68
|
const pLeft = Math.trunc(left / pitchX);
|
|
66
69
|
const pRight = Math.trunc(right / pitchX);
|
|
67
70
|
const pHeight = Math.ceil(height / pitchY);
|
|
71
|
+
const pLowerTop = lower ? Math.ceil(lower.top / pitchY) : pHeight;
|
|
68
72
|
const rectangle = {
|
|
69
73
|
l: pLeft,
|
|
70
74
|
r: pRight,
|
|
71
75
|
top: null,
|
|
72
76
|
h: pHeight,
|
|
73
77
|
};
|
|
78
|
+
const lowerSpan = lower
|
|
79
|
+
? {
|
|
80
|
+
l: Math.trunc(lower.left / pitchX),
|
|
81
|
+
r: Math.trunc(lower.right / pitchX),
|
|
82
|
+
}
|
|
83
|
+
: rectangle;
|
|
74
84
|
// Allow features to start at any position up to maxHeight
|
|
75
85
|
// Features starting at maxHeight or beyond are filtered out, but features
|
|
76
86
|
// that start below maxHeight and extend past it are allowed
|
|
@@ -84,7 +94,10 @@ export default class GranularRectLayout {
|
|
|
84
94
|
// between them still spans y, because y < top + pHeight — so nothing between
|
|
85
95
|
// can fit. `top = y` plus the loop's own increment is that jump, and it turns
|
|
86
96
|
// the scan from O(rows * pHeight) into O(rows): without it, a rect pHeight
|
|
87
|
-
// rows tall re-tests the row that blocked it pHeight times over.
|
|
97
|
+
// rows tall re-tests the row that blocked it pHeight times over. Moving
|
|
98
|
+
// the rect down only moves y up within it, so a hit above the lower span
|
|
99
|
+
// blocks every top to y, and a hit in the lower span blocks just the tops
|
|
100
|
+
// keeping y there: the jump goes to the first top putting y above it.
|
|
88
101
|
outer: for (; top <= maxTop; top += 1) {
|
|
89
102
|
// Check all rows that this rectangle would occupy
|
|
90
103
|
const maxY = top + pHeight;
|
|
@@ -97,13 +110,17 @@ export default class GranularRectLayout {
|
|
|
97
110
|
const intervals = row.getIntervals();
|
|
98
111
|
const len = intervals.length;
|
|
99
112
|
if (len > 0) {
|
|
113
|
+
const inLower = y - top >= pLowerTop;
|
|
114
|
+
const l = inLower ? lowerSpan.l : pLeft;
|
|
115
|
+
const r = inLower ? lowerSpan.r : pRight;
|
|
116
|
+
const blockedTop = inLower ? y - pLowerTop : y;
|
|
100
117
|
if (len < 40) {
|
|
101
118
|
// Linear scan for small arrays
|
|
102
119
|
for (let i = 0; i < len; i += 2) {
|
|
103
120
|
const start = intervals[i];
|
|
104
121
|
const end = intervals[i + 1];
|
|
105
|
-
if (end >
|
|
106
|
-
top =
|
|
122
|
+
if (end > l && start < r) {
|
|
123
|
+
top = blockedTop;
|
|
107
124
|
continue outer;
|
|
108
125
|
}
|
|
109
126
|
}
|
|
@@ -115,7 +132,7 @@ export default class GranularRectLayout {
|
|
|
115
132
|
while (low < high) {
|
|
116
133
|
const mid = (low + high) >>> 1;
|
|
117
134
|
const midIdx = mid << 1;
|
|
118
|
-
if (intervals[midIdx + 1] <=
|
|
135
|
+
if (intervals[midIdx + 1] <= l) {
|
|
119
136
|
low = mid + 1;
|
|
120
137
|
}
|
|
121
138
|
else {
|
|
@@ -125,8 +142,8 @@ export default class GranularRectLayout {
|
|
|
125
142
|
const idx = low << 1;
|
|
126
143
|
if (idx < len) {
|
|
127
144
|
const start = intervals[idx];
|
|
128
|
-
if (start <
|
|
129
|
-
top =
|
|
145
|
+
if (start < r) {
|
|
146
|
+
top = blockedTop;
|
|
130
147
|
continue outer;
|
|
131
148
|
}
|
|
132
149
|
}
|
|
@@ -143,7 +160,7 @@ export default class GranularRectLayout {
|
|
|
143
160
|
rectangle.top = top;
|
|
144
161
|
const yEnd = top + pHeight;
|
|
145
162
|
for (let y = top; y < yEnd; y += 1) {
|
|
146
|
-
this.getOrCreateRow(y).addRect(rectangle);
|
|
163
|
+
this.getOrCreateRow(y).addRect(y - top >= pLowerTop ? lowerSpan : rectangle);
|
|
147
164
|
}
|
|
148
165
|
return top * pitchY;
|
|
149
166
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { IStateTreeNode } from '@jbrowse/mobx-state-tree';
|
|
2
|
+
/**
|
|
3
|
+
* #api core/util
|
|
4
|
+
* Run a display's `afterAttach` body from a module loaded on demand, so the
|
|
5
|
+
* autorun installers stay out of the display's eager bundle.
|
|
6
|
+
*
|
|
7
|
+
* One policy for the gap the `await` opens: a node torn down before the module
|
|
8
|
+
* lands installs nothing, and a module that fails to load is reported where the
|
|
9
|
+
* user can see it rather than onto the display's own error slot — that slot is
|
|
10
|
+
* what `reload()` clears, and nothing would re-run the install behind it.
|
|
11
|
+
* Three displays hand-rolled this IIFE and each drew the lines differently.
|
|
12
|
+
*/
|
|
13
|
+
export declare function runLazyAfterAttach<Self extends IStateTreeNode>(self: Self, load: () => Promise<(self: Self) => void>): void;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { isAlive } from '@jbrowse/mobx-state-tree';
|
|
2
|
+
import { getNotificationSink } from './sessionServices.js';
|
|
3
|
+
/**
|
|
4
|
+
* #api core/util
|
|
5
|
+
* Run a display's `afterAttach` body from a module loaded on demand, so the
|
|
6
|
+
* autorun installers stay out of the display's eager bundle.
|
|
7
|
+
*
|
|
8
|
+
* One policy for the gap the `await` opens: a node torn down before the module
|
|
9
|
+
* lands installs nothing, and a module that fails to load is reported where the
|
|
10
|
+
* user can see it rather than onto the display's own error slot — that slot is
|
|
11
|
+
* what `reload()` clears, and nothing would re-run the install behind it.
|
|
12
|
+
* Three displays hand-rolled this IIFE and each drew the lines differently.
|
|
13
|
+
*/
|
|
14
|
+
export function runLazyAfterAttach(self, load) {
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
16
|
+
;
|
|
17
|
+
(async () => {
|
|
18
|
+
try {
|
|
19
|
+
const install = await load();
|
|
20
|
+
if (isAlive(self)) {
|
|
21
|
+
install(self);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
if (isAlive(self)) {
|
|
26
|
+
console.error(e);
|
|
27
|
+
getNotificationSink(self).notifyError(`${e}`, e);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
})();
|
|
31
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AnyReactComponentType } from './types/util.ts';
|
|
2
|
+
/**
|
|
3
|
+
* `React.lazy` that also exposes the import it wraps, so code that knows a
|
|
4
|
+
* component is about to render (a session naming a view, a track being shown)
|
|
5
|
+
* can start the download instead of waiting for React to reach it. A failed
|
|
6
|
+
* load is not kept, so the render that follows tries again.
|
|
7
|
+
*
|
|
8
|
+
* Once the import has landed, the first render gets the module synchronously.
|
|
9
|
+
* React.lazy suspends on any promise, settled or not, and React holds a
|
|
10
|
+
* suspended boundary's reveal for 300 ms after its fallback commits, so a
|
|
11
|
+
* preloaded component nested under another cost that 300 ms per level.
|
|
12
|
+
*/
|
|
13
|
+
export declare function lazyWithPreload<T extends AnyReactComponentType>(factory: () => Promise<{
|
|
14
|
+
default: T;
|
|
15
|
+
}>): import("react").LazyExoticComponent<T> & {
|
|
16
|
+
preload: () => Promise<{
|
|
17
|
+
default: T;
|
|
18
|
+
}>;
|
|
19
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { lazy } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* `React.lazy` that also exposes the import it wraps, so code that knows a
|
|
4
|
+
* component is about to render (a session naming a view, a track being shown)
|
|
5
|
+
* can start the download instead of waiting for React to reach it. A failed
|
|
6
|
+
* load is not kept, so the render that follows tries again.
|
|
7
|
+
*
|
|
8
|
+
* Once the import has landed, the first render gets the module synchronously.
|
|
9
|
+
* React.lazy suspends on any promise, settled or not, and React holds a
|
|
10
|
+
* suspended boundary's reveal for 300 ms after its fallback commits, so a
|
|
11
|
+
* preloaded component nested under another cost that 300 ms per level.
|
|
12
|
+
*/
|
|
13
|
+
export function lazyWithPreload(factory) {
|
|
14
|
+
let loaded;
|
|
15
|
+
let loading;
|
|
16
|
+
const load = () => (loading ??= factory().then(module => (loaded = module), (error) => {
|
|
17
|
+
loading = undefined;
|
|
18
|
+
throw error;
|
|
19
|
+
}));
|
|
20
|
+
const settled = (module) => ({
|
|
21
|
+
// eslint-disable-next-line unicorn/no-thenable -- React.lazy takes a module synchronously only from a then that calls back at once
|
|
22
|
+
then: (resolve) => {
|
|
23
|
+
resolve(module);
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
return Object.assign(lazy(() => (loaded ? settled(loaded) : load())), { preload: load });
|
|
27
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { CategoricalEntry, CategoricalScale } from '../ui/colorScale.ts';
|
|
2
|
+
import type { LegendSwatch } from '../ui/legendSpec.ts';
|
|
3
|
+
import type { CategoricalField } from './categoricalField.ts';
|
|
4
|
+
export interface LegendCandidate {
|
|
5
|
+
rowIndex: number;
|
|
6
|
+
value: string;
|
|
7
|
+
color: number;
|
|
8
|
+
}
|
|
9
|
+
export interface LegendEntry {
|
|
10
|
+
values: string[];
|
|
11
|
+
color: number;
|
|
12
|
+
}
|
|
13
|
+
export declare const MAX_LEGEND_ENTRIES = 30;
|
|
14
|
+
export declare const MAX_LEGEND_CANDIDATES = 1024;
|
|
15
|
+
/**
|
|
16
|
+
* Accumulator for the distinct (row, value, color) combinations a packer walks
|
|
17
|
+
* past, in first-seen order and bounded, so the main thread never re-walks the
|
|
18
|
+
* features. Deduped on the whole triple: a row of the union lists every value
|
|
19
|
+
* painted in its color, so a second value on that color has to still be in the
|
|
20
|
+
* list to reach it.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createLegendCandidateCollector(maxCandidates?: number): {
|
|
23
|
+
candidates: LegendCandidate[];
|
|
24
|
+
add(rowIndex: number, value: string, color: number): void;
|
|
25
|
+
};
|
|
26
|
+
export interface LegendCandidateSource {
|
|
27
|
+
candidates: readonly LegendCandidate[];
|
|
28
|
+
rowPaintsCandidateColor: (rowIndex: number) => boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The categorical color key over any number of packed regions: one entry per
|
|
32
|
+
* distinct color listing every value painted in it, colors in first-seen
|
|
33
|
+
* order. Keyed by color rather than by value because hiding a category hides
|
|
34
|
+
* features BY color, so two values sharing one color are one row that names
|
|
35
|
+
* both; a value met in two colors stays with the first.
|
|
36
|
+
*
|
|
37
|
+
* `[]` when there are more than `maxEntries` distinct colors, where the data is
|
|
38
|
+
* not a categorical vocabulary. `regions` is consumed lazily.
|
|
39
|
+
*/
|
|
40
|
+
export declare function unionLegendCandidates<T>(regions: Iterable<T>, resolve: (region: T) => LegendCandidateSource, maxEntries?: number): LegendEntry[];
|
|
41
|
+
/**
|
|
42
|
+
* A source whose every entry is a candidate its one row paints: the entries of
|
|
43
|
+
* a scale table `encodeFeatures` resolved, or any walk that met each value in
|
|
44
|
+
* one color.
|
|
45
|
+
*/
|
|
46
|
+
export declare function everyRowPaints(entries: readonly {
|
|
47
|
+
value: string;
|
|
48
|
+
color: number;
|
|
49
|
+
}[]): LegendCandidateSource;
|
|
50
|
+
/**
|
|
51
|
+
* The one categorical key a color channel derives from what a worker painted:
|
|
52
|
+
* the union above over the loaded regions, each row a painted color naming
|
|
53
|
+
* every value in it through `field` and ordered by it, and nothing where the
|
|
54
|
+
* rows would say nothing (`legendIsReadable`). A display resolving its own colors hands the
|
|
55
|
+
* candidates its packer recorded; one resolved by `encodeFeatures` hands the
|
|
56
|
+
* entries of the scale tables that came back. Either way the key lists what
|
|
57
|
+
* the painting holds, and a `closed` field's domain besides once anything
|
|
58
|
+
* painted. `title` heads it in place of the field's name, `''` heading
|
|
59
|
+
* nothing, and `swatches` draws a row as something other than its color's box.
|
|
60
|
+
* `besides` are the colors of rows a display lists beside these, which the
|
|
61
|
+
* one-color test counts and the length test does not.
|
|
62
|
+
*/
|
|
63
|
+
export declare function derivedColorScale<T>(regions: Iterable<T>, resolve: (region: T) => LegendCandidateSource, { id, field, title, maxItems, swatches, besides, }: {
|
|
64
|
+
id: string;
|
|
65
|
+
field: CategoricalField;
|
|
66
|
+
title?: string;
|
|
67
|
+
maxItems?: number;
|
|
68
|
+
swatches?: (row: CategoricalEntry & {
|
|
69
|
+
color: string;
|
|
70
|
+
}) => LegendSwatch[];
|
|
71
|
+
besides?: readonly string[];
|
|
72
|
+
}): CategoricalScale[];
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { MAX_LEGEND_ITEMS, legendIsReadable } from '../ui/legendSpec.js';
|
|
2
|
+
import { abgrToCssRgba, cssColorToABGR } from './colorBits.js';
|
|
3
|
+
// How many distinct colors a derived key may name and still BE a key. Past this
|
|
4
|
+
// the data is not a categorical vocabulary (a track keyed by unique per-feature
|
|
5
|
+
// names), and a list of every feature is the thing a key exists instead of.
|
|
6
|
+
//
|
|
7
|
+
// A different question from `legendIsReadable`'s lower bar, which asks whether a
|
|
8
|
+
// key a display already has is worth the rows it costs.
|
|
9
|
+
export const MAX_LEGEND_ENTRIES = 30;
|
|
10
|
+
// Bound on the candidate list one region ships. Far above MAX_LEGEND_ENTRIES, so
|
|
11
|
+
// a vocabulary that is categorical at all crosses whole, and a track with a name
|
|
12
|
+
// per feature ships a prefix that reads the same way it would have.
|
|
13
|
+
export const MAX_LEGEND_CANDIDATES = 1024;
|
|
14
|
+
/**
|
|
15
|
+
* Accumulator for the distinct (row, value, color) combinations a packer walks
|
|
16
|
+
* past, in first-seen order and bounded, so the main thread never re-walks the
|
|
17
|
+
* features. Deduped on the whole triple: a row of the union lists every value
|
|
18
|
+
* painted in its color, so a second value on that color has to still be in the
|
|
19
|
+
* list to reach it.
|
|
20
|
+
*/
|
|
21
|
+
export function createLegendCandidateCollector(maxCandidates = MAX_LEGEND_CANDIDATES) {
|
|
22
|
+
const candidates = [];
|
|
23
|
+
const seen = new Set();
|
|
24
|
+
return {
|
|
25
|
+
candidates,
|
|
26
|
+
add(rowIndex, value, color) {
|
|
27
|
+
const id = `${rowIndex}\u0000${color}\u0000${value}`;
|
|
28
|
+
if (candidates.length < maxCandidates && !seen.has(id)) {
|
|
29
|
+
seen.add(id);
|
|
30
|
+
candidates.push({ rowIndex, value, color });
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* The categorical color key over any number of packed regions: one entry per
|
|
37
|
+
* distinct color listing every value painted in it, colors in first-seen
|
|
38
|
+
* order. Keyed by color rather than by value because hiding a category hides
|
|
39
|
+
* features BY color, so two values sharing one color are one row that names
|
|
40
|
+
* both; a value met in two colors stays with the first.
|
|
41
|
+
*
|
|
42
|
+
* `[]` when there are more than `maxEntries` distinct colors, where the data is
|
|
43
|
+
* not a categorical vocabulary. `regions` is consumed lazily.
|
|
44
|
+
*/
|
|
45
|
+
export function unionLegendCandidates(regions, resolve, maxEntries = MAX_LEGEND_ENTRIES) {
|
|
46
|
+
const rows = new Map();
|
|
47
|
+
const seenValues = new Set();
|
|
48
|
+
for (const region of regions) {
|
|
49
|
+
const { candidates, rowPaintsCandidateColor } = resolve(region);
|
|
50
|
+
for (const { rowIndex, value, color } of candidates) {
|
|
51
|
+
if (!rowPaintsCandidateColor(rowIndex) || seenValues.has(value)) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
seenValues.add(value);
|
|
55
|
+
const row = rows.get(color);
|
|
56
|
+
if (row) {
|
|
57
|
+
row.values.push(value);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
rows.set(color, { values: [value], color });
|
|
61
|
+
if (rows.size > maxEntries) {
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return [...rows.values()];
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* A source whose every entry is a candidate its one row paints: the entries of
|
|
71
|
+
* a scale table `encodeFeatures` resolved, or any walk that met each value in
|
|
72
|
+
* one color.
|
|
73
|
+
*/
|
|
74
|
+
export function everyRowPaints(entries) {
|
|
75
|
+
return {
|
|
76
|
+
candidates: entries.map(({ value, color }) => ({
|
|
77
|
+
rowIndex: 0,
|
|
78
|
+
value,
|
|
79
|
+
color,
|
|
80
|
+
})),
|
|
81
|
+
rowPaintsCandidateColor: () => true,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* The one categorical key a color channel derives from what a worker painted:
|
|
86
|
+
* the union above over the loaded regions, each row a painted color naming
|
|
87
|
+
* every value in it through `field` and ordered by it, and nothing where the
|
|
88
|
+
* rows would say nothing (`legendIsReadable`). A display resolving its own colors hands the
|
|
89
|
+
* candidates its packer recorded; one resolved by `encodeFeatures` hands the
|
|
90
|
+
* entries of the scale tables that came back. Either way the key lists what
|
|
91
|
+
* the painting holds, and a `closed` field's domain besides once anything
|
|
92
|
+
* painted. `title` heads it in place of the field's name, `''` heading
|
|
93
|
+
* nothing, and `swatches` draws a row as something other than its color's box.
|
|
94
|
+
* `besides` are the colors of rows a display lists beside these, which the
|
|
95
|
+
* one-color test counts and the length test does not.
|
|
96
|
+
*/
|
|
97
|
+
export function derivedColorScale(regions, resolve, { id, field, title = field.field, maxItems, swatches, besides = [], }) {
|
|
98
|
+
const painted = unionLegendCandidates(regions, resolve).map(({ values, color }) => {
|
|
99
|
+
const sorted = values.toSorted(field.compare);
|
|
100
|
+
const value = sorted[0];
|
|
101
|
+
return {
|
|
102
|
+
value,
|
|
103
|
+
values: sorted,
|
|
104
|
+
label: sorted.map(v => field.label(v)).join(', '),
|
|
105
|
+
color: abgrToCssRgba(color),
|
|
106
|
+
...(value === '' ? { missing: true } : {}),
|
|
107
|
+
};
|
|
108
|
+
});
|
|
109
|
+
const named = new Set(painted.flatMap(e => e.values));
|
|
110
|
+
const unpainted = field.closed && painted.length > 0
|
|
111
|
+
? field.domain
|
|
112
|
+
.filter(value => !named.has(value))
|
|
113
|
+
.map(value => ({
|
|
114
|
+
value,
|
|
115
|
+
label: field.label(value),
|
|
116
|
+
color: abgrToCssRgba(cssColorToABGR(field.color(value))),
|
|
117
|
+
}))
|
|
118
|
+
: [];
|
|
119
|
+
const entries = [...painted, ...unpainted].sort((a, b) => field.compare(a.value, b.value));
|
|
120
|
+
const beside = besides.map(color => ({
|
|
121
|
+
label: '',
|
|
122
|
+
color: abgrToCssRgba(cssColorToABGR(color)),
|
|
123
|
+
}));
|
|
124
|
+
return painted.length > 0 &&
|
|
125
|
+
legendIsReadable([...entries, ...beside], (maxItems ?? MAX_LEGEND_ITEMS) + beside.length)
|
|
126
|
+
? [
|
|
127
|
+
{
|
|
128
|
+
kind: 'categorical',
|
|
129
|
+
id,
|
|
130
|
+
...(title ? { title } : {}),
|
|
131
|
+
...(field.domain.length > 0 ? { domain: field.domain } : {}),
|
|
132
|
+
entries: swatches
|
|
133
|
+
? entries.map(row => ({ ...row, swatches: swatches(row) }))
|
|
134
|
+
: entries,
|
|
135
|
+
},
|
|
136
|
+
]
|
|
137
|
+
: [];
|
|
138
|
+
}
|
package/esm/util/localStorage.js
CHANGED
|
@@ -12,10 +12,10 @@ export const { available: localStorageAvailable, getItem: localStorageGetItem, s
|
|
|
12
12
|
// and has to be announced by hand. Missing that half is what let two components
|
|
13
13
|
// on one key show different values until one of them remounted.
|
|
14
14
|
//
|
|
15
|
-
// Announcing is deliberately not folded into localStorageSetItem.
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
15
|
+
// Announcing is deliberately not folded into localStorageSetItem. A writer
|
|
16
|
+
// that persists from an autorun over its own state would, if its write called
|
|
17
|
+
// its own subscriber back, re-enter that autorun and write again, forever. A
|
|
18
|
+
// writer says when its write is news.
|
|
19
19
|
const listeners = new Map();
|
|
20
20
|
// Installed on the first subscription rather than at module scope, so importing
|
|
21
21
|
// this file from a worker or a test never touches `window`.
|