@genome-spy/core 0.78.0 → 0.79.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle/{browser-KWU9rWZT.js → browser-CETrb2cm.js} +53 -33
- package/dist/bundle/esm-BdLYkz-m.js +248 -0
- package/dist/bundle/esm-BwiDsqSb.js +1367 -0
- package/dist/bundle/esm-CDFd1cjk.js +441 -0
- package/dist/bundle/{esm-DVOHLB1e.js → esm-CTUHLDbv.js} +30 -30
- package/dist/bundle/{esm-NIYEaYkc.js → esm-Cx-EbkOj.js} +13 -13
- package/dist/bundle/esm-DlYGqi79.js +128 -0
- package/dist/bundle/{esm-BygJiwh0.js → esm-k9p3oHkt.js} +133 -158
- package/dist/bundle/{esm-CT3ygiMq.js → esm-zAZJQO6D.js} +226 -212
- package/dist/bundle/index.es.js +14840 -11661
- package/dist/bundle/index.js +119 -108
- package/dist/bundle/{parquetRead-DG_-F5j5.js → parquetRead-Cad1SOVV.js} +473 -399
- package/dist/schema.json +18940 -6914
- package/dist/src/config/axisConfig.d.ts +2 -2
- package/dist/src/config/axisConfig.d.ts.map +1 -1
- package/dist/src/config/axisConfig.js +28 -44
- package/dist/src/config/configLayers.d.ts +45 -0
- package/dist/src/config/configLayers.d.ts.map +1 -0
- package/dist/src/config/configLayers.js +110 -0
- package/dist/src/config/defaultConfig.d.ts.map +1 -1
- package/dist/src/config/defaultConfig.js +8 -1
- package/dist/src/config/defaults/legendDefaults.d.ts +14 -0
- package/dist/src/config/defaults/legendDefaults.d.ts.map +1 -0
- package/dist/src/config/defaults/legendDefaults.js +46 -0
- package/dist/src/config/defaults/titleDefaults.d.ts.map +1 -1
- package/dist/src/config/defaults/titleDefaults.js +26 -18
- package/dist/src/config/legendConfig.d.ts +11 -0
- package/dist/src/config/legendConfig.d.ts.map +1 -0
- package/dist/src/config/legendConfig.js +63 -0
- package/dist/src/config/styleUtils.d.ts +8 -2
- package/dist/src/config/styleUtils.d.ts.map +1 -1
- package/dist/src/config/styleUtils.js +25 -1
- package/dist/src/config/themes.d.ts.map +1 -1
- package/dist/src/config/themes.js +21 -2
- package/dist/src/config/titleConfig.d.ts.map +1 -1
- package/dist/src/config/titleConfig.js +2 -18
- package/dist/src/data/collector.d.ts.map +1 -1
- package/dist/src/data/collector.js +40 -18
- package/dist/src/data/flowInit.d.ts +6 -0
- package/dist/src/data/flowInit.d.ts.map +1 -1
- package/dist/src/data/flowInit.js +1 -1
- package/dist/src/data/flowNode.d.ts +32 -0
- package/dist/src/data/flowNode.d.ts.map +1 -1
- package/dist/src/data/flowNode.js +59 -0
- package/dist/src/data/sources/lazy/bamSource.d.ts +0 -1
- package/dist/src/data/sources/lazy/bamSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/bamSource.js +39 -30
- package/dist/src/data/sources/lazy/bigBedSource.d.ts +0 -10
- package/dist/src/data/sources/lazy/bigBedSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/bigBedSource.js +127 -62
- package/dist/src/data/sources/lazy/bigWigSource.d.ts +2 -2
- package/dist/src/data/sources/lazy/bigWigSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/bigWigSource.js +234 -81
- package/dist/src/data/sources/lazy/gff3Source.d.ts +7 -3
- package/dist/src/data/sources/lazy/gff3Source.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/gff3Source.js +7 -8
- package/dist/src/data/sources/lazy/indexedFastaSource.d.ts +1 -1
- package/dist/src/data/sources/lazy/indexedFastaSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/indexedFastaSource.js +28 -19
- package/dist/src/data/sources/lazy/legendEntriesSource.d.ts +24 -0
- package/dist/src/data/sources/lazy/legendEntriesSource.d.ts.map +1 -0
- package/dist/src/data/sources/lazy/legendEntriesSource.js +217 -0
- package/dist/src/data/sources/lazy/legendGradientSource.d.ts +30 -0
- package/dist/src/data/sources/lazy/legendGradientSource.d.ts.map +1 -0
- package/dist/src/data/sources/lazy/legendGradientSource.js +388 -0
- package/dist/src/data/sources/lazy/mockLazySource.d.ts +4 -1
- package/dist/src/data/sources/lazy/mockLazySource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/mockLazySource.js +49 -4
- package/dist/src/data/sources/lazy/registerCoreLazySources.js +2 -0
- package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +3 -4
- package/dist/src/data/sources/lazy/tabixSource.d.ts +9 -4
- package/dist/src/data/sources/lazy/tabixSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/tabixSource.js +201 -70
- package/dist/src/data/sources/lazy/tabixTsvSource.d.ts +2 -3
- package/dist/src/data/sources/lazy/tabixTsvSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/tabixTsvSource.js +14 -12
- package/dist/src/data/sources/lazy/vcfSource.d.ts +7 -3
- package/dist/src/data/sources/lazy/vcfSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/vcfSource.js +7 -8
- package/dist/src/data/sources/urlDescriptor.d.ts +165 -0
- package/dist/src/data/sources/urlDescriptor.d.ts.map +1 -0
- package/dist/src/data/sources/urlDescriptor.js +473 -0
- package/dist/src/data/sources/urlDescriptorController.d.ts +25 -0
- package/dist/src/data/sources/urlDescriptorController.d.ts.map +1 -0
- package/dist/src/data/sources/urlDescriptorController.js +72 -0
- package/dist/src/data/sources/urlDescriptorState.d.ts +47 -0
- package/dist/src/data/sources/urlDescriptorState.d.ts.map +1 -0
- package/dist/src/data/sources/urlDescriptorState.js +129 -0
- package/dist/src/data/sources/urlSource.d.ts.map +1 -1
- package/dist/src/data/sources/urlSource.js +101 -61
- package/dist/src/data/transforms/packLegendLabels.d.ts +21 -0
- package/dist/src/data/transforms/packLegendLabels.d.ts.map +1 -0
- package/dist/src/data/transforms/packLegendLabels.js +189 -0
- package/dist/src/data/transforms/transformFactory.d.ts.map +1 -1
- package/dist/src/data/transforms/transformFactory.js +4 -0
- package/dist/src/data/transforms/truncateText.d.ts +27 -0
- package/dist/src/data/transforms/truncateText.d.ts.map +1 -0
- package/dist/src/data/transforms/truncateText.js +94 -0
- package/dist/src/debug/dataflowDebugSnapshot.d.ts +58 -0
- package/dist/src/debug/dataflowDebugSnapshot.d.ts.map +1 -0
- package/dist/src/debug/dataflowDebugSnapshot.js +159 -0
- package/dist/src/debug/markDebugSnapshot.d.ts +54 -0
- package/dist/src/debug/markDebugSnapshot.d.ts.map +1 -0
- package/dist/src/debug/markDebugSnapshot.js +100 -0
- package/dist/src/debug/paramDebugSnapshot.d.ts +53 -0
- package/dist/src/debug/paramDebugSnapshot.d.ts.map +1 -0
- package/dist/src/debug/paramDebugSnapshot.js +86 -0
- package/dist/src/debug/resolutionDebugSnapshot.d.ts +155 -0
- package/dist/src/debug/resolutionDebugSnapshot.d.ts.map +1 -0
- package/dist/src/debug/resolutionDebugSnapshot.js +291 -0
- package/dist/src/debug/valuePreview.d.ts +9 -0
- package/dist/src/debug/valuePreview.d.ts.map +1 -0
- package/dist/src/debug/valuePreview.js +57 -0
- package/dist/src/debug/viewDebugSnapshot.d.ts +131 -0
- package/dist/src/debug/viewDebugSnapshot.d.ts.map +1 -0
- package/dist/src/debug/viewDebugSnapshot.js +390 -0
- package/dist/src/embedFactory.d.ts.map +1 -1
- package/dist/src/embedFactory.js +6 -1
- package/dist/src/encoder/encoder.d.ts +2 -2
- package/dist/src/encoder/encoder.d.ts.map +1 -1
- package/dist/src/encoder/encoder.js +5 -4
- package/dist/src/fonts/bmFontManager.d.ts +1 -1
- package/dist/src/fonts/bmFontManager.d.ts.map +1 -1
- package/dist/src/fonts/bmFontManager.js +45 -10
- package/dist/src/fonts/textMetrics.d.ts +69 -0
- package/dist/src/fonts/textMetrics.d.ts.map +1 -0
- package/dist/src/fonts/textMetrics.js +73 -0
- package/dist/src/genomeSpy/headlessBootstrap.d.ts.map +1 -1
- package/dist/src/genomeSpy/headlessBootstrap.js +6 -0
- package/dist/src/genomeSpy/renderCoordinator.d.ts.map +1 -1
- package/dist/src/genomeSpy/renderCoordinator.js +25 -3
- package/dist/src/genomeSpy/viewDataInit.d.ts +14 -0
- package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -1
- package/dist/src/genomeSpy/viewDataInit.js +45 -8
- package/dist/src/genomeSpyBase.d.ts +6 -0
- package/dist/src/genomeSpyBase.d.ts.map +1 -1
- package/dist/src/genomeSpyBase.js +20 -3
- package/dist/src/gl/glslScaleGenerator.d.ts +17 -0
- package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
- package/dist/src/gl/glslScaleGenerator.js +39 -2
- package/dist/src/gl/includes/common.glsl.js +1 -1
- package/dist/src/gl/vertexRangeIndex.d.ts.map +1 -1
- package/dist/src/gl/vertexRangeIndex.js +4 -2
- package/dist/src/gl/webGLHelper.d.ts +1 -1
- package/dist/src/gl/webGLHelper.d.ts.map +1 -1
- package/dist/src/gl/webGLHelper.js +13 -8
- package/dist/src/marks/__snapshots__/shaderSnapshot.test.js.snap +140 -3
- package/dist/src/marks/mark.d.ts +47 -4
- package/dist/src/marks/mark.d.ts.map +1 -1
- package/dist/src/marks/mark.js +158 -54
- package/dist/src/marks/point.d.ts.map +1 -1
- package/dist/src/marks/point.js +4 -0
- package/dist/src/marks/point.vertex.glsl.js +1 -1
- package/dist/src/marks/text.d.ts +1 -1
- package/dist/src/marks/text.d.ts.map +1 -1
- package/dist/src/marks/text.js +2 -7
- package/dist/src/marks/text.vertex.glsl.js +1 -1
- package/dist/src/paramRuntime/paramUtils.d.ts +43 -9
- package/dist/src/paramRuntime/paramUtils.d.ts.map +1 -1
- package/dist/src/paramRuntime/paramUtils.js +61 -1
- package/dist/src/paramRuntime/viewParamRuntime.d.ts +32 -0
- package/dist/src/paramRuntime/viewParamRuntime.d.ts.map +1 -1
- package/dist/src/paramRuntime/viewParamRuntime.js +63 -0
- package/dist/src/scales/axisResolution.d.ts +35 -0
- package/dist/src/scales/axisResolution.d.ts.map +1 -1
- package/dist/src/scales/axisResolution.js +115 -7
- package/dist/src/scales/legendResolution.d.ts +83 -0
- package/dist/src/scales/legendResolution.d.ts.map +1 -0
- package/dist/src/scales/legendResolution.js +461 -0
- package/dist/src/scales/scaleResolution.d.ts +36 -0
- package/dist/src/scales/scaleResolution.d.ts.map +1 -1
- package/dist/src/scales/scaleResolution.js +59 -0
- package/dist/src/scales/viewLevelGuideConfig.d.ts +53 -0
- package/dist/src/scales/viewLevelGuideConfig.d.ts.map +1 -0
- package/dist/src/scales/viewLevelGuideConfig.js +224 -0
- package/dist/src/scales/viewLevelScaleConfig.d.ts.map +1 -1
- package/dist/src/scales/viewLevelScaleConfig.js +13 -2
- package/dist/src/spec/axis.d.ts +109 -3
- package/dist/src/spec/channel.d.ts +23 -4
- package/dist/src/spec/config.d.ts +59 -4
- package/dist/src/spec/data.d.ts +177 -17
- package/dist/src/spec/legend.d.ts +246 -0
- package/dist/src/spec/mark.d.ts +16 -4
- package/dist/src/spec/title.d.ts +58 -1
- package/dist/src/spec/transform.d.ts +149 -0
- package/dist/src/spec/view.d.ts +39 -6
- package/dist/src/types/embedApi.d.ts +262 -6
- package/dist/src/types/rendering.d.ts +19 -3
- package/dist/src/types/viewContext.d.ts +18 -2
- package/dist/src/utils/arrayUtils.d.ts +11 -0
- package/dist/src/utils/arrayUtils.d.ts.map +1 -1
- package/dist/src/utils/arrayUtils.js +23 -0
- package/dist/src/utils/suspension.d.ts +17 -0
- package/dist/src/utils/suspension.d.ts.map +1 -0
- package/dist/src/utils/suspension.js +41 -0
- package/dist/src/view/axisGridView.d.ts.map +1 -1
- package/dist/src/view/axisGridView.js +1 -4
- package/dist/src/view/axisView.d.ts +18 -2
- package/dist/src/view/axisView.d.ts.map +1 -1
- package/dist/src/view/axisView.js +180 -75
- package/dist/src/view/concatView.d.ts +10 -2
- package/dist/src/view/concatView.d.ts.map +1 -1
- package/dist/src/view/concatView.js +46 -9
- package/dist/src/view/containerMutationHelper.d.ts +20 -1
- package/dist/src/view/containerMutationHelper.d.ts.map +1 -1
- package/dist/src/view/containerMutationHelper.js +196 -33
- package/dist/src/view/facetView.d.ts +1 -1
- package/dist/src/view/gridView/gridChild.d.ts +54 -4
- package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
- package/dist/src/view/gridView/gridChild.js +301 -120
- package/dist/src/view/gridView/gridChildLegends.d.ts +57 -0
- package/dist/src/view/gridView/gridChildLegends.d.ts.map +1 -0
- package/dist/src/view/gridView/gridChildLegends.js +503 -0
- package/dist/src/view/gridView/gridView.d.ts +25 -0
- package/dist/src/view/gridView/gridView.d.ts.map +1 -1
- package/dist/src/view/gridView/gridView.js +454 -78
- package/dist/src/view/gridView/legendLayout.d.ts +26 -0
- package/dist/src/view/gridView/legendLayout.d.ts.map +1 -0
- package/dist/src/view/gridView/legendLayout.js +111 -0
- package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
- package/dist/src/view/gridView/scrollbar.js +1 -4
- package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
- package/dist/src/view/gridView/selectionRect.js +1 -4
- package/dist/src/view/gridView/separatorView.d.ts.map +1 -1
- package/dist/src/view/gridView/separatorView.js +1 -4
- package/dist/src/view/layerView.d.ts +9 -2
- package/dist/src/view/layerView.d.ts.map +1 -1
- package/dist/src/view/layerView.js +18 -1
- package/dist/src/view/layout/flexLayout.d.ts +20 -4
- package/dist/src/view/layout/flexLayout.d.ts.map +1 -1
- package/dist/src/view/layout/flexLayout.js +331 -31
- package/dist/src/view/layout/rectangle.d.ts +14 -0
- package/dist/src/view/layout/rectangle.d.ts.map +1 -1
- package/dist/src/view/layout/rectangle.js +40 -0
- package/dist/src/view/legend/legendEntries.d.ts +20 -0
- package/dist/src/view/legend/legendEntries.d.ts.map +1 -0
- package/dist/src/view/legend/legendEntries.js +21 -0
- package/dist/src/view/legendView.d.ts +134 -0
- package/dist/src/view/legendView.d.ts.map +1 -0
- package/dist/src/view/legendView.js +1611 -0
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts.map +1 -1
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.js +26 -4
- package/dist/src/view/renderingContext/clipOptions.d.ts +44 -0
- package/dist/src/view/renderingContext/clipOptions.d.ts.map +1 -0
- package/dist/src/view/renderingContext/clipOptions.js +140 -0
- package/dist/src/view/renderingContext/simpleViewRenderingContext.d.ts.map +1 -1
- package/dist/src/view/renderingContext/simpleViewRenderingContext.js +12 -1
- package/dist/src/view/resolutionPlanner.d.ts +2 -1
- package/dist/src/view/resolutionPlanner.d.ts.map +1 -1
- package/dist/src/view/resolutionPlanner.js +89 -25
- package/dist/src/view/testUtils.d.ts +4 -2
- package/dist/src/view/testUtils.d.ts.map +1 -1
- package/dist/src/view/testUtils.js +29 -7
- package/dist/src/view/titleView.d.ts +37 -0
- package/dist/src/view/titleView.d.ts.map +1 -0
- package/dist/src/view/titleView.js +584 -0
- package/dist/src/view/unitView.d.ts +3 -3
- package/dist/src/view/unitView.d.ts.map +1 -1
- package/dist/src/view/unitView.js +3 -2
- package/dist/src/view/view.d.ts +25 -24
- package/dist/src/view/view.d.ts.map +1 -1
- package/dist/src/view/view.js +121 -16
- package/dist/src/view/viewFactory.d.ts +2 -5
- package/dist/src/view/viewFactory.d.ts.map +1 -1
- package/dist/src/view/viewFactory.js +1 -2
- package/dist/src/view/viewIdentityRegistry.d.ts +37 -0
- package/dist/src/view/viewIdentityRegistry.d.ts.map +1 -0
- package/dist/src/view/viewIdentityRegistry.js +71 -0
- package/dist/src/view/viewMutationAcidTestUtils.d.ts +112 -0
- package/dist/src/view/viewMutationAcidTestUtils.d.ts.map +1 -0
- package/dist/src/view/viewMutationAcidTestUtils.js +234 -0
- package/dist/src/view/viewMutationApi.d.ts +42 -0
- package/dist/src/view/viewMutationApi.d.ts.map +1 -0
- package/dist/src/view/viewMutationApi.js +811 -0
- package/dist/src/view/viewSelectors.d.ts +10 -0
- package/dist/src/view/viewSelectors.d.ts.map +1 -1
- package/dist/src/view/viewSelectors.js +23 -1
- package/package.json +4 -4
- package/dist/bundle/esm-CuMSzCHy.js +0 -298
- package/dist/bundle/esm-DAnOffpD.js +0 -1426
- package/dist/bundle/esm-DMXpJXM4.js +0 -369
- package/dist/bundle/esm-DNtC3H80.js +0 -121
- package/dist/src/view/title.d.ts +0 -13
- package/dist/src/view/title.d.ts.map +0 -1
- package/dist/src/view/title.js +0 -154
- /package/dist/bundle/{AbortablePromiseCache-3gHJdF3E.js → AbortablePromiseCache-BTmAcN-t.js} +0 -0
- /package/dist/bundle/{esm-CuVa5T98.js → esm-VvpZ9hsq.js} +0 -0
- /package/dist/bundle/{chunk-DmhlhrBa.js → rolldown-runtime-Dy4uBu1J.js} +0 -0
|
@@ -12,6 +12,8 @@ import { isStepSize } from "../view.js";
|
|
|
12
12
|
* @typedef {object} SizeDef Size definition inspired by CSS flexbox
|
|
13
13
|
* @prop {number} [px] Size in pixels
|
|
14
14
|
* @prop {number} [grow] Share of remaining space
|
|
15
|
+
* @prop {number} [minPx] Minimum size in pixels
|
|
16
|
+
* @prop {number} [maxPx] Maximum size in pixels
|
|
15
17
|
*
|
|
16
18
|
* @typedef {object} LocSize One-dimensional location and size
|
|
17
19
|
* @prop {number} location
|
|
@@ -37,16 +39,17 @@ export function mapToPixelCoords(
|
|
|
37
39
|
spacing = spacing || 0;
|
|
38
40
|
offset = offset || 0;
|
|
39
41
|
|
|
40
|
-
|
|
41
|
-
let totalGrow = 0;
|
|
42
|
+
const itemSizes = resolveItemSizes(items, containerSize, spacing);
|
|
42
43
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
let totalSize = 0;
|
|
45
|
+
let nonZeroCount = 0;
|
|
46
|
+
for (let i = 0; i < items.length; i++) {
|
|
47
|
+
totalSize += itemSizes[i];
|
|
48
|
+
if (!isZeroSizeDef(items[i])) {
|
|
49
|
+
nonZeroCount++;
|
|
50
|
+
}
|
|
46
51
|
}
|
|
47
|
-
totalPx
|
|
48
|
-
|
|
49
|
-
const remainingSpace = Math.max(0, containerSize - totalPx);
|
|
52
|
+
const totalPx = totalSize + Math.max(0, nonZeroCount - 1) * spacing;
|
|
50
53
|
|
|
51
54
|
/** @type {function(number):number} x */
|
|
52
55
|
const round =
|
|
@@ -57,9 +60,8 @@ export function mapToPixelCoords(
|
|
|
57
60
|
/**
|
|
58
61
|
* Buffer zero-sized items so that their locations can be spread evenly.
|
|
59
62
|
* They can then be interpolated nicely.
|
|
60
|
-
* @type {SizeDef[]}
|
|
61
63
|
*/
|
|
62
|
-
|
|
64
|
+
let zeroCount = 0;
|
|
63
65
|
|
|
64
66
|
/** @type {LocSize[]} */
|
|
65
67
|
const results = [];
|
|
@@ -70,7 +72,7 @@ export function mapToPixelCoords(
|
|
|
70
72
|
* @param {boolean} inMiddle
|
|
71
73
|
*/
|
|
72
74
|
const flushZeroBuffer = (inMiddle) => {
|
|
73
|
-
const n =
|
|
75
|
+
const n = zeroCount;
|
|
74
76
|
if (!n) {
|
|
75
77
|
return;
|
|
76
78
|
}
|
|
@@ -86,7 +88,7 @@ export function mapToPixelCoords(
|
|
|
86
88
|
}
|
|
87
89
|
x += s;
|
|
88
90
|
|
|
89
|
-
|
|
91
|
+
zeroCount = 0;
|
|
90
92
|
};
|
|
91
93
|
|
|
92
94
|
let x = reverse ? Math.max(containerSize, totalPx) : 0 + offset;
|
|
@@ -100,13 +102,11 @@ export function mapToPixelCoords(
|
|
|
100
102
|
const size = items[i];
|
|
101
103
|
|
|
102
104
|
if (isZeroSizeDef(size)) {
|
|
103
|
-
|
|
105
|
+
zeroCount++;
|
|
104
106
|
} else {
|
|
105
107
|
flushZeroBuffer(results.length > 0);
|
|
106
108
|
|
|
107
|
-
const advance =
|
|
108
|
-
z(size.px) +
|
|
109
|
-
(totalGrow ? (z(size.grow) / totalGrow) * remainingSpace : 0);
|
|
109
|
+
const advance = itemSizes[i];
|
|
110
110
|
|
|
111
111
|
if (reverse) {
|
|
112
112
|
x -= advance;
|
|
@@ -139,7 +139,8 @@ export function mapToPixelCoords(
|
|
|
139
139
|
export function getMinimumSize(items, { spacing } = { spacing: 0 }) {
|
|
140
140
|
let minimumSize = 0;
|
|
141
141
|
for (const size of items) {
|
|
142
|
-
minimumSize +=
|
|
142
|
+
minimumSize +=
|
|
143
|
+
getSizeDefMinPx(size) + (isZeroSizeDef(size) ? 0 : spacing);
|
|
143
144
|
}
|
|
144
145
|
return Math.max(0, minimumSize - spacing);
|
|
145
146
|
}
|
|
@@ -151,12 +152,29 @@ export function getMinimumSize(items, { spacing } = { spacing: 0 }) {
|
|
|
151
152
|
export function getLargestSize(items) {
|
|
152
153
|
let px = 0;
|
|
153
154
|
let grow = 0;
|
|
155
|
+
let minPx = 0;
|
|
156
|
+
let maxPx = undefined;
|
|
157
|
+
let hasMaxPx = true;
|
|
154
158
|
for (const s of items) {
|
|
155
159
|
px = Math.max(px, s.px ?? 0);
|
|
156
160
|
grow = Math.max(grow, s.grow ?? 0);
|
|
161
|
+
minPx = Math.max(minPx, getSizeDefMinPx(s));
|
|
162
|
+
|
|
163
|
+
const sizeMaxPx = getSizeDefMaxPx(s);
|
|
164
|
+
if (sizeMaxPx === undefined) {
|
|
165
|
+
hasMaxPx = false;
|
|
166
|
+
} else {
|
|
167
|
+
maxPx =
|
|
168
|
+
maxPx === undefined ? sizeMaxPx : Math.max(maxPx, sizeMaxPx);
|
|
169
|
+
}
|
|
157
170
|
}
|
|
158
171
|
|
|
159
|
-
return {
|
|
172
|
+
return createSizeDef({
|
|
173
|
+
px,
|
|
174
|
+
grow,
|
|
175
|
+
minPx,
|
|
176
|
+
maxPx: hasMaxPx ? maxPx : undefined,
|
|
177
|
+
});
|
|
160
178
|
}
|
|
161
179
|
|
|
162
180
|
/**
|
|
@@ -172,12 +190,24 @@ export function isStretching(items) {
|
|
|
172
190
|
* @param {SizeDef[]} sizeDefs
|
|
173
191
|
*/
|
|
174
192
|
export function sumSizeDefs(sizeDefs) {
|
|
175
|
-
const sum = { px: 0, grow: 0 };
|
|
193
|
+
const sum = { px: 0, grow: 0, minPx: 0, maxPx: 0 };
|
|
194
|
+
let hasMaxPx = true;
|
|
176
195
|
for (const size of sizeDefs) {
|
|
177
196
|
sum.px += z(size.px);
|
|
178
197
|
sum.grow += z(size.grow);
|
|
198
|
+
sum.minPx += getSizeDefMinPx(size);
|
|
199
|
+
|
|
200
|
+
const sizeMaxPx = getSizeDefMaxPx(size);
|
|
201
|
+
if (sizeMaxPx === undefined) {
|
|
202
|
+
hasMaxPx = false;
|
|
203
|
+
} else {
|
|
204
|
+
sum.maxPx += sizeMaxPx;
|
|
205
|
+
}
|
|
179
206
|
}
|
|
180
|
-
|
|
207
|
+
if (!hasMaxPx) {
|
|
208
|
+
delete sum.maxPx;
|
|
209
|
+
}
|
|
210
|
+
return createSizeDef(sum);
|
|
181
211
|
}
|
|
182
212
|
|
|
183
213
|
export class FlexDimensions {
|
|
@@ -218,14 +248,8 @@ export class FlexDimensions {
|
|
|
218
248
|
*/
|
|
219
249
|
#addPx(width, height) {
|
|
220
250
|
return new FlexDimensions(
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
grow: this.width.grow,
|
|
224
|
-
},
|
|
225
|
-
{
|
|
226
|
-
px: (this.height.px ?? 0) + height,
|
|
227
|
-
grow: this.height.grow,
|
|
228
|
-
}
|
|
251
|
+
addPxToSizeDef(this.width, width),
|
|
252
|
+
addPxToSizeDef(this.height, height)
|
|
229
253
|
);
|
|
230
254
|
}
|
|
231
255
|
|
|
@@ -260,7 +284,7 @@ export const ZERO_FLEXDIMENSIONS = new FlexDimensions(
|
|
|
260
284
|
* @param {SizeDef} sizeDef
|
|
261
285
|
*/
|
|
262
286
|
export function isZeroSizeDef(sizeDef) {
|
|
263
|
-
return !sizeDef.px && !sizeDef.grow;
|
|
287
|
+
return !sizeDef.px && !sizeDef.grow && !sizeDef.minPx;
|
|
264
288
|
}
|
|
265
289
|
|
|
266
290
|
/**
|
|
@@ -278,7 +302,13 @@ function z(value) {
|
|
|
278
302
|
* @returns {spec is SizeDef}
|
|
279
303
|
*/
|
|
280
304
|
export function isSizeDef(spec) {
|
|
281
|
-
return
|
|
305
|
+
return (
|
|
306
|
+
spec &&
|
|
307
|
+
(isNumber(spec.px) ||
|
|
308
|
+
isNumber(spec.grow) ||
|
|
309
|
+
isNumber(spec.minPx) ||
|
|
310
|
+
isNumber(spec.maxPx))
|
|
311
|
+
);
|
|
282
312
|
}
|
|
283
313
|
|
|
284
314
|
/**
|
|
@@ -290,7 +320,8 @@ export function parseSizeDef(size) {
|
|
|
290
320
|
if (isStepSize(size)) {
|
|
291
321
|
throw new Error("parseSizeDef does not accept step-based sizes.");
|
|
292
322
|
} else if (isSizeDef(size)) {
|
|
293
|
-
|
|
323
|
+
validateSizeDef(size);
|
|
324
|
+
return createSizeDef(size);
|
|
294
325
|
} else if (isNumber(size)) {
|
|
295
326
|
return { px: size, grow: 0 };
|
|
296
327
|
} else if (size === "container") {
|
|
@@ -302,3 +333,272 @@ export function parseSizeDef(size) {
|
|
|
302
333
|
|
|
303
334
|
throw new Error(`Invalid sizeDef: ${size}`);
|
|
304
335
|
}
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Resolves final item sizes using GenomeSpy's simplified flex model. It is
|
|
339
|
+
* inspired by CSS Flexbox §9.7 "Resolving Flexible Lengths", but only covers
|
|
340
|
+
* grow-based free-space distribution and min/max constraints.
|
|
341
|
+
*
|
|
342
|
+
* https://www.w3.org/TR/css-flexbox-1/#resolve-flexible-lengths
|
|
343
|
+
*
|
|
344
|
+
* @param {SizeDef[]} items
|
|
345
|
+
* @param {number} containerSize
|
|
346
|
+
* @param {number} spacing
|
|
347
|
+
* @returns {number[]}
|
|
348
|
+
*/
|
|
349
|
+
function resolveItemSizes(items, containerSize, spacing) {
|
|
350
|
+
let hasConstraints = false;
|
|
351
|
+
for (const item of items) {
|
|
352
|
+
validateSizeDef(item);
|
|
353
|
+
hasConstraints ||= hasSizeConstraints(item);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
if (!hasConstraints) {
|
|
357
|
+
return resolveUnconstrainedItemSizes(items, containerSize, spacing);
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/** @type {number[]} */
|
|
361
|
+
const sizes = Array(items.length).fill(0);
|
|
362
|
+
/** @type {number[]} */
|
|
363
|
+
const flexIndices = [];
|
|
364
|
+
for (let i = 0; i < items.length; i++) {
|
|
365
|
+
if (!isZeroSizeDef(items[i])) {
|
|
366
|
+
flexIndices.push(i);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
const gapSize = Math.max(0, flexIndices.length - 1) * spacing;
|
|
371
|
+
const availableSize = Math.max(0, containerSize - gapSize);
|
|
372
|
+
|
|
373
|
+
// Fixed-size items do not participate in flex growth, but min/max still
|
|
374
|
+
// clamp them just like flex items with flex-grow: 0.
|
|
375
|
+
/** @type {Set<number>} */
|
|
376
|
+
const frozen = new Set();
|
|
377
|
+
|
|
378
|
+
for (const index of flexIndices) {
|
|
379
|
+
const item = items[index];
|
|
380
|
+
if (!z(item.grow)) {
|
|
381
|
+
sizes[index] = clampSize(z(item.px), item);
|
|
382
|
+
frozen.add(index);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
while (true) {
|
|
387
|
+
let totalBase = 0;
|
|
388
|
+
let totalGrow = 0;
|
|
389
|
+
let frozenSize = 0;
|
|
390
|
+
|
|
391
|
+
// Frozen items have their final size. Unfrozen items still contribute
|
|
392
|
+
// their base px size and grow factor to the next free-space pass.
|
|
393
|
+
for (const index of flexIndices) {
|
|
394
|
+
if (frozen.has(index)) {
|
|
395
|
+
frozenSize += sizes[index];
|
|
396
|
+
} else {
|
|
397
|
+
totalBase += z(items[index].px);
|
|
398
|
+
totalGrow += z(items[index].grow);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
if (!totalGrow) {
|
|
403
|
+
for (const index of flexIndices) {
|
|
404
|
+
if (!frozen.has(index)) {
|
|
405
|
+
sizes[index] = clampSize(z(items[index].px), items[index]);
|
|
406
|
+
frozen.add(index);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
break;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
const remainingSize = Math.max(
|
|
413
|
+
0,
|
|
414
|
+
availableSize - frozenSize - totalBase
|
|
415
|
+
);
|
|
416
|
+
let totalViolation = 0;
|
|
417
|
+
/** @type {number[]} */
|
|
418
|
+
const minViolations = [];
|
|
419
|
+
/** @type {number[]} */
|
|
420
|
+
const maxViolations = [];
|
|
421
|
+
|
|
422
|
+
// CSS Flexbox §9.7 first clamps every unfrozen item, then uses the
|
|
423
|
+
// aggregate violation to decide which side freezes. We follow that
|
|
424
|
+
// part so mixed min/max violations converge the same way.
|
|
425
|
+
for (const index of flexIndices) {
|
|
426
|
+
if (frozen.has(index)) {
|
|
427
|
+
continue;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
const item = items[index];
|
|
431
|
+
const targetSize =
|
|
432
|
+
z(item.px) + (z(item.grow) / totalGrow) * remainingSize;
|
|
433
|
+
const clampedSize = clampSize(targetSize, item);
|
|
434
|
+
sizes[index] = clampedSize;
|
|
435
|
+
|
|
436
|
+
const violation = clampedSize - targetSize;
|
|
437
|
+
totalViolation += violation;
|
|
438
|
+
if (violation > 0) {
|
|
439
|
+
minViolations.push(index);
|
|
440
|
+
} else if (violation < 0) {
|
|
441
|
+
maxViolations.push(index);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
if (!minViolations.length && !maxViolations.length) {
|
|
446
|
+
break;
|
|
447
|
+
} else if (totalViolation > 0) {
|
|
448
|
+
for (const index of minViolations) {
|
|
449
|
+
frozen.add(index);
|
|
450
|
+
}
|
|
451
|
+
} else if (totalViolation < 0) {
|
|
452
|
+
for (const index of maxViolations) {
|
|
453
|
+
frozen.add(index);
|
|
454
|
+
}
|
|
455
|
+
} else {
|
|
456
|
+
for (const index of flexIndices) {
|
|
457
|
+
frozen.add(index);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
return sizes;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/**
|
|
466
|
+
* Fast path for the common SizeDef shape that only uses px and grow.
|
|
467
|
+
*
|
|
468
|
+
* @param {SizeDef[]} items
|
|
469
|
+
* @param {number} containerSize
|
|
470
|
+
* @param {number} spacing
|
|
471
|
+
* @returns {number[]}
|
|
472
|
+
*/
|
|
473
|
+
function resolveUnconstrainedItemSizes(items, containerSize, spacing) {
|
|
474
|
+
let totalPx = 0;
|
|
475
|
+
let totalGrow = 0;
|
|
476
|
+
|
|
477
|
+
for (const size of items) {
|
|
478
|
+
totalPx += z(size.px) + (isZeroSizeDef(size) ? 0 : spacing);
|
|
479
|
+
totalGrow += z(size.grow);
|
|
480
|
+
}
|
|
481
|
+
totalPx -= spacing;
|
|
482
|
+
|
|
483
|
+
const remainingSpace = Math.max(0, containerSize - totalPx);
|
|
484
|
+
|
|
485
|
+
/** @type {number[]} */
|
|
486
|
+
const sizes = Array(items.length);
|
|
487
|
+
for (let i = 0; i < items.length; i++) {
|
|
488
|
+
const size = items[i];
|
|
489
|
+
sizes[i] = isZeroSizeDef(size)
|
|
490
|
+
? 0
|
|
491
|
+
: z(size.px) +
|
|
492
|
+
(totalGrow ? (z(size.grow) / totalGrow) * remainingSpace : 0);
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
return sizes;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* @param {SizeDef} size
|
|
500
|
+
*/
|
|
501
|
+
function validateSizeDef(size) {
|
|
502
|
+
if (
|
|
503
|
+
size.minPx !== undefined &&
|
|
504
|
+
size.maxPx !== undefined &&
|
|
505
|
+
size.minPx > size.maxPx
|
|
506
|
+
) {
|
|
507
|
+
throw new Error("SizeDef minPx cannot be greater than maxPx.");
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* @param {number} size
|
|
513
|
+
* @param {SizeDef} sizeDef
|
|
514
|
+
*/
|
|
515
|
+
function clampSize(size, sizeDef) {
|
|
516
|
+
return Math.min(
|
|
517
|
+
Math.max(size, sizeDef.minPx ?? 0),
|
|
518
|
+
sizeDef.maxPx ?? Infinity
|
|
519
|
+
);
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
/**
|
|
523
|
+
* @param {SizeDef} sizeDef
|
|
524
|
+
*/
|
|
525
|
+
export function getSizeDefMinPx(sizeDef) {
|
|
526
|
+
return clampSize(z(sizeDef.px), sizeDef);
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
/**
|
|
530
|
+
* @param {SizeDef} sizeDef
|
|
531
|
+
* @returns {number | undefined}
|
|
532
|
+
*/
|
|
533
|
+
export function getSizeDefMaxPx(sizeDef) {
|
|
534
|
+
return (
|
|
535
|
+
sizeDef.maxPx ??
|
|
536
|
+
(z(sizeDef.grow) ? undefined : getSizeDefMinPx(sizeDef))
|
|
537
|
+
);
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
/**
|
|
541
|
+
* @param {SizeDef} sizeDef
|
|
542
|
+
*/
|
|
543
|
+
function hasSizeConstraints(sizeDef) {
|
|
544
|
+
return sizeDef.minPx !== undefined || sizeDef.maxPx !== undefined;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
/**
|
|
548
|
+
* @param {SizeDef} sizeDef
|
|
549
|
+
* @param {number} px
|
|
550
|
+
* @returns {SizeDef}
|
|
551
|
+
*/
|
|
552
|
+
function addPxToSizeDef(sizeDef, px) {
|
|
553
|
+
return createSizeDef({
|
|
554
|
+
px: (sizeDef.px ?? 0) + px,
|
|
555
|
+
grow: sizeDef.grow,
|
|
556
|
+
minPx:
|
|
557
|
+
sizeDef.minPx === undefined
|
|
558
|
+
? undefined
|
|
559
|
+
: Math.max(0, sizeDef.minPx + px),
|
|
560
|
+
maxPx:
|
|
561
|
+
sizeDef.maxPx === undefined
|
|
562
|
+
? undefined
|
|
563
|
+
: Math.max(0, sizeDef.maxPx + px),
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* @param {SizeDef} sizeDef
|
|
569
|
+
* @returns {SizeDef}
|
|
570
|
+
*/
|
|
571
|
+
function createSizeDef(sizeDef) {
|
|
572
|
+
/** @type {SizeDef} */
|
|
573
|
+
const result = {};
|
|
574
|
+
const hasPx = sizeDef.px !== undefined;
|
|
575
|
+
const hasGrow = sizeDef.grow !== undefined;
|
|
576
|
+
const hasConstraints = hasSizeConstraints(sizeDef);
|
|
577
|
+
|
|
578
|
+
if (sizeDef.px) {
|
|
579
|
+
result.px = sizeDef.px;
|
|
580
|
+
} else if (sizeDef.px === 0) {
|
|
581
|
+
result.px = 0;
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
if (sizeDef.grow) {
|
|
585
|
+
result.grow = sizeDef.grow;
|
|
586
|
+
} else if (sizeDef.grow === 0) {
|
|
587
|
+
result.grow = 0;
|
|
588
|
+
} else if (!hasPx && !hasGrow && hasConstraints) {
|
|
589
|
+
result.grow = 1;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
if (sizeDef.minPx && sizeDef.minPx > z(sizeDef.px)) {
|
|
593
|
+
result.minPx = sizeDef.minPx;
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
if (
|
|
597
|
+
sizeDef.maxPx !== undefined &&
|
|
598
|
+
(z(result.grow) || sizeDef.maxPx < z(sizeDef.px))
|
|
599
|
+
) {
|
|
600
|
+
result.maxPx = sizeDef.maxPx;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
return result;
|
|
604
|
+
}
|
|
@@ -95,6 +95,20 @@ export default class Rectangle {
|
|
|
95
95
|
* @param {Rectangle} rectangle
|
|
96
96
|
*/
|
|
97
97
|
intersect(rectangle: Rectangle): Rectangle;
|
|
98
|
+
/**
|
|
99
|
+
* Returns an intersection of this and the other's x range. The y range is
|
|
100
|
+
* preserved.
|
|
101
|
+
*
|
|
102
|
+
* @param {Rectangle} rectangle
|
|
103
|
+
*/
|
|
104
|
+
intersectX(rectangle: Rectangle): Rectangle;
|
|
105
|
+
/**
|
|
106
|
+
* Returns an intersection of this and the other's y range. The x range is
|
|
107
|
+
* preserved.
|
|
108
|
+
*
|
|
109
|
+
* @param {Rectangle} rectangle
|
|
110
|
+
*/
|
|
111
|
+
intersectY(rectangle: Rectangle): Rectangle;
|
|
98
112
|
/**
|
|
99
113
|
* Returns an union of this and the other rectangle.
|
|
100
114
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rectangle.d.ts","sourceRoot":"","sources":["../../../../src/view/layout/rectangle.js"],"names":[],"mappings":"AAQA;;;;;;;GAOG;AACH;IACI;;;;;;OAMG;IACH,iBALW,MAAM,KACN,MAAM,SACN,MAAM,UACN,MAAM,aAShB;IAED,uBAA2C;IA+B3C;;;;;;OAMG;IACH,eALW,QAAQ,KACR,QAAQ,SACR,QAAQ,UACR,QAAQ,EAOlB;IAzCD;;;;OAIG;IACH,cAJW,IAAI,SACJ,MAAM,IAAG,MAAW,MAAM,CAAA,GACxB,QAAQ,CAiBpB;IAED;;OAEG;IACH,mBAFW,IAAI,YAId;IAUG,gBAAgB,CAAC,sBAAW;IAC5B,gBAAgB,CAAC,sBAAW;IAC5B,gBAAgB,CAAC,0BAAmB;IACpC,gBAAgB,CAAC,2BAAqB;IAG1C;;OAEG;IACH,SAFa,MAAM,CAIlB;IAED;;OAEG;IACH,SAFa,MAAM,CAIlB;IAED;;OAEG;IACH,aAFa,MAAM,CAIlB;IAED;;OAEG;IACH,cAFa,MAAM,CAIlB;IAED,iBAEC;IAED,iBAEC;IAED;;;;OAIG;IACH,kBAFW,SAAS,WAcnB;IAED;;;OAGG;IACH,cAFW,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,IAAG,MAAW,MAAM,CAAA,CAAC,CAAC,aAkB3D;IAED;;;;OAIG;IACH,aAHW,MAAM,IAAG,MAAW,MAAM,CAAA,KAC1B,MAAM,IAAG,MAAW,MAAM,CAAA,aAapC;IAED;;;;OAIG;IACH,uBAFW,SAAS,aAKnB;IAED;;;OAGG;IACH,gBAFW,OAAO,iCA0BjB;IAED;;;OAGG;IACH,gBAFW,OAAO,aAIjB;IAED;;;;OAIG;IACH,qBAFW,SAAS,aAenB;IAED;;;;OAIG;IACH,iBAFW,SAAS,aAenB;IAED;;OAEG;IACH,qBAEC;IAED;;;OAGG;IACH,qBAOC;IAED;;;;;OAKG;IACH,iBAHW,MAAM,KACN,MAAM,WAIhB;IAED;;;;;;OAMG;IACH,kBAJW,MAAM,KACN,MAAM,UACN,OAAO;;;MAWjB;IAED;;;;OAIG;IACH,oBAJW,MAAM,KACN,MAAM,UACN,OAAO;;;MAUjB;IAED,mBAEC;IAED,0BAMC;CACJ;;;;;
|
|
1
|
+
{"version":3,"file":"rectangle.d.ts","sourceRoot":"","sources":["../../../../src/view/layout/rectangle.js"],"names":[],"mappings":"AAQA;;;;;;;GAOG;AACH;IACI;;;;;;OAMG;IACH,iBALW,MAAM,KACN,MAAM,SACN,MAAM,UACN,MAAM,aAShB;IAED,uBAA2C;IA+B3C;;;;;;OAMG;IACH,eALW,QAAQ,KACR,QAAQ,SACR,QAAQ,UACR,QAAQ,EAOlB;IAzCD;;;;OAIG;IACH,cAJW,IAAI,SACJ,MAAM,IAAG,MAAW,MAAM,CAAA,GACxB,QAAQ,CAiBpB;IAED;;OAEG;IACH,mBAFW,IAAI,YAId;IAUG,gBAAgB,CAAC,sBAAW;IAC5B,gBAAgB,CAAC,sBAAW;IAC5B,gBAAgB,CAAC,0BAAmB;IACpC,gBAAgB,CAAC,2BAAqB;IAG1C;;OAEG;IACH,SAFa,MAAM,CAIlB;IAED;;OAEG;IACH,SAFa,MAAM,CAIlB;IAED;;OAEG;IACH,aAFa,MAAM,CAIlB;IAED;;OAEG;IACH,cAFa,MAAM,CAIlB;IAED,iBAEC;IAED,iBAEC;IAED;;;;OAIG;IACH,kBAFW,SAAS,WAcnB;IAED;;;OAGG;IACH,cAFW,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,IAAG,MAAW,MAAM,CAAA,CAAC,CAAC,aAkB3D;IAED;;;;OAIG;IACH,aAHW,MAAM,IAAG,MAAW,MAAM,CAAA,KAC1B,MAAM,IAAG,MAAW,MAAM,CAAA,aAapC;IAED;;;;OAIG;IACH,uBAFW,SAAS,aAKnB;IAED;;;OAGG;IACH,gBAFW,OAAO,iCA0BjB;IAED;;;OAGG;IACH,gBAFW,OAAO,aAIjB;IAED;;;;OAIG;IACH,qBAFW,SAAS,aAenB;IAED;;;;;OAKG;IACH,sBAFW,SAAS,aAcnB;IAED;;;;;OAKG;IACH,sBAFW,SAAS,aAcnB;IAED;;;;OAIG;IACH,iBAFW,SAAS,aAenB;IAED;;OAEG;IACH,qBAEC;IAED;;;OAGG;IACH,qBAOC;IAED;;;;;OAKG;IACH,iBAHW,MAAM,KACN,MAAM,WAIhB;IAED;;;;;;OAMG;IACH,kBAJW,MAAM,KACN,MAAM,UACN,OAAO;;;MAWjB;IAED;;;;OAIG;IACH,oBAJW,MAAM,KACN,MAAM,UACN,OAAO;;;MAUjB;IAED,mBAEC;IAED,0BAMC;CACJ;;;;;mBA3WY,CAAC,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,CAAC;;;;;sBAChC,OAAO,cAAc,EAAE,OAAO;;;;;uBAC9B,MAAM,MAAM"}
|
|
@@ -239,6 +239,46 @@ export default class Rectangle {
|
|
|
239
239
|
);
|
|
240
240
|
}
|
|
241
241
|
|
|
242
|
+
/**
|
|
243
|
+
* Returns an intersection of this and the other's x range. The y range is
|
|
244
|
+
* preserved.
|
|
245
|
+
*
|
|
246
|
+
* @param {Rectangle} rectangle
|
|
247
|
+
*/
|
|
248
|
+
intersectX(rectangle) {
|
|
249
|
+
if (this === rectangle || rectangle == null) {
|
|
250
|
+
return this;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return new Rectangle(
|
|
254
|
+
() => Math.max(this.x, rectangle.x),
|
|
255
|
+
this._passThrough("y"),
|
|
256
|
+
() =>
|
|
257
|
+
Math.min(this.x2, rectangle.x2) - Math.max(this.x, rectangle.x),
|
|
258
|
+
this._passThrough("height")
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Returns an intersection of this and the other's y range. The x range is
|
|
264
|
+
* preserved.
|
|
265
|
+
*
|
|
266
|
+
* @param {Rectangle} rectangle
|
|
267
|
+
*/
|
|
268
|
+
intersectY(rectangle) {
|
|
269
|
+
if (this === rectangle || rectangle == null) {
|
|
270
|
+
return this;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
return new Rectangle(
|
|
274
|
+
this._passThrough("x"),
|
|
275
|
+
() => Math.max(this.y, rectangle.y),
|
|
276
|
+
this._passThrough("width"),
|
|
277
|
+
() =>
|
|
278
|
+
Math.min(this.y2, rectangle.y2) - Math.max(this.y, rectangle.y)
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
|
|
242
282
|
/**
|
|
243
283
|
* Returns an union of this and the other rectangle.
|
|
244
284
|
*
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {object} LegendEntry
|
|
3
|
+
* @prop {string | number | boolean} value
|
|
4
|
+
* @prop {string} label
|
|
5
|
+
* @prop {number} _legendIndex
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Creates symbol legend entries from a discrete scale resolution.
|
|
9
|
+
*
|
|
10
|
+
* @param {Pick<import("../../scales/scaleResolution.js").default, "getDomain">} resolution
|
|
11
|
+
* @param {(value: import("../../spec/channel.js").Scalar) => string} [format]
|
|
12
|
+
* @returns {LegendEntry[]}
|
|
13
|
+
*/
|
|
14
|
+
export function createDiscreteLegendEntries(resolution: Pick<import("../../scales/scaleResolution.js").default, "getDomain">, format?: (value: import("../../spec/channel.js").Scalar) => string): LegendEntry[];
|
|
15
|
+
export type LegendEntry = {
|
|
16
|
+
value: string | number | boolean;
|
|
17
|
+
label: string;
|
|
18
|
+
_legendIndex: number;
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=legendEntries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legendEntries.d.ts","sourceRoot":"","sources":["../../../../src/view/legend/legendEntries.js"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;GAMG;AACH,wDAJW,IAAI,CAAC,OAAO,iCAAiC,EAAE,OAAO,EAAE,WAAW,CAAC,WACpE,CAAC,KAAK,EAAE,OAAO,uBAAuB,EAAE,MAAM,KAAK,MAAM,GACvD,WAAW,EAAE,CAQzB;;WAlBS,MAAM,GAAG,MAAM,GAAG,OAAO;WACzB,MAAM;kBACN,MAAM"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {object} LegendEntry
|
|
3
|
+
* @prop {string | number | boolean} value
|
|
4
|
+
* @prop {string} label
|
|
5
|
+
* @prop {number} _legendIndex
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Creates symbol legend entries from a discrete scale resolution.
|
|
10
|
+
*
|
|
11
|
+
* @param {Pick<import("../../scales/scaleResolution.js").default, "getDomain">} resolution
|
|
12
|
+
* @param {(value: import("../../spec/channel.js").Scalar) => string} [format]
|
|
13
|
+
* @returns {LegendEntry[]}
|
|
14
|
+
*/
|
|
15
|
+
export function createDiscreteLegendEntries(resolution, format = String) {
|
|
16
|
+
return resolution.getDomain().map((value, index) => ({
|
|
17
|
+
value,
|
|
18
|
+
label: format(value),
|
|
19
|
+
_legendIndex: index,
|
|
20
|
+
}));
|
|
21
|
+
}
|