@genome-spy/core 0.48.1 → 0.49.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/index.es.js +7485 -7097
- package/dist/bundle/index.js +124 -111
- package/dist/schema.json +838 -344
- package/dist/src/data/collector.d.ts +10 -8
- package/dist/src/data/collector.d.ts.map +1 -1
- package/dist/src/data/collector.js +131 -33
- package/dist/src/data/collector.test.d.ts +2 -0
- package/dist/src/data/collector.test.d.ts.map +1 -0
- package/dist/src/data/collector.test.js +55 -1
- package/dist/src/data/dataFlow.test.d.ts +2 -0
- package/dist/src/data/dataFlow.test.d.ts.map +1 -0
- package/dist/src/data/flow.test.d.ts +2 -0
- package/dist/src/data/flow.test.d.ts.map +1 -0
- package/dist/src/data/flow.test.js +19 -14
- package/dist/src/data/flowNode.test.d.ts +2 -0
- package/dist/src/data/flowNode.test.d.ts.map +1 -0
- package/dist/src/data/flowOptimizer.test.d.ts +2 -0
- package/dist/src/data/flowOptimizer.test.d.ts.map +1 -0
- package/dist/src/data/flowOptimizer.test.js +9 -10
- package/dist/src/data/formats/fasta.test.d.ts +2 -0
- package/dist/src/data/formats/fasta.test.d.ts.map +1 -0
- package/dist/src/data/sources/inlineSource.test.d.ts +2 -0
- package/dist/src/data/sources/inlineSource.test.d.ts.map +1 -0
- package/dist/src/data/sources/inlineSource.test.js +23 -16
- package/dist/src/data/sources/sequenceSource.test.d.ts +2 -0
- package/dist/src/data/sources/sequenceSource.test.d.ts.map +1 -0
- package/dist/src/data/sources/sequenceSource.test.js +59 -42
- package/dist/src/data/transforms/clone.test.d.ts +2 -0
- package/dist/src/data/transforms/clone.test.d.ts.map +1 -0
- package/dist/src/data/transforms/coverage.test.d.ts +2 -0
- package/dist/src/data/transforms/coverage.test.d.ts.map +1 -0
- package/dist/src/data/transforms/coverage.test.js +1 -1
- package/dist/src/data/transforms/filter.d.ts +10 -0
- package/dist/src/data/transforms/filter.d.ts.map +1 -1
- package/dist/src/data/transforms/filter.js +30 -1
- package/dist/src/data/transforms/filter.test.d.ts +2 -0
- package/dist/src/data/transforms/filter.test.d.ts.map +1 -0
- package/dist/src/data/transforms/flatten.test.d.ts +2 -0
- package/dist/src/data/transforms/flatten.test.d.ts.map +1 -0
- package/dist/src/data/transforms/flatten.test.js +10 -7
- package/dist/src/data/transforms/flattenDelimited.test.d.ts +2 -0
- package/dist/src/data/transforms/flattenDelimited.test.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenDelimited.test.js +16 -13
- package/dist/src/data/transforms/flattenSequence.test.d.ts +2 -0
- package/dist/src/data/transforms/flattenSequence.test.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenSequence.test.js +1 -1
- package/dist/src/data/transforms/formula.test.d.ts +2 -0
- package/dist/src/data/transforms/formula.test.d.ts.map +1 -0
- package/dist/src/data/transforms/formula.test.js +1 -1
- package/dist/src/data/transforms/identifier.d.ts +1 -1
- package/dist/src/data/transforms/identifier.d.ts.map +1 -1
- package/dist/src/data/transforms/identifier.js +2 -2
- package/dist/src/data/transforms/identifier.test.d.ts +2 -0
- package/dist/src/data/transforms/identifier.test.d.ts.map +1 -0
- package/dist/src/data/transforms/identifier.test.js +23 -14
- package/dist/src/data/transforms/pileup.test.d.ts +2 -0
- package/dist/src/data/transforms/pileup.test.d.ts.map +1 -0
- package/dist/src/data/transforms/project.test.d.ts +2 -0
- package/dist/src/data/transforms/project.test.d.ts.map +1 -0
- package/dist/src/data/transforms/project.test.js +1 -1
- package/dist/src/data/transforms/regexExtract.test.d.ts +2 -0
- package/dist/src/data/transforms/regexExtract.test.d.ts.map +1 -0
- package/dist/src/data/transforms/regexExtract.test.js +6 -3
- package/dist/src/data/transforms/regexFold.test.d.ts +2 -0
- package/dist/src/data/transforms/regexFold.test.d.ts.map +1 -0
- package/dist/src/data/transforms/sample.test.d.ts +2 -0
- package/dist/src/data/transforms/sample.test.d.ts.map +1 -0
- package/dist/src/data/transforms/stack.test.d.ts +2 -0
- package/dist/src/data/transforms/stack.test.d.ts.map +1 -0
- package/dist/src/data/transforms/stack.test.js +8 -8
- package/dist/src/encoder/accessor.d.ts +17 -14
- package/dist/src/encoder/accessor.d.ts.map +1 -1
- package/dist/src/encoder/accessor.js +127 -56
- package/dist/src/encoder/accessor.test.d.ts +2 -0
- package/dist/src/encoder/accessor.test.d.ts.map +1 -0
- package/dist/src/encoder/accessor.test.js +145 -31
- package/dist/src/encoder/encoder.d.ts +26 -13
- package/dist/src/encoder/encoder.d.ts.map +1 -1
- package/dist/src/encoder/encoder.js +98 -114
- package/dist/src/encoder/encoder.test.d.ts +2 -0
- package/dist/src/encoder/encoder.test.d.ts.map +1 -0
- package/dist/src/encoder/encoder.test.js +85 -82
- package/dist/src/fonts/bmFontManager.d.ts.map +1 -1
- package/dist/src/fonts/bmFontManager.js +10 -4
- package/dist/src/genome/genome.test.d.ts +2 -0
- package/dist/src/genome/genome.test.d.ts.map +1 -0
- package/dist/src/genome/scaleIndex.test.d.ts +2 -0
- package/dist/src/genome/scaleIndex.test.d.ts.map +1 -0
- package/dist/src/genome/scaleLocus.test.d.ts +2 -0
- package/dist/src/genome/scaleLocus.test.d.ts.map +1 -0
- package/dist/src/genomeSpy.d.ts +3 -2
- package/dist/src/genomeSpy.d.ts.map +1 -1
- package/dist/src/genomeSpy.js +29 -21
- package/dist/src/gl/dataToVertices.d.ts +5 -7
- package/dist/src/gl/dataToVertices.d.ts.map +1 -1
- package/dist/src/gl/dataToVertices.js +42 -30
- package/dist/src/gl/glslScaleGenerator.d.ts +84 -15
- package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
- package/dist/src/gl/glslScaleGenerator.js +260 -73
- package/dist/src/gl/includes/picking.vertex.glsl.js +1 -1
- package/dist/src/marks/link.common.glsl.js +1 -1
- package/dist/src/marks/link.d.ts.map +1 -1
- package/dist/src/marks/link.js +10 -0
- package/dist/src/marks/link.vertex.glsl.js +1 -1
- package/dist/src/marks/mark.d.ts +6 -9
- package/dist/src/marks/mark.d.ts.map +1 -1
- package/dist/src/marks/mark.js +212 -95
- package/dist/src/marks/point.d.ts.map +1 -1
- package/dist/src/marks/point.js +5 -1
- package/dist/src/marks/rect.d.ts.map +1 -1
- package/dist/src/marks/rect.js +9 -4
- package/dist/src/marks/rule.d.ts.map +1 -1
- package/dist/src/marks/rule.js +4 -0
- package/dist/src/marks/text.d.ts.map +1 -1
- package/dist/src/marks/text.js +5 -1
- package/dist/src/scale/scale.test.d.ts +2 -0
- package/dist/src/scale/scale.test.d.ts.map +1 -0
- package/dist/src/scale/scale.test.js +2 -0
- package/dist/src/scale/ticks.test.d.ts +2 -0
- package/dist/src/scale/ticks.test.d.ts.map +1 -0
- package/dist/src/scale/ticks.test.js +6 -0
- package/dist/src/selection/selection.d.ts +39 -0
- package/dist/src/selection/selection.d.ts.map +1 -0
- package/dist/src/selection/selection.js +78 -0
- package/dist/src/spec/channel.d.ts +137 -83
- package/dist/src/spec/mark.d.ts +9 -0
- package/dist/src/spec/parameter.d.ts +112 -3
- package/dist/src/spec/root.d.ts +0 -1
- package/dist/src/spec/transform.d.ts +19 -1
- package/dist/src/spec/view.d.ts +3 -3
- package/dist/src/tooltip/dataTooltipHandler.js +1 -1
- package/dist/src/types/encoder.d.ts +80 -26
- package/dist/src/types/rendering.d.ts +1 -0
- package/dist/src/types/selectionTypes.d.ts +44 -0
- package/dist/src/types/viewContext.d.ts +1 -4
- package/dist/src/utils/addBaseUrl.test.d.ts +2 -0
- package/dist/src/utils/addBaseUrl.test.d.ts.map +1 -0
- package/dist/src/utils/animator.d.ts.map +1 -1
- package/dist/src/utils/animator.js +3 -1
- package/dist/src/utils/binnedIndex.test.d.ts +2 -0
- package/dist/src/utils/binnedIndex.test.d.ts.map +1 -0
- package/dist/src/utils/cloner.test.d.ts +2 -0
- package/dist/src/utils/cloner.test.d.ts.map +1 -0
- package/dist/src/utils/coalesce.test.d.ts +2 -0
- package/dist/src/utils/coalesce.test.d.ts.map +1 -0
- package/dist/src/utils/concatIterables.test.d.ts +2 -0
- package/dist/src/utils/concatIterables.test.d.ts.map +1 -0
- package/dist/src/utils/domainArray.test.d.ts +2 -0
- package/dist/src/utils/domainArray.test.d.ts.map +1 -0
- package/dist/src/utils/expression.d.ts +2 -2
- package/dist/src/utils/expression.d.ts.map +1 -1
- package/dist/src/utils/expression.js +11 -2
- package/dist/src/utils/indexer.test.d.ts +2 -0
- package/dist/src/utils/indexer.test.d.ts.map +1 -0
- package/dist/src/utils/inertia.d.ts.map +1 -1
- package/dist/src/utils/inertia.js +4 -0
- package/dist/src/utils/inputBinding.d.ts.map +1 -1
- package/dist/src/utils/inputBinding.js +4 -0
- package/dist/src/utils/iterateNestedMaps.d.ts +4 -3
- package/dist/src/utils/iterateNestedMaps.d.ts.map +1 -1
- package/dist/src/utils/iterateNestedMaps.js +3 -2
- package/dist/src/utils/iterateNestedMaps.test.d.ts +2 -0
- package/dist/src/utils/iterateNestedMaps.test.d.ts.map +1 -0
- package/dist/src/utils/kWayMerge.test.d.ts +2 -0
- package/dist/src/utils/kWayMerge.test.d.ts.map +1 -0
- package/dist/src/utils/mergeObjects.test.d.ts +2 -0
- package/dist/src/utils/mergeObjects.test.d.ts.map +1 -0
- package/dist/src/utils/numberExtractor.test.d.ts +2 -0
- package/dist/src/utils/numberExtractor.test.d.ts.map +1 -0
- package/dist/src/utils/propertyCacher.test.d.ts +2 -0
- package/dist/src/utils/propertyCacher.test.d.ts.map +1 -0
- package/dist/src/utils/propertyCoalescer.test.d.ts +2 -0
- package/dist/src/utils/propertyCoalescer.test.d.ts.map +1 -0
- package/dist/src/utils/propertyCoalescer.test.js +3 -0
- package/dist/src/utils/radixSort.d.ts +9 -0
- package/dist/src/utils/radixSort.d.ts.map +1 -0
- package/dist/src/utils/radixSort.js +130 -0
- package/dist/src/utils/radixSort.test.d.ts +2 -0
- package/dist/src/utils/radixSort.test.d.ts.map +1 -0
- package/dist/src/utils/radixSort.test.js +51 -0
- package/dist/src/utils/reservationMap.test.d.ts +2 -0
- package/dist/src/utils/reservationMap.test.d.ts.map +1 -0
- package/dist/src/utils/ringBuffer.test.d.ts +2 -0
- package/dist/src/utils/ringBuffer.test.d.ts.map +1 -0
- package/dist/src/utils/topK.test.d.ts +2 -0
- package/dist/src/utils/topK.test.d.ts.map +1 -0
- package/dist/src/utils/trees.test.d.ts +2 -0
- package/dist/src/utils/trees.test.d.ts.map +1 -0
- package/dist/src/utils/trees.test.js +8 -3
- package/dist/src/utils/variableTools.test.d.ts +2 -0
- package/dist/src/utils/variableTools.test.d.ts.map +1 -0
- package/dist/src/view/axisResolution.d.ts +19 -6
- package/dist/src/view/axisResolution.d.ts.map +1 -1
- package/dist/src/view/axisResolution.js +16 -7
- package/dist/src/view/axisResolution.test.d.ts +2 -0
- package/dist/src/view/axisResolution.test.d.ts.map +1 -0
- package/dist/src/view/axisResolution.test.js +16 -11
- package/dist/src/view/facetView.d.ts +1 -1
- package/dist/src/view/facetView.d.ts.map +1 -1
- package/dist/src/view/flowBuilder.d.ts +1 -1
- package/dist/src/view/flowBuilder.d.ts.map +1 -1
- package/dist/src/view/flowBuilder.js +34 -5
- package/dist/src/view/flowBuilder.test.d.ts +2 -0
- package/dist/src/view/flowBuilder.test.d.ts.map +1 -0
- package/dist/src/view/gridView.d.ts +0 -6
- package/dist/src/view/gridView.d.ts.map +1 -1
- package/dist/src/view/layerView.d.ts +0 -6
- package/dist/src/view/layerView.d.ts.map +1 -1
- package/dist/src/view/layout/flexLayout.test.d.ts +2 -0
- package/dist/src/view/layout/flexLayout.test.d.ts.map +1 -0
- package/dist/src/view/layout/grid.test.d.ts +2 -0
- package/dist/src/view/layout/grid.test.d.ts.map +1 -0
- package/dist/src/view/layout/rectangle.test.d.ts +2 -0
- package/dist/src/view/layout/rectangle.test.d.ts.map +1 -0
- package/dist/src/view/paramMediator.d.ts +32 -5
- package/dist/src/view/paramMediator.d.ts.map +1 -1
- package/dist/src/view/paramMediator.js +97 -9
- package/dist/src/view/paramMediator.test.d.ts +2 -0
- package/dist/src/view/paramMediator.test.d.ts.map +1 -0
- package/dist/src/view/paramMediator.test.js +17 -1
- package/dist/src/view/scaleResolution.d.ts +17 -9
- package/dist/src/view/scaleResolution.d.ts.map +1 -1
- package/dist/src/view/scaleResolution.js +51 -34
- package/dist/src/view/scaleResolution.test.d.ts +2 -0
- package/dist/src/view/scaleResolution.test.d.ts.map +1 -0
- package/dist/src/view/scaleResolution.test.js +2 -0
- package/dist/src/view/testUtils.d.ts.map +1 -1
- package/dist/src/view/testUtils.js +15 -3
- package/dist/src/view/unitView.d.ts +5 -15
- package/dist/src/view/unitView.d.ts.map +1 -1
- package/dist/src/view/unitView.js +81 -101
- package/dist/src/view/view.d.ts +1 -1
- package/dist/src/view/view.d.ts.map +1 -1
- package/dist/src/view/view.test.d.ts +2 -0
- package/dist/src/view/view.test.d.ts.map +1 -0
- package/dist/src/view/view.test.js +73 -55
- package/dist/src/view/viewFactory.test.d.ts +2 -0
- package/dist/src/view/viewFactory.test.d.ts.map +1 -0
- package/dist/src/view/viewFactory.test.js +2 -2
- package/dist/src/view/zoom.js +2 -2
- package/package.json +5 -2
|
@@ -1,18 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import createIndexer from "../utils/indexer.js";
|
|
3
|
-
import scaleNull from "../utils/scaleNull.js";
|
|
4
|
-
import { isExprRef } from "../view/paramMediator.js";
|
|
1
|
+
import { createConditionalAccessors } from "./accessor.js";
|
|
5
2
|
|
|
6
3
|
/**
|
|
7
4
|
* Creates an object that contains encoders for every channel of a mark
|
|
8
5
|
*
|
|
9
6
|
* TODO: This method should have a test. But how to mock Mark...
|
|
10
7
|
*
|
|
11
|
-
* @param {import("../
|
|
12
|
-
* @param {import("../spec/channel.js").Encoding}
|
|
8
|
+
* @param {import("../view/unitView.js").default} unitView
|
|
9
|
+
* @param {import("../spec/channel.js").Encoding} encoding
|
|
13
10
|
* @returns {Partial<Record<Channel, Encoder>>}
|
|
14
11
|
*/
|
|
15
|
-
export default function createEncoders(
|
|
12
|
+
export default function createEncoders(unitView, encoding) {
|
|
16
13
|
/**
|
|
17
14
|
* @typedef {import("../spec/channel.js").Channel} Channel
|
|
18
15
|
* @typedef {import("../types/encoder.js").Encoder} Encoder
|
|
@@ -21,29 +18,22 @@ export default function createEncoders(mark, encoding) {
|
|
|
21
18
|
/** @type {Partial<Record<Channel, Encoder>>} */
|
|
22
19
|
const encoders = {};
|
|
23
20
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
const scaleSource = (
|
|
22
|
+
/** @type {import("../spec/channel.js").ChannelWithScale}*/ channel
|
|
23
|
+
) => unitView.getScaleResolution(channel)?.scale;
|
|
27
24
|
|
|
28
25
|
for (const [channel, channelDef] of Object.entries(encoding)) {
|
|
29
26
|
if (!channelDef) {
|
|
30
27
|
continue;
|
|
31
28
|
}
|
|
32
29
|
|
|
33
|
-
|
|
34
|
-
(
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
encoders[channel] = createEncoder(
|
|
42
|
-
mark,
|
|
43
|
-
encoding[channel],
|
|
44
|
-
resolution?.scale,
|
|
45
|
-
mark.unitView.getAccessor(channel),
|
|
46
|
-
channel
|
|
30
|
+
encoders[channel] = createSimpleOrConditionalEncoder(
|
|
31
|
+
createConditionalAccessors(
|
|
32
|
+
channel,
|
|
33
|
+
channelDef,
|
|
34
|
+
unitView.paramMediator
|
|
35
|
+
),
|
|
36
|
+
scaleSource
|
|
47
37
|
);
|
|
48
38
|
}
|
|
49
39
|
|
|
@@ -51,109 +41,85 @@ export default function createEncoders(mark, encoding) {
|
|
|
51
41
|
}
|
|
52
42
|
|
|
53
43
|
/**
|
|
54
|
-
* @param {import("../
|
|
55
|
-
* @param {import("../spec/channel.js").
|
|
56
|
-
* @param {any} scale
|
|
57
|
-
* @param {Accessor} accessor
|
|
58
|
-
* @param {Channel} channel
|
|
44
|
+
* @param {import("../types/encoder.js").Accessor[]} accessors
|
|
45
|
+
* @param {(channel: import("../spec/channel.js").ChannelWithScale) => import("../types/encoder.js").VegaScale} scaleSource
|
|
59
46
|
* @returns {Encoder}
|
|
60
47
|
*/
|
|
61
|
-
export function
|
|
48
|
+
export function createSimpleOrConditionalEncoder(accessors, scaleSource) {
|
|
62
49
|
/**
|
|
63
|
-
* @typedef {import("../spec/channel.js").Channel} Channel
|
|
64
50
|
* @typedef {import("../types/encoder.js").Encoder} Encoder
|
|
65
51
|
* @typedef {import("../types/encoder.js").Accessor} Accessor
|
|
52
|
+
* @typedef {import("../data/flowNode.js").Datum} Datum
|
|
66
53
|
*/
|
|
54
|
+
if (accessors.length === 1) {
|
|
55
|
+
return createEncoder(accessors[0], scaleSource);
|
|
56
|
+
}
|
|
67
57
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
encoder.constant = true;
|
|
78
|
-
encoder.constantValue = false;
|
|
79
|
-
encoder.accessor = accessor;
|
|
80
|
-
} else {
|
|
81
|
-
const value = channelDef.value;
|
|
82
|
-
encoder = /** @type {Encoder} */ ((datum) => value);
|
|
83
|
-
encoder.constant = true;
|
|
84
|
-
encoder.constantValue = true;
|
|
85
|
-
encoder.accessor = undefined;
|
|
86
|
-
}
|
|
87
|
-
} else if (accessor) {
|
|
88
|
-
if (channel == "text") {
|
|
89
|
-
// TODO: Define somewhere channels that don't use a scale
|
|
90
|
-
encoder = /** @type {Encoder} */ ((datum) => undefined);
|
|
91
|
-
encoder.accessor = accessor;
|
|
92
|
-
encoder.constant = accessor.constant;
|
|
93
|
-
} else {
|
|
94
|
-
if (!scale) {
|
|
95
|
-
if (!isChannelWithScale(channel)) {
|
|
96
|
-
// Channels like uniqueId are passed as is.
|
|
97
|
-
scale = scaleNull();
|
|
98
|
-
} else {
|
|
99
|
-
throw new Error(
|
|
100
|
-
`Missing scale! "${channel}": ${JSON.stringify(
|
|
101
|
-
channelDef
|
|
102
|
-
)}`
|
|
103
|
-
);
|
|
58
|
+
const predicates = accessors.map((a) => a.predicate);
|
|
59
|
+
|
|
60
|
+
const encoders = accessors.map((a) => createEncoder(a, scaleSource));
|
|
61
|
+
|
|
62
|
+
const encoder = Object.assign(
|
|
63
|
+
(/** @type {Datum} */ datum) => {
|
|
64
|
+
for (let i = 0; i < encoders.length; i++) {
|
|
65
|
+
if (predicates[i](datum)) {
|
|
66
|
+
return encoders[i](datum);
|
|
104
67
|
}
|
|
105
68
|
}
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
constant: false,
|
|
72
|
+
accessors: /** @type {Accessor[]} */ (
|
|
73
|
+
encoders.map((e) => e.accessors[0])
|
|
74
|
+
),
|
|
75
|
+
dataAccessor: encoders.map((e) => e.dataAccessor).find((a) => a),
|
|
76
|
+
scale: encoders.map((e) => e.scale).find((s) => s),
|
|
77
|
+
channelDef: accessors.at(-1).channelDef,
|
|
78
|
+
}
|
|
79
|
+
);
|
|
106
80
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
);
|
|
110
|
-
|
|
111
|
-
if (isDiscrete(scale.type)) {
|
|
112
|
-
// TODO: pass the found values back to the scale/resolution
|
|
113
|
-
const indexer = createIndexer();
|
|
114
|
-
// Warning: There's a chance that the domain and indexer get out of sync.
|
|
115
|
-
// TODO: Make this more robust
|
|
116
|
-
indexer.addAll(scale.domain());
|
|
117
|
-
encoder.indexer = indexer;
|
|
118
|
-
}
|
|
81
|
+
return encoder;
|
|
82
|
+
}
|
|
119
83
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
84
|
+
/**
|
|
85
|
+
* @param {Accessor} accessor
|
|
86
|
+
* @param {(channel: import("../spec/channel.js").ChannelWithScale) => import("../types/encoder.js").VegaScale} scaleSource
|
|
87
|
+
* @returns {Encoder}
|
|
88
|
+
*/
|
|
89
|
+
export function createEncoder(accessor, scaleSource) {
|
|
90
|
+
/**
|
|
91
|
+
* @typedef {import("../types/encoder.js").Encoder} Encoder
|
|
92
|
+
* @typedef {import("../types/encoder.js").Accessor} Accessor
|
|
93
|
+
* @typedef {import("../data/flowNode.js").Datum} Datum
|
|
94
|
+
*/
|
|
95
|
+
|
|
96
|
+
const { channel, scaleChannel, channelDef } = accessor;
|
|
97
|
+
|
|
98
|
+
const scale = accessor.scaleChannel ? scaleSource(scaleChannel) : undefined;
|
|
99
|
+
|
|
100
|
+
if (scaleChannel && !scale) {
|
|
125
101
|
throw new Error(
|
|
126
|
-
`Missing
|
|
127
|
-
channelDef
|
|
128
|
-
)}`
|
|
102
|
+
`Missing scale! "${channel}": ${JSON.stringify(channelDef)}`
|
|
129
103
|
);
|
|
130
104
|
}
|
|
131
105
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
for (const prop in encoder) {
|
|
148
|
-
if (prop in encoder) {
|
|
149
|
-
// @ts-ignore
|
|
150
|
-
target[prop] = encoder[prop];
|
|
151
|
-
}
|
|
106
|
+
return Object.assign(
|
|
107
|
+
scale
|
|
108
|
+
? (/** @type {Datum} */ datum) =>
|
|
109
|
+
scale(
|
|
110
|
+
// @ts-ignore Bad d3 types
|
|
111
|
+
accessor(datum)
|
|
112
|
+
)
|
|
113
|
+
: (/** @type {Datum} */ datum) => accessor(datum),
|
|
114
|
+
{
|
|
115
|
+
scale,
|
|
116
|
+
constant: accessor.constant,
|
|
117
|
+
accessors: [accessor],
|
|
118
|
+
dataAccessor: accessor.constant ? undefined : accessor,
|
|
119
|
+
// TODO: Accessor already has the channelDef
|
|
120
|
+
channelDef,
|
|
152
121
|
}
|
|
153
|
-
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
return encoder;
|
|
122
|
+
);
|
|
157
123
|
}
|
|
158
124
|
|
|
159
125
|
/**
|
|
@@ -168,7 +134,7 @@ export function isValueDef(channelDef) {
|
|
|
168
134
|
|
|
169
135
|
/**
|
|
170
136
|
* @param {import("../spec/channel.js").ChannelDef} channelDef
|
|
171
|
-
* @returns {channelDef is import("../spec/channel.js").FieldDefBase
|
|
137
|
+
* @returns {channelDef is import("../spec/channel.js").FieldDefBase}
|
|
172
138
|
*/
|
|
173
139
|
export function isFieldDef(channelDef) {
|
|
174
140
|
return channelDef && "field" in channelDef;
|
|
@@ -233,6 +199,25 @@ export function isExprDef(channelDef) {
|
|
|
233
199
|
return channelDef && "expr" in channelDef;
|
|
234
200
|
}
|
|
235
201
|
|
|
202
|
+
/**
|
|
203
|
+
* @param {import("../spec/channel.js").ChannelDef} channelDef
|
|
204
|
+
* @returns {channelDef is import("../spec/channel.js").FieldOrDatumDefWithCondition}
|
|
205
|
+
*/
|
|
206
|
+
export function isFieldOrDatumDefWithCondition(channelDef) {
|
|
207
|
+
return (
|
|
208
|
+
(isFieldDef(channelDef) || isDatumDef(channelDef)) &&
|
|
209
|
+
"condition" in channelDef
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* @param {import("../spec/channel.js").ChannelDef} channelDef
|
|
215
|
+
* @returns {channelDef is import("../spec/channel.js").ValueDefWithCondition}
|
|
216
|
+
*/
|
|
217
|
+
export function isValueDefWithCondition(channelDef) {
|
|
218
|
+
return isValueDef(channelDef) && "condition" in channelDef;
|
|
219
|
+
}
|
|
220
|
+
|
|
236
221
|
/**
|
|
237
222
|
* @type {import("../spec/channel.js").PrimaryPositionalChannel[]}
|
|
238
223
|
*/
|
|
@@ -344,7 +329,7 @@ export function isColorChannel(channel) {
|
|
|
344
329
|
* @param {import("../spec/channel.js").Channel} channel
|
|
345
330
|
*/
|
|
346
331
|
export function isDiscreteChannel(channel) {
|
|
347
|
-
return ["shape"
|
|
332
|
+
return ["shape"].includes(channel);
|
|
348
333
|
}
|
|
349
334
|
|
|
350
335
|
/**
|
|
@@ -369,7 +354,6 @@ export function isChannelWithScale(channel) {
|
|
|
369
354
|
"angle",
|
|
370
355
|
"dx",
|
|
371
356
|
"dy",
|
|
372
|
-
"sample",
|
|
373
357
|
].includes(channel);
|
|
374
358
|
}
|
|
375
359
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoder.test.d.ts","sourceRoot":"","sources":["../../../src/encoder/encoder.test.js"],"names":[],"mappings":""}
|
|
@@ -1,101 +1,104 @@
|
|
|
1
1
|
import { describe, expect, test } from "vitest";
|
|
2
|
-
import AccessorFactory from "./accessor.js";
|
|
3
|
-
import { scale as vegaScale } from "vega-scale";
|
|
4
2
|
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
3
|
+
import { createAccessor, createConditionalAccessors } from "./accessor.js";
|
|
4
|
+
import ParamMediator from "../view/paramMediator.js";
|
|
5
|
+
import { createEncoder, createSimpleOrConditionalEncoder } from "./encoder.js";
|
|
6
|
+
import { UNIQUE_ID_KEY } from "../data/transforms/identifier.js";
|
|
7
|
+
import { createSinglePointSelection } from "../selection/selection.js";
|
|
8
|
+
import { isArray } from "vega-util";
|
|
9
|
+
import { scaleLinear } from "d3-scale";
|
|
10
|
+
|
|
11
|
+
/** @type {import("../spec/channel.js").Encoding} */
|
|
12
|
+
const encoding = {
|
|
13
|
+
x: { value: 42 },
|
|
14
|
+
y: {
|
|
15
|
+
field: "a",
|
|
16
|
+
type: "quantitative",
|
|
17
|
+
scale: { domain: [0, 100], range: [0, 1] },
|
|
18
|
+
},
|
|
19
|
+
size: {
|
|
20
|
+
field: "a",
|
|
21
|
+
type: "quantitative",
|
|
22
|
+
scale: { domain: [0, 100], range: [0, 10] },
|
|
23
|
+
condition: {
|
|
24
|
+
param: "p",
|
|
25
|
+
empty: false,
|
|
26
|
+
value: 5000,
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const scaleSource = (
|
|
32
|
+
/** @type {import("../spec/channel.js").ChannelWithScale} */ channel
|
|
33
|
+
) => {
|
|
34
|
+
// @ts-ignore
|
|
35
|
+
const props = encoding[channel].scale ?? encoding[channel].condition?.scale;
|
|
36
|
+
|
|
37
|
+
return Object.assign(
|
|
38
|
+
scaleLinear().domain(props.domain).range(props.range),
|
|
39
|
+
{
|
|
40
|
+
type: "linear",
|
|
38
41
|
}
|
|
39
|
-
|
|
40
|
-
|
|
42
|
+
);
|
|
43
|
+
};
|
|
41
44
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
const datum = {
|
|
46
|
+
a: 100,
|
|
47
|
+
b: 6,
|
|
48
|
+
c: "Pink Floyd",
|
|
49
|
+
[UNIQUE_ID_KEY]: 1234,
|
|
50
|
+
};
|
|
47
51
|
|
|
48
|
-
|
|
49
|
-
|
|
52
|
+
describe("Encoder", () => {
|
|
53
|
+
const pm = new ParamMediator();
|
|
54
|
+
/** @type {Partial<Record<import("../spec/channel.js").Channel, import("../types/encoder.js").Encoder>>} */
|
|
55
|
+
const e = Object.fromEntries(
|
|
56
|
+
Object.entries(encoding).map(([channel, channelDef]) => {
|
|
57
|
+
const accessor = createAccessor(channel, channelDef, pm);
|
|
58
|
+
return [channel, createEncoder(accessor, scaleSource)];
|
|
59
|
+
})
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
test("has a single accessors", () => {
|
|
63
|
+
expect(e.x.accessors?.length).toBe(1);
|
|
64
|
+
});
|
|
50
65
|
|
|
51
|
-
|
|
66
|
+
test("provides a data accessor for a FieldDef", () =>
|
|
67
|
+
expect(e.y.dataAccessor.fields).toContain("a"));
|
|
52
68
|
|
|
53
|
-
test("
|
|
54
|
-
expect(
|
|
55
|
-
["x", "y", "z", "size"].every(
|
|
56
|
-
(channel) => typeof encoders[channel] === "function"
|
|
57
|
-
)
|
|
58
|
-
).toBeTruthy());
|
|
69
|
+
test("doesn't provide a data accessor for a ValueDef", () =>
|
|
70
|
+
expect(e.x.dataAccessor).toBeUndefined());
|
|
59
71
|
|
|
60
|
-
test("
|
|
72
|
+
test("returns a value", () => expect(e.x(datum)).toEqual(42));
|
|
61
73
|
|
|
62
|
-
test("
|
|
63
|
-
expect(encoders.z(datum)).toBeCloseTo(0.1));
|
|
74
|
+
test("accesses a field and uses a scale", () => expect(e.y(datum)).toBe(1));
|
|
64
75
|
|
|
65
|
-
|
|
66
|
-
|
|
76
|
+
// TODO: Text ExprRef
|
|
77
|
+
});
|
|
67
78
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
*/
|
|
79
|
+
describe("Conditional encoder with a field and a conditional value", () => {
|
|
80
|
+
const pm = new ParamMediator();
|
|
81
|
+
const setter = pm.allocateSetter("p", createSinglePointSelection(null));
|
|
72
82
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
});
|
|
83
|
+
const e = createSimpleOrConditionalEncoder(
|
|
84
|
+
createConditionalAccessors("size", encoding.size, pm),
|
|
85
|
+
scaleSource
|
|
86
|
+
);
|
|
78
87
|
|
|
79
|
-
test("
|
|
80
|
-
expect(
|
|
81
|
-
expect(encoders.z.constantValue).toBeFalsy();
|
|
82
|
-
expect(encoders.size.constantValue).toBeTruthy();
|
|
88
|
+
test("has multiple accessors", () => {
|
|
89
|
+
expect(e.accessors.length).toBe(2);
|
|
83
90
|
});
|
|
84
91
|
|
|
85
|
-
test("
|
|
86
|
-
expect(
|
|
87
|
-
expect(encoders.z.invert(0.5)).toBeCloseTo(10);
|
|
88
|
-
// A value, no scale, can't invert
|
|
89
|
-
expect(() => encoders.size.invert(123)).toThrow();
|
|
90
|
-
});
|
|
92
|
+
test("accesses the field using the dataAccessor", () =>
|
|
93
|
+
expect(e.dataAccessor(datum)).toBe(100));
|
|
91
94
|
|
|
92
|
-
test("
|
|
93
|
-
|
|
94
|
-
expect(
|
|
95
|
-
expect(encoders.x.accessor).toBeUndefined();
|
|
95
|
+
test("encodes the default when a predicate is false", () => {
|
|
96
|
+
setter(createSinglePointSelection(null));
|
|
97
|
+
expect(e(datum)).toBe(10);
|
|
96
98
|
});
|
|
97
99
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
100
|
+
test("encodes the conditional value when a predicate is true", () => {
|
|
101
|
+
setter(createSinglePointSelection(datum));
|
|
102
|
+
expect(e(datum)).toBe(5000);
|
|
103
|
+
});
|
|
101
104
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bmFontManager.d.ts","sourceRoot":"","sources":["../../../src/fonts/bmFontManager.js"],"names":[],"mappings":"AAiBA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH;IACI;;OAEG;IACH,0BAFW,OAAO,sBAAsB,EAAE,OAAO,EAgChD;IA7BG,qDAA+B;IAE/B,uBACiF;IAEjF;;OAEG;IACH,QAFU,IAAI,OAAO,EAAE,SAAS,CAAC,CAEc;IAE/C,8DAA8D;IAC9D,mBADW,IAAI,MAAM,EAAE,QAAQ,uBAAuB,EAAE,CAAC,CAAC,CACxB;IAElC,kDAAkD;IAClD,eADW,IAAI,MAAM,EAAE,QAAQ,aAAa,CAAC,CAAC,CAChB;IAE9B,uEAAuE;IACvE,WADW,QAAQ,IAAI,CAAC,EAAE,CACP;IAEnB;;;OAGG;IACH,mBAFU,SAAS,CAOlB;IAGL,gCAEC;IAED;;;;;;OAMG;IACH,gBALW,MAAM,UACN,SAAS,WACT,UAAU,GAAG;;;;;;;;KAAa,GACxB,SAAS,CAyBrB;IAED;;;;OAIG;IACH,0BAHW,SAAS,OACT,OAAO,
|
|
1
|
+
{"version":3,"file":"bmFontManager.d.ts","sourceRoot":"","sources":["../../../src/fonts/bmFontManager.js"],"names":[],"mappings":"AAiBA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH;IACI;;OAEG;IACH,0BAFW,OAAO,sBAAsB,EAAE,OAAO,EAgChD;IA7BG,qDAA+B;IAE/B,uBACiF;IAEjF;;OAEG;IACH,QAFU,IAAI,OAAO,EAAE,SAAS,CAAC,CAEc;IAE/C,8DAA8D;IAC9D,mBADW,IAAI,MAAM,EAAE,QAAQ,uBAAuB,EAAE,CAAC,CAAC,CACxB;IAElC,kDAAkD;IAClD,eADW,IAAI,MAAM,EAAE,QAAQ,aAAa,CAAC,CAAC,CAChB;IAE9B,uEAAuE;IACvE,WADW,QAAQ,IAAI,CAAC,EAAE,CACP;IAEnB;;;OAGG;IACH,mBAFU,SAAS,CAOlB;IAGL,gCAEC;IAED;;;;;;OAMG;IACH,gBALW,MAAM,UACN,SAAS,WACT,UAAU,GAAG;;;;;;;;KAAa,GACxB,SAAS,CAyBrB;IAED;;;;OAIG;IACH,0BAHW,SAAS,OACT,OAAO,iBA0BjB;IAED;;OAEG;IACH,eAFW,MAAM,uDAoBhB;IAED;;;OAGG;IACH,sBAFW,MAAM,sCA+BhB;IAED,4BAEC;IAED;;;;OAIG;IACH,0BAHW,MAAM,GACJ,QAAQ,YAAY,CAAC,CAqBjC;IAED;;;;OAIG;IACH,6BAHW,MAAM,GACJ,YAAY,CA0BxB;CACJ;;;;;;;;;;UAgBS,MAAM;;;;WACN,MAAM;;;;YACN,MAAM;;;;cACN,MAAM;;;;sBACN,MAAM;;;;eACN,MAAM;;;;eACN,MAAM;;;;;;;;;qBAlQH,OAAO,oBAAoB,EAAE,MAAM;;;;;;;;4BACnC,OAAO,oBAAoB,EAAE,aAAa;;;;;;;;wBAE1C,QAAQ,GAAG,QAAQ;;;;;;;;yBACnB,MAAM;;;;;;;;;YAGT,MAAM;WACN,SAAS;YACT,UAAU;;;;;;;;;;aAGV,aAAa;aACb,YAAY"}
|
|
@@ -132,7 +132,9 @@ export default class BmFontManager {
|
|
|
132
132
|
fontEntry.texture = await texturePromise;
|
|
133
133
|
fontEntry.metrics = await metricsPromise;
|
|
134
134
|
} catch (error) {
|
|
135
|
-
console.
|
|
135
|
+
console.warn(
|
|
136
|
+
`Cannot load font: "${key.family}". Using the embedded default font.`
|
|
137
|
+
);
|
|
136
138
|
|
|
137
139
|
fontEntry.metrics = this._defaultFontEntry.metrics;
|
|
138
140
|
fontEntry.texture = this._defaultFontEntry.texture;
|
|
@@ -171,11 +173,15 @@ export default class BmFontManager {
|
|
|
171
173
|
|
|
172
174
|
let promise = this._metadataPromises.get(dir);
|
|
173
175
|
if (!promise) {
|
|
174
|
-
|
|
176
|
+
const url = this.fontRepository + dir + "/METADATA.pb";
|
|
177
|
+
promise = fetch(url)
|
|
175
178
|
.then((response) => {
|
|
176
179
|
if (!response.ok) {
|
|
177
180
|
throw new Error(
|
|
178
|
-
"Could not load font metadata: " +
|
|
181
|
+
"Could not load font metadata. Response status: " +
|
|
182
|
+
response.status +
|
|
183
|
+
", url: " +
|
|
184
|
+
url
|
|
179
185
|
);
|
|
180
186
|
}
|
|
181
187
|
return response;
|
|
@@ -183,7 +189,7 @@ export default class BmFontManager {
|
|
|
183
189
|
.then((response) => response.text())
|
|
184
190
|
.then((text) => parseMetadataPb(text))
|
|
185
191
|
.catch((error) => {
|
|
186
|
-
console.warn(error);
|
|
192
|
+
console.warn(error.message);
|
|
187
193
|
return undefined;
|
|
188
194
|
});
|
|
189
195
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genome.test.d.ts","sourceRoot":"","sources":["../../../src/genome/genome.test.js"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaleIndex.test.d.ts","sourceRoot":"","sources":["../../../src/genome/scaleIndex.test.js"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaleLocus.test.d.ts","sourceRoot":"","sources":["../../../src/genome/scaleLocus.test.js"],"names":[],"mappings":""}
|
package/dist/src/genomeSpy.d.ts
CHANGED
|
@@ -18,7 +18,6 @@ export default class GenomeSpy {
|
|
|
18
18
|
_destructionCallbacks: (() => void)[];
|
|
19
19
|
/** Root level configuration object */
|
|
20
20
|
spec: import("./spec/root.js").RootSpec;
|
|
21
|
-
accessorFactory: AccessorFactory;
|
|
22
21
|
viewFactory: ViewFactory;
|
|
23
22
|
/** @type {(function(string):object[])[]} */
|
|
24
23
|
namedDataProviders: ((arg0: string) => object[])[];
|
|
@@ -83,6 +82,8 @@ export default class GenomeSpy {
|
|
|
83
82
|
* @type {HTMLElement}
|
|
84
83
|
*/
|
|
85
84
|
_inputBindingContainer: HTMLElement;
|
|
85
|
+
/** @type {Point} */
|
|
86
|
+
_mouseDownCoords: Point;
|
|
86
87
|
/**
|
|
87
88
|
*
|
|
88
89
|
* @param {(name: string) => any[]} provider
|
|
@@ -151,12 +152,12 @@ export default class GenomeSpy {
|
|
|
151
152
|
* Events that are broadcasted to all views.
|
|
152
153
|
*/
|
|
153
154
|
export type BroadcastEventType = "dataFlowBuilt" | "dataLoaded" | "layout" | "layoutComputed";
|
|
154
|
-
import AccessorFactory from "./encoder/accessor.js";
|
|
155
155
|
import { ViewFactory } from "./view/viewFactory.js";
|
|
156
156
|
import Animator from "./utils/animator.js";
|
|
157
157
|
import GenomeStore from "./genome/genomeStore.js";
|
|
158
158
|
import BufferedViewRenderingContext from "./view/renderingContext/bufferedViewRenderingContext.js";
|
|
159
159
|
import Inertia from "./utils/inertia.js";
|
|
160
|
+
import Point from "./view/layout/point.js";
|
|
160
161
|
import WebGLHelper from "./gl/webGLHelper.js";
|
|
161
162
|
import Tooltip from "./utils/ui/tooltip.js";
|
|
162
163
|
import UnitView from "./view/unitView.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"genomeSpy.d.ts","sourceRoot":"","sources":["../../src/genomeSpy.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"genomeSpy.d.ts","sourceRoot":"","sources":["../../src/genomeSpy.js"],"names":[],"mappings":"AA8CA;IACI;;;;;OAKG;IAEH;;;;;OAKG;IACH,uBAJW,WAAW,qDAEX,OAAO,qBAAqB,EAAE,YAAY,EA6FpD;IA1FG,uBAA0B;IAC1B,oDAAsB;IAItB,6BAA6B;IAC7B,uBADW,CAAC,MAAM,IAAI,CAAC,EAAE,CACM;IAE/B,sCAAsC;IACtC,wCAAgB;IAEhB,yBAAoC;IAEpC,4CAA4C;IAC5C,oBADW,QAAU,MAAM,KAAE,MAAM,EAAE,CAAC,EAAE,CACZ;IAE5B,mBAAoD;IAEpD,0BAA0B;IAC1B,aADW,WAAW,CACM;IAE5B;;;;;OAKG;IACH,qEAF0B,OAAO,CAE8B;IAE/D,2CAA2C;IAC3C,mBADW,4BAA4B,CACL;IAClC,2CAA2C;IAC3C,iBADW,4BAA4B,CACP;IAEhC,oDAAoD;IACpD,6BAAgC;IAEhC;;;OAGG;IACH,eAFU;QAAE,IAAI,EAAE,OAAO,iBAAiB,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,oBAAoB,EAAE,KAAK,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAEpF;IAE9B,uBAA+C;IAE/C;;;OAGG;IACH,oBAFU,IAAI,MAAM,EAAE,QAAU,aAAa,KAAE,IAAI,CAAC,EAAE,CAAC,CAEpB;IAEnC;;;;;;OAMG;IACH,yCAFkC,GAAG,KAAK,IAAI,GAEd;IAEhC;;;OAGG;IACH,kDAFkC,GAAG,KAAK,IAAI,GAEL;IAEzC,oFAAoF;IACpF,iBADW,OAAO,MAAM,EAAE,OAAO,6BAA6B,EAAE,cAAc,CAAC,CAK9E;IAED,mBAAmB;IACnB,2CAAyB;IAEzB;;;;OAIG;IACH;gBAF8B,OAAO,wBAAwB,EAAE,iBAAiB;iBAAW,MAAM;OAEnE;IAE9B;;OAEG;IACH,wBAFU,WAAW,CAEkB;IAEvC,oBAAoB;IACpB,kBADW,KAAK,CACiB;IA2CrC;;;OAGG;IACH,2CAFkB,MAAM,KAAK,GAAG,EAAE,QAIjC;IAED;;OAEG;IACH,+BAFW,MAAM,YAShB;IAED;;;;OAIG;IACH,sBAHW,MAAM,QACN,GAAG,EAAE,QAaf;IAED;;;;;OAKG;IACH,gBAHW,kBAAkB,YAClB,GAAG,QAQb;IAED;;;OAGG;IACH,iCAqDC;IA0DG,uBAQC;IAGD,mCAGE;IAOF,sCAEE;IAGF,iBAAyC;IAW7C;;OAEG;IACH,gBAuBC;IAED,sCA6MC;IAED;;;OAGG;IACH,UAFa,QAAQ,OAAO,CAAC,CA6B5B;IAED,4BA8JC;IAvIe,iCAAoC;IAyIpD;;;OAGG;IACH,kBAHW,MAAM,KACN,MAAM,QAqEhB;IAED;;;;;;;OAOG;IACH,oDAHuB,QAAQ,MAAM,GAAG,WAAW,GAAG,OAAO,KAAK,EAAE,cAAc,CAAC,QAYlF;IAED,sBA6CC;IAED,kBAIC;IAED,iCAOC;IAED,iCASC;IAED,qFAWC;;CACJ;;;;iCAj8BY,eAAe,GAAG,YAAY,GAAG,QAAQ,GAAG,gBAAgB;4BAP7B,uBAAuB;qBAZ9C,qBAAqB;wBAIlB,yBAAyB;yCARR,yDAAyD;oBAYvD,oBAAoB;kBAT7C,wBAAwB;wBALlB,qBAAqB;oBAVzB,uBAAuB;qBAQtB,oBAAoB"}
|