@opendata-ai/openchart-engine 8.0.0-rc.8 → 8.0.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/index.d.ts +149 -12
- package/dist/index.js +894 -171
- package/dist/index.js.map +1 -1
- package/package.json +3 -4
- package/src/__test-fixtures__/specs.ts +0 -182
- package/src/__tests__/__snapshots__/compile-snapshot.test.ts.snap +0 -2339
- package/src/__tests__/annotation-behavior.test.ts +0 -852
- package/src/__tests__/axes.test.ts +0 -1579
- package/src/__tests__/compile-animation.test.ts +0 -161
- package/src/__tests__/compile-chart.test.ts +0 -1303
- package/src/__tests__/compile-footnotes.test.ts +0 -277
- package/src/__tests__/compile-layer.test.ts +0 -969
- package/src/__tests__/compile-snapshot.test.ts +0 -156
- package/src/__tests__/compound-labels.test.ts +0 -147
- package/src/__tests__/dimensions.test.ts +0 -918
- package/src/__tests__/encoding-sugar.test.ts +0 -390
- package/src/__tests__/facet.test.ts +0 -215
- package/src/__tests__/helpers/invariants.ts +0 -299
- package/src/__tests__/known-bugs.test.ts +0 -566
- package/src/__tests__/layout-fuzz.test.ts +0 -358
- package/src/__tests__/layout-invariants.test.ts +0 -535
- package/src/__tests__/legend.test.ts +0 -721
- package/src/__tests__/mark-keys.test.ts +0 -294
- package/src/__tests__/ranking-recipes.test.ts +0 -260
- package/src/__tests__/rotation.test.ts +0 -83
- package/src/__tests__/scales.test.ts +0 -323
- package/src/__tests__/series-search.test.ts +0 -92
- package/src/__tests__/spec-sugar.test.ts +0 -801
- package/src/__tests__/you-draw-it.test.ts +0 -160
- package/src/annotations/__tests__/compute.test.ts +0 -1672
- package/src/annotations/__tests__/geometry.test.ts +0 -66
- package/src/annotations/__tests__/placement-fuzz.test.ts +0 -256
- package/src/annotations/__tests__/placement-invariants.test.ts +0 -345
- package/src/annotations/__tests__/placement.test.ts +0 -316
- package/src/annotations/__tests__/resolve-text.test.ts +0 -788
- package/src/annotations/__tests__/rich-text.test.ts +0 -91
- package/src/annotations/__tests__/thinning.test.ts +0 -285
- package/src/annotations/collisions.ts +0 -326
- package/src/annotations/compute.ts +0 -333
- package/src/annotations/constants.ts +0 -162
- package/src/annotations/geometry.ts +0 -376
- package/src/annotations/move.ts +0 -135
- package/src/annotations/placement.ts +0 -636
- package/src/annotations/position.ts +0 -131
- package/src/annotations/resolve-range.ts +0 -117
- package/src/annotations/resolve-refline.ts +0 -157
- package/src/annotations/resolve-text.ts +0 -545
- package/src/annotations/rich-text.ts +0 -65
- package/src/annotations/thinning.ts +0 -190
- package/src/barlist/__tests__/compile-barlist.test.ts +0 -200
- package/src/barlist/compile-barlist.ts +0 -391
- package/src/barlist/types.ts +0 -28
- package/src/charts/__tests__/post-process.test.ts +0 -237
- package/src/charts/__tests__/registry.test.ts +0 -116
- package/src/charts/__tests__/utils.test.ts +0 -195
- package/src/charts/_shared/__tests__/density-filter.test.ts +0 -32
- package/src/charts/_shared/density-filter.ts +0 -26
- package/src/charts/_shared/format-label-value.ts +0 -16
- package/src/charts/bar/__tests__/compute.test.ts +0 -934
- package/src/charts/bar/__tests__/gradient-orient.test.ts +0 -127
- package/src/charts/bar/__tests__/labels.test.ts +0 -292
- package/src/charts/bar/compute.ts +0 -539
- package/src/charts/bar/index.ts +0 -60
- package/src/charts/bar/labels.ts +0 -311
- package/src/charts/beeswarm/__tests__/compute.test.ts +0 -280
- package/src/charts/beeswarm/__tests__/dodge.test.ts +0 -148
- package/src/charts/beeswarm/compute.ts +0 -203
- package/src/charts/beeswarm/dodge.ts +0 -155
- package/src/charts/beeswarm/index.ts +0 -32
- package/src/charts/builtin.ts +0 -75
- package/src/charts/calendar/__tests__/compute.test.ts +0 -417
- package/src/charts/calendar/compute.ts +0 -319
- package/src/charts/calendar/index.ts +0 -32
- package/src/charts/column/__tests__/compute.test.ts +0 -540
- package/src/charts/column/__tests__/labels.test.ts +0 -179
- package/src/charts/column/compute.ts +0 -493
- package/src/charts/column/index.ts +0 -53
- package/src/charts/column/labels.ts +0 -229
- package/src/charts/dot/__tests__/compute.test.ts +0 -380
- package/src/charts/dot/__tests__/labels.test.ts +0 -98
- package/src/charts/dot/compute.ts +0 -285
- package/src/charts/dot/index.ts +0 -62
- package/src/charts/dot/labels.ts +0 -121
- package/src/charts/line/__tests__/compute.test.ts +0 -1194
- package/src/charts/line/__tests__/curves.test.ts +0 -51
- package/src/charts/line/__tests__/labels.test.ts +0 -94
- package/src/charts/line/__tests__/mark-options.test.ts +0 -175
- package/src/charts/line/area.ts +0 -484
- package/src/charts/line/compute.ts +0 -356
- package/src/charts/line/curves.ts +0 -85
- package/src/charts/line/index.ts +0 -176
- package/src/charts/line/labels.ts +0 -177
- package/src/charts/parliament/__tests__/compute.test.ts +0 -411
- package/src/charts/parliament/compute.ts +0 -313
- package/src/charts/parliament/index.ts +0 -32
- package/src/charts/pie/__tests__/compute.test.ts +0 -384
- package/src/charts/pie/__tests__/labels.test.ts +0 -132
- package/src/charts/pie/compute.ts +0 -324
- package/src/charts/pie/index.ts +0 -49
- package/src/charts/pie/labels.ts +0 -143
- package/src/charts/post-process.ts +0 -229
- package/src/charts/range/__tests__/compute.test.ts +0 -486
- package/src/charts/range/compute.ts +0 -273
- package/src/charts/range/index.ts +0 -82
- package/src/charts/range/labels.ts +0 -169
- package/src/charts/rect/__tests__/compute.test.ts +0 -120
- package/src/charts/rect/index.ts +0 -127
- package/src/charts/registry.ts +0 -72
- package/src/charts/rule/index.ts +0 -139
- package/src/charts/scatter/__tests__/compute.test.ts +0 -488
- package/src/charts/scatter/__tests__/trendline.test.ts +0 -191
- package/src/charts/scatter/compute.ts +0 -192
- package/src/charts/scatter/index.ts +0 -46
- package/src/charts/scatter/trendline.ts +0 -100
- package/src/charts/text/__tests__/compute.test.ts +0 -307
- package/src/charts/text/index.ts +0 -141
- package/src/charts/tick/__tests__/compute.test.ts +0 -75
- package/src/charts/tick/index.ts +0 -99
- package/src/charts/utils.ts +0 -170
- package/src/charts/waffle/__tests__/compute.test.ts +0 -305
- package/src/charts/waffle/compute.ts +0 -197
- package/src/charts/waffle/index.ts +0 -31
- package/src/compile/__tests__/color-scale-range.test.ts +0 -158
- package/src/compile/__tests__/color-scale-reverse.test.ts +0 -89
- package/src/compile/__tests__/data-clip.test.ts +0 -127
- package/src/compile/__tests__/fill-patterns.test.ts +0 -154
- package/src/compile/__tests__/size-scale.test.ts +0 -108
- package/src/compile/__tests__/watermark-obstacle.test.ts +0 -93
- package/src/compile/color-scale-range.ts +0 -101
- package/src/compile/data-clip.ts +0 -48
- package/src/compile/fill-patterns.ts +0 -74
- package/src/compile/layer.ts +0 -626
- package/src/compile/size-scale.ts +0 -141
- package/src/compile/spec-sugar.ts +0 -758
- package/src/compile/watermark-obstacle.ts +0 -54
- package/src/compile/you-draw-it.ts +0 -123
- package/src/compile.ts +0 -1450
- package/src/compiler/__tests__/a11y-warnings.test.ts +0 -148
- package/src/compiler/__tests__/animation.test.ts +0 -177
- package/src/compiler/__tests__/compile.test.ts +0 -87
- package/src/compiler/__tests__/fixtures/vl-parity/axis-null.json +0 -19
- package/src/compiler/__tests__/fixtures/vl-parity/color-value.json +0 -20
- package/src/compiler/__tests__/fixtures/vl-parity/count-aggregate.json +0 -22
- package/src/compiler/__tests__/fixtures/vl-parity/data-values.json +0 -19
- package/src/compiler/__tests__/fixtures/vl-parity/layer-axis-null.json +0 -14
- package/src/compiler/__tests__/fixtures/vl-parity/layer-count.json +0 -34
- package/src/compiler/__tests__/fixtures/vl-parity/layer-data-values.json +0 -22
- package/src/compiler/__tests__/fixtures/vl-parity/layer-legend-null.json +0 -41
- package/src/compiler/__tests__/fixtures/vl-parity/layer-scheme.json +0 -38
- package/src/compiler/__tests__/fixtures/vl-parity/layer-sort.json +0 -28
- package/src/compiler/__tests__/fixtures/vl-parity/layer-theta.json +0 -28
- package/src/compiler/__tests__/fixtures/vl-parity/layer-title.json +0 -30
- package/src/compiler/__tests__/fixtures/vl-parity/layer-value-def.json +0 -29
- package/src/compiler/__tests__/fixtures/vl-parity/legend-null.json +0 -32
- package/src/compiler/__tests__/fixtures/vl-parity/scheme.json +0 -25
- package/src/compiler/__tests__/fixtures/vl-parity/sort-by-value.json +0 -19
- package/src/compiler/__tests__/fixtures/vl-parity/theta-arc.json +0 -19
- package/src/compiler/__tests__/fixtures/vl-parity/title-subtitle.json +0 -21
- package/src/compiler/__tests__/fixtures/vl-parity/width-height.json +0 -23
- package/src/compiler/__tests__/keys.test.ts +0 -83
- package/src/compiler/__tests__/normalize-highlight.test.ts +0 -103
- package/src/compiler/__tests__/normalize.test.ts +0 -399
- package/src/compiler/__tests__/sparkline-defaults.test.ts +0 -153
- package/src/compiler/__tests__/validate-did-you-mean.test.ts +0 -170
- package/src/compiler/__tests__/validate-highlight.test.ts +0 -112
- package/src/compiler/__tests__/validate-near-miss.test.ts +0 -251
- package/src/compiler/__tests__/validate.test.ts +0 -629
- package/src/compiler/__tests__/vl-parity.test.ts +0 -68
- package/src/compiler/a11y-warnings.ts +0 -110
- package/src/compiler/animation.ts +0 -142
- package/src/compiler/index.ts +0 -47
- package/src/compiler/keys.ts +0 -55
- package/src/compiler/normalize.ts +0 -734
- package/src/compiler/sparkline-defaults.ts +0 -138
- package/src/compiler/types.ts +0 -241
- package/src/compiler/validate.ts +0 -2041
- package/src/endpoint-labels/__tests__/compute.test.ts +0 -587
- package/src/endpoint-labels/compute.ts +0 -621
- package/src/endpoint-labels/constants.ts +0 -54
- package/src/endpoint-labels/format.ts +0 -60
- package/src/endpoint-labels/predict.ts +0 -139
- package/src/format/__tests__/field-format.test.ts +0 -164
- package/src/format/field-format.ts +0 -27
- package/src/geo/__tests__/compile-map.test.ts +0 -1004
- package/src/geo/compile-map.ts +0 -1341
- package/src/geo/join.ts +0 -115
- package/src/geo/projections.ts +0 -45
- package/src/geo/types.ts +0 -26
- package/src/graphs/__tests__/community.test.ts +0 -228
- package/src/graphs/__tests__/compile-graph.test.ts +0 -396
- package/src/graphs/__tests__/encoding.test.ts +0 -415
- package/src/graphs/community.ts +0 -92
- package/src/graphs/compile-graph.ts +0 -329
- package/src/graphs/encoding.ts +0 -356
- package/src/graphs/types.ts +0 -106
- package/src/index.ts +0 -177
- package/src/layout/__tests__/metrics.test.ts +0 -97
- package/src/layout/__tests__/scales-highlight.test.ts +0 -192
- package/src/layout/axes/rotation.ts +0 -152
- package/src/layout/axes/thinning.ts +0 -98
- package/src/layout/axes/ticks.ts +0 -409
- package/src/layout/axes.ts +0 -757
- package/src/layout/dimensions.ts +0 -912
- package/src/layout/facet.ts +0 -91
- package/src/layout/gridlines.ts +0 -84
- package/src/layout/metrics.ts +0 -132
- package/src/layout/plan.ts +0 -631
- package/src/layout/scales.ts +0 -1053
- package/src/layout/shared.ts +0 -44
- package/src/legend/__tests__/continuous.test.ts +0 -318
- package/src/legend/__tests__/redundancy.test.ts +0 -108
- package/src/legend/__tests__/size.test.ts +0 -348
- package/src/legend/__tests__/suppression.test.ts +0 -382
- package/src/legend/compute.ts +0 -747
- package/src/legend/continuous.ts +0 -327
- package/src/legend/size.ts +0 -407
- package/src/legend/suppression.ts +0 -226
- package/src/legend/wrap.ts +0 -117
- package/src/sankey/__tests__/compile-sankey.test.ts +0 -458
- package/src/sankey/__tests__/layout.test.ts +0 -165
- package/src/sankey/__tests__/node-label-wrap.test.ts +0 -114
- package/src/sankey/__tests__/node-sort.test.ts +0 -45
- package/src/sankey/compile-sankey.ts +0 -706
- package/src/sankey/layout.ts +0 -184
- package/src/sankey/types.ts +0 -41
- package/src/tables/__tests__/bar-column.test.ts +0 -147
- package/src/tables/__tests__/category-colors.test.ts +0 -230
- package/src/tables/__tests__/compile-table.test.ts +0 -236
- package/src/tables/__tests__/format-cells.test.ts +0 -143
- package/src/tables/__tests__/heatmap.test.ts +0 -148
- package/src/tables/__tests__/pagination.test.ts +0 -78
- package/src/tables/__tests__/search.test.ts +0 -94
- package/src/tables/__tests__/sort.test.ts +0 -107
- package/src/tables/__tests__/sparkline.test.ts +0 -122
- package/src/tables/bar-column.ts +0 -94
- package/src/tables/category-colors.ts +0 -78
- package/src/tables/compile-table.ts +0 -427
- package/src/tables/format-cells.ts +0 -115
- package/src/tables/heatmap.ts +0 -141
- package/src/tables/pagination.ts +0 -46
- package/src/tables/search.ts +0 -66
- package/src/tables/sort.ts +0 -69
- package/src/tables/sparkline.ts +0 -113
- package/src/tables/utils.ts +0 -16
- package/src/tilemap/__tests__/compile-tilemap.test.ts +0 -576
- package/src/tilemap/compile-tilemap.ts +0 -755
- package/src/tilemap/layout.ts +0 -172
- package/src/tilemap/types.ts +0 -33
- package/src/tooltips/__tests__/compute.test.ts +0 -582
- package/src/tooltips/compute.ts +0 -700
- package/src/transforms/__tests__/aggregate.test.ts +0 -159
- package/src/transforms/__tests__/bin.test.ts +0 -88
- package/src/transforms/__tests__/calculate.test.ts +0 -146
- package/src/transforms/__tests__/conditional.test.ts +0 -127
- package/src/transforms/__tests__/filter-relative.test.ts +0 -202
- package/src/transforms/__tests__/filter.test.ts +0 -59
- package/src/transforms/__tests__/fold.test.ts +0 -79
- package/src/transforms/__tests__/index.test.ts +0 -93
- package/src/transforms/__tests__/predicates.test.ts +0 -193
- package/src/transforms/__tests__/timeunit.test.ts +0 -129
- package/src/transforms/__tests__/window.test.ts +0 -286
- package/src/transforms/aggregate.ts +0 -131
- package/src/transforms/bin.ts +0 -87
- package/src/transforms/calculate.ts +0 -60
- package/src/transforms/conditional.ts +0 -46
- package/src/transforms/filter.ts +0 -122
- package/src/transforms/fold.ts +0 -49
- package/src/transforms/index.ts +0 -60
- package/src/transforms/predicates.ts +0 -123
- package/src/transforms/timeunit.ts +0 -88
- package/src/transforms/window.ts +0 -185
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared `size` channel scale.
|
|
3
|
-
*
|
|
4
|
-
* Three marks map a quantitative field onto a visual magnitude, and each used to
|
|
5
|
-
* build this scale inline with the same six lines and a different pair of
|
|
6
|
-
* constants. A size legend has to resolve the *same* scale the marks resolve or
|
|
7
|
-
* the key silently lies about what a big circle means, so the builder lives in
|
|
8
|
-
* one place and everyone -- marks and legend -- calls it.
|
|
9
|
-
*
|
|
10
|
-
* The curve is the one thing that genuinely differs, and it is a perceptual
|
|
11
|
-
* call, not a preference:
|
|
12
|
-
*
|
|
13
|
-
* - `sqrt` for circles (scatter, beeswarm). Perceived magnitude of a disc tracks
|
|
14
|
-
* its *area*, and area goes as r^2, so radius must go as sqrt(value).
|
|
15
|
-
* - `linear` for glyphs (text). A word reads by its *height*, which is linear in
|
|
16
|
-
* font size. Running font size through sqrt would be cargo-culting the bubble
|
|
17
|
-
* math onto a channel that doesn't share its geometry.
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
import type { DataRow, EncodingChannel } from '@opendata-ai/openchart-core';
|
|
21
|
-
import { max, min } from 'd3-array';
|
|
22
|
-
import { scaleLinear, scaleSqrt } from 'd3-scale';
|
|
23
|
-
|
|
24
|
-
/** How a size value maps onto its visual magnitude. */
|
|
25
|
-
export type SizeCurve = 'sqrt' | 'linear';
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Per-mark size-scale defaults.
|
|
29
|
-
*
|
|
30
|
-
* These live here, next to the builder, rather than in each mark's compute
|
|
31
|
-
* module -- because the size *legend* needs the exact same numbers, and a key
|
|
32
|
-
* whose circles are a different size from the bubbles they explain is worse
|
|
33
|
-
* than no key. One definition, imported by both, so they cannot drift.
|
|
34
|
-
*/
|
|
35
|
-
export const SIZE_SCALE_DEFAULTS = {
|
|
36
|
-
/** Scatter bubbles. */
|
|
37
|
-
point: { curve: 'sqrt', range: [3, 30] },
|
|
38
|
-
/**
|
|
39
|
-
* Beeswarm dots. Tighter than scatter's 3-30: large radii make the dodge
|
|
40
|
-
* layout stack dots far past the lane, so the default cap stays low.
|
|
41
|
-
*/
|
|
42
|
-
beeswarm: { curve: 'sqrt', range: [2, 10] },
|
|
43
|
-
/**
|
|
44
|
-
* Text glyphs. Linear, not sqrt -- a word reads by its height, which is
|
|
45
|
-
* linear in font size, where a disc reads by its area.
|
|
46
|
-
*/
|
|
47
|
-
text: { curve: 'linear', range: [11, 32] },
|
|
48
|
-
/** Map point dots. sqrt for area-proportional, tighter range than scatter. */
|
|
49
|
-
mapPoint: { curve: 'sqrt', range: [3, 20] },
|
|
50
|
-
} as const satisfies Record<string, { curve: SizeCurve; range: readonly [number, number] }>;
|
|
51
|
-
|
|
52
|
-
/** Size-scale options for a mark, or null when the mark has no size channel. */
|
|
53
|
-
export function sizeScaleDefaultsFor(
|
|
54
|
-
markType: string,
|
|
55
|
-
): { curve: SizeCurve; range: [number, number] } | null {
|
|
56
|
-
const found = (
|
|
57
|
-
SIZE_SCALE_DEFAULTS as Record<
|
|
58
|
-
string,
|
|
59
|
-
{ curve: SizeCurve; range: readonly [number, number] } | undefined
|
|
60
|
-
>
|
|
61
|
-
)[markType];
|
|
62
|
-
return found ? { curve: found.curve, range: [found.range[0], found.range[1]] } : null;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/** A resolved size scale plus the domain and range it was built from. */
|
|
66
|
-
export interface ResolvedSizeScale {
|
|
67
|
-
/** Maps a data value to a visual magnitude (radius, or font size). */
|
|
68
|
-
scale: (value: number) => number;
|
|
69
|
-
/** The domain actually used: an explicit `scale.domain` wins over the data extent. */
|
|
70
|
-
domain: [number, number];
|
|
71
|
-
/** The output range actually used: an explicit `scale.range` wins over the default. */
|
|
72
|
-
range: [number, number];
|
|
73
|
-
/** The field the scale reads. */
|
|
74
|
-
field: string;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Build the size scale for a quantitative `size` encoding.
|
|
79
|
-
*
|
|
80
|
-
* Author overrides come from the encoding, mirroring the color path: an explicit
|
|
81
|
-
* `scale.domain` (e.g. `[0, 900]`) keeps the largest datum below the max radius
|
|
82
|
-
* so dense clusters don't blob together, and an explicit `scale.range` caps the
|
|
83
|
-
* output magnitudes.
|
|
84
|
-
*
|
|
85
|
-
* The scale is **clamped**: a datum outside an explicit domain renders at the
|
|
86
|
-
* range endpoint rather than running off to an absurd radius. A legend built
|
|
87
|
-
* from this must therefore key the *domain*, not the data extent -- above an
|
|
88
|
-
* explicit `domain[1]` every datum looks identical.
|
|
89
|
-
*
|
|
90
|
-
* Holes (`null`, `undefined`, `''`) are not zeros -- they are absent data --
|
|
91
|
-
* and are dropped before the extent is fitted rather than coerced into it.
|
|
92
|
-
*
|
|
93
|
-
* @returns null when there is no size field, or when the domain is degenerate
|
|
94
|
-
* (no finite values, or every value identical). A zero-width domain would map
|
|
95
|
-
* every datum to the range's first value, so there is nothing to encode and
|
|
96
|
-
* nothing to legend.
|
|
97
|
-
*/
|
|
98
|
-
export function buildSizeScale(
|
|
99
|
-
sizeEncoding: EncodingChannel | undefined,
|
|
100
|
-
data: readonly DataRow[],
|
|
101
|
-
options: { curve: SizeCurve; range: readonly [number, number] },
|
|
102
|
-
): ResolvedSizeScale | null {
|
|
103
|
-
if (!sizeEncoding || !('field' in sizeEncoding) || !sizeEncoding.field) return null;
|
|
104
|
-
const field = sizeEncoding.field;
|
|
105
|
-
|
|
106
|
-
const values: number[] = [];
|
|
107
|
-
for (const row of data) {
|
|
108
|
-
const raw = row[field];
|
|
109
|
-
// Reject holes before coercing: `Number(null)` and `Number('')` are both a
|
|
110
|
-
// finite 0, so a null would enter the extent as a real zero and drag the
|
|
111
|
-
// domain floor down -- rescaling every genuine mark, and drawing a
|
|
112
|
-
// minimum-size mark for a datum that has no size at all.
|
|
113
|
-
if (raw == null || raw === '') continue;
|
|
114
|
-
const v = Number(raw);
|
|
115
|
-
if (Number.isFinite(v)) values.push(v);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
const explicitDomain = sizeEncoding.scale?.domain as [number, number] | undefined;
|
|
119
|
-
|
|
120
|
-
// Nothing to fit a domain to. An explicit domain still stands on its own --
|
|
121
|
-
// it is the author's, not the data's -- but without one there is no extent,
|
|
122
|
-
// and `min([]) ?? 0` / `max([]) ?? 1` would fabricate a bogus [0, 1].
|
|
123
|
-
if (!explicitDomain && values.length === 0) return null;
|
|
124
|
-
|
|
125
|
-
const domain: [number, number] = explicitDomain ?? [min(values) as number, max(values) as number];
|
|
126
|
-
|
|
127
|
-
// A zero-width domain maps every datum to range[0]: no magnitude is encoded,
|
|
128
|
-
// so callers fall back to their static default rather than render a field of
|
|
129
|
-
// identical minimum-size marks.
|
|
130
|
-
if (!Number.isFinite(domain[0]) || !Number.isFinite(domain[1]) || domain[0] >= domain[1]) {
|
|
131
|
-
return null;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
const explicitRange = sizeEncoding.scale?.range as [number, number] | undefined;
|
|
135
|
-
const range: [number, number] = explicitRange ?? [options.range[0], options.range[1]];
|
|
136
|
-
|
|
137
|
-
const build = options.curve === 'linear' ? scaleLinear : scaleSqrt;
|
|
138
|
-
const scale = build().domain(domain).range(range).clamp(true);
|
|
139
|
-
|
|
140
|
-
return { scale: (value: number) => scale(value), domain, range, field };
|
|
141
|
-
}
|