@jbrowse/core 5.0.0-beta.1 → 5.0.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1709 -390
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +37 -14
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +49 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.js +8 -5
- package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
- package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
- package/esm/BaseFeatureWidget/formatDetails.js +62 -83
- package/esm/BaseFeatureWidget/index.d.ts +2 -1
- package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
- package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
- package/esm/BaseFeatureWidget/types.d.ts +12 -6
- package/esm/BaseFeatureWidget/util.d.ts +0 -10
- package/esm/BaseFeatureWidget/util.js +0 -17
- package/esm/CorePlugin.js +34 -3
- package/esm/PluginLoader.d.ts +24 -13
- package/esm/PluginLoader.js +167 -51
- package/esm/PluginManager.d.ts +130 -24
- package/esm/PluginManager.js +180 -32
- package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
- package/esm/ReExports/MuiDataGridReExports.js +2 -2
- package/esm/ReExports/coreModules.generated.d.ts +2 -0
- package/esm/ReExports/coreModules.generated.js +530 -0
- package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/coreWorkerModules.generated.js +490 -0
- package/esm/ReExports/frameworkModules.d.ts +2 -0
- package/esm/ReExports/frameworkModules.js +68 -0
- package/esm/ReExports/frameworkShared.d.ts +12 -0
- package/esm/ReExports/frameworkShared.js +16 -0
- package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
- package/esm/ReExports/list.js +528 -79
- package/esm/ReExports/modules.d.ts +1 -1
- package/esm/ReExports/modules.js +10 -165
- package/esm/ReExports/registry.d.ts +1 -0
- package/esm/ReExports/registry.js +23 -5
- package/esm/ReExports/uiStub.d.ts +3 -0
- package/esm/ReExports/uiStub.js +33 -0
- package/esm/ReExports/workerModules.d.ts +2 -0
- package/esm/ReExports/workerModules.js +11 -0
- package/esm/TextSearch/TextSearchManager.d.ts +27 -13
- package/esm/TextSearch/TextSearchManager.js +77 -36
- package/esm/TextSearch/places.d.ts +12 -0
- package/esm/TextSearch/places.js +94 -0
- package/esm/assemblyManager/assembly.d.ts +21 -19
- package/esm/assemblyManager/assembly.js +28 -26
- package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
- package/esm/assemblyManager/assemblyAdapters.js +8 -2
- package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
- package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
- package/esm/assemblyManager/assemblyManager.d.ts +35 -180
- package/esm/assemblyManager/assemblyManager.js +47 -51
- package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
- package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
- package/esm/assemblyManager/geneticCodes.js +2 -5
- package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
- package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
- package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
- package/esm/assemblyManager/indexAssemblyNames.js +22 -0
- package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
- package/esm/assemblyManager/loadRefNameMap.js +4 -9
- package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
- package/esm/assemblyManager/refNameMapKey.js +12 -0
- package/esm/checkPlugins.d.ts +2 -0
- package/esm/checkPlugins.js +38 -17
- package/esm/configuration/bamIndexFields.d.ts +49 -0
- package/esm/configuration/bamIndexFields.js +41 -0
- package/esm/configuration/configurationSchema.d.ts +101 -71
- package/esm/configuration/configurationSchema.js +207 -134
- package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
- package/esm/configuration/configurationSchemaUnion.js +56 -0
- package/esm/configuration/configurationSlot.d.ts +150 -60
- package/esm/configuration/configurationSlot.js +103 -75
- package/esm/configuration/fillLocations.d.ts +14 -0
- package/esm/configuration/fillLocations.js +14 -0
- package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
- package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
- package/esm/configuration/formatDetailsConfigSchema.js +10 -13
- package/esm/configuration/fullConfSnapshot.d.ts +4 -19
- package/esm/configuration/fullConfSnapshot.js +30 -52
- package/esm/configuration/getConf.d.ts +45 -41
- package/esm/configuration/getConf.js +111 -44
- package/esm/configuration/index.d.ts +26 -11
- package/esm/configuration/index.js +16 -7
- package/esm/configuration/indexType.d.ts +26 -0
- package/esm/configuration/indexType.js +38 -0
- package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
- package/esm/configuration/mergeFormatCallbacks.js +13 -10
- package/esm/configuration/plot.d.ts +61 -0
- package/esm/configuration/plot.js +142 -0
- package/esm/configuration/readConfObject.d.ts +2 -24
- package/esm/configuration/readConfObject.js +20 -63
- package/esm/configuration/requirements.d.ts +37 -0
- package/esm/configuration/requirements.js +88 -0
- package/esm/configuration/schemaRegistry.d.ts +32 -15
- package/esm/configuration/schemaRegistry.js +33 -35
- package/esm/configuration/schemaTypes.d.ts +21 -5
- package/esm/configuration/schemaTypes.js +66 -55
- package/esm/configuration/slotFacade.d.ts +12 -29
- package/esm/configuration/slotFacade.js +44 -23
- package/esm/configuration/snapshotPreprocess.d.ts +43 -0
- package/esm/configuration/snapshotPreprocess.js +161 -0
- package/esm/configuration/tabixIndexFields.d.ts +30 -4
- package/esm/configuration/tabixIndexFields.js +21 -4
- package/esm/configuration/tabixShorthand.d.ts +34 -17
- package/esm/configuration/tabixShorthand.js +49 -22
- package/esm/configuration/types.d.ts +182 -43
- package/esm/configuration/uriShorthand.d.ts +9 -0
- package/esm/configuration/uriShorthand.js +16 -0
- package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
- package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
- package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
- package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
- package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
- package/esm/data_adapters/BaseAdapter/index.js +1 -0
- package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
- package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
- package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
- package/esm/data_adapters/BaseAdapter/stats.js +52 -13
- package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
- package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
- package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
- package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
- package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
- package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
- package/esm/data_adapters/dataAdapterCache.js +44 -10
- package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
- package/esm/data_adapters/getFeatureAdapter.js +8 -8
- package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
- package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
- package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
- package/esm/pluggableElementTypes/AdapterType.js +1 -1
- package/esm/pluggableElementTypes/DisplayType.d.ts +53 -16
- package/esm/pluggableElementTypes/DisplayType.js +28 -12
- package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
- package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
- package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
- package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
- package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
- package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
- package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
- package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
- package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
- package/esm/pluggableElementTypes/ViewType.js +32 -4
- package/esm/pluggableElementTypes/WidgetType.d.ts +6 -0
- package/esm/pluggableElementTypes/WidgetType.js +6 -0
- package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
- package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
- package/esm/pluggableElementTypes/extendElementType.js +9 -5
- package/esm/pluggableElementTypes/index.d.ts +2 -1
- package/esm/pluggableElementTypes/index.js +2 -9
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
- package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +122 -28
- package/esm/pluggableElementTypes/models/BaseDisplayModel.js +155 -11
- package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
- package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
- package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +87 -18
- package/esm/pluggableElementTypes/models/BaseViewModel.js +54 -11
- package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
- package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
- package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
- package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
- package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
- package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
- package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
- package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
- package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
- package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
- package/esm/pluggableElementTypes/models/index.d.ts +2 -3
- package/esm/pluggableElementTypes/models/index.js +2 -3
- package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
- package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
- package/esm/pluginDefinitions.d.ts +34 -7
- package/esm/pluginDefinitions.js +54 -20
- package/esm/rpc/BaseRpcDriver.d.ts +2 -2
- package/esm/rpc/BaseRpcDriver.js +25 -30
- package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
- package/esm/rpc/MainThreadRpcDriver.js +13 -8
- package/esm/rpc/RpcClient.d.ts +18 -6
- package/esm/rpc/RpcClient.js +51 -16
- package/esm/rpc/RpcManager.d.ts +14 -10
- package/esm/rpc/RpcManager.js +11 -1
- package/esm/rpc/RpcRegistry.d.ts +40 -7
- package/esm/rpc/RpcServer.d.ts +3 -1
- package/esm/rpc/RpcServer.js +19 -12
- package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
- package/esm/rpc/WebWorkerRpcDriver.js +64 -68
- package/esm/rpc/byteBudget.d.ts +20 -5
- package/esm/rpc/byteBudget.js +16 -5
- package/esm/rpc/configSchema.d.ts +7 -21
- package/esm/rpc/coreRpcMethods.d.ts +4 -0
- package/esm/rpc/coreRpcMethods.js +4 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
- package/esm/rpc/methods/CoreGetExportData.js +3 -4
- package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
- package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
- package/esm/rpc/methods/CoreGetFeatures.js +3 -5
- package/esm/rpc/methods/CoreGetRefNames.js +2 -12
- package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
- package/esm/rpc/methods/CoreGetSequence.js +2 -2
- package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
- package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
- package/esm/rpc/methods/layerFeatures.d.ts +33 -0
- package/esm/rpc/methods/layerFeatures.js +29 -0
- package/esm/svg/SvgExport.js +6 -7
- package/esm/svg/SvgThemeProviders.d.ts +12 -0
- package/esm/svg/SvgThemeProviders.js +15 -0
- package/esm/svg/exportViewSvg.d.ts +28 -0
- package/esm/svg/exportViewSvg.js +13 -0
- package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
- package/esm/svg/normalizeSvgMarkup.js +99 -0
- package/esm/svg/serializeSvg.d.ts +7 -0
- package/esm/svg/serializeSvg.js +11 -0
- package/esm/svg/svgId.d.ts +1 -1
- package/esm/svg/svgId.js +1 -1
- package/esm/svg/svgReady.d.ts +9 -7
- package/esm/svg/svgReady.js +8 -7
- package/esm/svg/trackNames.d.ts +7 -5
- package/esm/svg/trackNames.js +12 -9
- package/esm/svg/wrapSvgExport.js +6 -74
- package/esm/ui/AddCustomPluginDialog.js +3 -8
- package/esm/ui/AppReadyMarker.d.ts +45 -0
- package/esm/ui/AppReadyMarker.js +89 -0
- package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
- package/esm/ui/CascadingMenu.js +181 -104
- package/esm/ui/DropDownMenu.js +2 -1
- package/esm/ui/ErrorBanner.js +1 -1
- package/esm/ui/ErrorBoundary.d.ts +2 -2
- package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
- package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
- package/esm/ui/ExportSvgDialog.d.ts +1 -1
- package/esm/ui/FileDropZone.js +2 -1
- package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
- package/esm/ui/HoverMenu.d.ts +1 -2
- package/esm/ui/HoverMenu.js +6 -3
- package/esm/ui/JexlFilterDialog.d.ts +13 -10
- package/esm/ui/JexlFilterDialog.js +122 -50
- package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
- package/esm/ui/JexlFilterRowEditors.js +90 -0
- package/esm/ui/LazyBaseTooltip.d.ts +4 -0
- package/esm/ui/LazyBaseTooltip.js +9 -0
- package/esm/ui/LegendSwatchGlyph.js +26 -21
- package/esm/ui/LoadingOverlay.d.ts +14 -0
- package/esm/ui/LoadingOverlay.js +4 -2
- package/esm/ui/MenuTypes.d.ts +23 -53
- package/esm/ui/MenuTypes.js +3 -0
- package/esm/ui/MonospaceTextField.d.ts +2 -1
- package/esm/ui/MonospaceTextField.js +23 -20
- package/esm/ui/PaletteContext.d.ts +10 -5
- package/esm/ui/PaletteContext.js +44 -6
- package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
- package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
- package/esm/ui/RefNameAutocomplete/index.js +8 -2
- package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/util.js +42 -1
- package/esm/ui/ResizeHandle.d.ts +3 -1
- package/esm/ui/ResizeHandle.js +44 -11
- package/esm/ui/ScrollChrome.d.ts +13 -0
- package/esm/ui/ScrollChrome.js +11 -0
- package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
- package/esm/ui/ScrollEdgeShadow.js +14 -35
- package/esm/ui/ScrollZoomToggle.d.ts +4 -27
- package/esm/ui/ScrollZoomToggle.js +34 -51
- package/esm/ui/SessionJsonPanel.d.ts +3 -0
- package/esm/ui/SessionJsonPanel.js +14 -0
- package/esm/ui/SettingsChangesTable.d.ts +1 -0
- package/esm/ui/SettingsChangesTable.js +49 -11
- package/esm/ui/ShareLinkField.d.ts +1 -3
- package/esm/ui/ShareLinkField.js +13 -40
- package/esm/ui/SizeSliderRow.d.ts +1 -3
- package/esm/ui/SizeSliderRow.js +4 -6
- package/esm/ui/SnackbarModel.js +79 -67
- package/esm/ui/StatusProgressBar.js +2 -2
- package/esm/ui/SvgColorLegend.d.ts +9 -4
- package/esm/ui/SvgColorLegend.js +82 -41
- package/esm/ui/VerticalScrollbar.d.ts +13 -34
- package/esm/ui/VerticalScrollbar.js +29 -83
- package/esm/ui/ViewLoadingScreen.d.ts +5 -4
- package/esm/ui/ViewLoadingScreen.js +8 -32
- package/esm/ui/colorScale.d.ts +92 -0
- package/esm/ui/colorScale.js +72 -0
- package/esm/ui/colors.d.ts +64 -0
- package/esm/ui/colors.js +230 -1
- package/esm/ui/hoverBoxStyle.d.ts +14 -2
- package/esm/ui/hoverBoxStyle.js +17 -2
- package/esm/ui/index.d.ts +12 -12
- package/esm/ui/index.js +14 -22
- package/esm/ui/launchViewMenu.js +15 -5
- package/esm/ui/legendMenuItem.d.ts +10 -32
- package/esm/ui/legendMenuItem.js +9 -36
- package/esm/ui/legendSpec.d.ts +15 -8
- package/esm/ui/legendSpec.js +14 -23
- package/esm/ui/makeSizeMenu.d.ts +0 -6
- package/esm/ui/makeSizeMenu.js +6 -30
- package/esm/ui/measureLegendText.js +1 -1
- package/esm/ui/menuItemAdornment.d.ts +9 -20
- package/esm/ui/menuItemAdornment.js +10 -32
- package/esm/ui/menuItems.d.ts +2 -7
- package/esm/ui/menuItems.js +1 -6
- package/esm/ui/multiTrackMenuItems.d.ts +6 -0
- package/esm/ui/palette.d.ts +118 -116
- package/esm/ui/palette.js +114 -75
- package/esm/ui/replaceViewAction.d.ts +1 -1
- package/esm/ui/replaceViewAction.js +1 -1
- package/esm/ui/theme.d.ts +43 -119
- package/esm/ui/theme.js +62 -78
- package/esm/ui/toggleMenuItems.d.ts +1 -3
- package/esm/ui/toggleMenuItems.js +6 -5
- package/esm/ui/useAssemblySelection.d.ts +4 -4
- package/esm/ui/viewHeaderHeight.d.ts +1 -0
- package/esm/ui/viewHeaderHeight.js +1 -0
- package/esm/util/Base1DUtils.d.ts +5 -3
- package/esm/util/Base1DUtils.js +14 -6
- package/esm/util/Base1DViewModel.d.ts +2 -1
- package/esm/util/Base1DViewModel.js +3 -2
- package/esm/util/SvgCanvas.d.ts +15 -13
- package/esm/util/SvgCanvas.js +76 -56
- package/esm/util/TimeTraveller.d.ts +3 -0
- package/esm/util/TimeTraveller.js +34 -2
- package/esm/util/aborting.d.ts +39 -0
- package/esm/util/aborting.js +88 -6
- package/esm/util/adapterMetadata.d.ts +1 -1
- package/esm/util/adapterMetadata.js +6 -5
- package/esm/util/addAndShowTrack.d.ts +2 -5
- package/esm/util/addAndShowTrack.js +5 -1
- package/esm/util/addRelativeUris.d.ts +17 -5
- package/esm/util/addRelativeUris.js +46 -10
- package/esm/util/addTrackFromWidget.d.ts +2 -5
- package/esm/util/addTrackFromWidget.js +5 -4
- package/esm/util/aggregateFieldName.d.ts +10 -0
- package/esm/util/aggregateFieldName.js +8 -0
- package/esm/util/analytics.js +46 -13
- package/esm/util/animationAllowed.d.ts +9 -0
- package/esm/util/animationAllowed.js +13 -0
- package/esm/util/applyRowResizeWheel.d.ts +10 -5
- package/esm/util/applyRowResizeWheel.js +10 -21
- package/esm/util/bandHeight.d.ts +10 -0
- package/esm/util/bandHeight.js +29 -0
- package/esm/util/bandLayout.d.ts +4 -4
- package/esm/util/bandLayout.js +4 -4
- package/esm/util/baseDisplayConfig.d.ts +8 -0
- package/esm/util/baseDisplayConfig.js +27 -0
- package/esm/util/bezierConnector.d.ts +4 -3
- package/esm/util/bezierConnector.js +38 -45
- package/esm/util/bgzfWorkerPool.d.ts +20 -74
- package/esm/util/bgzfWorkerPool.js +20 -74
- package/esm/util/binnedAggregate.d.ts +17 -0
- package/esm/util/binnedAggregate.js +275 -0
- package/esm/util/cacheBudgets.d.ts +22 -19
- package/esm/util/cacheBudgets.js +22 -19
- package/esm/util/cachedSetup.d.ts +16 -6
- package/esm/util/cachedSetup.js +108 -38
- package/esm/util/categoricalField.d.ts +56 -0
- package/esm/util/categoricalField.js +73 -0
- package/esm/util/cellMatches.d.ts +23 -0
- package/esm/util/cellMatches.js +264 -0
- package/esm/util/cellsStep.d.ts +29 -0
- package/esm/util/cellsStep.js +437 -0
- package/esm/util/clampToContig.d.ts +17 -0
- package/esm/util/clampToContig.js +19 -0
- package/esm/util/coarseStripHTML.js +1 -2
- package/esm/util/color/cssColorsLevel4.d.ts +1 -0
- package/esm/util/color/cssColorsLevel4.js +1 -0
- package/esm/util/color/index.d.ts +5 -3
- package/esm/util/color/index.js +7 -4
- package/esm/util/colorBits.d.ts +3 -3
- package/esm/util/colorBits.js +19 -44
- package/esm/util/colorRamp.d.ts +49 -5
- package/esm/util/colorRamp.js +169 -18
- package/esm/util/colorScale.d.ts +156 -0
- package/esm/util/colorScale.js +243 -0
- package/esm/util/colorSchemes.d.ts +21 -0
- package/esm/util/colorSchemes.js +30 -0
- package/esm/util/copyToClipboard.js +8 -1
- package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
- package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
- package/esm/util/createSvgRasterCanvas.d.ts +10 -0
- package/esm/util/cssColorParse.d.ts +15 -0
- package/esm/util/cssColorParse.js +53 -0
- package/esm/util/diagonalizeRegions.d.ts +2 -3
- package/esm/util/diagonalizeRegions.js +8 -13
- package/esm/util/expandLooseSearchIndex.d.ts +19 -0
- package/esm/util/expandLooseSearchIndex.js +29 -0
- package/esm/util/featureTable.d.ts +224 -0
- package/esm/util/featureTable.js +366 -0
- package/esm/util/featureTransforms.d.ts +81 -0
- package/esm/util/featureTransforms.js +1231 -0
- package/esm/util/featureTypes.d.ts +24 -0
- package/esm/util/featureTypes.js +35 -0
- package/esm/util/fetchAndMaybeUnzip.js +16 -9
- package/esm/util/fetchContext.d.ts +7 -8
- package/esm/util/fetchContext.js +3 -3
- package/esm/util/fetchHub.d.ts +4 -2
- package/esm/util/fetchHub.js +2 -2
- package/esm/util/fetchPhases.d.ts +10 -10
- package/esm/util/fetchSeq.d.ts +2 -3
- package/esm/util/fetchSeq.js +2 -2
- package/esm/util/fieldReader.d.ts +17 -0
- package/esm/util/fieldReader.js +62 -0
- package/esm/util/formatBytes.js +1 -1
- package/esm/util/formatGuessers.d.ts +25 -14
- package/esm/util/formatGuessers.js +42 -27
- package/esm/util/formatRelativeTime.js +1 -1
- package/esm/util/freezeDeep.d.ts +8 -10
- package/esm/util/freezeDeep.js +8 -10
- package/esm/util/getLocationUri.d.ts +2 -1
- package/esm/util/getLocationUri.js +8 -2
- package/esm/util/groupKeys.d.ts +76 -0
- package/esm/util/groupKeys.js +156 -0
- package/esm/util/highlights.d.ts +10 -6
- package/esm/util/highlights.js +12 -25
- package/esm/util/hooks.d.ts +31 -2
- package/esm/util/hooks.js +72 -3
- package/esm/util/index.d.ts +11 -11
- package/esm/util/index.js +11 -10
- package/esm/util/indexCandidates.d.ts +1 -31
- package/esm/util/indexCandidates.js +5 -63
- package/esm/util/installFetch.d.ts +77 -37
- package/esm/util/installFetch.js +65 -38
- package/esm/util/installInitAutorun.d.ts +14 -13
- package/esm/util/installInitAutorun.js +17 -17
- package/esm/util/installPrerequisiteFetch.d.ts +115 -0
- package/esm/util/installPrerequisiteFetch.js +111 -0
- package/esm/util/intervals.js +9 -4
- package/esm/util/io/index.js +22 -15
- package/esm/util/isDataCurrent.d.ts +7 -5
- package/esm/util/isDataCurrent.js +9 -6
- package/esm/util/isTextEntryFocused.d.ts +7 -0
- package/esm/util/isTextEntryFocused.js +16 -0
- package/esm/util/jexl.js +24 -21
- package/esm/util/jexlFilterRows.d.ts +89 -0
- package/esm/util/jexlFilterRows.js +252 -0
- package/esm/util/jexlFilters.d.ts +32 -57
- package/esm/util/jexlFilters.js +31 -29
- package/esm/util/jexlStrings.d.ts +3 -4
- package/esm/util/jexlStrings.js +2 -3
- package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
- package/esm/util/layouts/GranularRectLayout.js +25 -8
- package/esm/util/lazyAfterAttach.d.ts +13 -0
- package/esm/util/lazyAfterAttach.js +31 -0
- package/esm/util/lazyWithPreload.d.ts +19 -0
- package/esm/util/lazyWithPreload.js +27 -0
- package/esm/util/legendCandidates.d.ts +72 -0
- package/esm/util/legendCandidates.js +138 -0
- package/esm/util/locString.js +5 -2
- package/esm/util/localStorage.js +4 -4
- package/esm/util/markEncoding.d.ts +150 -0
- package/esm/util/markEncoding.js +885 -0
- package/esm/util/markEncodingTypes.d.ts +595 -0
- package/esm/util/markEncodingTypes.js +8 -0
- package/esm/util/mst-reflection.d.ts +2 -20
- package/esm/util/mst-reflection.js +3 -53
- package/esm/util/mstUtils.d.ts +31 -23
- package/esm/util/mstUtils.js +39 -24
- package/esm/util/numericUtils.d.ts +7 -0
- package/esm/util/numericUtils.js +16 -0
- package/esm/util/numericValue.d.ts +14 -0
- package/esm/util/numericValue.js +34 -0
- package/esm/util/openFeatureWidget.d.ts +5 -0
- package/esm/util/openFeatureWidget.js +2 -2
- package/esm/util/openViews.d.ts +17 -0
- package/esm/util/openViews.js +22 -0
- package/esm/util/parentWalk.d.ts +1 -1
- package/esm/util/parentWalk.js +1 -1
- package/esm/util/parseLineByLine.d.ts +4 -5
- package/esm/util/parseLineByLine.js +8 -14
- package/esm/util/pluginStore.d.ts +6 -8
- package/esm/util/pluginStore.js +17 -16
- package/esm/util/preloadComponent.d.ts +5 -0
- package/esm/util/preloadComponent.js +11 -0
- package/esm/util/progress.d.ts +22 -22
- package/esm/util/progress.js +27 -26
- package/esm/util/quantileExtent.d.ts +49 -0
- package/esm/util/quantileExtent.js +162 -0
- package/esm/util/range.d.ts +13 -9
- package/esm/util/range.js +17 -8
- package/esm/util/renameRegions.d.ts +26 -6
- package/esm/util/renameRegions.js +68 -54
- package/esm/util/renderToStaticMarkup.js +24 -14
- package/esm/util/rxjs.d.ts +23 -8
- package/esm/util/rxjs.js +61 -15
- package/esm/util/samplesTsv.d.ts +49 -0
- package/esm/util/samplesTsv.js +86 -0
- package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
- package/esm/util/scheduleDetachedDestroy.js +24 -0
- package/esm/util/scrollLatch.d.ts +1 -0
- package/esm/util/scrollLatch.js +8 -0
- package/esm/util/selectEncodedFeature.d.ts +16 -0
- package/esm/util/selectEncodedFeature.js +34 -0
- package/esm/util/sessionSharing.d.ts +7 -5
- package/esm/util/sessionSharing.js +23 -23
- package/esm/util/shapeNameList.d.ts +2 -0
- package/esm/util/shapeNameList.js +6 -0
- package/esm/util/shapeNames.d.ts +7 -0
- package/esm/util/shapeNames.js +11 -0
- package/esm/util/simpleFeature.d.ts +0 -1
- package/esm/util/springAnimate.js +1 -1
- package/esm/util/starFusion.d.ts +26 -0
- package/esm/util/starFusion.js +37 -0
- package/esm/util/stepTables.d.ts +96 -0
- package/esm/util/stepTables.js +277 -0
- package/esm/util/svAlt.d.ts +145 -0
- package/esm/util/svAlt.js +364 -0
- package/esm/util/svgColorProps.d.ts +11 -0
- package/esm/util/svgColorProps.js +28 -1
- package/esm/util/systemColorScheme.d.ts +12 -0
- package/esm/util/systemColorScheme.js +27 -0
- package/esm/util/tabix.d.ts +19 -10
- package/esm/util/tabix.js +19 -14
- package/esm/util/thresholdScale.d.ts +91 -0
- package/esm/util/thresholdScale.js +166 -0
- package/esm/util/timeGate.d.ts +4 -5
- package/esm/util/timeGate.js +4 -5
- package/esm/util/trackConfigDelta.d.ts +26 -26
- package/esm/util/trackConfigDelta.js +63 -47
- package/esm/util/tracks.d.ts +120 -66
- package/esm/util/tracks.js +501 -151
- package/esm/util/translateTranscript.d.ts +44 -0
- package/esm/util/translateTranscript.js +102 -0
- package/esm/util/types/data.d.ts +0 -2
- package/esm/util/types/index.d.ts +121 -22
- package/esm/util/types/index.js +9 -0
- package/esm/util/types/mst.d.ts +3 -0
- package/esm/util/types/mst.js +4 -0
- package/esm/util/types/renameIds.d.ts +1 -0
- package/esm/util/types/renameIds.js +29 -0
- package/esm/util/types/services.d.ts +1 -1
- package/esm/util/unknownSnapshotKeys.d.ts +53 -0
- package/esm/util/unknownSnapshotKeys.js +76 -0
- package/esm/util/useFeatureSequence.js +5 -5
- package/esm/util/useFetch.d.ts +3 -4
- package/esm/util/useFetch.js +19 -10
- package/esm/util/useFetchPlugins.d.ts +6 -2
- package/esm/util/useFetchPlugins.js +7 -3
- package/esm/util/usePanZoom.js +10 -3
- package/esm/util/usePanelVirtualScroll.d.ts +7 -35
- package/esm/util/usePanelVirtualScroll.js +9 -36
- package/esm/util/useRafCommit.js +1 -0
- package/esm/util/useRowVirtualScroll.d.ts +6 -29
- package/esm/util/useRowVirtualScroll.js +8 -49
- package/esm/util/useVirtualScrollWheel.d.ts +20 -4
- package/esm/util/useVirtualScrollWheel.js +40 -74
- package/esm/util/viewHighlights.d.ts +3 -0
- package/esm/util/viewHighlights.js +5 -0
- package/esm/util/viewStatus.d.ts +47 -15
- package/esm/util/viewStatus.js +34 -0
- package/esm/util/wheelZoom.d.ts +7 -1
- package/esm/util/wheelZoom.js +85 -19
- package/esm/util/whenViewSettled.d.ts +55 -8
- package/esm/util/whenViewSettled.js +56 -7
- package/esm/util/withFeatureDetails.js +4 -0
- package/esm/util/withLaunchInput.d.ts +174 -0
- package/esm/util/withLaunchInput.js +274 -0
- package/package.json +75 -24
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
- package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
- package/esm/ReExports/BaseFeatureDetails.js +0 -10
- package/esm/ReExports/index.d.ts +0 -1
- package/esm/ReExports/index.js +0 -1
- package/esm/ReExports/publicUtil.d.ts +0 -1
- package/esm/ReExports/publicUtil.js +0 -28
- package/esm/configuration/promotableDefaults.d.ts +0 -199
- package/esm/configuration/promotableDefaults.js +0 -326
- package/esm/configuration/promotablePin.d.ts +0 -55
- package/esm/configuration/promotablePin.js +0 -1
- package/esm/configuration/promotableResolve.d.ts +0 -108
- package/esm/configuration/promotableResolve.js +0 -117
- package/esm/configuration/promotableSlots.d.ts +0 -12
- package/esm/configuration/promotableSlots.js +0 -45
- package/esm/configuration/slotShape.d.ts +0 -12
- package/esm/configuration/slotShape.js +0 -84
- package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
- package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
- package/esm/ui/PinAdornment.d.ts +0 -5
- package/esm/ui/PinAdornment.js +0 -79
- package/esm/ui/SvgGradientLegend.d.ts +0 -26
- package/esm/ui/SvgGradientLegend.js +0 -26
- package/esm/ui/highlightChipReveal.d.ts +0 -32
- package/esm/ui/highlightChipReveal.js +0 -39
- package/esm/ui/promotableMenuItems.d.ts +0 -19
- package/esm/ui/promotableMenuItems.js +0 -89
- package/esm/ui/promotablePinCoverage.d.ts +0 -44
- package/esm/ui/promotablePinCoverage.js +0 -87
- package/esm/util/applyInitSettings.d.ts +0 -79
- package/esm/util/applyInitSettings.js +0 -91
- package/esm/util/openDisplays.d.ts +0 -23
- package/esm/util/openDisplays.js +0 -79
- package/esm/util/stopToken.d.ts +0 -211
- package/esm/util/stopToken.js +0 -438
- /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
|
@@ -0,0 +1,437 @@
|
|
|
1
|
+
// The `cells` step: each row's runs against the reference it was fanned out
|
|
2
|
+
// of, and the texts its walk reads, which the fused identity kernel in
|
|
3
|
+
// cellMatches.ts walks too. Imported by relative path only.
|
|
4
|
+
import { DerivedTable, numberReaderOf, readerOf, valueAt, } from './featureTable.js';
|
|
5
|
+
import { FannedTable, boundsThrough } from './stepTables.js';
|
|
6
|
+
export const DEFAULT_CELLS_FIELD = 'seq';
|
|
7
|
+
export const DASH = 45;
|
|
8
|
+
export const SPACE = 32;
|
|
9
|
+
const LOWER_BIT = 0x20;
|
|
10
|
+
const CELL_STATES = ['match', 'mismatch', 'gap', 'insertion'];
|
|
11
|
+
export const MATCH = 0;
|
|
12
|
+
export const MISMATCH = 1;
|
|
13
|
+
const GAP = 2;
|
|
14
|
+
const INSERTION = 3;
|
|
15
|
+
export const NO_STATE = 255;
|
|
16
|
+
export function isGapByte(b) {
|
|
17
|
+
return b === DASH || b === SPACE;
|
|
18
|
+
}
|
|
19
|
+
// The columns carrying the row's own sequence: a gap run reaching either end
|
|
20
|
+
// of the row measures where the block was cut, not the alignment, so it is no
|
|
21
|
+
// cell either.
|
|
22
|
+
export function firstDrawn(bytes, at, len) {
|
|
23
|
+
let first = 0;
|
|
24
|
+
while (first < len && isGapByte(bytes[at + first])) {
|
|
25
|
+
first++;
|
|
26
|
+
}
|
|
27
|
+
return first;
|
|
28
|
+
}
|
|
29
|
+
export function lastDrawn(bytes, at, len, first) {
|
|
30
|
+
let last = len - 1;
|
|
31
|
+
while (last > first && isGapByte(bytes[at + last])) {
|
|
32
|
+
last--;
|
|
33
|
+
}
|
|
34
|
+
return last;
|
|
35
|
+
}
|
|
36
|
+
// A reference base's cell: no state outside the drawn columns, else the row's
|
|
37
|
+
// gap, or its base matched or not regardless of case.
|
|
38
|
+
export function cellState(refByte, rowByte, drawn) {
|
|
39
|
+
return !drawn
|
|
40
|
+
? NO_STATE
|
|
41
|
+
: isGapByte(rowByte)
|
|
42
|
+
? GAP
|
|
43
|
+
: (refByte | LOWER_BIT) === (rowByte | LOWER_BIT)
|
|
44
|
+
? MATCH
|
|
45
|
+
: MISMATCH;
|
|
46
|
+
}
|
|
47
|
+
// The row a cell step reads against: past any table that only reordered or
|
|
48
|
+
// annotated the rows, the one they were fanned out of.
|
|
49
|
+
function containerOf(table) {
|
|
50
|
+
let at = table;
|
|
51
|
+
let toBase;
|
|
52
|
+
while (at instanceof DerivedTable && !at.madeFrom) {
|
|
53
|
+
toBase = at.parentRow ? compose(toBase, at.parentRow) : toBase;
|
|
54
|
+
at = at.parent;
|
|
55
|
+
}
|
|
56
|
+
if (!(at instanceof DerivedTable)) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
made: at,
|
|
61
|
+
toMade: toBase,
|
|
62
|
+
table: at.parent,
|
|
63
|
+
row: at.parentRow ? compose(toBase, at.parentRow) : toBase,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function compose(outer, inner) {
|
|
67
|
+
if (!outer) {
|
|
68
|
+
return inner;
|
|
69
|
+
}
|
|
70
|
+
const out = new Uint32Array(outer.length);
|
|
71
|
+
for (let i = 0; i < outer.length; i++) {
|
|
72
|
+
out[i] = inner[outer[i]];
|
|
73
|
+
}
|
|
74
|
+
return out;
|
|
75
|
+
}
|
|
76
|
+
// Below this length a character loop copies a string faster than
|
|
77
|
+
// `encodeInto`, as the MAF packer measured.
|
|
78
|
+
const ASCII_COPY_MAX_LENGTH = 64;
|
|
79
|
+
const encoder = new TextEncoder();
|
|
80
|
+
// A column's text as bytes, one per character: an adapter's own, or the
|
|
81
|
+
// strings a feature holds copied into one buffer.
|
|
82
|
+
function textOf(column, n) {
|
|
83
|
+
if (column.kind === 'text') {
|
|
84
|
+
return column;
|
|
85
|
+
}
|
|
86
|
+
const read = readerOf(column);
|
|
87
|
+
const texts = new Array(n);
|
|
88
|
+
let total = 0;
|
|
89
|
+
for (let i = 0; i < n; i++) {
|
|
90
|
+
const v = read(i);
|
|
91
|
+
if (typeof v === 'string') {
|
|
92
|
+
texts[i] = v;
|
|
93
|
+
total += v.length;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const bytes = new Uint8Array(total);
|
|
97
|
+
const offset = new Uint32Array(n);
|
|
98
|
+
const length = new Uint32Array(n);
|
|
99
|
+
let pos = 0;
|
|
100
|
+
for (let i = 0; i < n; i++) {
|
|
101
|
+
const text = texts[i];
|
|
102
|
+
if (text === undefined) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
offset[i] = pos;
|
|
106
|
+
if (text.length <= ASCII_COPY_MAX_LENGTH) {
|
|
107
|
+
for (let c = 0; c < text.length; c++) {
|
|
108
|
+
bytes[pos + c] = text.charCodeAt(c);
|
|
109
|
+
}
|
|
110
|
+
length[i] = text.length;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
length[i] = encoder.encodeInto(text, bytes.subarray(pos, pos + text.length)).written;
|
|
114
|
+
}
|
|
115
|
+
pos += text.length;
|
|
116
|
+
}
|
|
117
|
+
return { kind: 'text', bytes, offset, length, at: undefined };
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* The texts a `cells` walk reads, by the row of the table it walked: each
|
|
121
|
+
* row's own, and the reference it is read against, which a row fanned out of
|
|
122
|
+
* a container reads off the container.
|
|
123
|
+
*/
|
|
124
|
+
class WalkedTexts {
|
|
125
|
+
row;
|
|
126
|
+
reference;
|
|
127
|
+
refRow;
|
|
128
|
+
constructor(row, ref, refRow) {
|
|
129
|
+
this.row = row;
|
|
130
|
+
this.reference = ref;
|
|
131
|
+
this.refRow = refRow;
|
|
132
|
+
}
|
|
133
|
+
rowOf(r) {
|
|
134
|
+
const { at } = this.row;
|
|
135
|
+
return at ? at[r] : r;
|
|
136
|
+
}
|
|
137
|
+
refOf(r) {
|
|
138
|
+
const p = this.refRow ? this.refRow[r] : r;
|
|
139
|
+
const { at } = this.reference;
|
|
140
|
+
return at ? at[p] : p;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
export function walkedTexts(table, field) {
|
|
144
|
+
const row = textOf(table.column(field), table.length);
|
|
145
|
+
const container = containerOf(table);
|
|
146
|
+
const made = container?.made;
|
|
147
|
+
if (container && !(made instanceof FannedTable && made.hasKept)) {
|
|
148
|
+
const { table: base } = container;
|
|
149
|
+
return new WalkedTexts(row, textOf(base.column(field), base.length), container.row);
|
|
150
|
+
}
|
|
151
|
+
// A container a flatten kept with nothing to fan out is the row itself, so
|
|
152
|
+
// its reference is its own container's, as its `parent()` says.
|
|
153
|
+
const byParent = (r) => table.row(r).parent?.()?.get(field);
|
|
154
|
+
const readContainer = container
|
|
155
|
+
? readerOf(container.table.column(field))
|
|
156
|
+
: undefined;
|
|
157
|
+
const read = readContainer && made instanceof FannedTable
|
|
158
|
+
? (r) => {
|
|
159
|
+
const { toMade, row: refRow } = container;
|
|
160
|
+
return made.isKept(toMade ? toMade[r] : r)
|
|
161
|
+
? byParent(r)
|
|
162
|
+
: readContainer(refRow ? refRow[r] : r);
|
|
163
|
+
}
|
|
164
|
+
: byParent;
|
|
165
|
+
return new WalkedTexts(row, textOf({ kind: 'value', read }, table.length));
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* The runs a `cells` step answers, one per stretch of one state against the
|
|
169
|
+
* reference, typed: each run's span, its state and the text column it starts
|
|
170
|
+
* at, with `base`, `match` and `length` read back out of the texts when asked
|
|
171
|
+
* for.
|
|
172
|
+
*/
|
|
173
|
+
class CellTable extends DerivedTable {
|
|
174
|
+
start;
|
|
175
|
+
end;
|
|
176
|
+
state;
|
|
177
|
+
textAt;
|
|
178
|
+
texts;
|
|
179
|
+
firstOfRow;
|
|
180
|
+
derived = new Map();
|
|
181
|
+
constructor(parent, parentRow, lanes, texts) {
|
|
182
|
+
super(parent, parentRow);
|
|
183
|
+
this.start = lanes.start;
|
|
184
|
+
this.end = lanes.end;
|
|
185
|
+
this.state = lanes.state;
|
|
186
|
+
this.textAt = lanes.textAt;
|
|
187
|
+
this.texts = texts;
|
|
188
|
+
}
|
|
189
|
+
get madeFrom() {
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
laneOf(name, build) {
|
|
193
|
+
let column = this.derived.get(name);
|
|
194
|
+
if (!column) {
|
|
195
|
+
column = build();
|
|
196
|
+
this.derived.set(name, column);
|
|
197
|
+
}
|
|
198
|
+
return column;
|
|
199
|
+
}
|
|
200
|
+
own(name) {
|
|
201
|
+
switch (name) {
|
|
202
|
+
case 'start': {
|
|
203
|
+
return { kind: 'number', values: this.start, at: undefined };
|
|
204
|
+
}
|
|
205
|
+
case 'end': {
|
|
206
|
+
return { kind: 'number', values: this.end, at: undefined };
|
|
207
|
+
}
|
|
208
|
+
case 'state': {
|
|
209
|
+
return {
|
|
210
|
+
kind: 'category',
|
|
211
|
+
codes: this.state,
|
|
212
|
+
labels: CELL_STATES,
|
|
213
|
+
at: undefined,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
case 'match': {
|
|
217
|
+
return this.laneOf(name, () => {
|
|
218
|
+
const values = new Float32Array(this.length);
|
|
219
|
+
for (let i = 0; i < this.length; i++) {
|
|
220
|
+
const s = this.state[i];
|
|
221
|
+
values[i] = s === MATCH ? 1 : s === MISMATCH ? 0 : Number.NaN;
|
|
222
|
+
}
|
|
223
|
+
return { kind: 'number', values, at: undefined, nanIsAbsent: true };
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
case 'length': {
|
|
227
|
+
return this.laneOf(name, () => {
|
|
228
|
+
const values = new Float32Array(this.length).fill(Number.NaN);
|
|
229
|
+
for (let i = 0; i < this.length; i++) {
|
|
230
|
+
if (this.state[i] === INSERTION) {
|
|
231
|
+
values[i] = this.inserted(i).length;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return { kind: 'number', values, at: undefined, nanIsAbsent: true };
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
case 'base': {
|
|
238
|
+
return this.laneOf(name, () => {
|
|
239
|
+
const values = new Array(this.length);
|
|
240
|
+
for (let i = 0; i < this.length; i++) {
|
|
241
|
+
const s = this.state[i];
|
|
242
|
+
values[i] =
|
|
243
|
+
s === MISMATCH
|
|
244
|
+
? this.mismatched(i)
|
|
245
|
+
: s === INSERTION
|
|
246
|
+
? this.inserted(i)
|
|
247
|
+
: undefined;
|
|
248
|
+
}
|
|
249
|
+
return { kind: 'value', read: i => values[i] };
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
default: {
|
|
253
|
+
return undefined;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
mismatched(i) {
|
|
258
|
+
const { bytes, offset } = this.texts.row;
|
|
259
|
+
const k = this.texts.rowOf(this.parentOf(i));
|
|
260
|
+
return String.fromCharCode(bytes[offset[k] + this.textAt[i]]);
|
|
261
|
+
}
|
|
262
|
+
// The bases a row holds where the reference has none, from the column the
|
|
263
|
+
// insertion starts at to the reference's next base.
|
|
264
|
+
inserted(i) {
|
|
265
|
+
const { row, reference: ref } = this.texts;
|
|
266
|
+
const r = this.parentOf(i);
|
|
267
|
+
const k = this.texts.rowOf(r);
|
|
268
|
+
const f = this.texts.refOf(r);
|
|
269
|
+
const rowAt = row.offset[k];
|
|
270
|
+
const refAt = ref.offset[f];
|
|
271
|
+
const end = Math.min(row.length[k], ref.length[f]);
|
|
272
|
+
let out = '';
|
|
273
|
+
for (let col = this.textAt[i]; col < end && ref.bytes[refAt + col] === DASH; col++) {
|
|
274
|
+
const b = row.bytes[rowAt + col];
|
|
275
|
+
if (!isGapByte(b)) {
|
|
276
|
+
out += String.fromCharCode(b);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return out;
|
|
280
|
+
}
|
|
281
|
+
id(i) {
|
|
282
|
+
const p = this.parentOf(i);
|
|
283
|
+
this.firstOfRow ??= firstRowIndex(this.parentRow, this.parent.length);
|
|
284
|
+
return `${this.parent.row(p).id()}#${i - this.firstOfRow[p]}`;
|
|
285
|
+
}
|
|
286
|
+
json(i) {
|
|
287
|
+
const out = {
|
|
288
|
+
...this.parent.row(this.parentOf(i)).toJSON(),
|
|
289
|
+
start: this.start[i],
|
|
290
|
+
end: this.end[i],
|
|
291
|
+
state: CELL_STATES[this.state[i]],
|
|
292
|
+
};
|
|
293
|
+
for (const name of ['base', 'match', 'length']) {
|
|
294
|
+
const v = valueAt(this.column(name), i);
|
|
295
|
+
if (v !== undefined) {
|
|
296
|
+
out[name] = v;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return out;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
// The lanes a `cells` walk writes, doubled as a row would overrun them.
|
|
303
|
+
class RunLanes {
|
|
304
|
+
start;
|
|
305
|
+
end;
|
|
306
|
+
state;
|
|
307
|
+
textAt;
|
|
308
|
+
parentRow;
|
|
309
|
+
length = 0;
|
|
310
|
+
constructor(capacity) {
|
|
311
|
+
this.start = new Uint32Array(capacity);
|
|
312
|
+
this.end = new Uint32Array(capacity);
|
|
313
|
+
this.state = new Uint8Array(capacity);
|
|
314
|
+
this.textAt = new Uint32Array(capacity);
|
|
315
|
+
this.parentRow = new Uint32Array(capacity);
|
|
316
|
+
}
|
|
317
|
+
reserve(more) {
|
|
318
|
+
const need = this.length + more;
|
|
319
|
+
if (need <= this.start.length) {
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
const size = Math.max(this.start.length * 2, need);
|
|
323
|
+
const widen = (a) => {
|
|
324
|
+
const next = new a.constructor(size);
|
|
325
|
+
next.set(a);
|
|
326
|
+
return next;
|
|
327
|
+
};
|
|
328
|
+
this.start = widen(this.start);
|
|
329
|
+
this.end = widen(this.end);
|
|
330
|
+
this.state = widen(this.state);
|
|
331
|
+
this.textAt = widen(this.textAt);
|
|
332
|
+
this.parentRow = widen(this.parentRow);
|
|
333
|
+
}
|
|
334
|
+
// One row's runs against its reference: a run per column is the most it
|
|
335
|
+
// can answer, so the lanes grow once and the walk writes through locals.
|
|
336
|
+
walk(r, startPos, rowBytes, rowAt, rowLen, refBytes, refAt, refLen) {
|
|
337
|
+
this.reserve(refLen + 1);
|
|
338
|
+
const { start, end, state, textAt, parentRow } = this;
|
|
339
|
+
let n = this.length;
|
|
340
|
+
let pos = startPos;
|
|
341
|
+
const first = firstDrawn(rowBytes, rowAt, rowLen);
|
|
342
|
+
const last = lastDrawn(rowBytes, rowAt, rowLen, first);
|
|
343
|
+
let runStart = -1;
|
|
344
|
+
let runState = NO_STATE;
|
|
345
|
+
let runBase = -1;
|
|
346
|
+
let runCol = 0;
|
|
347
|
+
let insertAt = -1;
|
|
348
|
+
for (let col = 0; col < refLen; col++) {
|
|
349
|
+
const refByte = refBytes[refAt + col];
|
|
350
|
+
const rowByte = col < rowLen ? rowBytes[rowAt + col] : SPACE;
|
|
351
|
+
if (refByte === DASH) {
|
|
352
|
+
if (insertAt < 0 && col < rowLen && !isGapByte(rowByte)) {
|
|
353
|
+
insertAt = col;
|
|
354
|
+
}
|
|
355
|
+
continue;
|
|
356
|
+
}
|
|
357
|
+
if (insertAt >= 0) {
|
|
358
|
+
start[n] = pos;
|
|
359
|
+
end[n] = pos;
|
|
360
|
+
state[n] = INSERTION;
|
|
361
|
+
textAt[n] = insertAt;
|
|
362
|
+
parentRow[n] = r;
|
|
363
|
+
n++;
|
|
364
|
+
insertAt = -1;
|
|
365
|
+
}
|
|
366
|
+
const st = cellState(refByte, rowByte, col >= first && col <= last && col < rowLen);
|
|
367
|
+
const base = st === MISMATCH ? rowByte : -1;
|
|
368
|
+
if (st !== runState || base !== runBase) {
|
|
369
|
+
if (runStart >= 0) {
|
|
370
|
+
start[n] = runStart;
|
|
371
|
+
end[n] = pos;
|
|
372
|
+
state[n] = runState;
|
|
373
|
+
textAt[n] = runCol;
|
|
374
|
+
parentRow[n] = r;
|
|
375
|
+
n++;
|
|
376
|
+
}
|
|
377
|
+
runStart = st === NO_STATE ? -1 : pos;
|
|
378
|
+
runState = st;
|
|
379
|
+
runBase = base;
|
|
380
|
+
runCol = col;
|
|
381
|
+
}
|
|
382
|
+
pos++;
|
|
383
|
+
}
|
|
384
|
+
if (runStart >= 0) {
|
|
385
|
+
start[n] = runStart;
|
|
386
|
+
end[n] = pos;
|
|
387
|
+
state[n] = runState;
|
|
388
|
+
textAt[n] = runCol;
|
|
389
|
+
parentRow[n] = r;
|
|
390
|
+
n++;
|
|
391
|
+
}
|
|
392
|
+
this.length = n;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
// Where each parent row's children start, for children written parent by
|
|
396
|
+
// parent in order.
|
|
397
|
+
function firstRowIndex(parentRow, parents) {
|
|
398
|
+
const first = new Uint32Array(parents);
|
|
399
|
+
for (let i = parentRow.length - 1; i >= 0; i--) {
|
|
400
|
+
first[parentRow[i]] = i;
|
|
401
|
+
}
|
|
402
|
+
return first;
|
|
403
|
+
}
|
|
404
|
+
export function cells({ table, bounds }, step) {
|
|
405
|
+
const { field = DEFAULT_CELLS_FIELD } = step;
|
|
406
|
+
const texts = walkedTexts(table, field);
|
|
407
|
+
const readStart = numberReaderOf(table.column('start'));
|
|
408
|
+
const { bytes: rowBytes, offset: rowOffset, length: rowLength } = texts.row;
|
|
409
|
+
const { bytes: refBytes, offset: refOffset, length: refLength, } = texts.reference;
|
|
410
|
+
// A run per reference base is the most a row can answer and far past what
|
|
411
|
+
// one does, so the lanes start at an eighth of it.
|
|
412
|
+
let bound = 0;
|
|
413
|
+
for (let r = 0; r < table.length; r++) {
|
|
414
|
+
bound += refLength[texts.refOf(r)] + 1;
|
|
415
|
+
}
|
|
416
|
+
const lanes = new RunLanes(Math.max(1024, bound >>> 3));
|
|
417
|
+
for (let r = 0; r < table.length; r++) {
|
|
418
|
+
const f = texts.refOf(r);
|
|
419
|
+
const refLen = refLength[f];
|
|
420
|
+
const pos = readStart(r);
|
|
421
|
+
if (refLen > 0 && pos >= 0) {
|
|
422
|
+
const k = texts.rowOf(r);
|
|
423
|
+
lanes.walk(r, pos, rowBytes, rowOffset[k], rowLength[k], refBytes, refOffset[f], refLen);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
const n = lanes.length;
|
|
427
|
+
const rows = lanes.parentRow.subarray(0, n);
|
|
428
|
+
return {
|
|
429
|
+
table: new CellTable(table, rows, {
|
|
430
|
+
start: lanes.start.subarray(0, n),
|
|
431
|
+
end: lanes.end.subarray(0, n),
|
|
432
|
+
state: lanes.state.subarray(0, n),
|
|
433
|
+
textAt: lanes.textAt.subarray(0, n),
|
|
434
|
+
}, texts),
|
|
435
|
+
bounds: boundsThrough(bounds, rows),
|
|
436
|
+
};
|
|
437
|
+
}
|
|
@@ -24,3 +24,20 @@ export declare function clampToContig(assembly: Assembly, region: {
|
|
|
24
24
|
start: number;
|
|
25
25
|
end: number;
|
|
26
26
|
}): Region | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* `clampToContig` for a refName that may not be on the assembly at all, which
|
|
29
|
+
* is the shape a location nobody requested arrives in — a BAM's `nextRef`, an
|
|
30
|
+
* SA record's contig (REFNAME_NAMESPACES.md). `clampToContig` alone passes an
|
|
31
|
+
* unknown name through with nothing to clamp against, so it cannot tell "past
|
|
32
|
+
* the end of a contig we have" from "a contig we do not have", and both callers
|
|
33
|
+
* need that apart to say which happened.
|
|
34
|
+
*/
|
|
35
|
+
export declare function clampToListedContig(assembly: Assembly, region: {
|
|
36
|
+
refName: string;
|
|
37
|
+
start: number;
|
|
38
|
+
end: number;
|
|
39
|
+
}): {
|
|
40
|
+
refName: string;
|
|
41
|
+
onAssembly: boolean;
|
|
42
|
+
region: Region | undefined;
|
|
43
|
+
};
|
|
@@ -26,3 +26,22 @@ export function clampToContig(assembly, region) {
|
|
|
26
26
|
? { ...region, assemblyName: assembly.name, refName, start, end }
|
|
27
27
|
: undefined;
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* `clampToContig` for a refName that may not be on the assembly at all, which
|
|
31
|
+
* is the shape a location nobody requested arrives in — a BAM's `nextRef`, an
|
|
32
|
+
* SA record's contig (REFNAME_NAMESPACES.md). `clampToContig` alone passes an
|
|
33
|
+
* unknown name through with nothing to clamp against, so it cannot tell "past
|
|
34
|
+
* the end of a contig we have" from "a contig we do not have", and both callers
|
|
35
|
+
* need that apart to say which happened.
|
|
36
|
+
*/
|
|
37
|
+
export function clampToListedContig(assembly, region) {
|
|
38
|
+
const refName = assembly.getCanonicalRefName2(region.refName);
|
|
39
|
+
const onAssembly = assembly.getRegionForRefName(refName) !== undefined;
|
|
40
|
+
return {
|
|
41
|
+
refName,
|
|
42
|
+
onAssembly,
|
|
43
|
+
region: onAssembly
|
|
44
|
+
? clampToContig(assembly, { ...region, refName })
|
|
45
|
+
: undefined,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
// not a sanitizer, this just removes html tags
|
|
2
|
-
// element width calculations
|
|
1
|
+
// not a sanitizer, this just removes html tags where only the text is shown
|
|
3
2
|
export function coarseStripHTML(s) {
|
|
4
3
|
return s.replaceAll(/<[^<>]*>/g, '');
|
|
5
4
|
}
|
|
@@ -20,7 +20,9 @@ export declare function emphasize(color: string, coefficient?: number): string;
|
|
|
20
20
|
* default refName colors.
|
|
21
21
|
*/
|
|
22
22
|
export declare function makeContrasting(foreground: string, background?: string, minContrastRatio?: number): string;
|
|
23
|
-
export { isNamedColor, namedColorToHex } from './cssColorsLevel4.ts';
|
|
23
|
+
export { CSS_COLOR_NAMES, isNamedColor, namedColorToHex, } from './cssColorsLevel4.ts';
|
|
24
|
+
export declare const NO_CATEGORY_COLOR = "#afafaf";
|
|
25
|
+
export declare const MISCONFIGURED_COLOR = "#808080";
|
|
24
26
|
/**
|
|
25
27
|
* #api
|
|
26
28
|
* Move a color's OKLCH lightness by `lightnessShift` and scale its chroma,
|
|
@@ -69,8 +71,8 @@ export declare function relight(color: string, lightnessShift: number, chromaSca
|
|
|
69
71
|
*
|
|
70
72
|
* A value that is absent gets NO_CATEGORY_COLOR rather than a hue, and that is
|
|
71
73
|
* the difference between this being usable on real data and not. The everyday
|
|
72
|
-
* caller is
|
|
73
|
-
*
|
|
74
|
+
* caller is a `jexl:randomColor(get(feature,'<attr>'))` color slot over a
|
|
75
|
+
* whole track — and most files
|
|
74
76
|
* have the attribute on some features and not others, so most of the time this
|
|
75
77
|
* is handed `undefined`. It used to throw on that (`str.length` of undefined),
|
|
76
78
|
* once per feature, and what a reader saw was every unlabelled feature in one
|
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 [
|