@genome-spy/core 0.36.1 → 0.37.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/README.md +1 -0
- package/dist/{index.es.js → bundled/index.es.js} +2253 -2115
- package/dist/{index.js → bundled/index.js} +180 -44
- package/dist/src/data/collector.d.ts +36 -0
- package/dist/src/data/collector.d.ts.map +1 -0
- package/dist/src/data/collector.js +184 -0
- package/dist/src/data/collector.test.js +84 -0
- package/dist/src/data/dataFlow.d.ts +65 -0
- package/dist/src/data/dataFlow.d.ts.map +1 -0
- package/dist/src/data/dataFlow.js +142 -0
- package/dist/src/data/dataFlow.test.js +5 -0
- package/dist/src/data/facetNode.d.ts +17 -0
- package/dist/src/data/facetNode.d.ts.map +1 -0
- package/dist/src/data/facetNode.js +17 -0
- package/dist/src/data/flow.test.js +72 -0
- package/dist/src/data/flowNode.d.ts +136 -0
- package/dist/src/data/flowNode.d.ts.map +1 -0
- package/dist/src/data/flowNode.js +286 -0
- package/dist/src/data/flowNode.test.js +50 -0
- package/dist/src/data/flowOptimizer.d.ts +27 -0
- package/dist/src/data/flowOptimizer.d.ts.map +1 -0
- package/dist/src/data/flowOptimizer.js +133 -0
- package/dist/src/data/flowOptimizer.test.js +193 -0
- package/dist/src/data/flowTestUtils.d.ts +30 -0
- package/dist/src/data/flowTestUtils.d.ts.map +1 -0
- package/dist/src/data/flowTestUtils.js +63 -0
- package/dist/src/data/formats/fasta.d.ts +20 -0
- package/dist/src/data/formats/fasta.d.ts.map +1 -0
- package/dist/src/data/formats/fasta.js +32 -0
- package/dist/src/data/formats/fasta.test.js +27 -0
- package/dist/src/data/sources/dataSource.d.ts +12 -0
- package/dist/src/data/sources/dataSource.d.ts.map +1 -0
- package/dist/src/data/sources/dataSource.js +25 -0
- package/dist/src/data/sources/dataSourceFactory.d.ts +16 -0
- package/dist/src/data/sources/dataSourceFactory.d.ts.map +1 -0
- package/dist/src/data/sources/dataSourceFactory.js +127 -0
- package/dist/src/data/sources/dataUtils.d.ts +50 -0
- package/dist/src/data/sources/dataUtils.d.ts.map +1 -0
- package/dist/src/data/sources/dataUtils.js +83 -0
- package/dist/src/data/sources/dynamic/README.md +3 -0
- package/dist/src/data/sources/dynamic/axisGenomeSource.d.ts +13 -0
- package/dist/src/data/sources/dynamic/axisGenomeSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/axisGenomeSource.js +19 -0
- package/dist/src/data/sources/dynamic/axisTickSource.d.ts +18 -0
- package/dist/src/data/sources/dynamic/axisTickSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/axisTickSource.js +73 -0
- package/dist/src/data/sources/dynamic/bamSource.d.ts +46 -0
- package/dist/src/data/sources/dynamic/bamSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/bamSource.js +115 -0
- package/dist/src/data/sources/dynamic/bigBedSource.d.ts +51 -0
- package/dist/src/data/sources/dynamic/bigBedSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/bigBedSource.js +128 -0
- package/dist/src/data/sources/dynamic/bigWigSource.d.ts +58 -0
- package/dist/src/data/sources/dynamic/bigWigSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/bigWigSource.js +166 -0
- package/dist/src/data/sources/dynamic/gff3Source.d.ts +8 -0
- package/dist/src/data/sources/dynamic/gff3Source.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/gff3Source.js +19 -0
- package/dist/src/data/sources/dynamic/indexedFastaSource.d.ts +30 -0
- package/dist/src/data/sources/dynamic/indexedFastaSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/indexedFastaSource.js +86 -0
- package/dist/src/data/sources/dynamic/singleAxisLazySource.d.ts +42 -0
- package/dist/src/data/sources/dynamic/singleAxisLazySource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/singleAxisLazySource.js +129 -0
- package/dist/src/data/sources/dynamic/tabixSource.d.ts +54 -0
- package/dist/src/data/sources/dynamic/tabixSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/tabixSource.js +140 -0
- package/dist/src/data/sources/dynamic/windowedMixin.d.ts +32 -0
- package/dist/src/data/sources/dynamic/windowedMixin.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/windowedMixin.js +53 -0
- package/dist/src/data/sources/inlineSource.d.ts +16 -0
- package/dist/src/data/sources/inlineSource.d.ts.map +1 -0
- package/dist/src/data/sources/inlineSource.js +68 -0
- package/dist/src/data/sources/inlineSource.test.js +56 -0
- package/dist/src/data/sources/namedSource.d.ts +25 -0
- package/dist/src/data/sources/namedSource.d.ts.map +1 -0
- package/dist/src/data/sources/namedSource.js +80 -0
- package/dist/src/data/sources/sequenceSource.d.ts +17 -0
- package/dist/src/data/sources/sequenceSource.d.ts.map +1 -0
- package/dist/src/data/sources/sequenceSource.js +47 -0
- package/dist/src/data/sources/sequenceSource.test.js +46 -0
- package/dist/src/data/sources/urlSource.d.ts +16 -0
- package/dist/src/data/sources/urlSource.d.ts.map +1 -0
- package/dist/src/data/sources/urlSource.js +74 -0
- package/dist/src/data/transforms/aggregate.d.ts +18 -0
- package/dist/src/data/transforms/aggregate.d.ts.map +1 -0
- package/dist/src/data/transforms/aggregate.js +67 -0
- package/dist/src/data/transforms/clone.d.ts +15 -0
- package/dist/src/data/transforms/clone.d.ts.map +1 -0
- package/dist/src/data/transforms/clone.js +40 -0
- package/dist/src/data/transforms/clone.test.js +11 -0
- package/dist/src/data/transforms/coverage.d.ts +30 -0
- package/dist/src/data/transforms/coverage.d.ts.map +1 -0
- package/dist/src/data/transforms/coverage.js +183 -0
- package/dist/src/data/transforms/coverage.test.js +123 -0
- package/dist/src/data/transforms/filter.d.ts +12 -0
- package/dist/src/data/transforms/filter.d.ts.map +1 -0
- package/dist/src/data/transforms/filter.js +33 -0
- package/dist/src/data/transforms/filter.test.js +18 -0
- package/dist/src/data/transforms/filterScoredLabels.d.ts +29 -0
- package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -0
- package/dist/src/data/transforms/filterScoredLabels.js +134 -0
- package/dist/src/data/transforms/flatten.d.ts +10 -0
- package/dist/src/data/transforms/flatten.d.ts.map +1 -0
- package/dist/src/data/transforms/flatten.js +68 -0
- package/dist/src/data/transforms/flatten.test.js +93 -0
- package/dist/src/data/transforms/flattenCompressedExons.d.ts +19 -0
- package/dist/src/data/transforms/flattenCompressedExons.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenCompressedExons.js +53 -0
- package/dist/src/data/transforms/flattenDelimited.d.ts +10 -0
- package/dist/src/data/transforms/flattenDelimited.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenDelimited.js +66 -0
- package/dist/src/data/transforms/flattenDelimited.test.js +87 -0
- package/dist/src/data/transforms/flattenSequence.d.ts +11 -0
- package/dist/src/data/transforms/flattenSequence.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenSequence.js +35 -0
- package/dist/src/data/transforms/flattenSequence.test.js +34 -0
- package/dist/src/data/transforms/formula.d.ts +13 -0
- package/dist/src/data/transforms/formula.d.ts.map +1 -0
- package/dist/src/data/transforms/formula.js +35 -0
- package/dist/src/data/transforms/formula.test.js +19 -0
- package/dist/src/data/transforms/identifier.d.ts +40 -0
- package/dist/src/data/transforms/identifier.d.ts.map +1 -0
- package/dist/src/data/transforms/identifier.js +106 -0
- package/dist/src/data/transforms/identifier.test.js +83 -0
- package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts +10 -0
- package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -0
- package/dist/src/data/transforms/linearizeGenomicCoordinate.js +97 -0
- package/dist/src/data/transforms/measureText.d.ts +18 -0
- package/dist/src/data/transforms/measureText.d.ts.map +1 -0
- package/dist/src/data/transforms/measureText.js +42 -0
- package/dist/src/data/transforms/pileup.d.ts +10 -0
- package/dist/src/data/transforms/pileup.d.ts.map +1 -0
- package/dist/src/data/transforms/pileup.js +126 -0
- package/dist/src/data/transforms/pileup.test.js +70 -0
- package/dist/src/data/transforms/project.d.ts +13 -0
- package/dist/src/data/transforms/project.d.ts.map +1 -0
- package/dist/src/data/transforms/project.js +38 -0
- package/dist/src/data/transforms/project.test.js +32 -0
- package/dist/src/data/transforms/regexExtract.d.ts +13 -0
- package/dist/src/data/transforms/regexExtract.d.ts.map +1 -0
- package/dist/src/data/transforms/regexExtract.js +57 -0
- package/dist/src/data/transforms/regexExtract.test.js +67 -0
- package/dist/src/data/transforms/regexFold.d.ts +14 -0
- package/dist/src/data/transforms/regexFold.d.ts.map +1 -0
- package/dist/src/data/transforms/regexFold.js +139 -0
- package/dist/src/data/transforms/regexFold.test.js +160 -0
- package/dist/src/data/transforms/sample.d.ts +42 -0
- package/dist/src/data/transforms/sample.d.ts.map +1 -0
- package/dist/src/data/transforms/sample.js +99 -0
- package/dist/src/data/transforms/sample.test.js +38 -0
- package/dist/src/data/transforms/stack.d.ts +11 -0
- package/dist/src/data/transforms/stack.d.ts.map +1 -0
- package/dist/src/data/transforms/stack.js +134 -0
- package/dist/src/data/transforms/stack.test.js +91 -0
- package/dist/src/data/transforms/transformFactory.d.ts +12 -0
- package/dist/src/data/transforms/transformFactory.d.ts.map +1 -0
- package/dist/src/data/transforms/transformFactory.js +59 -0
- package/dist/src/encoder/accessor.d.ts +15 -0
- package/dist/src/encoder/accessor.d.ts.map +1 -0
- package/dist/src/encoder/accessor.js +76 -0
- package/dist/src/encoder/accessor.test.js +47 -0
- package/dist/src/encoder/encoder.d.ts +144 -0
- package/dist/src/encoder/encoder.d.ts.map +1 -0
- package/dist/src/encoder/encoder.js +400 -0
- package/dist/src/encoder/encoder.test.js +98 -0
- package/dist/src/fonts/Lato-Regular.json +1267 -0
- package/dist/src/fonts/Lato-Regular.png +0 -0
- package/dist/src/fonts/OFL.txt +93 -0
- package/dist/src/fonts/README.md +3 -0
- package/dist/src/fonts/bmFontManager.d.ts +182 -0
- package/dist/src/fonts/bmFontManager.d.ts.map +1 -0
- package/dist/src/fonts/bmFontManager.js +359 -0
- package/dist/src/fonts/bmFontMetrics.d.ts +45 -0
- package/dist/src/fonts/bmFontMetrics.d.ts.map +1 -0
- package/dist/src/fonts/bmFontMetrics.js +108 -0
- package/dist/src/genome/genome.d.ts +172 -0
- package/dist/src/genome/genome.d.ts.map +1 -0
- package/dist/src/genome/genome.js +379 -0
- package/dist/src/genome/genome.test.js +226 -0
- package/dist/src/genome/genomeStore.d.ts +20 -0
- package/dist/src/genome/genomeStore.d.ts.map +1 -0
- package/dist/src/genome/genomeStore.js +54 -0
- package/dist/src/genome/locusFormat.d.ts +14 -0
- package/dist/src/genome/locusFormat.d.ts.map +1 -0
- package/dist/src/genome/locusFormat.js +37 -0
- package/dist/src/genome/scaleIndex.d.ts +6 -0
- package/dist/src/genome/scaleIndex.d.ts.map +1 -0
- package/dist/src/genome/scaleIndex.js +165 -0
- package/dist/src/genome/scaleIndex.test.js +78 -0
- package/dist/src/genome/scaleLocus.d.ts +3 -0
- package/dist/src/genome/scaleLocus.d.ts.map +1 -0
- package/dist/src/genome/scaleLocus.js +101 -0
- package/dist/src/genome/scaleLocus.test.js +4 -0
- package/dist/src/genomeSpy.d.ts +141 -0
- package/dist/src/genomeSpy.d.ts.map +1 -0
- package/dist/src/genomeSpy.js +788 -0
- package/dist/src/gl/arrayBuilder.d.ts +71 -0
- package/dist/src/gl/arrayBuilder.d.ts.map +1 -0
- package/dist/src/gl/arrayBuilder.js +199 -0
- package/dist/src/gl/dataToVertices.d.ts +194 -0
- package/dist/src/gl/dataToVertices.d.ts.map +1 -0
- package/dist/src/gl/dataToVertices.js +639 -0
- package/dist/src/gl/includes/common.glsl.js +2 -0
- package/dist/src/gl/includes/picking.fragment.glsl.js +2 -0
- package/dist/src/gl/includes/picking.vertex.glsl.js +2 -0
- package/dist/src/gl/includes/sampleFacet.glsl.js +2 -0
- package/dist/src/gl/includes/scales.glsl.js +2 -0
- package/dist/src/gl/link.fragment.glsl.js +2 -0
- package/dist/src/gl/link.vertex.glsl.js +2 -0
- package/dist/src/gl/point.fragment.glsl.js +2 -0
- package/dist/src/gl/point.vertex.glsl.js +2 -0
- package/dist/src/gl/rect.fragment.glsl.js +2 -0
- package/dist/src/gl/rect.vertex.glsl.js +2 -0
- package/dist/src/gl/rule.fragment.glsl.js +2 -0
- package/dist/src/gl/rule.vertex.glsl.js +2 -0
- package/dist/src/gl/text.fragment.glsl.js +2 -0
- package/dist/src/gl/text.vertex.glsl.js +2 -0
- package/dist/src/gl/webGLHelper.d.ts +118 -0
- package/dist/src/gl/webGLHelper.d.ts.map +1 -0
- package/dist/src/gl/webGLHelper.js +513 -0
- package/dist/src/img/bowtie.svg +1 -0
- package/dist/src/img/genomespy-favicon.svg +34 -0
- package/dist/src/index.d.ts +15 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.html +11 -0
- package/dist/src/index.js +129 -0
- package/dist/src/marks/link.d.ts +11 -0
- package/dist/src/marks/link.d.ts.map +1 -0
- package/dist/src/marks/link.js +175 -0
- package/dist/src/marks/mark.d.ts +226 -0
- package/dist/src/marks/mark.d.ts.map +1 -0
- package/dist/src/marks/mark.js +1004 -0
- package/dist/src/marks/markUtils.d.ts +23 -0
- package/dist/src/marks/markUtils.d.ts.map +1 -0
- package/dist/src/marks/markUtils.js +125 -0
- package/dist/src/marks/pointMark.d.ts +11 -0
- package/dist/src/marks/pointMark.d.ts.map +1 -0
- package/dist/src/marks/pointMark.js +251 -0
- package/dist/src/marks/rectMark.d.ts +18 -0
- package/dist/src/marks/rectMark.d.ts.map +1 -0
- package/dist/src/marks/rectMark.js +255 -0
- package/dist/src/marks/rule.d.ts +6 -0
- package/dist/src/marks/rule.d.ts.map +1 -0
- package/dist/src/marks/rule.js +250 -0
- package/dist/src/marks/text.d.ts +13 -0
- package/dist/src/marks/text.d.ts.map +1 -0
- package/dist/src/marks/text.js +279 -0
- package/dist/src/scale/colorUtils.d.ts +34 -0
- package/dist/src/scale/colorUtils.d.ts.map +1 -0
- package/dist/src/scale/colorUtils.js +184 -0
- package/dist/src/scale/glslScaleGenerator.d.ts +45 -0
- package/dist/src/scale/glslScaleGenerator.d.ts.map +1 -0
- package/dist/src/scale/glslScaleGenerator.js +506 -0
- package/dist/src/scale/scale.d.ts +10 -0
- package/dist/src/scale/scale.d.ts.map +1 -0
- package/dist/src/scale/scale.js +456 -0
- package/dist/src/scale/scale.test.js +324 -0
- package/dist/src/scale/ticks.d.ts +47 -0
- package/dist/src/scale/ticks.d.ts.map +1 -0
- package/dist/src/scale/ticks.js +203 -0
- package/dist/src/scale/ticks.test.js +40 -0
- package/dist/src/singlePageApp.d.ts +2 -0
- package/dist/src/singlePageApp.d.ts.map +1 -0
- package/dist/src/singlePageApp.js +13 -0
- package/dist/src/spec/axis.d.ts +402 -0
- package/dist/src/spec/channel.d.ts +440 -0
- package/dist/src/spec/data.d.ts +370 -0
- package/dist/src/spec/font.d.ts +15 -0
- package/dist/src/spec/genome.d.ts +35 -0
- package/dist/src/spec/mark.d.ts +435 -0
- package/dist/src/spec/root.d.ts +22 -0
- package/dist/src/spec/sampleView.d.ts +185 -0
- package/dist/src/spec/scale.d.ts +273 -0
- package/dist/src/spec/title.d.ts +102 -0
- package/dist/src/spec/tooltip.d.ts +9 -0
- package/dist/src/spec/transform.d.ts +504 -0
- package/dist/src/spec/view.d.ts +214 -0
- package/dist/src/styles/genome-spy.css.d.ts +3 -0
- package/dist/src/styles/genome-spy.css.d.ts.map +1 -0
- package/dist/src/styles/genome-spy.css.js +114 -0
- package/dist/src/styles/genome-spy.scss +153 -0
- package/dist/src/tooltip/dataTooltipHandler.d.ts +2 -0
- package/dist/src/tooltip/dataTooltipHandler.d.ts.map +1 -0
- package/dist/src/tooltip/dataTooltipHandler.js +64 -0
- package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts +2 -0
- package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts.map +1 -0
- package/dist/src/tooltip/refseqGeneTooltipHandler.js +78 -0
- package/dist/src/tooltip/tooltipHandler.d.ts +9 -0
- package/dist/src/tooltip/tooltipHandler.d.ts.map +1 -0
- package/dist/src/tooltip/tooltipHandler.ts +12 -0
- package/dist/src/types/bmFont.d.ts +58 -0
- package/dist/src/types/embedApi.d.ts +67 -0
- package/dist/src/types/encoder.d.ts +84 -0
- package/dist/src/types/flowBatch.d.ts +40 -0
- package/dist/src/types/rendering.d.ts +65 -0
- package/dist/src/types/scaleResolutionApi.d.ts +40 -0
- package/dist/src/types/viewContext.d.ts +85 -0
- package/dist/src/utils/addBaseUrl.d.ts +6 -0
- package/dist/src/utils/addBaseUrl.d.ts.map +1 -0
- package/dist/src/utils/addBaseUrl.js +19 -0
- package/dist/src/utils/addBaseUrl.test.js +22 -0
- package/dist/src/utils/animator.d.ts +41 -0
- package/dist/src/utils/animator.d.ts.map +1 -0
- package/dist/src/utils/animator.js +83 -0
- package/dist/src/utils/arrayUtils.d.ts +34 -0
- package/dist/src/utils/arrayUtils.d.ts.map +1 -0
- package/dist/src/utils/arrayUtils.js +61 -0
- package/dist/src/utils/binnedIndex.d.ts +23 -0
- package/dist/src/utils/binnedIndex.d.ts.map +1 -0
- package/dist/src/utils/binnedIndex.js +167 -0
- package/dist/src/utils/binnedIndex.test.js +155 -0
- package/dist/src/utils/clamp.d.ts +7 -0
- package/dist/src/utils/clamp.d.ts.map +1 -0
- package/dist/src/utils/clamp.js +8 -0
- package/dist/src/utils/cloner.d.ts +16 -0
- package/dist/src/utils/cloner.d.ts.map +1 -0
- package/dist/src/utils/cloner.js +34 -0
- package/dist/src/utils/cloner.test.js +24 -0
- package/dist/src/utils/coalesce.d.ts +6 -0
- package/dist/src/utils/coalesce.d.ts.map +1 -0
- package/dist/src/utils/coalesce.js +11 -0
- package/dist/src/utils/coalesce.test.js +16 -0
- package/dist/src/utils/concatIterables.d.ts +8 -0
- package/dist/src/utils/concatIterables.d.ts.map +1 -0
- package/dist/src/utils/concatIterables.js +26 -0
- package/dist/src/utils/concatIterables.test.js +8 -0
- package/dist/src/utils/debounce.d.ts +8 -0
- package/dist/src/utils/debounce.d.ts.map +1 -0
- package/dist/src/utils/debounce.js +37 -0
- package/dist/src/utils/domainArray.d.ts +61 -0
- package/dist/src/utils/domainArray.d.ts.map +1 -0
- package/dist/src/utils/domainArray.js +216 -0
- package/dist/src/utils/domainArray.test.js +130 -0
- package/dist/src/utils/eerp.d.ts +12 -0
- package/dist/src/utils/eerp.d.ts.map +1 -0
- package/dist/src/utils/eerp.js +13 -0
- package/dist/src/utils/expression.d.ts +9 -0
- package/dist/src/utils/expression.d.ts.map +1 -0
- package/dist/src/utils/expression.js +32 -0
- package/dist/src/utils/field.d.ts +17 -0
- package/dist/src/utils/field.d.ts.map +1 -0
- package/dist/src/utils/field.js +28 -0
- package/dist/src/utils/formatObject.d.ts +7 -0
- package/dist/src/utils/formatObject.d.ts.map +1 -0
- package/dist/src/utils/formatObject.js +37 -0
- package/dist/src/utils/indexer.d.ts +16 -0
- package/dist/src/utils/indexer.d.ts.map +1 -0
- package/dist/src/utils/indexer.js +43 -0
- package/dist/src/utils/indexer.test.js +47 -0
- package/dist/src/utils/inertia.d.ts +42 -0
- package/dist/src/utils/inertia.d.ts.map +1 -0
- package/dist/src/utils/inertia.js +124 -0
- package/dist/src/utils/interactionEvent.d.ts +26 -0
- package/dist/src/utils/interactionEvent.d.ts.map +1 -0
- package/dist/src/utils/interactionEvent.js +33 -0
- package/dist/src/utils/iterateNestedMaps.d.ts +11 -0
- package/dist/src/utils/iterateNestedMaps.d.ts.map +1 -0
- package/dist/src/utils/iterateNestedMaps.js +21 -0
- package/dist/src/utils/iterateNestedMaps.test.js +33 -0
- package/dist/src/utils/kWayMerge.d.ts +9 -0
- package/dist/src/utils/kWayMerge.d.ts.map +1 -0
- package/dist/src/utils/kWayMerge.js +42 -0
- package/dist/src/utils/kWayMerge.test.js +26 -0
- package/dist/src/utils/layout/flexLayout.d.ts +182 -0
- package/dist/src/utils/layout/flexLayout.d.ts.map +1 -0
- package/dist/src/utils/layout/flexLayout.js +381 -0
- package/dist/src/utils/layout/flexLayout.test.js +323 -0
- package/dist/src/utils/layout/grid.d.ts +29 -0
- package/dist/src/utils/layout/grid.d.ts.map +1 -0
- package/dist/src/utils/layout/grid.js +95 -0
- package/dist/src/utils/layout/grid.test.js +71 -0
- package/dist/src/utils/layout/padding.d.ts +83 -0
- package/dist/src/utils/layout/padding.d.ts.map +1 -0
- package/dist/src/utils/layout/padding.js +155 -0
- package/dist/src/utils/layout/point.d.ts +16 -0
- package/dist/src/utils/layout/point.d.ts.map +1 -0
- package/dist/src/utils/layout/point.js +23 -0
- package/dist/src/utils/layout/rectangle.d.ts +142 -0
- package/dist/src/utils/layout/rectangle.d.ts.map +1 -0
- package/dist/src/utils/layout/rectangle.js +296 -0
- package/dist/src/utils/layout/rectangle.test.js +172 -0
- package/dist/src/utils/mergeObjects.d.ts +15 -0
- package/dist/src/utils/mergeObjects.d.ts.map +1 -0
- package/dist/src/utils/mergeObjects.js +99 -0
- package/dist/src/utils/mergeObjects.test.js +42 -0
- package/dist/src/utils/numberExtractor.d.ts +9 -0
- package/dist/src/utils/numberExtractor.d.ts.map +1 -0
- package/dist/src/utils/numberExtractor.js +24 -0
- package/dist/src/utils/numberExtractor.test.js +6 -0
- package/dist/src/utils/point.d.ts +9 -0
- package/dist/src/utils/point.d.ts.map +1 -0
- package/dist/src/utils/point.js +14 -0
- package/dist/src/utils/propertyCacher.d.ts +30 -0
- package/dist/src/utils/propertyCacher.d.ts.map +1 -0
- package/dist/src/utils/propertyCacher.js +70 -0
- package/dist/src/utils/propertyCacher.test.js +85 -0
- package/dist/src/utils/propertyCoalescer.d.ts +15 -0
- package/dist/src/utils/propertyCoalescer.d.ts.map +1 -0
- package/dist/src/utils/propertyCoalescer.js +42 -0
- package/dist/src/utils/propertyCoalescer.test.js +22 -0
- package/dist/src/utils/reservationMap.d.ts +42 -0
- package/dist/src/utils/reservationMap.d.ts.map +1 -0
- package/dist/src/utils/reservationMap.js +103 -0
- package/dist/src/utils/reservationMap.test.js +20 -0
- package/dist/src/utils/scaleNull.d.ts +13 -0
- package/dist/src/utils/scaleNull.d.ts.map +1 -0
- package/dist/src/utils/scaleNull.js +21 -0
- package/dist/src/utils/setOperations.d.ts +31 -0
- package/dist/src/utils/setOperations.d.ts.map +1 -0
- package/dist/src/utils/setOperations.js +75 -0
- package/dist/src/utils/smoothstep.d.ts +7 -0
- package/dist/src/utils/smoothstep.d.ts.map +1 -0
- package/dist/src/utils/smoothstep.js +10 -0
- package/dist/src/utils/throttle.d.ts +8 -0
- package/dist/src/utils/throttle.d.ts.map +1 -0
- package/dist/src/utils/throttle.js +34 -0
- package/dist/src/utils/topK.d.ts +22 -0
- package/dist/src/utils/topK.d.ts.map +1 -0
- package/dist/src/utils/topK.js +76 -0
- package/dist/src/utils/topK.test.js +64 -0
- package/dist/src/utils/transition.d.ts +44 -0
- package/dist/src/utils/transition.d.ts.map +1 -0
- package/dist/src/utils/transition.js +74 -0
- package/dist/src/utils/trees.d.ts +56 -0
- package/dist/src/utils/trees.d.ts.map +1 -0
- package/dist/src/utils/trees.js +92 -0
- package/dist/src/utils/trees.test.js +130 -0
- package/dist/src/utils/ui/tooltip.d.ts +50 -0
- package/dist/src/utils/ui/tooltip.d.ts.map +1 -0
- package/dist/src/utils/ui/tooltip.js +189 -0
- package/dist/src/utils/url.d.ts +9 -0
- package/dist/src/utils/url.d.ts.map +1 -0
- package/dist/src/utils/url.js +22 -0
- package/dist/src/utils/variableTools.d.ts +14 -0
- package/dist/src/utils/variableTools.d.ts.map +1 -0
- package/dist/src/utils/variableTools.js +24 -0
- package/dist/src/utils/variableTools.test.js +13 -0
- package/dist/src/view/axisGridView.d.ts +39 -0
- package/dist/src/view/axisGridView.d.ts.map +1 -0
- package/dist/src/view/axisGridView.js +246 -0
- package/dist/src/view/axisResolution.d.ts +24 -0
- package/dist/src/view/axisResolution.d.ts.map +1 -0
- package/dist/src/view/axisResolution.js +141 -0
- package/dist/src/view/axisResolution.test.js +201 -0
- package/dist/src/view/axisView.d.ts +49 -0
- package/dist/src/view/axisView.d.ts.map +1 -0
- package/dist/src/view/axisView.js +629 -0
- package/dist/src/view/concatView.d.ts +16 -0
- package/dist/src/view/concatView.d.ts.map +1 -0
- package/dist/src/view/concatView.js +84 -0
- package/dist/src/view/containerView.d.ts +43 -0
- package/dist/src/view/containerView.d.ts.map +1 -0
- package/dist/src/view/containerView.js +137 -0
- package/dist/src/view/facetView.d.ts +71 -0
- package/dist/src/view/facetView.d.ts.map +1 -0
- package/dist/src/view/facetView.js +492 -0
- package/dist/src/view/flowBuilder.d.ts +37 -0
- package/dist/src/view/flowBuilder.d.ts.map +1 -0
- package/dist/src/view/flowBuilder.js +383 -0
- package/dist/src/view/flowBuilder.test.js +125 -0
- package/dist/src/view/gridView.d.ts +111 -0
- package/dist/src/view/gridView.d.ts.map +1 -0
- package/dist/src/view/gridView.js +1086 -0
- package/dist/src/view/implicitRootView.d.ts +9 -0
- package/dist/src/view/implicitRootView.d.ts.map +1 -0
- package/dist/src/view/implicitRootView.js +23 -0
- package/dist/src/view/importView.d.ts +17 -0
- package/dist/src/view/importView.d.ts.map +1 -0
- package/dist/src/view/importView.js +22 -0
- package/dist/src/view/layerView.d.ts +25 -0
- package/dist/src/view/layerView.d.ts.map +1 -0
- package/dist/src/view/layerView.js +77 -0
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts +30 -0
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.js +175 -0
- package/dist/src/view/renderingContext/compositeViewRenderingContext.d.ts +14 -0
- package/dist/src/view/renderingContext/compositeViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/compositeViewRenderingContext.js +51 -0
- package/dist/src/view/renderingContext/debuggingViewRenderingContext.d.ts +51 -0
- package/dist/src/view/renderingContext/debuggingViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/debuggingViewRenderingContext.js +94 -0
- package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.d.ts +60 -0
- package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.js +128 -0
- package/dist/src/view/renderingContext/simpleViewRenderingContext.d.ts +19 -0
- package/dist/src/view/renderingContext/simpleViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/simpleViewRenderingContext.js +64 -0
- package/dist/src/view/renderingContext/svgViewRenderingContext.d.ts +22 -0
- package/dist/src/view/renderingContext/svgViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/svgViewRenderingContext.js +125 -0
- package/dist/src/view/renderingContext/viewRenderingContext.d.ts +33 -0
- package/dist/src/view/renderingContext/viewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/viewRenderingContext.js +41 -0
- package/dist/src/view/scaleResolution.d.ts +170 -0
- package/dist/src/view/scaleResolution.d.ts.map +1 -0
- package/dist/src/view/scaleResolution.js +874 -0
- package/dist/src/view/scaleResolution.test.js +658 -0
- package/dist/src/view/testUtils.d.ts +30 -0
- package/dist/src/view/testUtils.d.ts.map +1 -0
- package/dist/src/view/testUtils.js +101 -0
- package/dist/src/view/title.d.ts +6 -0
- package/dist/src/view/title.d.ts.map +1 -0
- package/dist/src/view/title.js +165 -0
- package/dist/src/view/unitView.d.ts +93 -0
- package/dist/src/view/unitView.d.ts.map +1 -0
- package/dist/src/view/unitView.js +345 -0
- package/dist/src/view/view.d.ts +291 -0
- package/dist/src/view/view.d.ts.map +1 -0
- package/dist/src/view/view.js +691 -0
- package/dist/src/view/view.test.js +214 -0
- package/dist/src/view/viewFactory.d.ts +76 -0
- package/dist/src/view/viewFactory.d.ts.map +1 -0
- package/dist/src/view/viewFactory.js +178 -0
- package/dist/src/view/viewFactory.test.js +17 -0
- package/dist/src/view/viewUtils.d.ts +90 -0
- package/dist/src/view/viewUtils.d.ts.map +1 -0
- package/dist/src/view/viewUtils.js +326 -0
- package/dist/src/view/zoom.d.ts +23 -0
- package/dist/src/view/zoom.d.ts.map +1 -0
- package/dist/src/view/zoom.js +89 -0
- package/package.json +15 -12
- package/dist/style.css +0 -1
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
import RectMark from "../marks/rectMark";
|
|
2
|
+
import PointMark from "../marks/pointMark";
|
|
3
|
+
import RuleMark from "../marks/rule";
|
|
4
|
+
import LinkMark from "../marks/link";
|
|
5
|
+
import TextMark from "../marks/text";
|
|
6
|
+
|
|
7
|
+
import ContainerView from "./containerView";
|
|
8
|
+
import ScaleResolution from "./scaleResolution";
|
|
9
|
+
import {
|
|
10
|
+
isSecondaryChannel,
|
|
11
|
+
secondaryChannels,
|
|
12
|
+
isPositionalChannel,
|
|
13
|
+
isChannelDefWithScale,
|
|
14
|
+
primaryPositionalChannels,
|
|
15
|
+
getPrimaryChannel,
|
|
16
|
+
isChannelWithScale,
|
|
17
|
+
isPrimaryPositionalChannel,
|
|
18
|
+
} from "../encoder/encoder";
|
|
19
|
+
import createDomain from "../utils/domainArray";
|
|
20
|
+
import AxisResolution from "./axisResolution";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
*
|
|
24
|
+
* @type {Object.<string, typeof import("../marks/mark").default>}
|
|
25
|
+
* TODO: Find a proper place, make extendible
|
|
26
|
+
*/
|
|
27
|
+
export const markTypes = {
|
|
28
|
+
point: PointMark,
|
|
29
|
+
rect: RectMark,
|
|
30
|
+
rule: RuleMark,
|
|
31
|
+
link: LinkMark,
|
|
32
|
+
text: TextMark,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export default class UnitView extends ContainerView {
|
|
36
|
+
/**
|
|
37
|
+
* @typedef {import("../spec/channel").Channel} Channel
|
|
38
|
+
* @typedef {import("./view").default} View
|
|
39
|
+
* @typedef {import("./layerView").default} LayerView
|
|
40
|
+
* @typedef {import("../utils/domainArray").DomainArray} DomainArray
|
|
41
|
+
* @typedef {import("../spec/view").ResolutionTarget} ResolutionTarget
|
|
42
|
+
*
|
|
43
|
+
*/
|
|
44
|
+
/**
|
|
45
|
+
*
|
|
46
|
+
* @param {import("../spec/view").UnitSpec} spec
|
|
47
|
+
* @param {import("../types/viewContext").default} context
|
|
48
|
+
* @param {import("./containerView").default} layoutParent
|
|
49
|
+
* @param {import("./view").default} dataParent
|
|
50
|
+
* @param {string} name
|
|
51
|
+
*/
|
|
52
|
+
constructor(spec, context, layoutParent, dataParent, name) {
|
|
53
|
+
super(spec, context, layoutParent, dataParent, name);
|
|
54
|
+
|
|
55
|
+
this.spec = spec; // Set here again to keep types happy
|
|
56
|
+
|
|
57
|
+
const Mark = markTypes[this.getMarkType()];
|
|
58
|
+
if (Mark) {
|
|
59
|
+
/** @type {import("../marks/mark").default} */
|
|
60
|
+
this.mark = new Mark(this);
|
|
61
|
+
} else {
|
|
62
|
+
throw new Error(`No such mark: ${this.getMarkType()}`);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Not nice! Inconsistent when faceting!
|
|
67
|
+
* TODO: Something. Maybe store only width/height
|
|
68
|
+
* @type {import("../utils/layout/rectangle").default}
|
|
69
|
+
*/
|
|
70
|
+
this.coords = undefined;
|
|
71
|
+
|
|
72
|
+
this.needsAxes = { x: true, y: true };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @param {import("./renderingContext/viewRenderingContext").default} context
|
|
77
|
+
* @param {import("../utils/layout/rectangle").default} coords
|
|
78
|
+
* @param {import("../types/rendering").RenderingOptions} [options]
|
|
79
|
+
*/
|
|
80
|
+
render(context, coords, options = {}) {
|
|
81
|
+
if (!this.isConfiguredVisible()) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
this.coords = coords;
|
|
86
|
+
|
|
87
|
+
context.pushView(this, coords);
|
|
88
|
+
context.renderMark(this.mark, options);
|
|
89
|
+
context.popView(this);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
getMarkType() {
|
|
93
|
+
return typeof this.spec.mark == "object"
|
|
94
|
+
? this.spec.mark.type
|
|
95
|
+
: this.spec.mark;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Pulls scales and axes up in the view hierarcy according to the resolution rules, using dataParents.
|
|
100
|
+
* TODO: legends
|
|
101
|
+
*
|
|
102
|
+
* @param {ResolutionTarget} type
|
|
103
|
+
*/
|
|
104
|
+
resolve(type) {
|
|
105
|
+
// TODO: Complain about nonsensical configuration, e.g. shared parent has independent children.
|
|
106
|
+
|
|
107
|
+
const encoding = this.mark.encoding;
|
|
108
|
+
|
|
109
|
+
for (const [channel, channelDef] of Object.entries(encoding)) {
|
|
110
|
+
if (!isChannelDefWithScale(channelDef)) {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const targetChannel = getPrimaryChannel(
|
|
115
|
+
channelDef.resolutionChannel ?? channel
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
if (!isChannelWithScale(targetChannel)) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (type == "axis" && !isPositionalChannel(targetChannel)) {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// eslint-disable-next-line consistent-this
|
|
127
|
+
let view = this;
|
|
128
|
+
while (
|
|
129
|
+
(view.getConfiguredOrDefaultResolution(targetChannel, type) ==
|
|
130
|
+
"forced" ||
|
|
131
|
+
(view.dataParent instanceof ContainerView &&
|
|
132
|
+
["shared", "excluded", "forced"].includes(
|
|
133
|
+
view.dataParent.getConfiguredOrDefaultResolution(
|
|
134
|
+
targetChannel,
|
|
135
|
+
type
|
|
136
|
+
)
|
|
137
|
+
))) &&
|
|
138
|
+
view.getConfiguredOrDefaultResolution(targetChannel, type) !=
|
|
139
|
+
"excluded"
|
|
140
|
+
) {
|
|
141
|
+
// @ts-ignore
|
|
142
|
+
view = view.dataParent;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Quite a bit of redundancy, but makes type checker happy.
|
|
146
|
+
if (
|
|
147
|
+
type == "axis" &&
|
|
148
|
+
isPositionalChannel(channel) &&
|
|
149
|
+
isPrimaryPositionalChannel(targetChannel)
|
|
150
|
+
) {
|
|
151
|
+
if (!view.resolutions[type][targetChannel]) {
|
|
152
|
+
view.resolutions[type][targetChannel] = new AxisResolution(
|
|
153
|
+
targetChannel
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
view.resolutions[type][targetChannel].pushUnitView(
|
|
157
|
+
this,
|
|
158
|
+
channel
|
|
159
|
+
);
|
|
160
|
+
} else if (type == "scale" && isChannelWithScale(channel)) {
|
|
161
|
+
if (!view.resolutions[type][targetChannel]) {
|
|
162
|
+
view.resolutions[type][targetChannel] = new ScaleResolution(
|
|
163
|
+
targetChannel
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
view.resolutions[type][targetChannel].pushUnitView(
|
|
167
|
+
this,
|
|
168
|
+
channel
|
|
169
|
+
);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
*
|
|
176
|
+
* @param {Channel} channel
|
|
177
|
+
*/
|
|
178
|
+
getAccessor(channel) {
|
|
179
|
+
return this._cache("accessor/" + channel, () => {
|
|
180
|
+
const encoding = this.mark.encoding; // Mark provides encodings with defaults and possible modifications
|
|
181
|
+
if (encoding && encoding[channel]) {
|
|
182
|
+
return this.context.accessorFactory.createAccessor(
|
|
183
|
+
encoding[channel]
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Returns an accessor that returns a (composite) key for partitioning the data
|
|
191
|
+
*
|
|
192
|
+
* @param {View} [whoIsAsking]
|
|
193
|
+
* @returns {function(object):any}
|
|
194
|
+
*/
|
|
195
|
+
getFacetAccessor(whoIsAsking) {
|
|
196
|
+
// TODO: Rewrite, call getFacetFields
|
|
197
|
+
const sampleAccessor = this.getAccessor("sample");
|
|
198
|
+
if (sampleAccessor) {
|
|
199
|
+
return sampleAccessor;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return super.getFacetAccessor(this);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Returns a collector that is associated with this view.
|
|
207
|
+
*/
|
|
208
|
+
getCollector() {
|
|
209
|
+
return this.context.dataFlow.findCollectorByKey(this);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* @param {Channel} channel A primary channel
|
|
214
|
+
*/
|
|
215
|
+
_validateDomainQuery(channel) {
|
|
216
|
+
if (isSecondaryChannel(channel)) {
|
|
217
|
+
throw new Error(
|
|
218
|
+
`getDomain(${channel}), must only be called for primary channels!`
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const channelDef = this.mark.encoding[channel];
|
|
223
|
+
// TODO: Broken. Fix.
|
|
224
|
+
if (!isChannelDefWithScale(channelDef)) {
|
|
225
|
+
throw new Error("The channel has no scale, cannot get domain!");
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return channelDef;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Returns the domain of the specified channel of this domain/mark.
|
|
233
|
+
*
|
|
234
|
+
* @param {import("../spec/channel").ChannelWithScale} channel A primary channel
|
|
235
|
+
* @returns {DomainArray}
|
|
236
|
+
*/
|
|
237
|
+
getConfiguredDomain(channel) {
|
|
238
|
+
const channelDef = this._validateDomainQuery(channel);
|
|
239
|
+
|
|
240
|
+
const specDomain =
|
|
241
|
+
channelDef && channelDef.scale && channelDef.scale.domain;
|
|
242
|
+
if (specDomain) {
|
|
243
|
+
const scaleResolution = this.getScaleResolution(
|
|
244
|
+
channelDef.resolutionChannel ?? channel
|
|
245
|
+
);
|
|
246
|
+
return createDomain(
|
|
247
|
+
channelDef.type ?? "nominal",
|
|
248
|
+
// Chrom/pos must be linearized first
|
|
249
|
+
scaleResolution.fromComplexInterval(specDomain)
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Extracts the domain from the data.
|
|
256
|
+
*
|
|
257
|
+
* TODO: Optimize! Now this performs redundant work if multiple views share the same collector.
|
|
258
|
+
* Also, all relevant fields should be processed in one iteration: https://jsbench.me/y5kkqy52jo/1
|
|
259
|
+
* In fact, domain extraction could be a responsibility of the collector: As it handles data items,
|
|
260
|
+
* it extracts domains for all fields (and data types) that need extracted domains.
|
|
261
|
+
* Alternatively, extractor nodes could be added to the data flow, just like Vega does
|
|
262
|
+
* (with aggregate and extent).
|
|
263
|
+
*
|
|
264
|
+
* @param {Channel} channel
|
|
265
|
+
* @returns {DomainArray}
|
|
266
|
+
*/
|
|
267
|
+
extractDataDomain(channel) {
|
|
268
|
+
const channelDef = this._validateDomainQuery(channel);
|
|
269
|
+
const type = channelDef.type ?? "nominal"; // TODO: Should check that this is a channel without scale
|
|
270
|
+
|
|
271
|
+
/** @param {Channel} channel */
|
|
272
|
+
const extract = (channel) => {
|
|
273
|
+
/** @type {DomainArray} */
|
|
274
|
+
let domain;
|
|
275
|
+
|
|
276
|
+
const encodingSpec = this.mark.encoding[channel];
|
|
277
|
+
|
|
278
|
+
if (encodingSpec) {
|
|
279
|
+
const accessor =
|
|
280
|
+
this.context.accessorFactory.createAccessor(encodingSpec);
|
|
281
|
+
if (accessor) {
|
|
282
|
+
domain = createDomain(type);
|
|
283
|
+
|
|
284
|
+
if (accessor.constant) {
|
|
285
|
+
domain.extend(accessor({}));
|
|
286
|
+
} else {
|
|
287
|
+
const collector = this.getCollector();
|
|
288
|
+
if (collector?.completed) {
|
|
289
|
+
collector.visitData((d) =>
|
|
290
|
+
domain.extend(accessor(d))
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return domain;
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
let domain = extract(channel);
|
|
300
|
+
|
|
301
|
+
const secondaryChannel = secondaryChannels[channel];
|
|
302
|
+
if (secondaryChannel) {
|
|
303
|
+
const secondaryDomain = extract(secondaryChannel);
|
|
304
|
+
if (secondaryDomain) {
|
|
305
|
+
domain.extendAll(secondaryDomain);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
return domain;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
getZoomLevel() {
|
|
313
|
+
/** @param {import("../spec/channel").ChannelWithScale} channel */
|
|
314
|
+
const getZoomLevel = (channel) =>
|
|
315
|
+
this.getScaleResolution(channel)?.getZoomLevel() ?? 1.0;
|
|
316
|
+
|
|
317
|
+
return primaryPositionalChannels
|
|
318
|
+
.map(getZoomLevel)
|
|
319
|
+
.reduce((a, c) => a * c, 1);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* @param {import("../utils/interactionEvent").default} event
|
|
324
|
+
*/
|
|
325
|
+
propagateInteractionEvent(event) {
|
|
326
|
+
this.handleInteractionEvent(undefined, event, true);
|
|
327
|
+
event.target = this;
|
|
328
|
+
|
|
329
|
+
if (event.stopped) {
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
this.handleInteractionEvent(undefined, event, false);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* @param {string} channel
|
|
338
|
+
* @param {ResolutionTarget} resolutionType
|
|
339
|
+
* @returns {import("../spec/view").ResolutionBehavior}
|
|
340
|
+
*/
|
|
341
|
+
getDefaultResolution(channel, resolutionType) {
|
|
342
|
+
// This affects the sample aggregate views.
|
|
343
|
+
return channel == "x" ? "shared" : "independent";
|
|
344
|
+
}
|
|
345
|
+
}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/** Skip children */
|
|
2
|
+
export const VISIT_SKIP: "VISIT_SKIP";
|
|
3
|
+
/** Stop further visits */
|
|
4
|
+
export const VISIT_STOP: "VISIT_STOP";
|
|
5
|
+
/**
|
|
6
|
+
* @typedef {VISIT_SKIP|VISIT_STOP|void} VisitResult
|
|
7
|
+
*
|
|
8
|
+
* @callback VisitorCallback
|
|
9
|
+
* @param {View} view
|
|
10
|
+
* @returns {VisitResult}
|
|
11
|
+
*
|
|
12
|
+
* @typedef {VisitorCallback & {
|
|
13
|
+
* postOrder?: function(View):void,
|
|
14
|
+
* beforeChildren?: function(View):void,
|
|
15
|
+
* afterChildren?: function(View):void}
|
|
16
|
+
* } Visitor
|
|
17
|
+
*
|
|
18
|
+
* @typedef {object} BroadcastMessage
|
|
19
|
+
* @prop {import("../genomeSpy").BroadcastEventType} type Broadcast type
|
|
20
|
+
* @prop {any} [payload] Anything
|
|
21
|
+
*
|
|
22
|
+
* @callback InteractionEventListener
|
|
23
|
+
* @param {import("../utils/layout/rectangle").default} coords
|
|
24
|
+
* Coordinates of the view
|
|
25
|
+
* @param {import("../utils/interactionEvent").default} event
|
|
26
|
+
*/
|
|
27
|
+
export default class View {
|
|
28
|
+
/**
|
|
29
|
+
*
|
|
30
|
+
* @param {import("../spec/view").ViewSpec} spec
|
|
31
|
+
* @param {import("../types/viewContext").default} context
|
|
32
|
+
* @param {import("./containerView").default} layoutParent Parent that handles rendering of this view
|
|
33
|
+
* @param {import("./view").default} dataParent Parent that provides data, encodings, and is used in scale resolution
|
|
34
|
+
* @param {string} name
|
|
35
|
+
*/
|
|
36
|
+
constructor(spec: import("../spec/view").ViewSpec, context: import("../types/viewContext").default, layoutParent: import("./containerView").default, dataParent: import("./view").default, name: string);
|
|
37
|
+
/**
|
|
38
|
+
* @type {function(number):number}
|
|
39
|
+
*/
|
|
40
|
+
opacityFunction: (arg0: number) => number;
|
|
41
|
+
context: import("../types/viewContext").default;
|
|
42
|
+
layoutParent: import("./containerView").default;
|
|
43
|
+
dataParent: View;
|
|
44
|
+
name: string;
|
|
45
|
+
spec: import("../spec/view").ViewSpec;
|
|
46
|
+
resolutions: {
|
|
47
|
+
/**
|
|
48
|
+
* Channel-specific scale resolutions
|
|
49
|
+
* @type {Partial<Record<import("../spec/channel").ChannelWithScale, import("./scaleResolution").default>>}
|
|
50
|
+
*/
|
|
51
|
+
scale: Partial<Record<import("../spec/channel").ChannelWithScale, import("./scaleResolution").default>>;
|
|
52
|
+
/**
|
|
53
|
+
* Channel-specific axis resolutions
|
|
54
|
+
* @type {Partial<Record<import("../spec/channel").PrimaryPositionalChannel, import("./axisResolution").default>>}
|
|
55
|
+
*/
|
|
56
|
+
axis: Partial<Record<import("../spec/channel").PrimaryPositionalChannel, import("./axisResolution").default>>;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Don't inherit encodings from parent.
|
|
60
|
+
* TODO: Make configurable through spec. Allow more fine-grained control.
|
|
61
|
+
*/
|
|
62
|
+
blockEncodingInheritance: boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Whether ScaleResolution should include this view or its children in the domain.
|
|
65
|
+
* This is mainly used to block axis views from contributing to the domain.
|
|
66
|
+
*/
|
|
67
|
+
contributesToScaleDomain: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Whether GridView or equivalent should draw axis and grid lines for this view.
|
|
70
|
+
* @type {Record<import("../spec/channel").PrimaryPositionalChannel, boolean>}
|
|
71
|
+
*/
|
|
72
|
+
needsAxes: Record<import("../spec/channel").PrimaryPositionalChannel, boolean>;
|
|
73
|
+
getPadding(): Padding;
|
|
74
|
+
/**
|
|
75
|
+
* Returns a padding that indicates how much axes and titles extend over the plot area.
|
|
76
|
+
*
|
|
77
|
+
* @returns {Padding}
|
|
78
|
+
*/
|
|
79
|
+
getOverhang(): Padding;
|
|
80
|
+
/**
|
|
81
|
+
* Returns the configured size, if present. Otherwise a computed or default
|
|
82
|
+
* height is returned.
|
|
83
|
+
*
|
|
84
|
+
* @returns {FlexDimensions}
|
|
85
|
+
*/
|
|
86
|
+
getSize(): FlexDimensions;
|
|
87
|
+
isConfiguredVisible(): boolean;
|
|
88
|
+
isVisibleInSpec(): boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Returns the effective visibility of this view, e.g., whether this view
|
|
91
|
+
* and all its ancestors are visible.
|
|
92
|
+
*
|
|
93
|
+
* When doing a depth-first traversal on the view hierarchy, it's best to
|
|
94
|
+
* use `isConfiguredVisible()` instead of this method.
|
|
95
|
+
*
|
|
96
|
+
* @returns {boolean}
|
|
97
|
+
*/
|
|
98
|
+
isVisible(): boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Returns the effective opacity of this view, e.g., view's opacity multiplied
|
|
101
|
+
* by opacities of its ancestors.
|
|
102
|
+
*
|
|
103
|
+
* TODO: This methods makes sense only in Unit and Layer views.
|
|
104
|
+
*
|
|
105
|
+
* @returns {number}
|
|
106
|
+
*/
|
|
107
|
+
getEffectiveOpacity(): number;
|
|
108
|
+
getPathString(): string;
|
|
109
|
+
/**
|
|
110
|
+
* Returns the ancestor views, starting with this view.
|
|
111
|
+
*/
|
|
112
|
+
getLayoutAncestors(): View[];
|
|
113
|
+
/**
|
|
114
|
+
* Returns the ancestor views, starting with this view.
|
|
115
|
+
*/
|
|
116
|
+
getDataAncestors(): View[];
|
|
117
|
+
/**
|
|
118
|
+
* Handles a broadcast message that is intended for the whole view hierarchy.
|
|
119
|
+
*
|
|
120
|
+
* @param {BroadcastMessage} message
|
|
121
|
+
*/
|
|
122
|
+
handleBroadcast(message: BroadcastMessage): void;
|
|
123
|
+
/**
|
|
124
|
+
*
|
|
125
|
+
* @param {string} type
|
|
126
|
+
* @param {function(BroadcastMessage):void} handler
|
|
127
|
+
*/
|
|
128
|
+
_addBroadcastHandler(type: string, handler: (arg0: BroadcastMessage) => void): void;
|
|
129
|
+
/**
|
|
130
|
+
* Handles an interactionEvent
|
|
131
|
+
*
|
|
132
|
+
* @param {import("../utils/layout/rectangle").default} coords
|
|
133
|
+
* Coordinates of the view
|
|
134
|
+
* @param {import("../utils/interactionEvent").default} event
|
|
135
|
+
* @param {boolean} capturing
|
|
136
|
+
*/
|
|
137
|
+
handleInteractionEvent(coords: import("../utils/layout/rectangle").default, event: import("../utils/interactionEvent").default, capturing: boolean): void;
|
|
138
|
+
/**
|
|
139
|
+
* Add an "interaction" event listener that mimics DOM's event model inside
|
|
140
|
+
* the view hierarchy.
|
|
141
|
+
*
|
|
142
|
+
* This is intended for GenomeSpy's internal use. It allows the views to handle
|
|
143
|
+
* low level interactions such as dragging, wheeling, etc.
|
|
144
|
+
*
|
|
145
|
+
* @param {string} type
|
|
146
|
+
* @param {InteractionEventListener} listener
|
|
147
|
+
* @param {boolean} [useCapture]
|
|
148
|
+
*/
|
|
149
|
+
addInteractionEventListener(type: string, listener: InteractionEventListener, useCapture?: boolean): void;
|
|
150
|
+
/**
|
|
151
|
+
* Visits child views in depth-first order. Visitor's return value
|
|
152
|
+
* controls the traversal.
|
|
153
|
+
*
|
|
154
|
+
* @param {Visitor} visitor
|
|
155
|
+
* @returns {VisitResult}
|
|
156
|
+
*
|
|
157
|
+
*/
|
|
158
|
+
visit(visitor: Visitor): VisitResult;
|
|
159
|
+
/**
|
|
160
|
+
* Get all descendants of this view in depth-first order.
|
|
161
|
+
*/
|
|
162
|
+
getDescendants(): View[];
|
|
163
|
+
/**
|
|
164
|
+
* Called after all scales in the view hierarchy have been resolved.
|
|
165
|
+
*/
|
|
166
|
+
onScalesResolved(): void;
|
|
167
|
+
/**
|
|
168
|
+
* ViewRenderingContext calls this method once for each view during each rendering
|
|
169
|
+
* pass. The order is depth first, pre order.
|
|
170
|
+
*/
|
|
171
|
+
onBeforeRender(): void;
|
|
172
|
+
render(context: ViewRenderingContext, coords: import("../utils/layout/rectangle").default, options?: import("../types/rendering").RenderingOptions): void;
|
|
173
|
+
/**
|
|
174
|
+
* Returns the encodings specified in this view combined with the inherited
|
|
175
|
+
* encodings. However, this does not contain any defaults or inferred/adjusted/fixed
|
|
176
|
+
* encodings. Those are available in Mark's encoding property.
|
|
177
|
+
*
|
|
178
|
+
* @return {import("../spec/channel").Encoding}
|
|
179
|
+
*/
|
|
180
|
+
getEncoding(): import("../spec/channel").Encoding;
|
|
181
|
+
/**
|
|
182
|
+
* @param {View} [whoIsAsking] Passed to the immediate parent. Allows for
|
|
183
|
+
* selectively breaking the inheritance.
|
|
184
|
+
* @return {function(object):any}
|
|
185
|
+
*/
|
|
186
|
+
getFacetAccessor(whoIsAsking?: View): (arg0: object) => any;
|
|
187
|
+
/**
|
|
188
|
+
* Returns the fields that should be used for partitioning the data for facets.
|
|
189
|
+
*
|
|
190
|
+
* @param {View} [whoIsAsking]
|
|
191
|
+
* @returns {string[]}
|
|
192
|
+
*/
|
|
193
|
+
getFacetFields(whoIsAsking?: View): string[];
|
|
194
|
+
/**
|
|
195
|
+
* Returns a texture that has a mapping for the sample locations. This is implemented
|
|
196
|
+
* only in the SampleView of GenomeSpy App.
|
|
197
|
+
*
|
|
198
|
+
* Background:
|
|
199
|
+
* There are to ways to manage how sample facets are drawn in the App:
|
|
200
|
+
*
|
|
201
|
+
* 1) Use one draw call for each facet and pass the location data as a uniform.
|
|
202
|
+
* 2) Draw all facets with one call and pass the facet locations as a texture.
|
|
203
|
+
*
|
|
204
|
+
* The former is suitable for large datasets, which can be subsetted for better
|
|
205
|
+
* performance. The latter one is more performant for cases where each facet
|
|
206
|
+
* consists of few data items (sample attributes / metadata).
|
|
207
|
+
*
|
|
208
|
+
* @return {WebGLTexture}
|
|
209
|
+
*/
|
|
210
|
+
getSampleFacetTexture(): WebGLTexture;
|
|
211
|
+
/**
|
|
212
|
+
* @param {import("../spec/channel").ChannelWithScale} channel
|
|
213
|
+
*/
|
|
214
|
+
getScaleResolution(channel: import("../spec/channel").ChannelWithScale): import("./scaleResolution").default;
|
|
215
|
+
/**
|
|
216
|
+
* @param {import("../spec/channel").PositionalChannel} channel
|
|
217
|
+
*/
|
|
218
|
+
getAxisResolution(channel: import("../spec/channel").PositionalChannel): import("./axisResolution").default;
|
|
219
|
+
/**
|
|
220
|
+
* @param {import("../spec/channel").Channel | "default"} channel
|
|
221
|
+
* @param {import("../spec/view").ResolutionTarget} resolutionType
|
|
222
|
+
* @returns {import("../spec/view").ResolutionBehavior}
|
|
223
|
+
*/
|
|
224
|
+
getConfiguredResolution(channel: import("../spec/channel").Channel | "default", resolutionType: import("../spec/view").ResolutionTarget): import("../spec/view").ResolutionBehavior;
|
|
225
|
+
/**
|
|
226
|
+
* @param {import("../spec/channel").Channel} channel
|
|
227
|
+
* @param {import("../spec/view").ResolutionTarget} resolutionType
|
|
228
|
+
* @returns {import("../spec/view").ResolutionBehavior}
|
|
229
|
+
*/
|
|
230
|
+
getConfiguredOrDefaultResolution(channel: import("../spec/channel").Channel, resolutionType: import("../spec/view").ResolutionTarget): import("../spec/view").ResolutionBehavior;
|
|
231
|
+
/**
|
|
232
|
+
* @param {import("../spec/channel").Channel} channel
|
|
233
|
+
* @param {import("../spec/view").ResolutionTarget} resolutionType
|
|
234
|
+
* @returns {import("../spec/view").ResolutionBehavior}
|
|
235
|
+
*/
|
|
236
|
+
getDefaultResolution(channel: import("../spec/channel").Channel, resolutionType: import("../spec/view").ResolutionTarget): import("../spec/view").ResolutionBehavior;
|
|
237
|
+
/**
|
|
238
|
+
* @returns {string}
|
|
239
|
+
*/
|
|
240
|
+
getBaseUrl(): string;
|
|
241
|
+
/**
|
|
242
|
+
* Returns `true` if this view and its children supports picking.
|
|
243
|
+
*/
|
|
244
|
+
isPickingSupported(): boolean;
|
|
245
|
+
getTitleText(): string;
|
|
246
|
+
/**
|
|
247
|
+
* @param {any} key string
|
|
248
|
+
* @param {function(key?):T} callable A function that produces a value to be cached
|
|
249
|
+
* @returns {T}
|
|
250
|
+
* @template T
|
|
251
|
+
* @protected
|
|
252
|
+
*/
|
|
253
|
+
protected _cache<T>(key: any, callable: (arg0: any | null) => T): T;
|
|
254
|
+
/**
|
|
255
|
+
*
|
|
256
|
+
* @param {string} key
|
|
257
|
+
* @param {"self" | "progeny" | "ancestors"} [direction]
|
|
258
|
+
*/
|
|
259
|
+
_invalidateCacheByPrefix(key: string, direction?: "self" | "progeny" | "ancestors"): void;
|
|
260
|
+
invalidateSizeCache(): void;
|
|
261
|
+
/**
|
|
262
|
+
* Broadcasts a message to views that include the given (x, y) point.
|
|
263
|
+
* This is mainly intended for mouse events.
|
|
264
|
+
*
|
|
265
|
+
* @param {import("../utils/interactionEvent").default} event
|
|
266
|
+
*/
|
|
267
|
+
propagateInteractionEvent(event: import("../utils/interactionEvent").default): void;
|
|
268
|
+
#private;
|
|
269
|
+
}
|
|
270
|
+
export function isStepSize(size: any): size is import("../spec/view").Step;
|
|
271
|
+
export type VisitResult = "VISIT_SKIP" | "VISIT_STOP" | void;
|
|
272
|
+
export type VisitorCallback = (view: View) => VisitResult;
|
|
273
|
+
export type Visitor = VisitorCallback & {
|
|
274
|
+
postOrder?: (arg0: View) => void;
|
|
275
|
+
beforeChildren?: (arg0: View) => void;
|
|
276
|
+
afterChildren?: (arg0: View) => void;
|
|
277
|
+
};
|
|
278
|
+
export type BroadcastMessage = {
|
|
279
|
+
/**
|
|
280
|
+
* Broadcast type
|
|
281
|
+
*/
|
|
282
|
+
type: import("../genomeSpy").BroadcastEventType;
|
|
283
|
+
/**
|
|
284
|
+
* Anything
|
|
285
|
+
*/
|
|
286
|
+
payload?: any;
|
|
287
|
+
};
|
|
288
|
+
export type InteractionEventListener = (coords: import("../utils/layout/rectangle").default, event: import("../utils/interactionEvent").default) => any;
|
|
289
|
+
import Padding from "../utils/layout/padding";
|
|
290
|
+
import { FlexDimensions } from "../utils/layout/flexLayout";
|
|
291
|
+
//# sourceMappingURL=view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../../src/view/view.js"],"names":[],"mappings":"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"}
|