@opendata-ai/openchart-engine 8.0.0-rc.9 → 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 +804 -155
- 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 -2401
- 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 -630
- 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 -1503
- 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 -1128
- package/src/geo/compile-map.ts +0 -1376
- package/src/geo/join.ts +0 -115
- package/src/geo/projections.ts +0 -65
- 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 -748
- 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,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Compute the brand watermark obstacle rect.
|
|
3
|
-
*
|
|
4
|
-
* The watermark is right-aligned on the same baseline as the first bottom
|
|
5
|
-
* chrome element (source, byline, or footer), offset below the chart area
|
|
6
|
-
* by the x-axis extent (tick labels + axis title). Returns null when the
|
|
7
|
-
* watermark is disabled so callers can skip obstacle collection entirely.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import type { Rect, ResolvedTheme } from '@opendata-ai/openchart-core';
|
|
11
|
-
import { BRAND_RESERVE_WIDTH } from '@opendata-ai/openchart-core';
|
|
12
|
-
import type { AxesResult } from '../layout/axes';
|
|
13
|
-
import type { LayoutDimensions } from '../layout/dimensions';
|
|
14
|
-
|
|
15
|
-
/** Height of the watermark element used for obstacle avoidance. */
|
|
16
|
-
const WATERMARK_HEIGHT = 30;
|
|
17
|
-
|
|
18
|
-
/** Vertical padding below the x-axis label when an axis title is present. */
|
|
19
|
-
const X_AXIS_EXTENT_WITH_LABEL = 48;
|
|
20
|
-
|
|
21
|
-
/** Vertical padding below the x-axis ticks when no axis title is present. */
|
|
22
|
-
const X_AXIS_EXTENT_TICKS_ONLY = 26;
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Compute the rect occupied by the watermark, or null when it is disabled.
|
|
26
|
-
*
|
|
27
|
-
* @param dims - Layout dimensions (for total width and chrome positions).
|
|
28
|
-
* @param watermark - Whether the watermark is enabled for this chart.
|
|
29
|
-
* @param axes - Computed axes (the x-axis determines how far below the chart the watermark sits).
|
|
30
|
-
* @param theme - Resolved theme (padding + fallback spacing).
|
|
31
|
-
*/
|
|
32
|
-
export function computeWatermarkObstacle(
|
|
33
|
-
dims: LayoutDimensions,
|
|
34
|
-
watermark: boolean,
|
|
35
|
-
axes: AxesResult,
|
|
36
|
-
theme: ResolvedTheme,
|
|
37
|
-
): Rect | null {
|
|
38
|
-
if (!watermark) return null;
|
|
39
|
-
|
|
40
|
-
const chartArea = dims.chartArea;
|
|
41
|
-
const brandPadding = theme.spacing.padding;
|
|
42
|
-
const brandX = dims.total.width - brandPadding - BRAND_RESERVE_WIDTH;
|
|
43
|
-
const xAxisExtent = axes.x?.label
|
|
44
|
-
? X_AXIS_EXTENT_WITH_LABEL
|
|
45
|
-
: axes.x
|
|
46
|
-
? X_AXIS_EXTENT_TICKS_ONLY
|
|
47
|
-
: 0;
|
|
48
|
-
const firstBottomChrome = dims.chrome.source ?? dims.chrome.byline ?? dims.chrome.footer;
|
|
49
|
-
const brandY = firstBottomChrome
|
|
50
|
-
? chartArea.y + chartArea.height + xAxisExtent + firstBottomChrome.y
|
|
51
|
-
: chartArea.y + chartArea.height + xAxisExtent + theme.spacing.chartToFooter;
|
|
52
|
-
|
|
53
|
-
return { x: brandX, y: brandY, width: BRAND_RESERVE_WIDTH, height: WATERMARK_HEIGHT };
|
|
54
|
-
}
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* "You draw it" resolution: computes the pixel geometry the vanilla adapter
|
|
3
|
-
* needs to render the hatched drawing region, capture pointer input, and
|
|
4
|
-
* mask/reveal the real line.
|
|
5
|
-
*
|
|
6
|
-
* Runs AFTER marks are computed (needs the target LineMark's pixel points)
|
|
7
|
-
* and needs the x scale to resolve `from` to a pixel position. Single-series
|
|
8
|
-
* line charts only; validateSpec rejects other combinations before this runs.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import type {
|
|
12
|
-
LineMark,
|
|
13
|
-
Mark,
|
|
14
|
-
Point,
|
|
15
|
-
Rect,
|
|
16
|
-
ResolvedYouDrawIt,
|
|
17
|
-
YouDrawItConfig,
|
|
18
|
-
YouDrawItSample,
|
|
19
|
-
} from '@opendata-ai/openchart-core';
|
|
20
|
-
import { resolvePosition } from '../annotations/position';
|
|
21
|
-
import type { ResolvedScales } from '../layout/scales';
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Linear-invert two reference pixels through the y scale so the vanilla layer
|
|
25
|
-
* can map a drawn pixel-y back to a data value without the scale object.
|
|
26
|
-
* `.invert()` exists on continuous scales (linear/log/time/pow/sqrt/symlog);
|
|
27
|
-
* for band/ordinal y (never valid with a quantitative line here) it is
|
|
28
|
-
* undefined and this returns undefined, so onReveal falls back to pixel
|
|
29
|
-
* fractions.
|
|
30
|
-
*/
|
|
31
|
-
function resolveYInvert(scaleY: ResolvedScales['y'], area: Rect): ResolvedYouDrawIt['yInvert'] {
|
|
32
|
-
if (!scaleY) return undefined;
|
|
33
|
-
const invert = (scaleY.scale as { invert?: (px: number) => number }).invert;
|
|
34
|
-
if (typeof invert !== 'function') return undefined;
|
|
35
|
-
const topData = invert.call(scaleY.scale, area.y);
|
|
36
|
-
const bottomData = invert.call(scaleY.scale, area.y + area.height);
|
|
37
|
-
if (!Number.isFinite(topData) || !Number.isFinite(bottomData)) return undefined;
|
|
38
|
-
return {
|
|
39
|
-
topPixel: area.y,
|
|
40
|
-
bottomPixel: area.y + area.height,
|
|
41
|
-
topData,
|
|
42
|
-
bottomData,
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Resolve `youDrawIt` into pixel geometry, or undefined when the config is
|
|
48
|
-
* absent, no line mark was produced (e.g. empty data), or `from` doesn't
|
|
49
|
-
* resolve to a position on the x scale.
|
|
50
|
-
*/
|
|
51
|
-
export function resolveYouDrawIt(
|
|
52
|
-
config: YouDrawItConfig | undefined,
|
|
53
|
-
marks: Mark[],
|
|
54
|
-
scales: ResolvedScales,
|
|
55
|
-
chartArea: Rect,
|
|
56
|
-
xField: string | undefined,
|
|
57
|
-
): ResolvedYouDrawIt | undefined {
|
|
58
|
-
if (!config || !scales.x) return undefined;
|
|
59
|
-
|
|
60
|
-
const targetLine = marks.find((m): m is LineMark => m.type === 'line');
|
|
61
|
-
if (!targetLine || targetLine.points.length === 0) return undefined;
|
|
62
|
-
|
|
63
|
-
const fromX = resolvePosition(config.from, scales.x);
|
|
64
|
-
if (fromX === null) return undefined;
|
|
65
|
-
|
|
66
|
-
// Pair each pixel-x sample at/after `from` with its data-x value, so the
|
|
67
|
-
// vanilla layer can report the guess in data coordinates on reveal. Prefer
|
|
68
|
-
// dataPoints (carries the original datum) and fall back to the raw point x
|
|
69
|
-
// when dataPoints is absent (e.g. a single-point degenerate line).
|
|
70
|
-
const seen = new Set<number>();
|
|
71
|
-
const samples: YouDrawItSample[] = [];
|
|
72
|
-
if (targetLine.dataPoints?.length) {
|
|
73
|
-
for (const dp of targetLine.dataPoints) {
|
|
74
|
-
if (dp.x < fromX - 0.5) continue;
|
|
75
|
-
if (seen.has(dp.x)) continue;
|
|
76
|
-
seen.add(dp.x);
|
|
77
|
-
const raw = xField ? dp.datum[xField] : undefined;
|
|
78
|
-
const xValue = typeof raw === 'string' || typeof raw === 'number' ? raw : dp.x;
|
|
79
|
-
samples.push({ px: dp.x, xValue });
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
if (samples.length === 0) {
|
|
83
|
-
// No dataPoints (or none past `from`): fall back to geometric point xs so
|
|
84
|
-
// drawing still snaps, reporting pixel x as the identity when we can't
|
|
85
|
-
// recover the data value.
|
|
86
|
-
for (const p of targetLine.points) {
|
|
87
|
-
if (p.x < fromX - 0.5) continue;
|
|
88
|
-
if (seen.has(p.x)) continue;
|
|
89
|
-
seen.add(p.x);
|
|
90
|
-
samples.push({ px: p.x, xValue: p.x });
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
samples.sort((a, b) => a.px - b.px);
|
|
94
|
-
if (samples.length === 0) return undefined;
|
|
95
|
-
|
|
96
|
-
let comparisonPoints: Point[] | undefined;
|
|
97
|
-
if (config.comparisonLine && config.comparisonLine.length > 0) {
|
|
98
|
-
const resolved: Point[] = [];
|
|
99
|
-
for (const { x, y } of config.comparisonLine) {
|
|
100
|
-
const px = resolvePosition(x, scales.x);
|
|
101
|
-
const py = scales.y ? resolvePosition(y, scales.y) : null;
|
|
102
|
-
if (px !== null && py !== null) resolved.push({ x: px, y: py });
|
|
103
|
-
}
|
|
104
|
-
if (resolved.length > 0) {
|
|
105
|
-
resolved.sort((a, b) => a.x - b.x);
|
|
106
|
-
comparisonPoints = resolved;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
const yInvert = resolveYInvert(scales.y, chartArea);
|
|
111
|
-
|
|
112
|
-
return {
|
|
113
|
-
fromX,
|
|
114
|
-
area: chartArea,
|
|
115
|
-
samples,
|
|
116
|
-
prompt: config.prompt ?? 'Draw your guess',
|
|
117
|
-
revealLabel: config.revealLabel ?? 'Show me',
|
|
118
|
-
lineColor: targetLine.stroke,
|
|
119
|
-
targetSeriesKey: targetLine.seriesKey,
|
|
120
|
-
...(yInvert ? { yInvert } : {}),
|
|
121
|
-
...(comparisonPoints ? { comparisonPoints } : {}),
|
|
122
|
-
};
|
|
123
|
-
}
|