@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
package/esm/util/color/index.js
CHANGED
|
@@ -72,7 +72,7 @@ export function makeContrasting(foreground, background = 'white', minContrastRat
|
|
|
72
72
|
}
|
|
73
73
|
return best;
|
|
74
74
|
}
|
|
75
|
-
export { isNamedColor, namedColorToHex } from './cssColorsLevel4.js';
|
|
75
|
+
export { CSS_COLOR_NAMES, isNamedColor, namedColorToHex, } from './cssColorsLevel4.js';
|
|
76
76
|
// The (lightness, chroma) tiers randomColor picks between, in OKLCH. Values are
|
|
77
77
|
// in the band a hand-built categorical palette occupies — bright enough to tell
|
|
78
78
|
// apart, dark enough that black text over one still reads, and never near
|
|
@@ -81,7 +81,10 @@ export { isNamedColor, namedColorToHex } from './cssColorsLevel4.js';
|
|
|
81
81
|
// What a value-less feature is painted. Neutral and unsaturated on purpose: it
|
|
82
82
|
// has to read as "not in a category" beside a palette whose every member is
|
|
83
83
|
// equally light and equally colorful, so it cannot be one more hue.
|
|
84
|
-
const NO_CATEGORY_COLOR = '#afafaf';
|
|
84
|
+
export const NO_CATEGORY_COLOR = '#afafaf';
|
|
85
|
+
// What a colour declaration paints where it reads nothing it can colour, so a
|
|
86
|
+
// misconfiguration surfaces rather than passing for the no-category grey.
|
|
87
|
+
export const MISCONFIGURED_COLOR = '#808080';
|
|
85
88
|
const RANDOM_COLOR_TIERS = [
|
|
86
89
|
{ lightness: 0.66, chroma: 0.15 },
|
|
87
90
|
{ lightness: 0.56, chroma: 0.14 },
|
|
@@ -175,8 +178,8 @@ export function relight(color, lightnessShift, chromaScale = 1) {
|
|
|
175
178
|
*
|
|
176
179
|
* A value that is absent gets NO_CATEGORY_COLOR rather than a hue, and that is
|
|
177
180
|
* the difference between this being usable on real data and not. The everyday
|
|
178
|
-
* caller is
|
|
179
|
-
*
|
|
181
|
+
* caller is a `jexl:randomColor(get(feature,'<attr>'))` color slot over a
|
|
182
|
+
* whole track — and most files
|
|
180
183
|
* have the attribute on some features and not others, so most of the time this
|
|
181
184
|
* is handed `undefined`. It used to throw on that (`str.length` of undefined),
|
|
182
185
|
* once per feature, and what a reader saw was every unlabelled feature in one
|
package/esm/util/colorBits.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { abgrToCssRgba } from '@jbrowse/render-core/marks/colorFill';
|
|
2
2
|
import type { Feature } from './simpleFeature.ts';
|
|
3
|
+
export { abgrToCssRgba };
|
|
4
|
+
export { isCssColor, parseCssColorOr } from './cssColorParse.ts';
|
|
3
5
|
export { alpha, blend, darken, formatHEX, formatHEXA, formatRGBA, getAlpha, getBlue, getGreen, getLuminance, getRed, lighten, newColor, parse, toHSLA, toRGBA, } from './color-bits/index.ts';
|
|
4
6
|
export type { Color } from './color-bits/index.ts';
|
|
5
7
|
/**
|
|
@@ -17,7 +19,6 @@ export declare function featureItemRgb(raw: unknown): string | undefined;
|
|
|
17
19
|
* undefined if it declares none.
|
|
18
20
|
*/
|
|
19
21
|
export declare function featureBedColor(feature: Feature): string | undefined;
|
|
20
|
-
export declare function parseCssColorOr(color: string, fallback: Color): Color;
|
|
21
22
|
export declare function parseCssColor(color: string | undefined | null): number;
|
|
22
23
|
export declare function cssColorToNormalizedRgb(color: string): [number, number, number];
|
|
23
24
|
export declare function cssColorToRgb(color: string): [number, number, number];
|
|
@@ -35,5 +36,4 @@ export declare function abgrRed(c: number): number;
|
|
|
35
36
|
export declare function abgrGreen(c: number): number;
|
|
36
37
|
export declare function abgrBlue(c: number): number;
|
|
37
38
|
export declare function abgrAlpha(c: number): number;
|
|
38
|
-
export declare function abgrToCssRgba(c: number): string;
|
|
39
39
|
export declare function cssColorToNormalizedRgba(color: string): [number, number, number, number];
|
package/esm/util/colorBits.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { abgrToCssRgba } from '@jbrowse/render-core/marks/colorFill';
|
|
2
|
+
import { getAlpha, getBlue, getGreen, getRed, newColor, } from './color-bits/index.js';
|
|
3
|
+
import { bedTriple, parseCssColorOr } from './cssColorParse.js';
|
|
4
|
+
export { abgrToCssRgba };
|
|
5
|
+
export { isCssColor, parseCssColorOr } from './cssColorParse.js';
|
|
3
6
|
export { alpha, blend, darken, formatHEX, formatHEXA, formatRGBA, getAlpha, getBlue, getGreen, getLuminance, getRed, lighten, newColor, parse, toHSLA, toRGBA, } from './color-bits/index.js';
|
|
4
7
|
// Magenta sentinel for invalid input. User-written jexl color callbacks can
|
|
5
8
|
// legitimately return undefined (e.g. when a feature lacks the field they
|
|
@@ -7,10 +10,6 @@ export { alpha, blend, darken, formatHEX, formatHEXA, formatRGBA, getAlpha, getB
|
|
|
7
10
|
// Returning magenta makes the bad slot visually obvious without breaking the
|
|
8
11
|
// rest of the render.
|
|
9
12
|
const INVALID_COLOR = newColor(255, 0, 255, 255);
|
|
10
|
-
// A bare BED color triple ("255,0,0"), which is not a CSS color but is what
|
|
11
|
-
// BED-family adapters put on the feature verbatim. The spec has no spaces, but
|
|
12
|
-
// tolerate them rather than silently ignoring an otherwise-usable color.
|
|
13
|
-
const BED_TRIPLE = /^(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})$/;
|
|
14
13
|
// UCSC's convention is that a color of "0" means "no color specified", and plain
|
|
15
14
|
// BED12 files fill the column with that placeholder (often spelled as the
|
|
16
15
|
// all-zero triple) rather than omitting it — every itemRgb in our own
|
|
@@ -18,17 +17,6 @@ const BED_TRIPLE = /^(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})$/;
|
|
|
18
17
|
// ordinary BED12 track solid black, so read them as absent. A file that really
|
|
19
18
|
// wants black can say so with an explicit `color` slot.
|
|
20
19
|
const BED_TRIPLE_UNSET = /^0(,0,0)?$/;
|
|
21
|
-
/**
|
|
22
|
-
* Normalize a bare BED color triple to canonical "r,g,b", or undefined if the
|
|
23
|
-
* string isn't one. Each component must be in range: the underlying parser
|
|
24
|
-
* masks to 8 bits, so a bogus "999,0,0" would otherwise *wrap* to 231 and paint
|
|
25
|
-
* a plausible-looking but wrong color rather than being caught.
|
|
26
|
-
*/
|
|
27
|
-
function bedTriple(str) {
|
|
28
|
-
const m = BED_TRIPLE.exec(str.trim());
|
|
29
|
-
const rgb = m?.slice(1, 4).map(Number);
|
|
30
|
-
return rgb?.every(n => n <= 255) ? rgb.join(',') : undefined;
|
|
31
|
-
}
|
|
32
20
|
/**
|
|
33
21
|
* One raw attribute value as a usable BED color, or undefined when it isn't
|
|
34
22
|
* one. Deliberately strict: this feeds an *automatic* coloring path, so a value
|
|
@@ -73,27 +61,6 @@ export function featureBedColor(feature) {
|
|
|
73
61
|
}
|
|
74
62
|
return found;
|
|
75
63
|
}
|
|
76
|
-
// Resolve a CSS color string to a Color: honors named colors, `transparent`,
|
|
77
|
-
// and bare BED color triples, and returns `fallback` on malformed-but-nonempty
|
|
78
|
-
// input. `parse` throws on e.g. an empty "rgb()"; callers pass a fallback so one
|
|
79
|
-
// bad per-feature color can't crash a whole render/RPC. An out-of-range triple
|
|
80
|
-
// is left to throw into `fallback` (magenta) rather than wrapping to a wrong
|
|
81
|
-
// color — the same rule featureItemRgb applies, so a jexl callback reading an
|
|
82
|
-
// itemRgb column and the automatic path agree on what counts as a color.
|
|
83
|
-
export function parseCssColorOr(color, fallback) {
|
|
84
|
-
const str = color.trim().toLowerCase();
|
|
85
|
-
if (str === 'transparent') {
|
|
86
|
-
return newColor(0, 0, 0, 0);
|
|
87
|
-
}
|
|
88
|
-
try {
|
|
89
|
-
const hex = namedColorToHex(str);
|
|
90
|
-
const triple = bedTriple(str);
|
|
91
|
-
return parse(hex ? hex : triple ? `rgb(${triple})` : str);
|
|
92
|
-
}
|
|
93
|
-
catch {
|
|
94
|
-
return fallback;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
64
|
export function parseCssColor(color) {
|
|
98
65
|
if (typeof color !== 'string' || color.length === 0) {
|
|
99
66
|
return INVALID_COLOR;
|
|
@@ -118,9 +85,22 @@ export function cssColorToRgba(color) {
|
|
|
118
85
|
export function packAbgr(r, g, b, a) {
|
|
119
86
|
return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0;
|
|
120
87
|
}
|
|
88
|
+
// A packer resolves the same few strings once per primitive, so the parse is
|
|
89
|
+
// cached by string. Capped, because BED itemRgb triples are unbounded.
|
|
90
|
+
const ABGR_CACHE_LIMIT = 4096;
|
|
91
|
+
const abgrByCss = new Map();
|
|
121
92
|
export function cssColorToABGR(color) {
|
|
93
|
+
const cached = abgrByCss.get(color);
|
|
94
|
+
if (cached !== undefined) {
|
|
95
|
+
return cached;
|
|
96
|
+
}
|
|
122
97
|
const c = parseCssColor(color);
|
|
123
|
-
|
|
98
|
+
const packed = packAbgr(getRed(c), getGreen(c), getBlue(c), getAlpha(c));
|
|
99
|
+
if (abgrByCss.size >= ABGR_CACHE_LIMIT) {
|
|
100
|
+
abgrByCss.clear();
|
|
101
|
+
}
|
|
102
|
+
abgrByCss.set(color, packed);
|
|
103
|
+
return packed;
|
|
124
104
|
}
|
|
125
105
|
// Replace the alpha byte of an ABGR-packed u32, keeping its RGB. RGB already
|
|
126
106
|
// occupies the low 24 bits (b<<16 | g<<8 | r), so this is a mask + or — no
|
|
@@ -143,7 +123,6 @@ export function normalizedRgbToCss(c) {
|
|
|
143
123
|
export function normalizedRgbToCssRgba(c, alpha) {
|
|
144
124
|
return `rgba(${Math.round(c[0] * 255)},${Math.round(c[1] * 255)},${Math.round(c[2] * 255)},${alpha})`;
|
|
145
125
|
}
|
|
146
|
-
// Set fillStyle from an ABGR-packed u32.
|
|
147
126
|
export function setAbgrFill(ctx, c) {
|
|
148
127
|
ctx.fillStyle = abgrToCssRgba(c);
|
|
149
128
|
}
|
|
@@ -165,10 +144,6 @@ export function abgrBlue(c) {
|
|
|
165
144
|
export function abgrAlpha(c) {
|
|
166
145
|
return (c >>> 24) & 0xff;
|
|
167
146
|
}
|
|
168
|
-
// Format an ABGR-packed u32 as a CSS rgba() string.
|
|
169
|
-
export function abgrToCssRgba(c) {
|
|
170
|
-
return `rgba(${abgrRed(c)},${abgrGreen(c)},${abgrBlue(c)},${abgrAlpha(c) / 255})`;
|
|
171
|
-
}
|
|
172
147
|
export function cssColorToNormalizedRgba(color) {
|
|
173
148
|
const c = parseCssColor(color);
|
|
174
149
|
return [
|
package/esm/util/colorRamp.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { RampStop } from '../ui/colorScale.ts';
|
|
2
|
+
import type { ColorSchemeName } from './colorSchemes.ts';
|
|
2
3
|
/** One evenly-spaced ramp stop: 8-bit red, green, blue, alpha. */
|
|
3
4
|
export type ColorRampStop = readonly [number, number, number, number];
|
|
4
5
|
/**
|
|
@@ -8,6 +9,27 @@ export type ColorRampStop = readonly [number, number, number, number];
|
|
|
8
9
|
* stops.
|
|
9
10
|
*/
|
|
10
11
|
export declare const VIRIDIS_STOPS: readonly ColorRampStop[];
|
|
12
|
+
/**
|
|
13
|
+
* #api
|
|
14
|
+
* Whether a named ramp runs dark at its low end, drawn over white: viridis
|
|
15
|
+
* and its siblings do, juicebox, fall, reds and blues do not.
|
|
16
|
+
*/
|
|
17
|
+
export declare function darkAtLowEnd(scheme: ColorSchemeName): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* #api
|
|
20
|
+
* The domain a continuous colour scale spans: each end `min` or `max` pins,
|
|
21
|
+
* else the extent's, ascending, since a span has no direction and `reverse`
|
|
22
|
+
* is the ramp's. An open end stops at a pinned one rather than crossing it,
|
|
23
|
+
* and an extent holding no value (`[Infinity, -Infinity]`) spans [0, 1].
|
|
24
|
+
*/
|
|
25
|
+
export declare function rampDomain(min: number | undefined, max: number | undefined, extent: readonly [number, number]): [number, number];
|
|
26
|
+
/**
|
|
27
|
+
* #api
|
|
28
|
+
* The stops a continuous colour scale samples: `range`'s CSS colours where it
|
|
29
|
+
* lists any, else the named `scheme`, viridis while that is unset, turned
|
|
30
|
+
* round under `reverse`.
|
|
31
|
+
*/
|
|
32
|
+
export declare function colorRampStops({ range, scheme, reverse, }: RampDeclaration): readonly ColorRampStop[];
|
|
11
33
|
/**
|
|
12
34
|
* #api
|
|
13
35
|
* The color at `t` in `[0, 1]` across a list of EVENLY SPACED stops, linearly
|
|
@@ -22,16 +44,38 @@ export declare function sampleColorRamp(stops: readonly ColorRampStop[], t: numb
|
|
|
22
44
|
* texture both GPU backends upload and the Canvas2D twins index — entry `i` is
|
|
23
45
|
* the color at `t = i / (N - 1)`. N comes off the shader that samples it, so
|
|
24
46
|
* the table and `rampColor`'s texel mapping cannot disagree.
|
|
47
|
+
*
|
|
48
|
+
* The table is always straight. A diverging ramp whose middle belongs at a
|
|
49
|
+
* value off the centre of the domain reads it through `rampMidT`, the shader's
|
|
50
|
+
* rule and its generated twin, so the middle follows a moving domain without a
|
|
51
|
+
* new table.
|
|
25
52
|
*/
|
|
26
53
|
export declare function buildColorRampLut(stops: readonly ColorRampStop[]): Uint8Array<ArrayBuffer>;
|
|
54
|
+
/**
|
|
55
|
+
* #api
|
|
56
|
+
* A continuous colour scale's ramp as a config declares it.
|
|
57
|
+
*/
|
|
58
|
+
export interface RampDeclaration {
|
|
59
|
+
range?: readonly string[];
|
|
60
|
+
scheme?: ColorSchemeName;
|
|
61
|
+
reverse?: boolean;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* #api
|
|
65
|
+
* The {@link buildColorRampLut} table a ramp declaration asks for, the same
|
|
66
|
+
* `Uint8Array` for the same declaration, since a GPU backend re-uploads its
|
|
67
|
+
* ramp texture when the identity changes and a render state is rebuilt far
|
|
68
|
+
* more often than its ramp.
|
|
69
|
+
*/
|
|
70
|
+
export declare function rampLutOf(ramp: RampDeclaration): Uint8Array;
|
|
27
71
|
/**
|
|
28
72
|
* #api
|
|
29
73
|
* `n` evenly spaced legend stops read straight out of a
|
|
30
74
|
* {@link buildColorRampLut} byte table — the same 256×1 RGBA array
|
|
31
75
|
* `uploadColorRampLut` hands the GPU and the Canvas2D fillStyle LUTs index —
|
|
32
|
-
*
|
|
33
|
-
* swatch at bar fraction `t` is byte-identical to the ramp entry
|
|
34
|
-
*
|
|
76
|
+
* as the stops of a `RampScale`. It holds one claim by construction: the
|
|
77
|
+
* swatch at bar fraction `t` is byte-identical to the ramp entry both backends
|
|
78
|
+
* read at `t`, through the ramp's middle stop at `midNorm` (`rampMidT`). Alpha rides `opacity` (the juicebox fade), never baked into
|
|
35
79
|
* the color string.
|
|
36
80
|
*/
|
|
37
|
-
export declare function stopsFromRampLut(lut: Uint8Array, n: number):
|
|
81
|
+
export declare function stopsFromRampLut(lut: Uint8Array, n: number, midNorm?: number): RampStop[];
|
package/esm/util/colorRamp.js
CHANGED
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
import { COLOR_RAMP_LUT_ENTRIES } from '@jbrowse/render-core/colorRampLut';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
// gained the same named ramp; both build their 256×1 GPU/Canvas2D LUTs from
|
|
6
|
-
// this one table.
|
|
2
|
+
import { rampMidT } from '@jbrowse/render-core/shaders/colorRampLut';
|
|
3
|
+
import { cssColorToRgba } from './colorBits.js';
|
|
4
|
+
import { DEFAULT_COLOR_SCHEME } from './colorSchemes.js';
|
|
7
5
|
const VIRIDIS_HEX_SPEC = '44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725';
|
|
8
|
-
function
|
|
6
|
+
function stopsFromHex(spec) {
|
|
9
7
|
const out = [];
|
|
10
|
-
for (let i = 0; i <
|
|
11
|
-
const hex = VIRIDIS_HEX_SPEC.slice(i * 6, i * 6 + 6);
|
|
8
|
+
for (let i = 0; i < spec.length; i += 6) {
|
|
12
9
|
out.push([
|
|
13
|
-
Number.parseInt(
|
|
14
|
-
Number.parseInt(
|
|
15
|
-
Number.parseInt(
|
|
10
|
+
Number.parseInt(spec.slice(i, i + 2), 16),
|
|
11
|
+
Number.parseInt(spec.slice(i + 2, i + 4), 16),
|
|
12
|
+
Number.parseInt(spec.slice(i + 4, i + 6), 16),
|
|
16
13
|
255,
|
|
17
14
|
]);
|
|
18
15
|
}
|
|
@@ -24,7 +21,133 @@ function viridisStopsFromHex() {
|
|
|
24
21
|
* for the texture/fillStyle form, or to {@link sampleColorRamp} for legend
|
|
25
22
|
* stops.
|
|
26
23
|
*/
|
|
27
|
-
export const VIRIDIS_STOPS =
|
|
24
|
+
export const VIRIDIS_STOPS = stopsFromHex(VIRIDIS_HEX_SPEC);
|
|
25
|
+
const MAGMA_HEX_SPEC = '00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf';
|
|
26
|
+
const INFERNO_HEX_SPEC = '00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4';
|
|
27
|
+
const CIVIDIS_HEX_SPEC = '00224e00234f00245100255300255400265600275800285900285b00295d002a5f002a61002b62002c64002c66002d68002e6a002e6c002f6d00306f0030700031700031710132710533710833700c34700f357012357014367016377018376f1a386f1c396f1e3a6f203a6f213b6e233c6e243c6e263d6e273e6e293f6e2a3f6d2b406d2d416d2e416d2f426d31436d32436d33446d34456c35456c36466c38476c39486c3a486c3b496c3c4a6c3d4a6c3e4b6c3f4c6c404c6c414d6c424e6c434e6c444f6c45506c46516c47516c48526c49536c4a536c4b546c4c556c4d556c4e566c4f576c50576c51586d52596d535a6d545a6d555b6d555c6d565c6d575d6d585e6d595e6e5a5f6e5b606e5c616e5d616e5e626e5e636f5f636f60646f61656f62656f636670646770656870656870666970676a71686a71696b716a6c716b6d726c6d726c6e726d6f726e6f736f70737071737172747272747273747374757474757575757676767777767777777878777979777a7a787b7a787c7b787d7c787e7c787e7d787f7e78807f78817f788280798381798482798582798683798784788885788985788a86788b87788c88788d88788e89788f8a78908b78918b78928c78928d78938e78948e77958f779690779791779892779992779a93769b94769c95769d95769e96769f9775a09875a19975a29975a39a74a49b74a59c74a69c74a79d73a89e73a99f73aaa073aba072aca172ada272aea371afa471b0a571b1a570b3a670b4a76fb5a86fb6a96fb7a96eb8aa6eb9ab6dbaac6dbbad6dbcae6cbdae6cbeaf6bbfb06bc0b16ac1b26ac2b369c3b369c4b468c5b568c6b667c7b767c8b866c9b965cbb965ccba64cdbb63cebc63cfbd62d0be62d1bf61d2c060d3c05fd4c15fd5c25ed6c35dd7c45cd9c55cdac65bdbc75adcc859ddc858dec958dfca57e0cb56e1cc55e2cd54e4ce53e5cf52e6d051e7d150e8d24fe9d34eead34cebd44bedd54aeed649efd748f0d846f1d945f2da44f3db42f5dc41f6dd3ff7de3ef8df3cf9e03afbe138fce236fde334fee434fee535fee636fee838';
|
|
28
|
+
const FALL_STOPS = [
|
|
29
|
+
[255, 255, 255, 255],
|
|
30
|
+
[255, 255, 204, 255],
|
|
31
|
+
[255, 237, 160, 255],
|
|
32
|
+
[254, 217, 118, 255],
|
|
33
|
+
[254, 178, 76, 255],
|
|
34
|
+
[253, 141, 60, 255],
|
|
35
|
+
[252, 78, 42, 255],
|
|
36
|
+
[227, 26, 28, 255],
|
|
37
|
+
[189, 0, 38, 255],
|
|
38
|
+
[128, 0, 38, 255],
|
|
39
|
+
[0, 0, 0, 255],
|
|
40
|
+
];
|
|
41
|
+
const JUICEBOX_STOPS = [
|
|
42
|
+
[255, 0, 0, 0],
|
|
43
|
+
[255, 0, 0, 255],
|
|
44
|
+
];
|
|
45
|
+
const REDS_STOPS = [
|
|
46
|
+
[255, 245, 240, 255],
|
|
47
|
+
[254, 224, 210, 255],
|
|
48
|
+
[252, 187, 161, 255],
|
|
49
|
+
[252, 146, 114, 255],
|
|
50
|
+
[251, 106, 74, 255],
|
|
51
|
+
[239, 59, 44, 255],
|
|
52
|
+
[203, 24, 29, 255],
|
|
53
|
+
[165, 15, 21, 255],
|
|
54
|
+
[103, 0, 13, 255],
|
|
55
|
+
];
|
|
56
|
+
const BLUES_STOPS = [
|
|
57
|
+
[247, 251, 255, 255],
|
|
58
|
+
[222, 235, 247, 255],
|
|
59
|
+
[198, 219, 239, 255],
|
|
60
|
+
[158, 202, 225, 255],
|
|
61
|
+
[107, 174, 214, 255],
|
|
62
|
+
[66, 146, 198, 255],
|
|
63
|
+
[33, 113, 181, 255],
|
|
64
|
+
[8, 81, 156, 255],
|
|
65
|
+
[8, 48, 107, 255],
|
|
66
|
+
];
|
|
67
|
+
const REDBLUE_STOPS = [
|
|
68
|
+
[103, 0, 31, 255],
|
|
69
|
+
[178, 24, 43, 255],
|
|
70
|
+
[214, 96, 77, 255],
|
|
71
|
+
[244, 165, 130, 255],
|
|
72
|
+
[253, 219, 199, 255],
|
|
73
|
+
[247, 247, 247, 255],
|
|
74
|
+
[209, 229, 240, 255],
|
|
75
|
+
[146, 197, 222, 255],
|
|
76
|
+
[67, 147, 195, 255],
|
|
77
|
+
[33, 102, 172, 255],
|
|
78
|
+
[5, 48, 97, 255],
|
|
79
|
+
];
|
|
80
|
+
const PURPLEORANGE_STOPS = [
|
|
81
|
+
[45, 0, 75, 255],
|
|
82
|
+
[84, 39, 136, 255],
|
|
83
|
+
[128, 115, 172, 255],
|
|
84
|
+
[178, 171, 210, 255],
|
|
85
|
+
[216, 218, 235, 255],
|
|
86
|
+
[247, 247, 247, 255],
|
|
87
|
+
[254, 224, 182, 255],
|
|
88
|
+
[253, 184, 99, 255],
|
|
89
|
+
[224, 130, 20, 255],
|
|
90
|
+
[179, 88, 6, 255],
|
|
91
|
+
[127, 59, 8, 255],
|
|
92
|
+
];
|
|
93
|
+
const SCHEME_STOPS = {
|
|
94
|
+
viridis: VIRIDIS_STOPS,
|
|
95
|
+
juicebox: JUICEBOX_STOPS,
|
|
96
|
+
fall: FALL_STOPS,
|
|
97
|
+
reds: REDS_STOPS,
|
|
98
|
+
blues: BLUES_STOPS,
|
|
99
|
+
magma: stopsFromHex(MAGMA_HEX_SPEC),
|
|
100
|
+
inferno: stopsFromHex(INFERNO_HEX_SPEC),
|
|
101
|
+
cividis: stopsFromHex(CIVIDIS_HEX_SPEC),
|
|
102
|
+
redblue: REDBLUE_STOPS,
|
|
103
|
+
purpleorange: PURPLEORANGE_STOPS,
|
|
104
|
+
};
|
|
105
|
+
function luminanceOverWhite([r, g, b, a]) {
|
|
106
|
+
const over = (c) => 255 + (c - 255) * (a / 255);
|
|
107
|
+
return 0.2126 * over(r) + 0.7152 * over(g) + 0.0722 * over(b);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* #api
|
|
111
|
+
* Whether a named ramp runs dark at its low end, drawn over white: viridis
|
|
112
|
+
* and its siblings do, juicebox, fall, reds and blues do not.
|
|
113
|
+
*/
|
|
114
|
+
export function darkAtLowEnd(scheme) {
|
|
115
|
+
const stops = SCHEME_STOPS[scheme];
|
|
116
|
+
return luminanceOverWhite(stops[0]) < luminanceOverWhite(stops.at(-1));
|
|
117
|
+
}
|
|
118
|
+
const EMPTY_EXTENT_DOMAIN = [0, 1];
|
|
119
|
+
/**
|
|
120
|
+
* #api
|
|
121
|
+
* The domain a continuous colour scale spans: each end `min` or `max` pins,
|
|
122
|
+
* else the extent's, ascending, since a span has no direction and `reverse`
|
|
123
|
+
* is the ramp's. An open end stops at a pinned one rather than crossing it,
|
|
124
|
+
* and an extent holding no value (`[Infinity, -Infinity]`) spans [0, 1].
|
|
125
|
+
*/
|
|
126
|
+
export function rampDomain(min, max, extent) {
|
|
127
|
+
const [lo, hi] = extent[0] <= extent[1] ? extent : EMPTY_EXTENT_DOMAIN;
|
|
128
|
+
if (min !== undefined && max !== undefined) {
|
|
129
|
+
return min <= max ? [min, max] : [max, min];
|
|
130
|
+
}
|
|
131
|
+
if (min !== undefined) {
|
|
132
|
+
return [min, Math.max(min, hi)];
|
|
133
|
+
}
|
|
134
|
+
if (max !== undefined) {
|
|
135
|
+
return [Math.min(lo, max), max];
|
|
136
|
+
}
|
|
137
|
+
return [lo, hi];
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* #api
|
|
141
|
+
* The stops a continuous colour scale samples: `range`'s CSS colours where it
|
|
142
|
+
* lists any, else the named `scheme`, viridis while that is unset, turned
|
|
143
|
+
* round under `reverse`.
|
|
144
|
+
*/
|
|
145
|
+
export function colorRampStops({ range, scheme, reverse, }) {
|
|
146
|
+
const stops = range?.length
|
|
147
|
+
? range.map(c => cssColorToRgba(c))
|
|
148
|
+
: SCHEME_STOPS[scheme ?? DEFAULT_COLOR_SCHEME];
|
|
149
|
+
return reverse ? stops.toReversed() : stops;
|
|
150
|
+
}
|
|
28
151
|
function lerp8(a, b, t) {
|
|
29
152
|
return Math.round(a * (1 - t) + b * t);
|
|
30
153
|
}
|
|
@@ -54,6 +177,11 @@ export function sampleColorRamp(stops, t) {
|
|
|
54
177
|
* texture both GPU backends upload and the Canvas2D twins index — entry `i` is
|
|
55
178
|
* the color at `t = i / (N - 1)`. N comes off the shader that samples it, so
|
|
56
179
|
* the table and `rampColor`'s texel mapping cannot disagree.
|
|
180
|
+
*
|
|
181
|
+
* The table is always straight. A diverging ramp whose middle belongs at a
|
|
182
|
+
* value off the centre of the domain reads it through `rampMidT`, the shader's
|
|
183
|
+
* rule and its generated twin, so the middle follows a moving domain without a
|
|
184
|
+
* new table.
|
|
57
185
|
*/
|
|
58
186
|
export function buildColorRampLut(stops) {
|
|
59
187
|
const last = COLOR_RAMP_LUT_ENTRIES - 1;
|
|
@@ -67,24 +195,47 @@ export function buildColorRampLut(stops) {
|
|
|
67
195
|
}
|
|
68
196
|
return data;
|
|
69
197
|
}
|
|
198
|
+
const MAX_RAMP_LUTS = 32;
|
|
199
|
+
const luts = new Map();
|
|
200
|
+
/**
|
|
201
|
+
* #api
|
|
202
|
+
* The {@link buildColorRampLut} table a ramp declaration asks for, the same
|
|
203
|
+
* `Uint8Array` for the same declaration, since a GPU backend re-uploads its
|
|
204
|
+
* ramp texture when the identity changes and a render state is rebuilt far
|
|
205
|
+
* more often than its ramp.
|
|
206
|
+
*/
|
|
207
|
+
export function rampLutOf(ramp) {
|
|
208
|
+
const key = [ramp.scheme ?? '', ramp.range?.join(' ') ?? '', !!ramp.reverse]
|
|
209
|
+
.map(String)
|
|
210
|
+
.join('|');
|
|
211
|
+
let lut = luts.get(key);
|
|
212
|
+
if (!lut) {
|
|
213
|
+
if (luts.size >= MAX_RAMP_LUTS) {
|
|
214
|
+
luts.delete(luts.keys().next().value);
|
|
215
|
+
}
|
|
216
|
+
lut = buildColorRampLut(colorRampStops(ramp));
|
|
217
|
+
luts.set(key, lut);
|
|
218
|
+
}
|
|
219
|
+
return lut;
|
|
220
|
+
}
|
|
70
221
|
/**
|
|
71
222
|
* #api
|
|
72
223
|
* `n` evenly spaced legend stops read straight out of a
|
|
73
224
|
* {@link buildColorRampLut} byte table — the same 256×1 RGBA array
|
|
74
225
|
* `uploadColorRampLut` hands the GPU and the Canvas2D fillStyle LUTs index —
|
|
75
|
-
*
|
|
76
|
-
* swatch at bar fraction `t` is byte-identical to the ramp entry
|
|
77
|
-
*
|
|
226
|
+
* as the stops of a `RampScale`. It holds one claim by construction: the
|
|
227
|
+
* swatch at bar fraction `t` is byte-identical to the ramp entry both backends
|
|
228
|
+
* read at `t`, through the ramp's middle stop at `midNorm` (`rampMidT`). Alpha rides `opacity` (the juicebox fade), never baked into
|
|
78
229
|
* the color string.
|
|
79
230
|
*/
|
|
80
|
-
export function stopsFromRampLut(lut, n) {
|
|
231
|
+
export function stopsFromRampLut(lut, n, midNorm = 0.5) {
|
|
81
232
|
const lastEntry = lut.length / 4 - 1;
|
|
82
233
|
const out = [];
|
|
83
234
|
for (let i = 0; i < n; i++) {
|
|
84
235
|
const t = n === 1 ? 0 : i / (n - 1);
|
|
85
|
-
const o = Math.round(t * lastEntry) * 4;
|
|
236
|
+
const o = Math.round(rampMidT(t, midNorm) * lastEntry) * 4;
|
|
86
237
|
out.push({
|
|
87
|
-
offset:
|
|
238
|
+
offset: t,
|
|
88
239
|
color: `rgb(${lut[o]},${lut[o + 1]},${lut[o + 2]})`,
|
|
89
240
|
opacity: lut[o + 3] / 255,
|
|
90
241
|
});
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The scales a colour object paints through, in a module that imports
|
|
3
|
+
* nothing: `jbrowse validate` carries a copy of it, so the validator and the
|
|
4
|
+
* displays read one statement.
|
|
5
|
+
*/
|
|
6
|
+
/** How a colour object maps its `field`; `none` paints `value`. */
|
|
7
|
+
export declare const COLOR_SCALES: readonly ['none', 'categorical', 'linear', 'log', 'threshold'];
|
|
8
|
+
/**
|
|
9
|
+
* The scale that maps no field: each feature paints the colour it carries, and
|
|
10
|
+
* the key names the colours `domain` lists. Only a display whose features
|
|
11
|
+
* carry colours of their own declares it.
|
|
12
|
+
*/
|
|
13
|
+
export declare const IDENTITY_SCALE = "identity";
|
|
14
|
+
export type ColorScaleName = (typeof COLOR_SCALES)[number] | typeof IDENTITY_SCALE;
|
|
15
|
+
/**
|
|
16
|
+
* A field's defaults on a display: the scale it paints through while `scale`
|
|
17
|
+
* is unset, and the members that scale reads while the config leaves them
|
|
18
|
+
* unwritten, so a field with a vocabulary or ramp of its own is the colour
|
|
19
|
+
* object's defaults rather than a painter beside it.
|
|
20
|
+
*/
|
|
21
|
+
export interface FieldPreset<S extends string = ColorScaleName> {
|
|
22
|
+
scale: S;
|
|
23
|
+
/** The key a feature carrying no value files under. */
|
|
24
|
+
missing?: string;
|
|
25
|
+
domain?: readonly string[];
|
|
26
|
+
range?: readonly string[];
|
|
27
|
+
labels?: readonly string[];
|
|
28
|
+
title?: string;
|
|
29
|
+
domainMin?: number;
|
|
30
|
+
domainMax?: number;
|
|
31
|
+
domainMid?: number;
|
|
32
|
+
scheme?: string;
|
|
33
|
+
reverse?: boolean;
|
|
34
|
+
}
|
|
35
|
+
/** Each field's preset, `*` for any other field. */
|
|
36
|
+
export type FieldPresets<S extends string = ColorScaleName> = Readonly<Record<string, FieldPreset<S>>>;
|
|
37
|
+
/**
|
|
38
|
+
* The fields whose values have names, an order and colours of their own on
|
|
39
|
+
* every display, beneath each display's own presets. Red forward and blue
|
|
40
|
+
* reverse is what the synteny ribbons paint too. The SV classes are
|
|
41
|
+
* `svClassOf`'s, deletion red and duplication blue as dbVar and gnomAD-SV
|
|
42
|
+
* paint them, insertion the pileup's purple, and the rest kept apart under
|
|
43
|
+
* deuteranopia and protanopia. A record with no class files under `''`, so
|
|
44
|
+
* each display keeps its own no-value colour for it.
|
|
45
|
+
*/
|
|
46
|
+
export declare const UNIVERSAL_FIELD_PRESETS: {
|
|
47
|
+
readonly strand: {
|
|
48
|
+
readonly scale: 'categorical';
|
|
49
|
+
readonly missing: '0';
|
|
50
|
+
readonly domain: readonly ["1", "-1", "0"];
|
|
51
|
+
readonly range: readonly ["tomato", "cornflowerblue", "goldenrod"];
|
|
52
|
+
readonly labels: readonly ["Forward strand", "Reverse strand", "No strand"];
|
|
53
|
+
};
|
|
54
|
+
readonly svType: {
|
|
55
|
+
readonly scale: 'categorical';
|
|
56
|
+
readonly domain: readonly ["DEL", "DUP", "INS", "INV", "CNV", "TR", "BND", "CPX", "OTHER"];
|
|
57
|
+
readonly range: readonly ["#e41a1c", "#377eb8", "#800080", "#ff7f00", "#7e6148", "#e7298a", "#17becf", "#66a61e", "#000000"];
|
|
58
|
+
readonly labels: readonly ["Deletion", "Duplication", "Insertion", "Inversion", "Copy-number variable", "Tandem repeat", "Breakend / translocation", "Complex", "Other / mixed"];
|
|
59
|
+
readonly title: 'SV type';
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
/** The universal preset of `field`, if it has one. */
|
|
63
|
+
export declare function universalPresetOf(field: string): FieldPreset<'categorical'> | undefined;
|
|
64
|
+
/** Every field categorical while `scale` is unset, with nothing preset. */
|
|
65
|
+
export declare const CATEGORICAL_FIELD_PRESETS: {
|
|
66
|
+
readonly '*': FieldPreset<"categorical">;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* What a feature's field paints through while `scale` is unset: `score` a
|
|
70
|
+
* ramp, any other field categories.
|
|
71
|
+
*/
|
|
72
|
+
export declare const FEATURE_FIELD_PRESETS: {
|
|
73
|
+
readonly score: {
|
|
74
|
+
readonly scale: 'linear';
|
|
75
|
+
};
|
|
76
|
+
readonly '*': FieldPreset<"categorical">;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* A field's preset under `presets`: its own, else a universal one, else
|
|
80
|
+
* `*`'s, else categorical.
|
|
81
|
+
*/
|
|
82
|
+
export declare function presetOf<S extends string>(presets: FieldPresets<S>, field: string): FieldPreset<S | 'categorical'>;
|
|
83
|
+
/** What a field paints through under `presets` while `scale` is unset. */
|
|
84
|
+
export declare function fieldScaleOf<S extends string>(presets: FieldPresets<S>, field: string): S | 'categorical';
|
|
85
|
+
/**
|
|
86
|
+
* A colour object with its field's preset under it: each member the preset
|
|
87
|
+
* names and the config leaves unwritten, an empty list counting as unwritten.
|
|
88
|
+
* Only while the colour paints through the preset's own scale, so the cuts of
|
|
89
|
+
* a threshold preset never reach a field read through a ramp. A categorical
|
|
90
|
+
* preset's `range` and `labels` name its `domain`'s values in order, so they
|
|
91
|
+
* fill only while `domain` does too: a written order keeps each value's own
|
|
92
|
+
* colour and name.
|
|
93
|
+
*/
|
|
94
|
+
export declare function withPreset<C extends {
|
|
95
|
+
field?: string;
|
|
96
|
+
scale?: string;
|
|
97
|
+
}>(color: C, presets: FieldPresets<string>): C;
|
|
98
|
+
/**
|
|
99
|
+
* The scale a colour object paints through: `none` while no `field` is
|
|
100
|
+
* named, else its own `scale`, or `fieldScale` where that is unset.
|
|
101
|
+
*/
|
|
102
|
+
export declare function paintedScale<S extends string, F extends string>({ scale, field }: {
|
|
103
|
+
scale: S | undefined;
|
|
104
|
+
field: string;
|
|
105
|
+
}, fieldScale: F): S | F | 'none';
|
|
106
|
+
/** A combination of a scale's slots the display cannot draw as written. */
|
|
107
|
+
export interface ScaleProblem {
|
|
108
|
+
rule: 'threshold-cuts' | 'threshold-range' | 'ramp-domain' | 'domain-ends' | 'domain-quantile' | 'labels-domain';
|
|
109
|
+
/** the slot to look at, relative to the scale's own object */
|
|
110
|
+
slot: string;
|
|
111
|
+
message: string;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* The members a quantitative scale's ends are read by, as a colour ramp,
|
|
115
|
+
* `scales.y` and a mark's width spell them alike.
|
|
116
|
+
*/
|
|
117
|
+
export interface ScaleEnds {
|
|
118
|
+
domainMin?: number;
|
|
119
|
+
domainMax?: number;
|
|
120
|
+
domainQuantile?: number;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* What a quantitative scale's ends say together that neither can refuse
|
|
124
|
+
* alone: a `domainMax` below its `domainMin`, which every such scale draws in
|
|
125
|
+
* order either way, and a `domainQuantile` outside 0.5 to 1, where the quantile
|
|
126
|
+
* an open end follows is clamped. `reverse` is whether the scale turns round by
|
|
127
|
+
* a member of its own, which is then the spelling to point at.
|
|
128
|
+
*/
|
|
129
|
+
export declare function scaleEndProblems({ domainMin, domainMax, domainQuantile }: ScaleEnds, { reverse }?: {
|
|
130
|
+
reverse?: boolean;
|
|
131
|
+
}): ScaleProblem[];
|
|
132
|
+
/** Problems as the lines a display's corner notice lists, under the setting that holds the scale. */
|
|
133
|
+
export declare function noticeLines(setting: string, problems: readonly ScaleProblem[]): string[];
|
|
134
|
+
/** The slots `colorProblems` reads, as a snapshot or a resolved setting holds them. */
|
|
135
|
+
export interface ColorSlots {
|
|
136
|
+
value?: string;
|
|
137
|
+
field?: string;
|
|
138
|
+
scale?: string;
|
|
139
|
+
domain?: readonly unknown[];
|
|
140
|
+
range?: readonly unknown[];
|
|
141
|
+
domainMin?: number;
|
|
142
|
+
domainMax?: number;
|
|
143
|
+
domainQuantile?: number;
|
|
144
|
+
labels?: readonly unknown[];
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* What a colour object's slots say together that no single slot can refuse,
|
|
148
|
+
* since the config editor writes one slot at a time (ADR-133), read with its
|
|
149
|
+
* field's preset under it. A display shows these as a notice and draws what
|
|
150
|
+
* it can. A threshold naming no cuts leaves its intervals to the display —
|
|
151
|
+
* the alignments insert-size band samples its cuts, the wiggle plot cuts at
|
|
152
|
+
* its origin — so its `labels` go uncounted.
|
|
153
|
+
*/
|
|
154
|
+
export declare function colorProblems(written: ColorSlots, presets: FieldPresets<string>): ScaleProblem[];
|
|
155
|
+
/** `colorProblems` as the lines a display's corner notice lists, under `color`. */
|
|
156
|
+
export declare function colorNotices(color: ColorSlots, presets: FieldPresets<string>): string[];
|