@genome-spy/core 0.29.0 → 0.30.2

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.
Files changed (234) hide show
  1. package/dist/index.es.js +16373 -0
  2. package/dist/index.js +43 -43
  3. package/package.json +10 -7
  4. package/src/data/collector.js +0 -183
  5. package/src/data/collector.test.js +0 -84
  6. package/src/data/dataFlow.js +0 -148
  7. package/src/data/dataFlow.test.js +0 -5
  8. package/src/data/facetNode.js +0 -17
  9. package/src/data/flow.test.js +0 -72
  10. package/src/data/flowBatch.d.ts +0 -40
  11. package/src/data/flowNode.js +0 -283
  12. package/src/data/flowNode.test.js +0 -50
  13. package/src/data/flowOptimizer.js +0 -123
  14. package/src/data/flowOptimizer.test.js +0 -193
  15. package/src/data/flowTestUtils.js +0 -63
  16. package/src/data/formats/fasta.js +0 -32
  17. package/src/data/formats/fasta.test.js +0 -27
  18. package/src/data/sources/dataSource.js +0 -22
  19. package/src/data/sources/dataSourceFactory.js +0 -24
  20. package/src/data/sources/dataUtils.js +0 -78
  21. package/src/data/sources/dynamicCallbackSource.js +0 -57
  22. package/src/data/sources/dynamicSource.js +0 -37
  23. package/src/data/sources/inlineSource.js +0 -67
  24. package/src/data/sources/inlineSource.test.js +0 -56
  25. package/src/data/sources/namedSource.js +0 -79
  26. package/src/data/sources/sequenceSource.js +0 -46
  27. package/src/data/sources/sequenceSource.test.js +0 -46
  28. package/src/data/sources/urlSource.js +0 -74
  29. package/src/data/transforms/aggregate.js +0 -70
  30. package/src/data/transforms/clone.js +0 -40
  31. package/src/data/transforms/clone.test.js +0 -11
  32. package/src/data/transforms/coverage.js +0 -187
  33. package/src/data/transforms/coverage.test.js +0 -123
  34. package/src/data/transforms/filter.js +0 -37
  35. package/src/data/transforms/filter.test.js +0 -18
  36. package/src/data/transforms/filterScoredLabels.js +0 -134
  37. package/src/data/transforms/flattenCompressedExons.js +0 -57
  38. package/src/data/transforms/flattenDelimited.js +0 -74
  39. package/src/data/transforms/flattenDelimited.test.js +0 -87
  40. package/src/data/transforms/flattenSequence.js +0 -39
  41. package/src/data/transforms/flattenSequence.test.js +0 -34
  42. package/src/data/transforms/formula.js +0 -39
  43. package/src/data/transforms/formula.test.js +0 -19
  44. package/src/data/transforms/identifier.js +0 -108
  45. package/src/data/transforms/identifier.test.js +0 -83
  46. package/src/data/transforms/linearizeGenomicCoordinate.js +0 -101
  47. package/src/data/transforms/measureText.js +0 -44
  48. package/src/data/transforms/pileup.js +0 -128
  49. package/src/data/transforms/pileup.test.js +0 -70
  50. package/src/data/transforms/project.js +0 -41
  51. package/src/data/transforms/project.test.js +0 -32
  52. package/src/data/transforms/regexExtract.js +0 -61
  53. package/src/data/transforms/regexExtract.test.js +0 -67
  54. package/src/data/transforms/regexFold.js +0 -141
  55. package/src/data/transforms/regexFold.test.js +0 -160
  56. package/src/data/transforms/sample.js +0 -101
  57. package/src/data/transforms/sample.test.js +0 -38
  58. package/src/data/transforms/stack.js +0 -137
  59. package/src/data/transforms/stack.test.js +0 -91
  60. package/src/data/transforms/transformFactory.js +0 -60
  61. package/src/embedApi.d.ts +0 -67
  62. package/src/encoder/accessor.js +0 -82
  63. package/src/encoder/accessor.test.js +0 -47
  64. package/src/encoder/encoder.js +0 -394
  65. package/src/encoder/encoder.test.js +0 -98
  66. package/src/fonts/Lato-Regular.json +0 -1267
  67. package/src/fonts/Lato-Regular.png +0 -0
  68. package/src/fonts/OFL.txt +0 -93
  69. package/src/fonts/README.md +0 -3
  70. package/src/fonts/bmFont.d.ts +0 -58
  71. package/src/fonts/bmFontManager.js +0 -357
  72. package/src/fonts/bmFontMetrics.js +0 -108
  73. package/src/genome/genome.js +0 -317
  74. package/src/genome/genome.test.js +0 -188
  75. package/src/genome/genomeStore.js +0 -54
  76. package/src/genome/locusFormat.js +0 -31
  77. package/src/genome/scaleIndex.d.ts +0 -38
  78. package/src/genome/scaleIndex.js +0 -166
  79. package/src/genome/scaleIndex.test.js +0 -78
  80. package/src/genome/scaleLocus.d.ts +0 -11
  81. package/src/genome/scaleLocus.js +0 -108
  82. package/src/genome/scaleLocus.test.js +0 -4
  83. package/src/genomeSpy.js +0 -784
  84. package/src/gl/arrayBuilder.js +0 -199
  85. package/src/gl/dataToVertices.js +0 -636
  86. package/src/gl/includes/common.glsl +0 -63
  87. package/src/gl/includes/picking.fragment.glsl +0 -1
  88. package/src/gl/includes/picking.vertex.glsl +0 -27
  89. package/src/gl/includes/sampleFacet.glsl +0 -107
  90. package/src/gl/includes/scales.glsl +0 -112
  91. package/src/gl/link.fragment.glsl +0 -18
  92. package/src/gl/link.vertex.glsl +0 -111
  93. package/src/gl/point.fragment.glsl +0 -123
  94. package/src/gl/point.vertex.glsl +0 -129
  95. package/src/gl/rect.fragment.glsl +0 -51
  96. package/src/gl/rect.vertex.glsl +0 -114
  97. package/src/gl/rule.fragment.glsl +0 -52
  98. package/src/gl/rule.vertex.glsl +0 -89
  99. package/src/gl/text.fragment.glsl +0 -31
  100. package/src/gl/text.vertex.glsl +0 -246
  101. package/src/gl/webGLHelper.js +0 -489
  102. package/src/img/bowtie.svg +0 -1
  103. package/src/img/genomespy-favicon.svg +0 -34
  104. package/src/index.html +0 -11
  105. package/src/index.js +0 -128
  106. package/src/marks/link.js +0 -175
  107. package/src/marks/mark.js +0 -975
  108. package/src/marks/markUtils.js +0 -125
  109. package/src/marks/pointMark.js +0 -251
  110. package/src/marks/rectMark.js +0 -241
  111. package/src/marks/rule.js +0 -250
  112. package/src/marks/text.js +0 -278
  113. package/src/node_modules/.vitest/results.json +0 -1
  114. package/src/scale/colorUtils.js +0 -184
  115. package/src/scale/glslScaleGenerator.js +0 -488
  116. package/src/scale/scale.js +0 -451
  117. package/src/scale/scale.test.js +0 -324
  118. package/src/scale/ticks.js +0 -203
  119. package/src/scale/ticks.test.js +0 -40
  120. package/src/singlePageApp.js +0 -13
  121. package/src/spec/axis.d.ts +0 -296
  122. package/src/spec/channel.d.ts +0 -430
  123. package/src/spec/data.d.ts +0 -196
  124. package/src/spec/font.d.ts +0 -15
  125. package/src/spec/genome.d.ts +0 -35
  126. package/src/spec/mark.d.ts +0 -429
  127. package/src/spec/root.d.ts +0 -17
  128. package/src/spec/sampleView.d.ts +0 -180
  129. package/src/spec/scale.d.ts +0 -273
  130. package/src/spec/title.d.ts +0 -102
  131. package/src/spec/tooltip.d.ts +0 -9
  132. package/src/spec/transform.d.ts +0 -479
  133. package/src/spec/view.d.ts +0 -201
  134. package/src/styles/genome-spy.scss +0 -153
  135. package/src/tooltip/dataTooltipHandler.js +0 -64
  136. package/src/tooltip/refseqGeneTooltipHandler.js +0 -78
  137. package/src/tooltip/tooltipHandler.ts +0 -12
  138. package/src/types/filetypes.d.ts +0 -14
  139. package/src/types/flatqueue.d.ts +0 -53
  140. package/src/types/glsl.d.ts +0 -4
  141. package/src/types/internmap.d.ts +0 -22
  142. package/src/types/object.d.ts +0 -21
  143. package/src/types/vega-loader.d.ts +0 -1
  144. package/src/types/vega-scale.d.ts +0 -60
  145. package/src/utils/addBaseUrl.js +0 -19
  146. package/src/utils/addBaseUrl.test.js +0 -22
  147. package/src/utils/animator.js +0 -83
  148. package/src/utils/arrayUtils.js +0 -61
  149. package/src/utils/binnedIndex.js +0 -167
  150. package/src/utils/binnedIndex.test.js +0 -155
  151. package/src/utils/clamp.js +0 -8
  152. package/src/utils/cloner.js +0 -34
  153. package/src/utils/cloner.test.js +0 -24
  154. package/src/utils/coalesce.js +0 -11
  155. package/src/utils/coalesce.test.js +0 -16
  156. package/src/utils/concatIterables.js +0 -26
  157. package/src/utils/concatIterables.test.js +0 -8
  158. package/src/utils/debounce.js +0 -37
  159. package/src/utils/domainArray.js +0 -216
  160. package/src/utils/domainArray.test.js +0 -130
  161. package/src/utils/eerp.js +0 -13
  162. package/src/utils/expression.js +0 -32
  163. package/src/utils/field.js +0 -28
  164. package/src/utils/formatObject.js +0 -31
  165. package/src/utils/indexer.js +0 -43
  166. package/src/utils/indexer.test.js +0 -47
  167. package/src/utils/inertia.js +0 -124
  168. package/src/utils/interactionEvent.js +0 -33
  169. package/src/utils/iterateNestedMaps.js +0 -21
  170. package/src/utils/iterateNestedMaps.test.js +0 -33
  171. package/src/utils/kWayMerge.js +0 -42
  172. package/src/utils/kWayMerge.test.js +0 -26
  173. package/src/utils/layout/flexLayout.js +0 -368
  174. package/src/utils/layout/flexLayout.test.js +0 -311
  175. package/src/utils/layout/grid.js +0 -95
  176. package/src/utils/layout/grid.test.js +0 -71
  177. package/src/utils/layout/padding.js +0 -120
  178. package/src/utils/layout/point.js +0 -23
  179. package/src/utils/layout/rectangle.js +0 -288
  180. package/src/utils/layout/rectangle.test.js +0 -172
  181. package/src/utils/mergeObjects.js +0 -99
  182. package/src/utils/mergeObjects.test.js +0 -42
  183. package/src/utils/numberExtractor.js +0 -24
  184. package/src/utils/numberExtractor.test.js +0 -6
  185. package/src/utils/point.js +0 -14
  186. package/src/utils/propertyCacher.js +0 -70
  187. package/src/utils/propertyCacher.test.js +0 -85
  188. package/src/utils/propertyCoalescer.js +0 -42
  189. package/src/utils/propertyCoalescer.test.js +0 -22
  190. package/src/utils/reservationMap.js +0 -103
  191. package/src/utils/reservationMap.test.js +0 -20
  192. package/src/utils/scaleNull.js +0 -19
  193. package/src/utils/setOperations.js +0 -75
  194. package/src/utils/smoothstep.js +0 -10
  195. package/src/utils/throttle.js +0 -34
  196. package/src/utils/topK.js +0 -76
  197. package/src/utils/topK.test.js +0 -64
  198. package/src/utils/transition.js +0 -74
  199. package/src/utils/ui/tooltip.js +0 -189
  200. package/src/utils/url.js +0 -22
  201. package/src/utils/variableTools.js +0 -24
  202. package/src/utils/variableTools.test.js +0 -13
  203. package/src/view/axisResolution.js +0 -140
  204. package/src/view/axisResolution.test.js +0 -201
  205. package/src/view/axisView.js +0 -747
  206. package/src/view/concatView.js +0 -45
  207. package/src/view/containerView.js +0 -159
  208. package/src/view/facetView.js +0 -491
  209. package/src/view/flowBuilder.js +0 -367
  210. package/src/view/flowBuilder.test.js +0 -125
  211. package/src/view/gridView.js +0 -786
  212. package/src/view/implicitRootView.js +0 -14
  213. package/src/view/importView.js +0 -19
  214. package/src/view/layerView.js +0 -74
  215. package/src/view/rendering.d.ts +0 -44
  216. package/src/view/renderingContext/compositeViewRenderingContext.js +0 -51
  217. package/src/view/renderingContext/deferredViewRenderingContext.js +0 -176
  218. package/src/view/renderingContext/layoutRecorderViewRenderingContext.js +0 -128
  219. package/src/view/renderingContext/simpleViewRenderingContext.js +0 -64
  220. package/src/view/renderingContext/svgViewRenderingContext.js +0 -125
  221. package/src/view/renderingContext/viewRenderingContext.js +0 -41
  222. package/src/view/scaleResolution.js +0 -791
  223. package/src/view/scaleResolution.test.js +0 -572
  224. package/src/view/scaleResolutionApi.d.ts +0 -40
  225. package/src/view/testUtils.js +0 -51
  226. package/src/view/title.js +0 -165
  227. package/src/view/unitView.js +0 -382
  228. package/src/view/view.js +0 -612
  229. package/src/view/view.test.js +0 -214
  230. package/src/view/viewContext.d.ts +0 -62
  231. package/src/view/viewFactory.js +0 -181
  232. package/src/view/viewFactory.test.js +0 -17
  233. package/src/view/viewUtils.js +0 -327
  234. 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
- });
@@ -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
- }