@genome-spy/core 0.77.0 → 0.79.0
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/dist/bundle/{browser-KWU9rWZT.js → browser-CETrb2cm.js} +53 -33
- package/dist/bundle/esm-BdLYkz-m.js +248 -0
- package/dist/bundle/esm-BwiDsqSb.js +1367 -0
- package/dist/bundle/esm-CDFd1cjk.js +441 -0
- package/dist/bundle/{esm-CRMf_I9V.js → esm-CTUHLDbv.js} +30 -30
- package/dist/bundle/esm-Cx-EbkOj.js +1221 -0
- package/dist/bundle/esm-DlYGqi79.js +128 -0
- package/dist/bundle/{esm-BygJiwh0.js → esm-k9p3oHkt.js} +133 -158
- package/dist/bundle/{esm-CT3ygiMq.js → esm-zAZJQO6D.js} +226 -212
- package/dist/bundle/index.es.js +14102 -10810
- package/dist/bundle/index.js +109 -95
- package/dist/bundle/{parquetRead-DG_-F5j5.js → parquetRead-Cad1SOVV.js} +473 -399
- package/dist/schema.json +23788 -11049
- package/dist/src/config/axisConfig.d.ts +2 -2
- package/dist/src/config/axisConfig.d.ts.map +1 -1
- package/dist/src/config/axisConfig.js +28 -44
- package/dist/src/config/configLayers.d.ts +45 -0
- package/dist/src/config/configLayers.d.ts.map +1 -0
- package/dist/src/config/configLayers.js +110 -0
- package/dist/src/config/defaultConfig.d.ts.map +1 -1
- package/dist/src/config/defaultConfig.js +8 -1
- package/dist/src/config/defaults/legendDefaults.d.ts +14 -0
- package/dist/src/config/defaults/legendDefaults.d.ts.map +1 -0
- package/dist/src/config/defaults/legendDefaults.js +46 -0
- package/dist/src/config/defaults/titleDefaults.d.ts.map +1 -1
- package/dist/src/config/defaults/titleDefaults.js +26 -18
- package/dist/src/config/legendConfig.d.ts +11 -0
- package/dist/src/config/legendConfig.d.ts.map +1 -0
- package/dist/src/config/legendConfig.js +63 -0
- package/dist/src/config/styleUtils.d.ts +8 -2
- package/dist/src/config/styleUtils.d.ts.map +1 -1
- package/dist/src/config/styleUtils.js +25 -1
- package/dist/src/config/themes.d.ts.map +1 -1
- package/dist/src/config/themes.js +21 -2
- package/dist/src/config/titleConfig.d.ts.map +1 -1
- package/dist/src/config/titleConfig.js +2 -18
- package/dist/src/data/collector.d.ts.map +1 -1
- package/dist/src/data/collector.js +40 -18
- package/dist/src/data/flowInit.d.ts +6 -0
- package/dist/src/data/flowInit.d.ts.map +1 -1
- package/dist/src/data/flowInit.js +1 -1
- package/dist/src/data/flowNode.d.ts +32 -0
- package/dist/src/data/flowNode.d.ts.map +1 -1
- package/dist/src/data/flowNode.js +59 -0
- package/dist/src/data/sources/lazy/bamSource.d.ts +0 -1
- package/dist/src/data/sources/lazy/bamSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/bamSource.js +39 -30
- package/dist/src/data/sources/lazy/bigBedSource.d.ts +0 -10
- package/dist/src/data/sources/lazy/bigBedSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/bigBedSource.js +127 -62
- package/dist/src/data/sources/lazy/bigWigSource.d.ts +2 -2
- package/dist/src/data/sources/lazy/bigWigSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/bigWigSource.js +234 -81
- package/dist/src/data/sources/lazy/gff3Source.d.ts +7 -3
- package/dist/src/data/sources/lazy/gff3Source.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/gff3Source.js +7 -8
- package/dist/src/data/sources/lazy/indexedFastaSource.d.ts +1 -1
- package/dist/src/data/sources/lazy/indexedFastaSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/indexedFastaSource.js +28 -19
- package/dist/src/data/sources/lazy/legendEntriesSource.d.ts +24 -0
- package/dist/src/data/sources/lazy/legendEntriesSource.d.ts.map +1 -0
- package/dist/src/data/sources/lazy/legendEntriesSource.js +217 -0
- package/dist/src/data/sources/lazy/legendGradientSource.d.ts +30 -0
- package/dist/src/data/sources/lazy/legendGradientSource.d.ts.map +1 -0
- package/dist/src/data/sources/lazy/legendGradientSource.js +388 -0
- package/dist/src/data/sources/lazy/mockLazySource.d.ts +4 -1
- package/dist/src/data/sources/lazy/mockLazySource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/mockLazySource.js +49 -4
- package/dist/src/data/sources/lazy/registerCoreLazySources.js +2 -0
- package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +3 -4
- package/dist/src/data/sources/lazy/tabixSource.d.ts +9 -4
- package/dist/src/data/sources/lazy/tabixSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/tabixSource.js +201 -70
- package/dist/src/data/sources/lazy/tabixTsvSource.d.ts +2 -3
- package/dist/src/data/sources/lazy/tabixTsvSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/tabixTsvSource.js +14 -12
- package/dist/src/data/sources/lazy/vcfSource.d.ts +7 -3
- package/dist/src/data/sources/lazy/vcfSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/vcfSource.js +7 -8
- package/dist/src/data/sources/urlDescriptor.d.ts +165 -0
- package/dist/src/data/sources/urlDescriptor.d.ts.map +1 -0
- package/dist/src/data/sources/urlDescriptor.js +473 -0
- package/dist/src/data/sources/urlDescriptorController.d.ts +25 -0
- package/dist/src/data/sources/urlDescriptorController.d.ts.map +1 -0
- package/dist/src/data/sources/urlDescriptorController.js +72 -0
- package/dist/src/data/sources/urlDescriptorState.d.ts +47 -0
- package/dist/src/data/sources/urlDescriptorState.d.ts.map +1 -0
- package/dist/src/data/sources/urlDescriptorState.js +129 -0
- package/dist/src/data/sources/urlSource.d.ts.map +1 -1
- package/dist/src/data/sources/urlSource.js +101 -61
- package/dist/src/data/transforms/packLegendLabels.d.ts +21 -0
- package/dist/src/data/transforms/packLegendLabels.d.ts.map +1 -0
- package/dist/src/data/transforms/packLegendLabels.js +189 -0
- package/dist/src/data/transforms/transformFactory.d.ts.map +1 -1
- package/dist/src/data/transforms/transformFactory.js +4 -0
- package/dist/src/data/transforms/truncateText.d.ts +27 -0
- package/dist/src/data/transforms/truncateText.d.ts.map +1 -0
- package/dist/src/data/transforms/truncateText.js +94 -0
- package/dist/src/debug/dataflowDebugSnapshot.d.ts +58 -0
- package/dist/src/debug/dataflowDebugSnapshot.d.ts.map +1 -0
- package/dist/src/debug/dataflowDebugSnapshot.js +159 -0
- package/dist/src/debug/markDebugSnapshot.d.ts +54 -0
- package/dist/src/debug/markDebugSnapshot.d.ts.map +1 -0
- package/dist/src/debug/markDebugSnapshot.js +100 -0
- package/dist/src/debug/paramDebugSnapshot.d.ts +53 -0
- package/dist/src/debug/paramDebugSnapshot.d.ts.map +1 -0
- package/dist/src/debug/paramDebugSnapshot.js +86 -0
- package/dist/src/debug/resolutionDebugSnapshot.d.ts +155 -0
- package/dist/src/debug/resolutionDebugSnapshot.d.ts.map +1 -0
- package/dist/src/debug/resolutionDebugSnapshot.js +291 -0
- package/dist/src/debug/valuePreview.d.ts +9 -0
- package/dist/src/debug/valuePreview.d.ts.map +1 -0
- package/dist/src/debug/valuePreview.js +57 -0
- package/dist/src/debug/viewDebugSnapshot.d.ts +131 -0
- package/dist/src/debug/viewDebugSnapshot.d.ts.map +1 -0
- package/dist/src/debug/viewDebugSnapshot.js +390 -0
- package/dist/src/embedFactory.d.ts.map +1 -1
- package/dist/src/embedFactory.js +6 -1
- package/dist/src/encoder/encoder.d.ts +2 -2
- package/dist/src/encoder/encoder.d.ts.map +1 -1
- package/dist/src/encoder/encoder.js +5 -4
- package/dist/src/fonts/bmFontManager.d.ts +1 -1
- package/dist/src/fonts/bmFontManager.d.ts.map +1 -1
- package/dist/src/fonts/bmFontManager.js +45 -10
- package/dist/src/fonts/textMetrics.d.ts +69 -0
- package/dist/src/fonts/textMetrics.d.ts.map +1 -0
- package/dist/src/fonts/textMetrics.js +73 -0
- package/dist/src/genomeSpy/headlessBootstrap.d.ts.map +1 -1
- package/dist/src/genomeSpy/headlessBootstrap.js +8 -0
- package/dist/src/genomeSpy/interactionController.d.ts +4 -1
- package/dist/src/genomeSpy/interactionController.d.ts.map +1 -1
- package/dist/src/genomeSpy/interactionController.js +57 -13
- package/dist/src/genomeSpy/renderCoordinator.d.ts.map +1 -1
- package/dist/src/genomeSpy/renderCoordinator.js +25 -3
- package/dist/src/genomeSpy/viewDataInit.d.ts +14 -0
- package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -1
- package/dist/src/genomeSpy/viewDataInit.js +45 -8
- package/dist/src/genomeSpyBase.d.ts +6 -0
- package/dist/src/genomeSpyBase.d.ts.map +1 -1
- package/dist/src/genomeSpyBase.js +25 -4
- package/dist/src/gl/glslScaleGenerator.d.ts +17 -0
- package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
- package/dist/src/gl/glslScaleGenerator.js +39 -2
- package/dist/src/gl/includes/common.glsl.js +1 -1
- package/dist/src/gl/vertexRangeIndex.d.ts.map +1 -1
- package/dist/src/gl/vertexRangeIndex.js +4 -2
- package/dist/src/gl/webGLHelper.d.ts +1 -1
- package/dist/src/gl/webGLHelper.d.ts.map +1 -1
- package/dist/src/gl/webGLHelper.js +13 -8
- package/dist/src/marks/__snapshots__/shaderSnapshot.test.js.snap +140 -3
- package/dist/src/marks/mark.d.ts +47 -4
- package/dist/src/marks/mark.d.ts.map +1 -1
- package/dist/src/marks/mark.js +158 -54
- package/dist/src/marks/point.d.ts.map +1 -1
- package/dist/src/marks/point.js +4 -0
- package/dist/src/marks/point.vertex.glsl.js +1 -1
- package/dist/src/marks/text.d.ts +1 -1
- package/dist/src/marks/text.d.ts.map +1 -1
- package/dist/src/marks/text.js +2 -7
- package/dist/src/marks/text.vertex.glsl.js +1 -1
- package/dist/src/paramRuntime/paramUtils.d.ts +43 -9
- package/dist/src/paramRuntime/paramUtils.d.ts.map +1 -1
- package/dist/src/paramRuntime/paramUtils.js +61 -1
- package/dist/src/paramRuntime/viewParamRuntime.d.ts +32 -0
- package/dist/src/paramRuntime/viewParamRuntime.d.ts.map +1 -1
- package/dist/src/paramRuntime/viewParamRuntime.js +63 -0
- package/dist/src/scales/axisResolution.d.ts +35 -0
- package/dist/src/scales/axisResolution.d.ts.map +1 -1
- package/dist/src/scales/axisResolution.js +115 -7
- package/dist/src/scales/domainExpressions.d.ts +21 -0
- package/dist/src/scales/domainExpressions.d.ts.map +1 -0
- package/dist/src/scales/domainExpressions.js +43 -0
- package/dist/src/scales/domainPlanner.d.ts +12 -1
- package/dist/src/scales/domainPlanner.d.ts.map +1 -1
- package/dist/src/scales/domainPlanner.js +55 -36
- package/dist/src/scales/legendResolution.d.ts +83 -0
- package/dist/src/scales/legendResolution.d.ts.map +1 -0
- package/dist/src/scales/legendResolution.js +461 -0
- package/dist/src/scales/scaleInstanceManager.d.ts +1 -0
- package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -1
- package/dist/src/scales/scaleInstanceManager.js +5 -0
- package/dist/src/scales/scalePropsResolver.d.ts +6 -1
- package/dist/src/scales/scalePropsResolver.d.ts.map +1 -1
- package/dist/src/scales/scalePropsResolver.js +35 -10
- package/dist/src/scales/scaleResolution.d.ts +52 -0
- package/dist/src/scales/scaleResolution.d.ts.map +1 -1
- package/dist/src/scales/scaleResolution.js +195 -16
- package/dist/src/scales/scaleRules.d.ts +10 -0
- package/dist/src/scales/scaleRules.d.ts.map +1 -1
- package/dist/src/scales/scaleRules.js +38 -1
- package/dist/src/scales/viewLevelGuideConfig.d.ts +53 -0
- package/dist/src/scales/viewLevelGuideConfig.d.ts.map +1 -0
- package/dist/src/scales/viewLevelGuideConfig.js +224 -0
- package/dist/src/scales/viewLevelScaleConfig.d.ts +45 -0
- package/dist/src/scales/viewLevelScaleConfig.d.ts.map +1 -0
- package/dist/src/scales/viewLevelScaleConfig.js +149 -0
- package/dist/src/spec/axis.d.ts +109 -3
- package/dist/src/spec/channel.d.ts +23 -4
- package/dist/src/spec/config.d.ts +59 -4
- package/dist/src/spec/data.d.ts +177 -17
- package/dist/src/spec/legend.d.ts +246 -0
- package/dist/src/spec/mark.d.ts +16 -4
- package/dist/src/spec/scale.d.ts +19 -6
- package/dist/src/spec/title.d.ts +58 -1
- package/dist/src/spec/transform.d.ts +149 -0
- package/dist/src/spec/view.d.ts +50 -6
- package/dist/src/styles/genome-spy.css +4 -1
- package/dist/src/styles/genome-spy.css.d.ts +1 -1
- package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
- package/dist/src/styles/genome-spy.css.js +4 -1
- package/dist/src/types/embedApi.d.ts +262 -6
- package/dist/src/types/rendering.d.ts +19 -3
- package/dist/src/types/viewContext.d.ts +18 -2
- package/dist/src/utils/arrayUtils.d.ts +11 -0
- package/dist/src/utils/arrayUtils.d.ts.map +1 -1
- package/dist/src/utils/arrayUtils.js +23 -0
- package/dist/src/utils/suspension.d.ts +17 -0
- package/dist/src/utils/suspension.d.ts.map +1 -0
- package/dist/src/utils/suspension.js +41 -0
- package/dist/src/utils/ui/tooltip.d.ts +4 -0
- package/dist/src/utils/ui/tooltip.d.ts.map +1 -1
- package/dist/src/utils/ui/tooltip.js +35 -10
- package/dist/src/view/axisGridView.d.ts.map +1 -1
- package/dist/src/view/axisGridView.js +1 -4
- package/dist/src/view/axisView.d.ts +18 -2
- package/dist/src/view/axisView.d.ts.map +1 -1
- package/dist/src/view/axisView.js +180 -75
- package/dist/src/view/concatView.d.ts +10 -2
- package/dist/src/view/concatView.d.ts.map +1 -1
- package/dist/src/view/concatView.js +46 -9
- package/dist/src/view/containerMutationHelper.d.ts +20 -1
- package/dist/src/view/containerMutationHelper.d.ts.map +1 -1
- package/dist/src/view/containerMutationHelper.js +203 -32
- package/dist/src/view/facetView.d.ts +1 -1
- package/dist/src/view/gridView/gridChild.d.ts +54 -4
- package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
- package/dist/src/view/gridView/gridChild.js +301 -120
- package/dist/src/view/gridView/gridChildLegends.d.ts +57 -0
- package/dist/src/view/gridView/gridChildLegends.d.ts.map +1 -0
- package/dist/src/view/gridView/gridChildLegends.js +503 -0
- package/dist/src/view/gridView/gridView.d.ts +25 -0
- package/dist/src/view/gridView/gridView.d.ts.map +1 -1
- package/dist/src/view/gridView/gridView.js +454 -78
- package/dist/src/view/gridView/legendLayout.d.ts +26 -0
- package/dist/src/view/gridView/legendLayout.d.ts.map +1 -0
- package/dist/src/view/gridView/legendLayout.js +111 -0
- package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
- package/dist/src/view/gridView/scrollbar.js +1 -4
- package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
- package/dist/src/view/gridView/selectionRect.js +1 -4
- package/dist/src/view/gridView/separatorView.d.ts.map +1 -1
- package/dist/src/view/gridView/separatorView.js +1 -4
- package/dist/src/view/layerView.d.ts +9 -2
- package/dist/src/view/layerView.d.ts.map +1 -1
- package/dist/src/view/layerView.js +18 -1
- package/dist/src/view/layout/flexLayout.d.ts +20 -4
- package/dist/src/view/layout/flexLayout.d.ts.map +1 -1
- package/dist/src/view/layout/flexLayout.js +331 -31
- package/dist/src/view/layout/rectangle.d.ts +14 -0
- package/dist/src/view/layout/rectangle.d.ts.map +1 -1
- package/dist/src/view/layout/rectangle.js +40 -0
- package/dist/src/view/legend/legendEntries.d.ts +20 -0
- package/dist/src/view/legend/legendEntries.d.ts.map +1 -0
- package/dist/src/view/legend/legendEntries.js +21 -0
- package/dist/src/view/legendView.d.ts +134 -0
- package/dist/src/view/legendView.d.ts.map +1 -0
- package/dist/src/view/legendView.js +1611 -0
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts.map +1 -1
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.js +26 -4
- package/dist/src/view/renderingContext/clipOptions.d.ts +44 -0
- package/dist/src/view/renderingContext/clipOptions.d.ts.map +1 -0
- package/dist/src/view/renderingContext/clipOptions.js +140 -0
- package/dist/src/view/renderingContext/simpleViewRenderingContext.d.ts.map +1 -1
- package/dist/src/view/renderingContext/simpleViewRenderingContext.js +12 -1
- package/dist/src/view/resolutionPlanner.d.ts +2 -1
- package/dist/src/view/resolutionPlanner.d.ts.map +1 -1
- package/dist/src/view/resolutionPlanner.js +89 -25
- package/dist/src/view/testUtils.d.ts +4 -2
- package/dist/src/view/testUtils.d.ts.map +1 -1
- package/dist/src/view/testUtils.js +29 -7
- package/dist/src/view/titleView.d.ts +37 -0
- package/dist/src/view/titleView.d.ts.map +1 -0
- package/dist/src/view/titleView.js +584 -0
- package/dist/src/view/unitView.d.ts +3 -3
- package/dist/src/view/unitView.d.ts.map +1 -1
- package/dist/src/view/unitView.js +3 -2
- package/dist/src/view/view.d.ts +25 -24
- package/dist/src/view/view.d.ts.map +1 -1
- package/dist/src/view/view.js +121 -16
- package/dist/src/view/viewFactory.d.ts +2 -5
- package/dist/src/view/viewFactory.d.ts.map +1 -1
- package/dist/src/view/viewFactory.js +1 -2
- package/dist/src/view/viewIdentityRegistry.d.ts +37 -0
- package/dist/src/view/viewIdentityRegistry.d.ts.map +1 -0
- package/dist/src/view/viewIdentityRegistry.js +71 -0
- package/dist/src/view/viewMutationAcidTestUtils.d.ts +112 -0
- package/dist/src/view/viewMutationAcidTestUtils.d.ts.map +1 -0
- package/dist/src/view/viewMutationAcidTestUtils.js +234 -0
- package/dist/src/view/viewMutationApi.d.ts +42 -0
- package/dist/src/view/viewMutationApi.d.ts.map +1 -0
- package/dist/src/view/viewMutationApi.js +811 -0
- package/dist/src/view/viewSelectors.d.ts +10 -0
- package/dist/src/view/viewSelectors.d.ts.map +1 -1
- package/dist/src/view/viewSelectors.js +23 -1
- package/package.json +4 -4
- package/dist/bundle/esm-0dYHNV_D.js +0 -121
- package/dist/bundle/esm-C49STiCR.js +0 -1248
- package/dist/bundle/esm-CscjKVDc.js +0 -1426
- package/dist/bundle/esm-CuMSzCHy.js +0 -298
- package/dist/bundle/esm-DMXpJXM4.js +0 -369
- package/dist/src/view/title.d.ts +0 -13
- package/dist/src/view/title.d.ts.map +0 -1
- package/dist/src/view/title.js +0 -154
- /package/dist/bundle/{AbortablePromiseCache-3gHJdF3E.js → AbortablePromiseCache-BTmAcN-t.js} +0 -0
- /package/dist/bundle/{esm-CuVa5T98.js → esm-VvpZ9hsq.js} +0 -0
- /package/dist/bundle/{chunk-DmhlhrBa.js → rolldown-runtime-Dy4uBu1J.js} +0 -0
|
@@ -17,6 +17,23 @@ export {
|
|
|
17
17
|
withoutExprRef,
|
|
18
18
|
} from "./paramUtils.js";
|
|
19
19
|
|
|
20
|
+
/**
|
|
21
|
+
* @typedef {object} ViewParamRuntimeDebugState
|
|
22
|
+
* @prop {string} scopeId
|
|
23
|
+
* @prop {boolean} disposed
|
|
24
|
+
* @prop {ViewParamDebugState[]} params
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @typedef {object} ViewParamDebugState
|
|
29
|
+
* @prop {string} name
|
|
30
|
+
* @prop {"auto" | "base" | "derived" | "selection" | "push"} kind
|
|
31
|
+
* @prop {any} value
|
|
32
|
+
* @prop {boolean} writable
|
|
33
|
+
* @prop {boolean} configured
|
|
34
|
+
* @prop {import("../spec/parameter.js").Parameter | undefined} config
|
|
35
|
+
*/
|
|
36
|
+
|
|
20
37
|
/**
|
|
21
38
|
* A class that manages parameters and expressions.
|
|
22
39
|
* Supports nesting and scoped parameters through a shared runtime graph.
|
|
@@ -352,6 +369,32 @@ export default class ViewParamRuntime {
|
|
|
352
369
|
}
|
|
353
370
|
}
|
|
354
371
|
|
|
372
|
+
/**
|
|
373
|
+
* @returns {ViewParamRuntimeDebugState}
|
|
374
|
+
*/
|
|
375
|
+
getDebugState() {
|
|
376
|
+
/** @type {ViewParamDebugState[]} */
|
|
377
|
+
const params = [];
|
|
378
|
+
|
|
379
|
+
for (const [name, ref] of this.#localRefs) {
|
|
380
|
+
const config = this.#paramConfigs.get(name);
|
|
381
|
+
params.push({
|
|
382
|
+
name,
|
|
383
|
+
kind: getParamKind(config),
|
|
384
|
+
value: ref.get(),
|
|
385
|
+
writable: this.#allocatedSetters.has(name),
|
|
386
|
+
configured: Boolean(config),
|
|
387
|
+
config: config ? structuredClone(config) : undefined,
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
return {
|
|
392
|
+
scopeId: this.#scopeId,
|
|
393
|
+
disposed: this.#disposed,
|
|
394
|
+
params,
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
|
|
355
398
|
// Setter lifecycle is scope-owned: setters are dropped when the runtime scope
|
|
356
399
|
// is disposed. A standalone deallocation API is intentionally not exposed.
|
|
357
400
|
|
|
@@ -487,3 +530,23 @@ export default class ViewParamRuntime {
|
|
|
487
530
|
return false;
|
|
488
531
|
}
|
|
489
532
|
}
|
|
533
|
+
|
|
534
|
+
/**
|
|
535
|
+
* @param {import("../spec/parameter.js").Parameter | undefined} config
|
|
536
|
+
* @returns {"auto" | "base" | "derived" | "selection" | "push"}
|
|
537
|
+
*/
|
|
538
|
+
function getParamKind(config) {
|
|
539
|
+
if (!config) {
|
|
540
|
+
return "auto";
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
if (config.push === "outer") {
|
|
544
|
+
return "push";
|
|
545
|
+
} else if ("select" in config) {
|
|
546
|
+
return "selection";
|
|
547
|
+
} else if ("expr" in config) {
|
|
548
|
+
return "derived";
|
|
549
|
+
} else {
|
|
550
|
+
return "base";
|
|
551
|
+
}
|
|
552
|
+
}
|
|
@@ -23,8 +23,43 @@ export default class AxisResolution {
|
|
|
23
23
|
* @returns {boolean}
|
|
24
24
|
*/
|
|
25
25
|
removeMember(member: AxisResolutionMember): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* @returns {boolean} True when at least one non-chrome axis-contributing view is visible.
|
|
28
|
+
*/
|
|
29
|
+
hasVisibleNonChromeMember(): boolean;
|
|
30
|
+
getDebugState(): {
|
|
31
|
+
kind: string;
|
|
32
|
+
channel: import("../spec/channel.js").PrimaryPositionalChannel;
|
|
33
|
+
hostView: any;
|
|
34
|
+
scaleResolution: any;
|
|
35
|
+
title: string;
|
|
36
|
+
axisProps: import("../spec/axis.js").GenomeAxis;
|
|
37
|
+
hasVisibleNonChromeMember: boolean;
|
|
38
|
+
members: {
|
|
39
|
+
view: import("../view/unitView.js").default<import("../spec/view.js").UnitSpec>;
|
|
40
|
+
channel: import("../spec/channel.js").PositionalChannel;
|
|
41
|
+
channelDef: import("../spec/channel.js").ChannelDefWithScale;
|
|
42
|
+
}[];
|
|
43
|
+
viewLevelAxisConfig: {
|
|
44
|
+
view: import("../view/view.js").default<import("../spec/view.js").ViewSpec>;
|
|
45
|
+
config: Partial<import("../spec/axis.js").Axis & import("../spec/axis.js").GenomeAxis>;
|
|
46
|
+
};
|
|
47
|
+
};
|
|
26
48
|
getAxisProps(): import("../spec/axis.js").GenomeAxis;
|
|
27
49
|
getTitle(): string;
|
|
50
|
+
/**
|
|
51
|
+
* @param {import("../view/view.js").default} view
|
|
52
|
+
* @param {Partial<import("../spec/axis.js").Axis & import("../spec/axis.js").GenomeAxis>} config
|
|
53
|
+
*/
|
|
54
|
+
attachViewLevelAxisConfig(view: import("../view/view.js").default, config: Partial<import("../spec/axis.js").Axis & import("../spec/axis.js").GenomeAxis>): void;
|
|
55
|
+
/**
|
|
56
|
+
* @param {import("../view/view.js").default} view
|
|
57
|
+
*/
|
|
58
|
+
clearViewLevelAxisConfig(view: import("../view/view.js").default): void;
|
|
59
|
+
getViewLevelAxisConfig(): {
|
|
60
|
+
view: import("../view/view.js").default;
|
|
61
|
+
config: Partial<import("../spec/axis.js").Axis & import("../spec/axis.js").GenomeAxis>;
|
|
62
|
+
};
|
|
28
63
|
#private;
|
|
29
64
|
}
|
|
30
65
|
export type AxisResolutionMember<T extends import("../spec/channel.js").PositionalChannel = import("../spec/channel.js").PositionalChannel> = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"axisResolution.d.ts","sourceRoot":"","sources":["../../../src/scales/axisResolution.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"axisResolution.d.ts","sourceRoot":"","sources":["../../../src/scales/axisResolution.js"],"names":[],"mappings":"AAgBA;;;;;;;GAOG;AACH;IAYI;;OAEG;IACH,qBAFW,OAAO,oBAAoB,EAAE,wBAAwB,EAI/D;IADG,+DAAsB;IAG1B,2BAGC;IAiCD;;;OAGG;IACH,uBAHW,oBAAoB,GAClB,MAAM,OAAO,CASzB;IAED;;;OAGG;IACH,qBAHW,oBAAoB,GAClB,OAAO,CAQnB;IAED;;OAEG;IACH,6BAFa,OAAO,CAanB;IAED;;;;;;;;;;;;;;;;;MAwBC;IAED,qDA0BC;IAED,mBAuEC;IAED;;;OAGG;IACH,gCAHW,OAAO,iBAAiB,EAAE,OAAO,UACjC,OAAO,CAAC,OAAO,iBAAiB,EAAE,IAAI,GAAG,OAAO,iBAAiB,EAAE,UAAU,CAAC,QAuBxF;IAED;;OAEG;IACH,+BAFW,OAAO,iBAAiB,EAAE,OAAO,QAO3C;IAED;cA3PmB,OAAO,iBAAiB,EAAE,OAAO;gBAAU,OAAO,CAAC,OAAO,iBAAiB,EAAE,IAAI,GAAG,OAAO,iBAAiB,EAAE,UAAU,CAAC;MA6P3I;;CAiBJ;iCA9R6D,CAAC,SAAlD,OAAQ,oBAAoB,EAAE,iBAAkB;UAGnD,OAAO,qBAAqB,EAAE,OAAO;aACrC,CAAC;gBACD,OAAO,oBAAoB,EAAE,mBAAmB"}
|
|
@@ -11,6 +11,7 @@ import coalesce from "../utils/coalesce.js";
|
|
|
11
11
|
|
|
12
12
|
import mergeObjects from "../utils/mergeObjects.js";
|
|
13
13
|
import { getCachedOrCall, invalidate } from "../utils/propertyCacher.js";
|
|
14
|
+
import { isChromeView } from "../view/viewSelectors.js";
|
|
14
15
|
import { orderResolutionMembers } from "./resolutionMemberOrder.js";
|
|
15
16
|
|
|
16
17
|
/**
|
|
@@ -30,6 +31,9 @@ export default class AxisResolution {
|
|
|
30
31
|
/** @type {Set<AxisResolutionMember>} The involved views */
|
|
31
32
|
#members = new Set();
|
|
32
33
|
|
|
34
|
+
/** @type {{ view: import("../view/view.js").default, config: Partial<import("../spec/axis.js").Axis & import("../spec/axis.js").GenomeAxis> } | undefined} */
|
|
35
|
+
#viewLevelAxisConfig;
|
|
36
|
+
|
|
33
37
|
/**
|
|
34
38
|
* @param {import("../spec/channel.js").PrimaryPositionalChannel} channel
|
|
35
39
|
*/
|
|
@@ -78,6 +82,7 @@ export default class AxisResolution {
|
|
|
78
82
|
* @returns {() => boolean}
|
|
79
83
|
*/
|
|
80
84
|
registerMember(member) {
|
|
85
|
+
this.#assertNoMixing(member);
|
|
81
86
|
this.#addMember(member);
|
|
82
87
|
return () => {
|
|
83
88
|
const removed = this.removeMember(member);
|
|
@@ -97,15 +102,57 @@ export default class AxisResolution {
|
|
|
97
102
|
return removed;
|
|
98
103
|
}
|
|
99
104
|
|
|
105
|
+
/**
|
|
106
|
+
* @returns {boolean} True when at least one non-chrome axis-contributing view is visible.
|
|
107
|
+
*/
|
|
108
|
+
hasVisibleNonChromeMember() {
|
|
109
|
+
for (const member of this.#members) {
|
|
110
|
+
if (
|
|
111
|
+
member.view.isVisible() &&
|
|
112
|
+
!member.view.getLayoutAncestors().some(isChromeView)
|
|
113
|
+
) {
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
getDebugState() {
|
|
122
|
+
return {
|
|
123
|
+
kind: "axis",
|
|
124
|
+
channel: this.channel,
|
|
125
|
+
hostView:
|
|
126
|
+
this.scaleResolution?.getDebugState().hostView ??
|
|
127
|
+
this.#viewLevelAxisConfig?.view ??
|
|
128
|
+
this.#members.values().next().value?.view,
|
|
129
|
+
scaleResolution: this.scaleResolution,
|
|
130
|
+
title: this.getTitle(),
|
|
131
|
+
axisProps: this.getAxisProps(),
|
|
132
|
+
hasVisibleNonChromeMember: this.hasVisibleNonChromeMember(),
|
|
133
|
+
members: orderResolutionMembers(this.#members).map((member) => ({
|
|
134
|
+
view: member.view,
|
|
135
|
+
channel: member.channel,
|
|
136
|
+
channelDef: structuredClone(member.channelDef),
|
|
137
|
+
})),
|
|
138
|
+
viewLevelAxisConfig: this.#viewLevelAxisConfig
|
|
139
|
+
? {
|
|
140
|
+
view: this.#viewLevelAxisConfig.view,
|
|
141
|
+
config: structuredClone(this.#viewLevelAxisConfig.config),
|
|
142
|
+
}
|
|
143
|
+
: undefined,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
100
147
|
getAxisProps() {
|
|
101
148
|
return getCachedOrCall(this, "axisProps", () => {
|
|
102
|
-
const propArray =
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
149
|
+
const propArray = this.#viewLevelAxisConfig
|
|
150
|
+
? [this.#viewLevelAxisConfig.config]
|
|
151
|
+
: orderResolutionMembers(this.#members).map((member) => {
|
|
152
|
+
const channelDef =
|
|
153
|
+
member.view.mark.encoding[member.channel];
|
|
154
|
+
return "axis" in channelDef && channelDef.axis;
|
|
155
|
+
});
|
|
109
156
|
|
|
110
157
|
if (
|
|
111
158
|
propArray.length > 0 &&
|
|
@@ -126,6 +173,10 @@ export default class AxisResolution {
|
|
|
126
173
|
}
|
|
127
174
|
|
|
128
175
|
getTitle() {
|
|
176
|
+
if (this.#viewLevelAxisConfig?.config.title !== undefined) {
|
|
177
|
+
return this.#viewLevelAxisConfig.config.title;
|
|
178
|
+
}
|
|
179
|
+
|
|
129
180
|
/** @param {AxisResolutionMember} member} */
|
|
130
181
|
const computeTitle = (member) => {
|
|
131
182
|
const channelDef = getChannelDefWithScale(
|
|
@@ -193,4 +244,61 @@ export default class AxisResolution {
|
|
|
193
244
|
|
|
194
245
|
return uniqueTitles.size ? [...uniqueTitles].join(", ") : null;
|
|
195
246
|
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* @param {import("../view/view.js").default} view
|
|
250
|
+
* @param {Partial<import("../spec/axis.js").Axis & import("../spec/axis.js").GenomeAxis>} config
|
|
251
|
+
*/
|
|
252
|
+
attachViewLevelAxisConfig(view, config) {
|
|
253
|
+
if (
|
|
254
|
+
this.#viewLevelAxisConfig &&
|
|
255
|
+
this.#viewLevelAxisConfig.view !== view
|
|
256
|
+
) {
|
|
257
|
+
throw new Error(
|
|
258
|
+
`Multiple view-level axis configs target the same ${this.channel} axis resolution.`
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
for (const member of this.#members) {
|
|
263
|
+
const channelDef = member.view.mark.encoding[member.channel];
|
|
264
|
+
if ("axis" in channelDef && channelDef.axis !== undefined) {
|
|
265
|
+
throw new Error(
|
|
266
|
+
`Cannot mix view-level axes.${this.channel} with encoding.${member.channel}.axis in the same axis resolution.`
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
this.#viewLevelAxisConfig = { view, config };
|
|
272
|
+
invalidate(this, "axisProps");
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* @param {import("../view/view.js").default} view
|
|
277
|
+
*/
|
|
278
|
+
clearViewLevelAxisConfig(view) {
|
|
279
|
+
if (this.#viewLevelAxisConfig?.view === view) {
|
|
280
|
+
this.#viewLevelAxisConfig = undefined;
|
|
281
|
+
invalidate(this, "axisProps");
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
getViewLevelAxisConfig() {
|
|
286
|
+
return this.#viewLevelAxisConfig;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* @param {AxisResolutionMember} member
|
|
291
|
+
*/
|
|
292
|
+
#assertNoMixing(member) {
|
|
293
|
+
if (!this.#viewLevelAxisConfig) {
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
const channelDef = member.view.mark.encoding[member.channel];
|
|
298
|
+
if ("axis" in channelDef && channelDef.axis !== undefined) {
|
|
299
|
+
throw new Error(
|
|
300
|
+
`Cannot mix view-level axes.${this.channel} with encoding.${member.channel}.axis in the same axis resolution.`
|
|
301
|
+
);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
196
304
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves a configured domain value recursively.
|
|
3
|
+
*
|
|
4
|
+
* This supports top-level expression refs as well as arrays containing mixed
|
|
5
|
+
* constants and expression refs.
|
|
6
|
+
*
|
|
7
|
+
* @param {any} value
|
|
8
|
+
* @param {{ createExpression: (expr: string) => () => any }} paramRuntime
|
|
9
|
+
* @returns {any}
|
|
10
|
+
*/
|
|
11
|
+
export function resolveConfiguredDomainValue(value: any, paramRuntime: {
|
|
12
|
+
createExpression: (expr: string) => () => any;
|
|
13
|
+
}): any;
|
|
14
|
+
/**
|
|
15
|
+
* Collects all expression refs nested inside a configured domain value.
|
|
16
|
+
*
|
|
17
|
+
* @param {any} value
|
|
18
|
+
* @returns {import("../spec/parameter.js").ExprRef[]}
|
|
19
|
+
*/
|
|
20
|
+
export function collectConfiguredDomainExprRefs(value: any): import("../spec/parameter.js").ExprRef[];
|
|
21
|
+
//# sourceMappingURL=domainExpressions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domainExpressions.d.ts","sourceRoot":"","sources":["../../../src/scales/domainExpressions.js"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,oDAJW,GAAG,gBACH;IAAE,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,CAAA;CAAE,GAC/C,GAAG,CAcf;AAED;;;;;GAKG;AACH,uDAHW,GAAG,GACD,OAAO,sBAAsB,EAAE,OAAO,EAAE,CAYpD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { isExprRef } from "../paramRuntime/paramUtils.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Resolves a configured domain value recursively.
|
|
5
|
+
*
|
|
6
|
+
* This supports top-level expression refs as well as arrays containing mixed
|
|
7
|
+
* constants and expression refs.
|
|
8
|
+
*
|
|
9
|
+
* @param {any} value
|
|
10
|
+
* @param {{ createExpression: (expr: string) => () => any }} paramRuntime
|
|
11
|
+
* @returns {any}
|
|
12
|
+
*/
|
|
13
|
+
export function resolveConfiguredDomainValue(value, paramRuntime) {
|
|
14
|
+
if (isExprRef(value)) {
|
|
15
|
+
return paramRuntime.createExpression(value.expr)();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (Array.isArray(value)) {
|
|
19
|
+
return value.map((item) =>
|
|
20
|
+
resolveConfiguredDomainValue(item, paramRuntime)
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Collects all expression refs nested inside a configured domain value.
|
|
29
|
+
*
|
|
30
|
+
* @param {any} value
|
|
31
|
+
* @returns {import("../spec/parameter.js").ExprRef[]}
|
|
32
|
+
*/
|
|
33
|
+
export function collectConfiguredDomainExprRefs(value) {
|
|
34
|
+
if (isExprRef(value)) {
|
|
35
|
+
return [value];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (Array.isArray(value)) {
|
|
39
|
+
return value.flatMap((item) => collectConfiguredDomainExprRefs(item));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
@@ -10,7 +10,9 @@ export function isSelectionDomainRef(domain: any): domain is SelectionDomainRef;
|
|
|
10
10
|
* @typedef {import("../spec/scale.js").SelectionDomainRef} SelectionDomainRef
|
|
11
11
|
* @typedef {import("../spec/parameter.js").ExprRef} ExprRef
|
|
12
12
|
* @typedef {import("./scaleResolution.js").ScaleResolutionMember} ScaleResolutionMember
|
|
13
|
+
* @typedef {{ view: import("../view/view.js").default, channel: import("../spec/channel.js").ChannelWithScale, type: import("../spec/channel.js").Type, domain: import("../spec/scale.js").Scale["domain"] }} ConfiguredDomainSource
|
|
13
14
|
* @typedef {() => Set<ScaleResolutionMember>} ScaleMembersGetter
|
|
15
|
+
* @typedef {() => ConfiguredDomainSource | undefined} ViewLevelConfiguredDomainGetter
|
|
14
16
|
* @typedef {(interval: ScalarDomain | ComplexDomain) => number[]} FromComplexInterval
|
|
15
17
|
* @typedef {(assembly: import("../spec/scale.js").Scale["assembly"] | undefined) => number[]} GetLocusExtent
|
|
16
18
|
* @typedef {{
|
|
@@ -45,14 +47,16 @@ export default class DomainPlanner {
|
|
|
45
47
|
* @param {ScaleMembersGetter} options.getActiveMembers Active shared-scale members used for configured domain planning.
|
|
46
48
|
* @param {ScaleMembersGetter} [options.getAllMembers] All members, including inactive ones, used for conflict validation.
|
|
47
49
|
* @param {ScaleMembersGetter} [options.getDataMembers] Members used for data-domain extraction; defaults to `getActiveMembers`.
|
|
50
|
+
* @param {ViewLevelConfiguredDomainGetter} [options.getViewLevelConfiguredDomain] View-level configured domain source.
|
|
48
51
|
* @param {() => import("../spec/channel.js").Type} options.getType
|
|
49
52
|
* @param {GetLocusExtent} options.getLocusExtent
|
|
50
53
|
* @param {FromComplexInterval} options.fromComplexInterval
|
|
51
54
|
*/
|
|
52
|
-
constructor({ getActiveMembers, getAllMembers, getDataMembers, getType, getLocusExtent, fromComplexInterval, }: {
|
|
55
|
+
constructor({ getActiveMembers, getAllMembers, getDataMembers, getViewLevelConfiguredDomain, getType, getLocusExtent, fromComplexInterval, }: {
|
|
53
56
|
getActiveMembers: ScaleMembersGetter;
|
|
54
57
|
getAllMembers?: ScaleMembersGetter;
|
|
55
58
|
getDataMembers?: ScaleMembersGetter;
|
|
59
|
+
getViewLevelConfiguredDomain?: ViewLevelConfiguredDomainGetter;
|
|
56
60
|
getType: () => import("../spec/channel.js").Type;
|
|
57
61
|
getLocusExtent: GetLocusExtent;
|
|
58
62
|
fromComplexInterval: FromComplexInterval;
|
|
@@ -126,7 +130,14 @@ export type ScalarDomain = import("../spec/scale.js").ScalarDomain;
|
|
|
126
130
|
export type SelectionDomainRef = import("../spec/scale.js").SelectionDomainRef;
|
|
127
131
|
export type ExprRef = import("../spec/parameter.js").ExprRef;
|
|
128
132
|
export type ScaleResolutionMember = import("./scaleResolution.js").ScaleResolutionMember;
|
|
133
|
+
export type ConfiguredDomainSource = {
|
|
134
|
+
view: import("../view/view.js").default;
|
|
135
|
+
channel: import("../spec/channel.js").ChannelWithScale;
|
|
136
|
+
type: import("../spec/channel.js").Type;
|
|
137
|
+
domain: import("../spec/scale.js").Scale["domain"];
|
|
138
|
+
};
|
|
129
139
|
export type ScaleMembersGetter = () => Set<ScaleResolutionMember>;
|
|
140
|
+
export type ViewLevelConfiguredDomainGetter = () => ConfiguredDomainSource | undefined;
|
|
130
141
|
export type FromComplexInterval = (interval: ScalarDomain | ComplexDomain) => number[];
|
|
131
142
|
export type GetLocusExtent = (assembly: import("../spec/scale.js").Scale["assembly"] | undefined) => number[];
|
|
132
143
|
export type ConfiguredDomainResolutionState = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"domainPlanner.d.ts","sourceRoot":"","sources":["../../../src/scales/domainPlanner.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"domainPlanner.d.ts","sourceRoot":"","sources":["../../../src/scales/domainPlanner.js"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
resolveIntervalSelectionBinding,
|
|
12
12
|
} from "./selectionDomainUtils.js";
|
|
13
13
|
import createDomain from "../utils/domainArray.js";
|
|
14
|
-
import {
|
|
14
|
+
import { resolveConfiguredDomainValue } from "./domainExpressions.js";
|
|
15
15
|
import { getAccessorDomainKey, isScaleAccessor } from "../encoder/accessor.js";
|
|
16
16
|
import { getEncoderAccessors, getPrimaryChannel } from "../encoder/encoder.js";
|
|
17
17
|
import {
|
|
@@ -36,7 +36,9 @@ import {
|
|
|
36
36
|
* @typedef {import("../spec/scale.js").SelectionDomainRef} SelectionDomainRef
|
|
37
37
|
* @typedef {import("../spec/parameter.js").ExprRef} ExprRef
|
|
38
38
|
* @typedef {import("./scaleResolution.js").ScaleResolutionMember} ScaleResolutionMember
|
|
39
|
+
* @typedef {{ view: import("../view/view.js").default, channel: import("../spec/channel.js").ChannelWithScale, type: import("../spec/channel.js").Type, domain: import("../spec/scale.js").Scale["domain"] }} ConfiguredDomainSource
|
|
39
40
|
* @typedef {() => Set<ScaleResolutionMember>} ScaleMembersGetter
|
|
41
|
+
* @typedef {() => ConfiguredDomainSource | undefined} ViewLevelConfiguredDomainGetter
|
|
40
42
|
* @typedef {(interval: ScalarDomain | ComplexDomain) => number[]} FromComplexInterval
|
|
41
43
|
* @typedef {(assembly: import("../spec/scale.js").Scale["assembly"] | undefined) => number[]} GetLocusExtent
|
|
42
44
|
* @typedef {{
|
|
@@ -76,6 +78,9 @@ export default class DomainPlanner {
|
|
|
76
78
|
/** @type {ScaleMembersGetter} */
|
|
77
79
|
#getDataMembers;
|
|
78
80
|
|
|
81
|
+
/** @type {ViewLevelConfiguredDomainGetter | undefined} */
|
|
82
|
+
#getViewLevelConfiguredDomain;
|
|
83
|
+
|
|
79
84
|
/** @type {() => import("../spec/channel.js").Type} */
|
|
80
85
|
#getType;
|
|
81
86
|
|
|
@@ -104,6 +109,7 @@ export default class DomainPlanner {
|
|
|
104
109
|
* @param {ScaleMembersGetter} options.getActiveMembers Active shared-scale members used for configured domain planning.
|
|
105
110
|
* @param {ScaleMembersGetter} [options.getAllMembers] All members, including inactive ones, used for conflict validation.
|
|
106
111
|
* @param {ScaleMembersGetter} [options.getDataMembers] Members used for data-domain extraction; defaults to `getActiveMembers`.
|
|
112
|
+
* @param {ViewLevelConfiguredDomainGetter} [options.getViewLevelConfiguredDomain] View-level configured domain source.
|
|
107
113
|
* @param {() => import("../spec/channel.js").Type} options.getType
|
|
108
114
|
* @param {GetLocusExtent} options.getLocusExtent
|
|
109
115
|
* @param {FromComplexInterval} options.fromComplexInterval
|
|
@@ -112,6 +118,7 @@ export default class DomainPlanner {
|
|
|
112
118
|
getActiveMembers,
|
|
113
119
|
getAllMembers,
|
|
114
120
|
getDataMembers,
|
|
121
|
+
getViewLevelConfiguredDomain,
|
|
115
122
|
getType,
|
|
116
123
|
getLocusExtent,
|
|
117
124
|
fromComplexInterval,
|
|
@@ -119,6 +126,7 @@ export default class DomainPlanner {
|
|
|
119
126
|
this.#getActiveMembers = getActiveMembers;
|
|
120
127
|
this.#getAllMembers = getAllMembers ?? getActiveMembers;
|
|
121
128
|
this.#getDataMembers = getDataMembers ?? getActiveMembers;
|
|
129
|
+
this.#getViewLevelConfiguredDomain = getViewLevelConfiguredDomain;
|
|
122
130
|
this.#getType = getType;
|
|
123
131
|
this.#getLocusExtent = getLocusExtent;
|
|
124
132
|
this.#fromComplexInterval = fromComplexInterval;
|
|
@@ -232,6 +240,7 @@ export default class DomainPlanner {
|
|
|
232
240
|
|
|
233
241
|
const configuredDomain = resolveConfiguredDomain(
|
|
234
242
|
this.#getActiveMembers(),
|
|
243
|
+
this.#getViewLevelConfiguredDomain?.(),
|
|
235
244
|
this.#fromComplexInterval,
|
|
236
245
|
includeSelectionInitial
|
|
237
246
|
);
|
|
@@ -319,6 +328,7 @@ export default class DomainPlanner {
|
|
|
319
328
|
|
|
320
329
|
/**
|
|
321
330
|
* @param {Set<ScaleResolutionMember>} members
|
|
331
|
+
* @param {ConfiguredDomainSource | undefined} viewLevelDomain
|
|
322
332
|
* @param {(interval: ScalarDomain | ComplexDomain) => number[]} fromComplexInterval
|
|
323
333
|
* @param {boolean} includeSelectionInitial
|
|
324
334
|
* @returns {{
|
|
@@ -328,6 +338,7 @@ export default class DomainPlanner {
|
|
|
328
338
|
*/
|
|
329
339
|
function resolveConfiguredDomain(
|
|
330
340
|
members,
|
|
341
|
+
viewLevelDomain,
|
|
331
342
|
fromComplexInterval,
|
|
332
343
|
includeSelectionInitial
|
|
333
344
|
) {
|
|
@@ -344,41 +355,62 @@ function resolveConfiguredDomain(
|
|
|
344
355
|
hasLiteralDomain: false,
|
|
345
356
|
};
|
|
346
357
|
|
|
347
|
-
|
|
348
|
-
const resolved =
|
|
349
|
-
|
|
358
|
+
if (viewLevelDomain?.domain !== undefined) {
|
|
359
|
+
const resolved = resolveConfiguredDomainSource(
|
|
360
|
+
viewLevelDomain,
|
|
350
361
|
fromComplexInterval,
|
|
351
362
|
includeSelectionInitial
|
|
352
363
|
);
|
|
364
|
+
mergeConfiguredDomainResolution(state, resolved);
|
|
365
|
+
}
|
|
353
366
|
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
367
|
+
for (const member of domainMembers) {
|
|
368
|
+
const resolved = resolveConfiguredDomainSource(
|
|
369
|
+
{
|
|
370
|
+
view: member.view,
|
|
371
|
+
channel: member.channel,
|
|
372
|
+
type: member.channelDef.type,
|
|
373
|
+
domain: member.channelDef.scale.domain,
|
|
374
|
+
},
|
|
375
|
+
fromComplexInterval,
|
|
376
|
+
includeSelectionInitial
|
|
377
|
+
);
|
|
358
378
|
|
|
359
|
-
|
|
379
|
+
mergeConfiguredDomainResolution(state, resolved);
|
|
360
380
|
}
|
|
361
381
|
|
|
362
382
|
return finishConfiguredDomainResolution(state);
|
|
363
383
|
}
|
|
364
384
|
|
|
365
385
|
/**
|
|
366
|
-
* @param {
|
|
386
|
+
* @param {ConfiguredDomainResolutionState} state
|
|
387
|
+
* @param {ConfiguredDomainMemberResolution} resolved
|
|
388
|
+
*/
|
|
389
|
+
function mergeConfiguredDomainResolution(state, resolved) {
|
|
390
|
+
if (resolved.kind === "selection") {
|
|
391
|
+
mergeSelectionConfiguredDomain(state, resolved);
|
|
392
|
+
} else {
|
|
393
|
+
mergeLiteralConfiguredDomain(state, resolved);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* @param {ConfiguredDomainSource} source
|
|
367
399
|
* @param {(interval: ScalarDomain | ComplexDomain) => number[]} fromComplexInterval
|
|
368
400
|
* @param {boolean} includeSelectionInitial
|
|
369
401
|
* @returns {ConfiguredDomainMemberResolution}
|
|
370
402
|
*/
|
|
371
|
-
function
|
|
372
|
-
|
|
403
|
+
function resolveConfiguredDomainSource(
|
|
404
|
+
source,
|
|
373
405
|
fromComplexInterval,
|
|
374
406
|
includeSelectionInitial
|
|
375
407
|
) {
|
|
376
|
-
const domainDef =
|
|
408
|
+
const domainDef = source.domain;
|
|
377
409
|
if (isSelectionDomainRef(domainDef)) {
|
|
378
410
|
return {
|
|
379
411
|
kind: "selection",
|
|
380
412
|
...resolveSelectionDomain(
|
|
381
|
-
|
|
413
|
+
source,
|
|
382
414
|
domainDef,
|
|
383
415
|
fromComplexInterval,
|
|
384
416
|
includeSelectionInitial
|
|
@@ -386,22 +418,11 @@ function resolveConfiguredDomainMember(
|
|
|
386
418
|
};
|
|
387
419
|
}
|
|
388
420
|
|
|
389
|
-
if (isExprRef(domainDef)) {
|
|
390
|
-
return {
|
|
391
|
-
kind: "literal",
|
|
392
|
-
domain: resolveConfiguredIntervalDomain(
|
|
393
|
-
member.channelDef.type,
|
|
394
|
-
member.view.paramRuntime.createExpression(domainDef.expr)(),
|
|
395
|
-
fromComplexInterval
|
|
396
|
-
),
|
|
397
|
-
};
|
|
398
|
-
}
|
|
399
|
-
|
|
400
421
|
return {
|
|
401
422
|
kind: "literal",
|
|
402
423
|
domain: resolveConfiguredIntervalDomain(
|
|
403
|
-
|
|
404
|
-
domainDef,
|
|
424
|
+
source.type,
|
|
425
|
+
resolveConfiguredDomainValue(domainDef, source.view?.paramRuntime),
|
|
405
426
|
fromComplexInterval
|
|
406
427
|
),
|
|
407
428
|
};
|
|
@@ -488,7 +509,7 @@ function finishConfiguredDomainResolution(state) {
|
|
|
488
509
|
}
|
|
489
510
|
|
|
490
511
|
/**
|
|
491
|
-
* @param {
|
|
512
|
+
* @param {ConfiguredDomainSource} source
|
|
492
513
|
* @param {SelectionDomainRef} domainRef
|
|
493
514
|
* @param {(interval: ScalarDomain | ComplexDomain) => number[]} fromComplexInterval
|
|
494
515
|
* @param {boolean} includeSelectionInitial
|
|
@@ -502,7 +523,7 @@ function finishConfiguredDomainResolution(state) {
|
|
|
502
523
|
* }}
|
|
503
524
|
*/
|
|
504
525
|
function resolveSelectionDomain(
|
|
505
|
-
|
|
526
|
+
source,
|
|
506
527
|
domainRef,
|
|
507
528
|
fromComplexInterval,
|
|
508
529
|
includeSelectionInitial
|
|
@@ -510,13 +531,13 @@ function resolveSelectionDomain(
|
|
|
510
531
|
const paramName = domainRef.param;
|
|
511
532
|
|
|
512
533
|
const resolvedChannel = resolveSelectionDomainChannel(
|
|
513
|
-
|
|
534
|
+
source.channel,
|
|
514
535
|
domainRef,
|
|
515
536
|
paramName
|
|
516
537
|
);
|
|
517
538
|
|
|
518
539
|
const binding = resolveIntervalSelectionBinding(
|
|
519
|
-
|
|
540
|
+
source.view,
|
|
520
541
|
paramName,
|
|
521
542
|
resolvedChannel
|
|
522
543
|
);
|
|
@@ -527,7 +548,7 @@ function resolveSelectionDomain(
|
|
|
527
548
|
const initialDomain = includeSelectionInitial
|
|
528
549
|
? domainRef.initial
|
|
529
550
|
? resolveConfiguredIntervalDomain(
|
|
530
|
-
|
|
551
|
+
source.type,
|
|
531
552
|
domainRef.initial,
|
|
532
553
|
fromComplexInterval
|
|
533
554
|
)
|
|
@@ -545,10 +566,7 @@ function resolveSelectionDomain(
|
|
|
545
566
|
|
|
546
567
|
return {
|
|
547
568
|
// Selection intervals already use internal scale-domain coordinates.
|
|
548
|
-
domain: createDomain(
|
|
549
|
-
member.channelDef.type,
|
|
550
|
-
fromComplexInterval(interval)
|
|
551
|
-
),
|
|
569
|
+
domain: createDomain(source.type, fromComplexInterval(interval)),
|
|
552
570
|
description,
|
|
553
571
|
param: paramName,
|
|
554
572
|
encoding: resolvedChannel,
|
|
@@ -565,6 +583,7 @@ function resolveSelectionDomain(
|
|
|
565
583
|
*/
|
|
566
584
|
function resolveConfiguredIntervalDomain(type, interval, fromComplexInterval) {
|
|
567
585
|
const numericDomain = fromComplexInterval(interval);
|
|
586
|
+
// TODO: support Vega-Lite-style `unionWith` domains.
|
|
568
587
|
const internalDomain =
|
|
569
588
|
type === LOCUS &&
|
|
570
589
|
isChromosomalLocusInterval(interval) &&
|