@genome-spy/core 0.30.0 → 0.30.3
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/index.es.js +16379 -0
- package/dist/index.js +43 -43
- package/package.json +10 -7
- package/src/data/collector.js +0 -183
- package/src/data/collector.test.js +0 -84
- package/src/data/dataFlow.js +0 -148
- package/src/data/dataFlow.test.js +0 -5
- package/src/data/facetNode.js +0 -17
- package/src/data/flow.test.js +0 -72
- package/src/data/flowBatch.d.ts +0 -40
- package/src/data/flowNode.js +0 -283
- package/src/data/flowNode.test.js +0 -50
- package/src/data/flowOptimizer.js +0 -123
- package/src/data/flowOptimizer.test.js +0 -193
- package/src/data/flowTestUtils.js +0 -63
- package/src/data/formats/fasta.js +0 -32
- package/src/data/formats/fasta.test.js +0 -27
- package/src/data/sources/dataSource.js +0 -22
- package/src/data/sources/dataSourceFactory.js +0 -24
- package/src/data/sources/dataUtils.js +0 -78
- package/src/data/sources/dynamicCallbackSource.js +0 -57
- package/src/data/sources/dynamicSource.js +0 -37
- package/src/data/sources/inlineSource.js +0 -67
- package/src/data/sources/inlineSource.test.js +0 -56
- package/src/data/sources/namedSource.js +0 -79
- package/src/data/sources/sequenceSource.js +0 -46
- package/src/data/sources/sequenceSource.test.js +0 -46
- package/src/data/sources/urlSource.js +0 -74
- package/src/data/transforms/aggregate.js +0 -70
- package/src/data/transforms/clone.js +0 -40
- package/src/data/transforms/clone.test.js +0 -11
- package/src/data/transforms/coverage.js +0 -187
- package/src/data/transforms/coverage.test.js +0 -123
- package/src/data/transforms/filter.js +0 -37
- package/src/data/transforms/filter.test.js +0 -18
- package/src/data/transforms/filterScoredLabels.js +0 -134
- package/src/data/transforms/flattenCompressedExons.js +0 -57
- package/src/data/transforms/flattenDelimited.js +0 -74
- package/src/data/transforms/flattenDelimited.test.js +0 -87
- package/src/data/transforms/flattenSequence.js +0 -39
- package/src/data/transforms/flattenSequence.test.js +0 -34
- package/src/data/transforms/formula.js +0 -39
- package/src/data/transforms/formula.test.js +0 -19
- package/src/data/transforms/identifier.js +0 -108
- package/src/data/transforms/identifier.test.js +0 -83
- package/src/data/transforms/linearizeGenomicCoordinate.js +0 -101
- package/src/data/transforms/measureText.js +0 -44
- package/src/data/transforms/pileup.js +0 -128
- package/src/data/transforms/pileup.test.js +0 -70
- package/src/data/transforms/project.js +0 -41
- package/src/data/transforms/project.test.js +0 -32
- package/src/data/transforms/regexExtract.js +0 -61
- package/src/data/transforms/regexExtract.test.js +0 -67
- package/src/data/transforms/regexFold.js +0 -141
- package/src/data/transforms/regexFold.test.js +0 -160
- package/src/data/transforms/sample.js +0 -101
- package/src/data/transforms/sample.test.js +0 -38
- package/src/data/transforms/stack.js +0 -137
- package/src/data/transforms/stack.test.js +0 -91
- package/src/data/transforms/transformFactory.js +0 -60
- package/src/embedApi.d.ts +0 -67
- package/src/encoder/accessor.js +0 -82
- package/src/encoder/accessor.test.js +0 -47
- package/src/encoder/encoder.js +0 -394
- package/src/encoder/encoder.test.js +0 -98
- package/src/fonts/Lato-Regular.json +0 -1267
- package/src/fonts/Lato-Regular.png +0 -0
- package/src/fonts/OFL.txt +0 -93
- package/src/fonts/README.md +0 -3
- package/src/fonts/bmFont.d.ts +0 -58
- package/src/fonts/bmFontManager.js +0 -357
- package/src/fonts/bmFontMetrics.js +0 -108
- package/src/genome/genome.js +0 -317
- package/src/genome/genome.test.js +0 -188
- package/src/genome/genomeStore.js +0 -54
- package/src/genome/locusFormat.js +0 -31
- package/src/genome/scaleIndex.d.ts +0 -38
- package/src/genome/scaleIndex.js +0 -166
- package/src/genome/scaleIndex.test.js +0 -78
- package/src/genome/scaleLocus.d.ts +0 -11
- package/src/genome/scaleLocus.js +0 -108
- package/src/genome/scaleLocus.test.js +0 -4
- package/src/genomeSpy.js +0 -785
- package/src/gl/arrayBuilder.js +0 -199
- package/src/gl/dataToVertices.js +0 -636
- package/src/gl/includes/common.glsl +0 -63
- package/src/gl/includes/picking.fragment.glsl +0 -1
- package/src/gl/includes/picking.vertex.glsl +0 -27
- package/src/gl/includes/sampleFacet.glsl +0 -107
- package/src/gl/includes/scales.glsl +0 -112
- package/src/gl/link.fragment.glsl +0 -18
- package/src/gl/link.vertex.glsl +0 -111
- package/src/gl/point.fragment.glsl +0 -123
- package/src/gl/point.vertex.glsl +0 -129
- package/src/gl/rect.fragment.glsl +0 -51
- package/src/gl/rect.vertex.glsl +0 -114
- package/src/gl/rule.fragment.glsl +0 -52
- package/src/gl/rule.vertex.glsl +0 -89
- package/src/gl/text.fragment.glsl +0 -31
- package/src/gl/text.vertex.glsl +0 -246
- package/src/gl/webGLHelper.js +0 -504
- package/src/img/bowtie.svg +0 -1
- package/src/img/genomespy-favicon.svg +0 -34
- package/src/index.html +0 -11
- package/src/index.js +0 -128
- package/src/marks/link.js +0 -175
- package/src/marks/mark.js +0 -975
- package/src/marks/markUtils.js +0 -125
- package/src/marks/pointMark.js +0 -251
- package/src/marks/rectMark.js +0 -241
- package/src/marks/rule.js +0 -250
- package/src/marks/text.js +0 -278
- package/src/node_modules/.vitest/results.json +0 -1
- package/src/scale/colorUtils.js +0 -184
- package/src/scale/glslScaleGenerator.js +0 -502
- package/src/scale/scale.js +0 -451
- package/src/scale/scale.test.js +0 -324
- package/src/scale/ticks.js +0 -203
- package/src/scale/ticks.test.js +0 -40
- package/src/singlePageApp.js +0 -13
- package/src/spec/axis.d.ts +0 -296
- package/src/spec/channel.d.ts +0 -430
- package/src/spec/data.d.ts +0 -196
- package/src/spec/font.d.ts +0 -15
- package/src/spec/genome.d.ts +0 -35
- package/src/spec/mark.d.ts +0 -429
- package/src/spec/root.d.ts +0 -17
- package/src/spec/sampleView.d.ts +0 -180
- package/src/spec/scale.d.ts +0 -273
- package/src/spec/title.d.ts +0 -102
- package/src/spec/tooltip.d.ts +0 -9
- package/src/spec/transform.d.ts +0 -479
- package/src/spec/view.d.ts +0 -201
- package/src/styles/genome-spy.scss +0 -153
- package/src/tooltip/dataTooltipHandler.js +0 -64
- package/src/tooltip/refseqGeneTooltipHandler.js +0 -78
- package/src/tooltip/tooltipHandler.ts +0 -12
- package/src/types/filetypes.d.ts +0 -14
- package/src/types/flatqueue.d.ts +0 -53
- package/src/types/glsl.d.ts +0 -4
- package/src/types/internmap.d.ts +0 -22
- package/src/types/object.d.ts +0 -21
- package/src/types/vega-loader.d.ts +0 -1
- package/src/types/vega-scale.d.ts +0 -60
- package/src/utils/addBaseUrl.js +0 -19
- package/src/utils/addBaseUrl.test.js +0 -22
- package/src/utils/animator.js +0 -83
- package/src/utils/arrayUtils.js +0 -61
- package/src/utils/binnedIndex.js +0 -167
- package/src/utils/binnedIndex.test.js +0 -155
- package/src/utils/clamp.js +0 -8
- package/src/utils/cloner.js +0 -34
- package/src/utils/cloner.test.js +0 -24
- package/src/utils/coalesce.js +0 -11
- package/src/utils/coalesce.test.js +0 -16
- package/src/utils/concatIterables.js +0 -26
- package/src/utils/concatIterables.test.js +0 -8
- package/src/utils/debounce.js +0 -37
- package/src/utils/domainArray.js +0 -216
- package/src/utils/domainArray.test.js +0 -130
- package/src/utils/eerp.js +0 -13
- package/src/utils/expression.js +0 -32
- package/src/utils/field.js +0 -28
- package/src/utils/formatObject.js +0 -31
- package/src/utils/indexer.js +0 -43
- package/src/utils/indexer.test.js +0 -47
- package/src/utils/inertia.js +0 -124
- package/src/utils/interactionEvent.js +0 -33
- package/src/utils/iterateNestedMaps.js +0 -21
- package/src/utils/iterateNestedMaps.test.js +0 -33
- package/src/utils/kWayMerge.js +0 -42
- package/src/utils/kWayMerge.test.js +0 -26
- package/src/utils/layout/flexLayout.js +0 -368
- package/src/utils/layout/flexLayout.test.js +0 -311
- package/src/utils/layout/grid.js +0 -95
- package/src/utils/layout/grid.test.js +0 -71
- package/src/utils/layout/padding.js +0 -120
- package/src/utils/layout/point.js +0 -23
- package/src/utils/layout/rectangle.js +0 -288
- package/src/utils/layout/rectangle.test.js +0 -172
- package/src/utils/mergeObjects.js +0 -99
- package/src/utils/mergeObjects.test.js +0 -42
- package/src/utils/numberExtractor.js +0 -24
- package/src/utils/numberExtractor.test.js +0 -6
- package/src/utils/point.js +0 -14
- package/src/utils/propertyCacher.js +0 -70
- package/src/utils/propertyCacher.test.js +0 -85
- package/src/utils/propertyCoalescer.js +0 -42
- package/src/utils/propertyCoalescer.test.js +0 -22
- package/src/utils/reservationMap.js +0 -103
- package/src/utils/reservationMap.test.js +0 -20
- package/src/utils/scaleNull.js +0 -19
- package/src/utils/setOperations.js +0 -75
- package/src/utils/smoothstep.js +0 -10
- package/src/utils/throttle.js +0 -34
- package/src/utils/topK.js +0 -76
- package/src/utils/topK.test.js +0 -64
- package/src/utils/transition.js +0 -74
- package/src/utils/ui/tooltip.js +0 -189
- package/src/utils/url.js +0 -22
- package/src/utils/variableTools.js +0 -24
- package/src/utils/variableTools.test.js +0 -13
- package/src/view/axisResolution.js +0 -140
- package/src/view/axisResolution.test.js +0 -201
- package/src/view/axisView.js +0 -747
- package/src/view/concatView.js +0 -45
- package/src/view/containerView.js +0 -159
- package/src/view/facetView.js +0 -491
- package/src/view/flowBuilder.js +0 -367
- package/src/view/flowBuilder.test.js +0 -125
- package/src/view/gridView.js +0 -786
- package/src/view/implicitRootView.js +0 -14
- package/src/view/importView.js +0 -19
- package/src/view/layerView.js +0 -74
- package/src/view/rendering.d.ts +0 -44
- package/src/view/renderingContext/compositeViewRenderingContext.js +0 -51
- package/src/view/renderingContext/deferredViewRenderingContext.js +0 -176
- package/src/view/renderingContext/layoutRecorderViewRenderingContext.js +0 -128
- package/src/view/renderingContext/simpleViewRenderingContext.js +0 -64
- package/src/view/renderingContext/svgViewRenderingContext.js +0 -125
- package/src/view/renderingContext/viewRenderingContext.js +0 -41
- package/src/view/scaleResolution.js +0 -797
- package/src/view/scaleResolution.test.js +0 -572
- package/src/view/scaleResolutionApi.d.ts +0 -40
- package/src/view/testUtils.js +0 -51
- package/src/view/title.js +0 -165
- package/src/view/unitView.js +0 -382
- package/src/view/view.js +0 -612
- package/src/view/view.test.js +0 -214
- package/src/view/viewContext.d.ts +0 -62
- package/src/view/viewFactory.js +0 -181
- package/src/view/viewFactory.test.js +0 -17
- package/src/view/viewUtils.js +0 -327
- package/src/view/zoom.js +0 -89
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Iterates a nested Map structure created by d3-array's group() function.
|
|
3
|
-
*
|
|
4
|
-
* Yields arrays that contain the compound key and the grouped data items.
|
|
5
|
-
*
|
|
6
|
-
* @param {Map<any, any>} map The root
|
|
7
|
-
* @param {any[]} [path] The path so far.
|
|
8
|
-
* @returns {Generator<[any[], any[]]>}
|
|
9
|
-
*/
|
|
10
|
-
export default function* iterateNestedMaps(map, path = []) {
|
|
11
|
-
for (const [key, value] of map.entries()) {
|
|
12
|
-
if (value instanceof Map) {
|
|
13
|
-
for (const m of iterateNestedMaps(value, [...path, key])) {
|
|
14
|
-
yield m;
|
|
15
|
-
}
|
|
16
|
-
} else {
|
|
17
|
-
// TODO: Could recycle compound key arrays for better performance
|
|
18
|
-
yield [[...path, key], value];
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { expect, test } from "vitest";
|
|
2
|
-
import { group } from "d3-array";
|
|
3
|
-
import iterateNestedMaps from "./iterateNestedMaps";
|
|
4
|
-
|
|
5
|
-
const data = [
|
|
6
|
-
{ name: "jim", amount: "34.0", date: "11/12/2015" },
|
|
7
|
-
{ name: "carl", amount: "120.11", date: "11/12/2015" },
|
|
8
|
-
{ name: "stacy", amount: "12.01", date: "01/04/2016" },
|
|
9
|
-
{ name: "stacy", amount: "34.05", date: "01/04/2016" },
|
|
10
|
-
{ name: "stacy", amount: "1.5", date: "02/04/2016" },
|
|
11
|
-
];
|
|
12
|
-
|
|
13
|
-
const groups = group(
|
|
14
|
-
data,
|
|
15
|
-
(d) => d.name,
|
|
16
|
-
(d) => d.date
|
|
17
|
-
);
|
|
18
|
-
|
|
19
|
-
test("iterateNestedMaps iterates correctly", () => {
|
|
20
|
-
const expected = [
|
|
21
|
-
[["jim", "11/12/2015"], [data[0]]],
|
|
22
|
-
[["carl", "11/12/2015"], [data[1]]],
|
|
23
|
-
[
|
|
24
|
-
["stacy", "01/04/2016"],
|
|
25
|
-
[data[2], data[3]],
|
|
26
|
-
],
|
|
27
|
-
[["stacy", "02/04/2016"], [data[4]]],
|
|
28
|
-
];
|
|
29
|
-
|
|
30
|
-
const result = [...iterateNestedMaps(groups)];
|
|
31
|
-
|
|
32
|
-
expect(result).toEqual(expected);
|
|
33
|
-
});
|
package/src/utils/kWayMerge.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import FlatQueue from "flatqueue";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Returns an iterator that merges multiple sorted arrays.
|
|
5
|
-
*
|
|
6
|
-
* @param {T[][]} arrays
|
|
7
|
-
* @param {function(T):number} [accessor]
|
|
8
|
-
* @template T
|
|
9
|
-
*/
|
|
10
|
-
export default function* kWayMerge(arrays, accessor = (x) => +x) {
|
|
11
|
-
// https://www.wikiwand.com/en/K-way_merge_algorithm
|
|
12
|
-
|
|
13
|
-
// This could be optimized by implementing a tournament tree or
|
|
14
|
-
// by adding replaceTop to the Heap.
|
|
15
|
-
// https://docs.python.org/2/library/heapq.html#heapq.heapreplace
|
|
16
|
-
|
|
17
|
-
const k = arrays.length;
|
|
18
|
-
|
|
19
|
-
const heap = new FlatQueue();
|
|
20
|
-
const pointers = new Array(k).fill(0);
|
|
21
|
-
|
|
22
|
-
for (const [i, array] of arrays.entries()) {
|
|
23
|
-
if (array.length) {
|
|
24
|
-
heap.push(i, accessor(array[0]));
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
let i = 0;
|
|
29
|
-
while ((i = heap.pop()) !== undefined) {
|
|
30
|
-
const array = arrays[i];
|
|
31
|
-
let pointer = pointers[i];
|
|
32
|
-
const element = array[pointer++];
|
|
33
|
-
|
|
34
|
-
yield element;
|
|
35
|
-
|
|
36
|
-
if (pointer < array.length) {
|
|
37
|
-
const newValue = accessor(array[pointer]);
|
|
38
|
-
heap.push(i, newValue);
|
|
39
|
-
pointers[i] = pointer;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { expect, test } from "vitest";
|
|
2
|
-
import kWayMerge from "./kWayMerge";
|
|
3
|
-
|
|
4
|
-
test("k-way merge merges multiple sorted arrays", () => {
|
|
5
|
-
/** @type {{a: number}[][]} */
|
|
6
|
-
const arrays = [];
|
|
7
|
-
|
|
8
|
-
for (let a = 0; a < 20; a++) {
|
|
9
|
-
/** @type {{a: number}[]} */
|
|
10
|
-
const array = [];
|
|
11
|
-
arrays.push(array);
|
|
12
|
-
|
|
13
|
-
let x = 0;
|
|
14
|
-
for (let i = 0; i < a; i++) {
|
|
15
|
-
x += Math.floor(Math.random() * 10);
|
|
16
|
-
array.push({ a: x });
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const sorted = arrays.flat().sort((a, b) => a.a - b.a);
|
|
21
|
-
|
|
22
|
-
/** @type {function(any):number} */
|
|
23
|
-
const accessor = (d) => d.a;
|
|
24
|
-
|
|
25
|
-
expect([...kWayMerge(arrays, accessor)]).toEqual(sorted);
|
|
26
|
-
});
|
|
@@ -1,368 +0,0 @@
|
|
|
1
|
-
import { isNumber } from "vega-util";
|
|
2
|
-
import { isStepSize } from "../../view/view";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
*
|
|
6
|
-
* Layout calculation inspired by flexbox. The elements may have an
|
|
7
|
-
* absolute size (in pixels) and a growth component for filling the
|
|
8
|
-
* remaining space. Spacing around zero-sized items are collapsed.
|
|
9
|
-
*
|
|
10
|
-
* Read more at https://css-tricks.com/flex-grow-is-weird/
|
|
11
|
-
*
|
|
12
|
-
* @typedef {object} SizeDef Size definition inspired by CSS flexbox
|
|
13
|
-
* @prop {number} [px] Size in pixels
|
|
14
|
-
* @prop {number} [grow] Share of remaining space
|
|
15
|
-
*
|
|
16
|
-
* @typedef {object} LocSize One-dimensional location and size
|
|
17
|
-
* @prop {number} location
|
|
18
|
-
* @prop {number} size
|
|
19
|
-
*
|
|
20
|
-
* @typedef {object} FlexOptions
|
|
21
|
-
* @prop {number} [spacing] gap between items in pixels
|
|
22
|
-
* @prop {number} [devicePixelRatio] allows for snapping to "retina" pixels.
|
|
23
|
-
* Default: `undefined`, which disables the snapping.
|
|
24
|
-
* @prop {number} [offset] add the offset to all locations. Default: `0`.
|
|
25
|
-
* @prop {boolean} [reverse] fill from "right to left".
|
|
26
|
-
*
|
|
27
|
-
* @param {SizeDef[]} items
|
|
28
|
-
* @param {number} containerSize in pixels
|
|
29
|
-
* @param {FlexOptions} [options]
|
|
30
|
-
* @returns {LocSize[]}
|
|
31
|
-
*/
|
|
32
|
-
export function mapToPixelCoords(
|
|
33
|
-
items,
|
|
34
|
-
containerSize,
|
|
35
|
-
{ spacing, devicePixelRatio, offset, reverse } = {}
|
|
36
|
-
) {
|
|
37
|
-
spacing = spacing || 0;
|
|
38
|
-
offset = offset || 0;
|
|
39
|
-
|
|
40
|
-
let totalPx = 0;
|
|
41
|
-
let totalGrow = 0;
|
|
42
|
-
|
|
43
|
-
for (const size of items) {
|
|
44
|
-
totalPx += z(size.px) + (isZeroSizeDef(size) ? 0 : spacing);
|
|
45
|
-
totalGrow += z(size.grow);
|
|
46
|
-
}
|
|
47
|
-
totalPx -= spacing;
|
|
48
|
-
|
|
49
|
-
const remainingSpace = Math.max(0, containerSize - totalPx);
|
|
50
|
-
|
|
51
|
-
/** @type {function(number):number} x */
|
|
52
|
-
const round =
|
|
53
|
-
devicePixelRatio !== undefined
|
|
54
|
-
? (x) => Math.round(x * devicePixelRatio) / devicePixelRatio
|
|
55
|
-
: (x) => x;
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Buffer zero-sized items so that their locations can be spread evenly.
|
|
59
|
-
* They can then be interpolated nicely.
|
|
60
|
-
* @type {SizeDef[]}
|
|
61
|
-
*/
|
|
62
|
-
const zeroBuffer = [];
|
|
63
|
-
|
|
64
|
-
/** @type {LocSize[]} */
|
|
65
|
-
const results = [];
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Spread evenly
|
|
69
|
-
*
|
|
70
|
-
* @param {boolean} inMiddle
|
|
71
|
-
*/
|
|
72
|
-
const flushZeroBuffer = (inMiddle) => {
|
|
73
|
-
const n = zeroBuffer.length;
|
|
74
|
-
if (!n) {
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const s = (inMiddle ? spacing : 0) * (reverse ? -1 : 1);
|
|
79
|
-
|
|
80
|
-
x -= s;
|
|
81
|
-
for (let i = 0; i < n; i++) {
|
|
82
|
-
results.push({
|
|
83
|
-
location: x + ((i + 1) / (n + 1)) * s,
|
|
84
|
-
size: 0,
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
x += s;
|
|
88
|
-
|
|
89
|
-
zeroBuffer.length = 0;
|
|
90
|
-
};
|
|
91
|
-
|
|
92
|
-
let x = reverse ? Math.max(containerSize, totalPx) : 0 + offset;
|
|
93
|
-
|
|
94
|
-
// Handle a special case
|
|
95
|
-
if (items.length == 1 && isZeroSizeDef(items[0])) {
|
|
96
|
-
return [{ location: x, size: 0 }];
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
for (let i = 0; i < items.length; i++) {
|
|
100
|
-
const size = items[i];
|
|
101
|
-
|
|
102
|
-
if (isZeroSizeDef(size)) {
|
|
103
|
-
zeroBuffer.push(size);
|
|
104
|
-
} else {
|
|
105
|
-
flushZeroBuffer(results.length > 0);
|
|
106
|
-
|
|
107
|
-
const advance =
|
|
108
|
-
z(size.px) +
|
|
109
|
-
(totalGrow ? (z(size.grow) / totalGrow) * remainingSpace : 0);
|
|
110
|
-
|
|
111
|
-
if (reverse) {
|
|
112
|
-
x -= advance;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
results.push({ location: round(x), size: round(advance) });
|
|
116
|
-
|
|
117
|
-
if (!reverse) {
|
|
118
|
-
x += advance + spacing;
|
|
119
|
-
} else {
|
|
120
|
-
x -= spacing;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// Remove the last gap
|
|
126
|
-
x += reverse ? spacing : -spacing;
|
|
127
|
-
|
|
128
|
-
flushZeroBuffer(false);
|
|
129
|
-
|
|
130
|
-
return results;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Returns the minimum size (the sum of pixels sizes) for the flex items
|
|
135
|
-
*
|
|
136
|
-
* @param {Iterable<SizeDef>} items
|
|
137
|
-
* @param {FlexOptions} [options]
|
|
138
|
-
*/
|
|
139
|
-
export function getMinimumSize(items, { spacing } = { spacing: 0 }) {
|
|
140
|
-
let minimumSize = 0;
|
|
141
|
-
for (const size of items) {
|
|
142
|
-
minimumSize += z(size.px) + (isZeroSizeDef(size) ? 0 : spacing);
|
|
143
|
-
}
|
|
144
|
-
return Math.max(0, minimumSize - spacing);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* @param {Iterable<SizeDef>} items
|
|
149
|
-
* @returns {SizeDef}
|
|
150
|
-
*/
|
|
151
|
-
export function getLargestSize(items) {
|
|
152
|
-
let px = 0;
|
|
153
|
-
let grow = 0;
|
|
154
|
-
for (const s of items) {
|
|
155
|
-
px = Math.max(px, s.px ?? 0);
|
|
156
|
-
grow = Math.max(grow, s.grow ?? 0);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
return { px, grow };
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* Returns true if relative (stretching) elements are present
|
|
164
|
-
* @param {SizeDef[]} items
|
|
165
|
-
*/
|
|
166
|
-
export function isStretching(items) {
|
|
167
|
-
return items.some((size) => size.grow);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
export class FlexDimensions {
|
|
171
|
-
/**
|
|
172
|
-
*
|
|
173
|
-
* @param {SizeDef} width
|
|
174
|
-
* @param {SizeDef} height
|
|
175
|
-
*/
|
|
176
|
-
constructor(width, height) {
|
|
177
|
-
// TODO: Consider making immutable
|
|
178
|
-
/** @readonly */
|
|
179
|
-
this.width = width;
|
|
180
|
-
/** @readonly */
|
|
181
|
-
this.height = height;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Adds padding to absolute (px) dimensions
|
|
186
|
-
*
|
|
187
|
-
* @param {import("./padding").default} padding
|
|
188
|
-
*/
|
|
189
|
-
addPadding(padding) {
|
|
190
|
-
return this.#addPx(padding.width, padding.height);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* Subtracts padding from absolute (px) dimensions
|
|
195
|
-
*
|
|
196
|
-
* @param {import("./padding").default} padding
|
|
197
|
-
*/
|
|
198
|
-
subtractPadding(padding) {
|
|
199
|
-
return this.#addPx(-padding.width, -padding.height);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* @param {number} width
|
|
204
|
-
* @param {number} height
|
|
205
|
-
*/
|
|
206
|
-
#addPx(width, height) {
|
|
207
|
-
return new FlexDimensions(
|
|
208
|
-
{
|
|
209
|
-
px: (this.width.px ?? 0) + width,
|
|
210
|
-
grow: this.width.grow,
|
|
211
|
-
},
|
|
212
|
-
{
|
|
213
|
-
px: (this.height.px ?? 0) + height,
|
|
214
|
-
grow: this.height.grow,
|
|
215
|
-
}
|
|
216
|
-
);
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
/**
|
|
221
|
-
* A sizedef that takes no space at all.
|
|
222
|
-
*
|
|
223
|
-
* @type {SizeDef}
|
|
224
|
-
*/
|
|
225
|
-
export const ZERO_SIZEDEF = Object.freeze({
|
|
226
|
-
px: 0,
|
|
227
|
-
grow: 0,
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
export const ZERO_FLEXDIMENSIONS = new FlexDimensions(
|
|
231
|
-
ZERO_SIZEDEF,
|
|
232
|
-
ZERO_SIZEDEF
|
|
233
|
-
);
|
|
234
|
-
|
|
235
|
-
/**
|
|
236
|
-
* Is the sizeDef taking no space at all
|
|
237
|
-
*
|
|
238
|
-
* @param {SizeDef} sizeDef
|
|
239
|
-
*/
|
|
240
|
-
export function isZeroSizeDef(sizeDef) {
|
|
241
|
-
return !sizeDef.px && !sizeDef.grow;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* Converts undefined/null to zero
|
|
246
|
-
*
|
|
247
|
-
* @param {number} value
|
|
248
|
-
*/
|
|
249
|
-
function z(value) {
|
|
250
|
-
return value || 0;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
/**
|
|
254
|
-
*
|
|
255
|
-
* @param {*} spec
|
|
256
|
-
* @returns {spec is SizeDef}
|
|
257
|
-
*/
|
|
258
|
-
export function isSizeDef(spec) {
|
|
259
|
-
return spec && (isNumber(spec.px) || isNumber(spec.grow));
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
*
|
|
264
|
-
* @param {"container" | number | SizeDef | import("../../spec/view").Step} size
|
|
265
|
-
* @returns {SizeDef}
|
|
266
|
-
*/
|
|
267
|
-
export function parseSizeDef(size) {
|
|
268
|
-
if (isStepSize(size)) {
|
|
269
|
-
throw new Error("parseSizeDef does not accept step-based sizes.");
|
|
270
|
-
} else if (isSizeDef(size)) {
|
|
271
|
-
return size;
|
|
272
|
-
} else if (isNumber(size)) {
|
|
273
|
-
return { px: size, grow: 0 };
|
|
274
|
-
} else if (size === "container") {
|
|
275
|
-
// https://vega.github.io/vega-lite/docs/size.html#specifying-responsive-width-and-height
|
|
276
|
-
return { px: 0, grow: 1 };
|
|
277
|
-
} else if (!size) {
|
|
278
|
-
return { px: 0, grow: 1 };
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
throw new Error(`Invalid sizeDef: ${size}`);
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
// TODO: Find a better place for the following utilities: ////////////////////////////////////
|
|
285
|
-
|
|
286
|
-
/**
|
|
287
|
-
* Interpolates between two LocSizes
|
|
288
|
-
*
|
|
289
|
-
* @param {LocSize} from
|
|
290
|
-
* @param {LocSize} to
|
|
291
|
-
* @param {function():number} ratio
|
|
292
|
-
* @returns {LocSize}
|
|
293
|
-
*/
|
|
294
|
-
export function interpolateLocSizes(from, to, ratio) {
|
|
295
|
-
return {
|
|
296
|
-
get location() {
|
|
297
|
-
const r = ratio();
|
|
298
|
-
switch (r) {
|
|
299
|
-
case 0:
|
|
300
|
-
return from.location;
|
|
301
|
-
case 1:
|
|
302
|
-
return to.location;
|
|
303
|
-
default:
|
|
304
|
-
return r * to.location + (1 - r) * from.location;
|
|
305
|
-
}
|
|
306
|
-
},
|
|
307
|
-
|
|
308
|
-
get size() {
|
|
309
|
-
const r = ratio();
|
|
310
|
-
switch (r) {
|
|
311
|
-
case 0:
|
|
312
|
-
return from.size;
|
|
313
|
-
case 1:
|
|
314
|
-
return to.size;
|
|
315
|
-
default:
|
|
316
|
-
return r * to.size + (1 - r) * from.size;
|
|
317
|
-
}
|
|
318
|
-
},
|
|
319
|
-
};
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
/**
|
|
323
|
-
* Wraps a LocSize and allows scrolling.
|
|
324
|
-
*
|
|
325
|
-
* @param {LocSize} locSize
|
|
326
|
-
* @param {number | function():number} offset
|
|
327
|
-
* @returns {LocSize}
|
|
328
|
-
*/
|
|
329
|
-
export function translateLocSize(locSize, offset) {
|
|
330
|
-
const fn = isNumber(offset) ? () => offset : offset;
|
|
331
|
-
return {
|
|
332
|
-
get location() {
|
|
333
|
-
return locSize.location + fn();
|
|
334
|
-
},
|
|
335
|
-
|
|
336
|
-
get size() {
|
|
337
|
-
return locSize.size;
|
|
338
|
-
},
|
|
339
|
-
};
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
/**
|
|
343
|
-
* Wraps a LocSize and allows scaling.
|
|
344
|
-
*
|
|
345
|
-
* @param {LocSize} locSize
|
|
346
|
-
* @param {number | function():number} factor
|
|
347
|
-
* @returns {LocSize}
|
|
348
|
-
*/
|
|
349
|
-
export function scaleLocSize(locSize, factor) {
|
|
350
|
-
const fn = isNumber(factor) ? () => factor : factor;
|
|
351
|
-
return {
|
|
352
|
-
get location() {
|
|
353
|
-
return locSize.location * fn();
|
|
354
|
-
},
|
|
355
|
-
|
|
356
|
-
get size() {
|
|
357
|
-
return locSize.size * fn();
|
|
358
|
-
},
|
|
359
|
-
};
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
/**
|
|
363
|
-
* @param {LocSize} locSize
|
|
364
|
-
* @param {number} value
|
|
365
|
-
*/
|
|
366
|
-
export function locSizeEncloses(locSize, value) {
|
|
367
|
-
return value >= locSize.location && value < locSize.location + locSize.size;
|
|
368
|
-
}
|