@milaboratories/miplots4 1.0.136 → 1.0.137

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.
@@ -44,6 +44,7 @@ declare class ChartRenderer {
44
44
  notCalculatedProps: Partial<SVGLayerProps>;
45
45
  allDots: Dot[];
46
46
  visibleLabels: Label[];
47
+ dataFrame: DataFrame;
47
48
  clear(): void;
48
49
  init(node: HTMLElement): void;
49
50
  updateChartSizes(size: ScatterplotUmapSettingsImpl['chartSettings']['size']): void;
@@ -52,8 +53,8 @@ declare class ChartRenderer {
52
53
  createMainTitle(title: ScatterplotUmapSettingsImpl['chartSettings']['title']): void;
53
54
  updateMargins(): void;
54
55
  updateLegendSize(legend: ScatterplotUmapSettingsImpl['chartSettings']['legend'], legendLabels: ScatterplotUmapLegendInfo, grouping: ColumnName[], layers: ScatterplotUmapLayer[]): void;
55
- initSettings(dataFrame: DataFrame, dots: Dot[], chartSettings: ScatterplotUmapSettingsImpl['chartSettings'], dotExtents: DotsExtents, legendInfo: ScatterplotUmapLegendInfo, layers: ScatterplotUmapSettingsImpl['layers'], grouping: ColumnName[]): void;
56
- updateAes(dataFrame: DataFrame, legendInfo: ScatterplotUmapLegendInfo, layers: ScatterplotUmapSettingsImpl['layers']): void;
56
+ initSettings(dots: Dot[], chartSettings: ScatterplotUmapSettingsImpl['chartSettings'], dotExtents: DotsExtents, legendInfo: ScatterplotUmapLegendInfo, layers: ScatterplotUmapSettingsImpl['layers'], grouping: ColumnName[]): void;
57
+ updateAes(legendInfo: ScatterplotUmapLegendInfo, layers: ScatterplotUmapSettingsImpl['layers']): void;
57
58
  updatePointSize(): void;
58
59
  updateByLasso(): void;
59
60
  createQuadtree(dots: Dot[]): KDBush;
@@ -62,7 +63,7 @@ declare class ChartRenderer {
62
63
  render(dataFrame: DataFrame, settingsId: string, chartSettings: ScatterplotUmapSettingsImpl['chartSettings'], keyColumn: ColumnName | null, dots: Dot[], dotExtents: DotsExtents, dotsByGrouping: Record<string, Dot[]>, layers: ScatterplotUmapSettingsImpl['layers'], legendInfo: ScatterplotUmapLegendInfo, grouping: ColumnName[], onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'], onTooltipHintSwitch: (v: boolean) => void, onLassoControlsStateUpdate: (v: LassoControlsState) => void): void;
63
64
  renderWebglLayer(): void;
64
65
  onPolygonUpdate: (p: Polygon[]) => void;
65
- renderSvgLayer(dataFrame: DataFrame): void;
66
+ renderSvgLayer(): void;
66
67
  renderError(message: string): void;
67
68
  private computeLabels;
68
69
  private updateLabelsPosition;
@@ -1 +1 @@
1
- {"version":3,"file":"ChartRenderer.d.ts","sourceRoot":"","sources":["../../src/scatterplot-umap/ChartRenderer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChartRenderer.d.ts","sourceRoot":"","sources":["../../src/scatterplot-umap/ChartRenderer.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  var _ = Object.defineProperty;
2
2
  var k = (y, t, e) => t in y ? _(y, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : y[t] = e;
3
- var c = (y, t, e) => k(y, typeof t != "symbol" ? t + "" : t, e);
3
+ var h = (y, t, e) => k(y, typeof t != "symbol" ? t + "" : t, e);
4
4
  import { j as b } from "../node_modules/react/jsx-runtime.js";
5
5
  import K from "../node_modules/@d3fc/d3fc-chart/src/cartesian.js";
6
6
  import "../node_modules/@d3fc/d3fc-webgl/src/scale/scaleMapper.js";
@@ -12,13 +12,13 @@ import $ from "../node_modules/d3-zoom/src/zoom.js";
12
12
  import "../node_modules/d3-zoom/src/transform.js";
13
13
  import { createRoot as Q } from "../node_modules/react-dom/client.js";
14
14
  import { Error as J } from "../common/Error.js";
15
- import { BLACK as R, DEFAULT_HEIGHT as w, DEFAULT_WIDTH as D, TITLE_LINE_HEIGHT as Z, TITLE_MARGIN as tt } from "../constants.js";
15
+ import { BLACK as G, DEFAULT_HEIGHT as w, DEFAULT_WIDTH as D, TITLE_LINE_HEIGHT as Z, TITLE_MARGIN as tt } from "../constants.js";
16
16
  import { splitTextByWidth as et } from "../utils/splitTextByWidth.js";
17
- import { MIN_MARGIN as L, DEFAULT_DOT_AES as G } from "../scatterplot/constants.js";
17
+ import { MIN_MARGIN as C, DEFAULT_DOT_AES as F } from "../scatterplot/constants.js";
18
18
  import { createAesGetter as H } from "../scatterplot/utils/createAesGetter.js";
19
19
  import { getTicksAndFormat as it } from "../scatterplot/utils/getTicksAndFormat.js";
20
20
  import { createLabelPositioner as st } from "../scatterplot/utils/getVisibleLabels.js";
21
- import { isContinuousAes as A } from "../types/common.js";
21
+ import { isContinuousAes as R } from "../types/common.js";
22
22
  import "../types/discrete.js";
23
23
  import "../types/scatterplot.js";
24
24
  import "../types/heatmap.js";
@@ -27,56 +27,57 @@ import "../types/histogram.js";
27
27
  import "../types/bubble.js";
28
28
  import { getContinuousColorScale as ot } from "../utils/getContinuousColorScale.js";
29
29
  import { getContinuousLegendTicks as at } from "../utils/getContinuousLegendTicks.js";
30
- import { TextMeasurer as F } from "../utils/TextMeasurer/TextMeasurer.js";
30
+ import { TextMeasurer as A } from "../utils/TextMeasurer/TextMeasurer.js";
31
31
  import { SVGLayer as nt } from "./components/SVGLayer.js";
32
32
  import { PADDINGS as W, TITLE_LINE as I, LEGEND_OFFSET as rt } from "./constants.js";
33
33
  import lt from "../node_modules/@d3fc/d3fc-pointer/src/pointer.js";
34
34
  import ht from "../node_modules/kdbush/index.js";
35
35
  import { DataFrameProvider as ct } from "../common/useDataFrame.js";
36
- import { arrangeLegendParts as dt } from "../utils/arrangeLegendParts.js";
36
+ import { DataFrame as dt } from "../DataFrame.js";
37
+ import { arrangeLegendParts as mt } from "../utils/arrangeLegendParts.js";
37
38
  import { stringToNumberRgba as M, getColorWithFakeOpacity as P, GET_BLACK as O } from "./colors.js";
38
- import T from "../node_modules/d3-scale/src/linear.js";
39
+ import L from "../node_modules/d3-scale/src/linear.js";
39
40
  import V from "../node_modules/d3-scale/src/log.js";
40
41
  import N from "../node_modules/d3-selection/src/select.js";
41
- import mt from "../node_modules/d3-scale/src/ordinal.js";
42
- import pt from "../node_modules/d3-scale/src/symlog.js";
43
- import { sqrt as gt } from "../node_modules/d3-scale/src/pow.js";
44
- import ut from "../node_modules/d3-polygon/src/contains.js";
42
+ import pt from "../node_modules/d3-scale/src/ordinal.js";
43
+ import gt from "../node_modules/d3-scale/src/symlog.js";
44
+ import { sqrt as ut } from "../node_modules/d3-scale/src/pow.js";
45
+ import ft from "../node_modules/d3-polygon/src/contains.js";
45
46
  function B(y) {
46
47
  return y / 2.35 * (y / 2.35) * 64;
47
48
  }
48
49
  function E(y, t, e) {
49
- return e.length === 0 ? !0 : e.some((i) => i.closed && i.points.length > 2 && ut(i.points, [y, t]));
50
+ return e.length === 0 ? !0 : e.some((i) => i.closed && i.points.length > 2 && ft(i.points, [y, t]));
50
51
  }
51
52
  function U(y, t, e) {
52
- const i = e.find((o) => o.type === "dots"), r = e.find((o) => o.type === "curve");
53
+ const i = e.find((o) => o.type === "dots"), l = e.find((o) => o.type === "curve");
53
54
  return {
54
- dotFill: H(y, t, (i == null ? void 0 : i.aes.dotFill) ?? G.color, "dotFill"),
55
- dotSize: H(y, t, (i == null ? void 0 : i.aes.dotSize) ?? G.size, "dotSize"),
56
- lineType: H(y, t, (r == null ? void 0 : r.aes.lineShape) ?? "solid", "lineShape")
55
+ dotFill: H(y, t, (i == null ? void 0 : i.aes.dotFill) ?? F.color, "dotFill"),
56
+ dotSize: H(y, t, (i == null ? void 0 : i.aes.dotSize) ?? F.size, "dotSize"),
57
+ lineType: H(y, t, (l == null ? void 0 : l.aes.lineShape) ?? "solid", "lineShape")
57
58
  };
58
59
  }
59
- class oe {
60
+ class ne {
60
61
  constructor() {
61
- c(this, "reactRoot", null);
62
- c(this, "parentNode", null);
63
- c(this, "rootNode", null);
64
- c(this, "canvasNode", null);
65
- c(this, "svgLayerElement", null);
66
- c(this, "svgLayerComponent", /* @__PURE__ */ b.jsx(b.Fragment, {}));
67
- c(this, "aesGetters", {
62
+ h(this, "reactRoot", null);
63
+ h(this, "parentNode", null);
64
+ h(this, "rootNode", null);
65
+ h(this, "canvasNode", null);
66
+ h(this, "svgLayerElement", null);
67
+ h(this, "svgLayerComponent", /* @__PURE__ */ b.jsx(b.Fragment, {}));
68
+ h(this, "aesGetters", {
68
69
  dotSize: () => 2,
69
- dotFill: () => R,
70
+ dotFill: () => G,
70
71
  lineType: () => "solid"
71
72
  });
72
- c(this, "tools", null);
73
- c(this, "margins", {
74
- top: L,
75
- bottom: L,
76
- left: L,
77
- right: L
73
+ h(this, "tools", null);
74
+ h(this, "margins", {
75
+ top: C,
76
+ bottom: C,
77
+ left: C,
78
+ right: C
78
79
  });
79
- c(this, "chartSizes", {
80
+ h(this, "chartSizes", {
80
81
  chartWidth: D,
81
82
  // width of single chart
82
83
  chartHeight: w,
@@ -86,33 +87,34 @@ class oe {
86
87
  totalHeight: w
87
88
  // width of all charts in charts height, plus bottom axis, plus top title
88
89
  });
89
- c(this, "scales", {
90
- x: T().domain([0, 10]).range([0, D]),
91
- y: T().domain([0, 10]).range([w, 0]),
92
- xOriginal: T().domain([0, 10]).range([0, D]),
93
- yOriginal: T().domain([0, 10]).range([w, 0])
90
+ h(this, "scales", {
91
+ x: L().domain([0, 10]).range([0, D]),
92
+ y: L().domain([0, 10]).range([w, 0]),
93
+ xOriginal: L().domain([0, 10]).range([0, D]),
94
+ yOriginal: L().domain([0, 10]).range([w, 0])
94
95
  });
95
- c(this, "polygons", []);
96
- c(this, "onPolygonUpdateOutside", () => {
96
+ h(this, "polygons", []);
97
+ h(this, "onPolygonUpdateOutside", () => {
97
98
  });
98
- c(this, "onTooltipHintSwitch", () => {
99
+ h(this, "onTooltipHintSwitch", () => {
99
100
  });
100
- c(this, "onLassoControlsStateUpdate", () => {
101
+ h(this, "onLassoControlsStateUpdate", () => {
101
102
  });
102
- c(this, "zoomTransform", null);
103
- c(this, "zoomStateKey", "");
104
- c(this, "selectedDot", null);
105
- c(this, "captionsSizes", {
103
+ h(this, "zoomTransform", null);
104
+ h(this, "zoomStateKey", "");
105
+ h(this, "selectedDot", null);
106
+ h(this, "captionsSizes", {
106
107
  xAxisCaptionsWidth: 30,
107
108
  yAxisCaptionsWidth: 100
108
109
  });
109
- c(this, "mainTitle", []);
110
+ h(this, "mainTitle", []);
110
111
  // can be multiline
111
- c(this, "legend", { width: 0, height: 0, items: [] });
112
- c(this, "notCalculatedProps", {});
113
- c(this, "allDots", []);
114
- c(this, "visibleLabels", []);
115
- c(this, "onPolygonUpdate", (t) => {
112
+ h(this, "legend", { width: 0, height: 0, items: [] });
113
+ h(this, "notCalculatedProps", {});
114
+ h(this, "allDots", []);
115
+ h(this, "visibleLabels", []);
116
+ h(this, "dataFrame", new dt("", {}));
117
+ h(this, "onPolygonUpdate", (t) => {
116
118
  this.polygons = t, this.updateByLasso();
117
119
  const e = this.allDots.filter((i) => E(i.x, i.y, this.polygons)).map((i) => i.idx);
118
120
  this.onPolygonUpdateOutside(e, t);
@@ -132,33 +134,33 @@ class oe {
132
134
  (t.width !== this.chartSizes.chartWidth || t.height !== this.chartSizes.chartHeight) && (this.chartSizes.chartWidth = t.width, this.chartSizes.chartHeight = t.height, this.scales.x.range([0, this.chartSizes.chartWidth]), this.scales.y.range([this.chartSizes.chartHeight, 0]));
133
135
  }
134
136
  updateViewport(t, e, i) {
135
- const r = t.scale === "log" ? V() : T();
136
- let { minX: o, minY: l, maxX: m, maxY: u } = i;
137
- if (t.lowerValue !== void 0 && (o = Math.max(o, t.lowerValue)), t.upperValue !== void 0 && (m = Math.min(m, t.upperValue)), e.lowerValue !== void 0 && (l = Math.max(l, e.lowerValue)), e.upperValue !== void 0 && (u = Math.min(u, e.upperValue)), t.symmetricRange !== void 0) {
138
- const a = t.symmetricRange;
139
- if (a >= o && a <= m) {
140
- const f = Math.max(a - o, m - a);
141
- o = a - f, m = a + f;
137
+ const l = t.scale === "log" ? V() : L();
138
+ let { minX: o, minY: c, maxX: m, maxY: u } = i;
139
+ if (t.lowerValue !== void 0 && (o = Math.max(o, t.lowerValue)), t.upperValue !== void 0 && (m = Math.min(m, t.upperValue)), e.lowerValue !== void 0 && (c = Math.max(c, e.lowerValue)), e.upperValue !== void 0 && (u = Math.min(u, e.upperValue)), t.symmetricRange !== void 0) {
140
+ const n = t.symmetricRange;
141
+ if (n >= o && n <= m) {
142
+ const f = Math.max(n - o, m - n);
143
+ o = n - f, m = n + f;
142
144
  }
143
145
  }
144
146
  if (typeof e.symmetricRange < "u") {
145
- const a = e.symmetricRange;
146
- if (a >= l && a <= u) {
147
- const f = Math.max(a - l, u - a);
148
- l = a - f, u = a + f;
147
+ const n = e.symmetricRange;
148
+ if (n >= c && n <= u) {
149
+ const f = Math.max(n - c, u - n);
150
+ c = n - f, u = n + f;
149
151
  }
150
152
  }
151
- const S = [0, this.chartSizes.chartWidth], x = r.copy().domain([o, m]).range([W.LEFT, this.chartSizes.chartWidth - W.RIGHT]);
152
- r.domain([x.invert(0), x.invert(this.chartSizes.chartWidth)]).range(S).nice(), this.scales.x = r, this.scales.xOriginal = r.copy();
153
- const d = e.scale === "log" ? V() : T(), h = [this.chartSizes.chartHeight, 0], g = d.copy().domain([l, u]).range([this.chartSizes.chartHeight - W.BOTTOM, W.TOP]);
154
- d.domain([g.invert(this.chartSizes.chartHeight), g.invert(0)]).range(h).nice(), this.scales.y = d, this.scales.yOriginal = d.copy();
153
+ const S = [0, this.chartSizes.chartWidth], x = l.copy().domain([o, m]).range([W.LEFT, this.chartSizes.chartWidth - W.RIGHT]);
154
+ l.domain([x.invert(0), x.invert(this.chartSizes.chartWidth)]).range(S).nice(), this.scales.x = l, this.scales.xOriginal = l.copy();
155
+ const d = e.scale === "log" ? V() : L(), r = [this.chartSizes.chartHeight, 0], g = d.copy().domain([c, u]).range([this.chartSizes.chartHeight - W.BOTTOM, W.TOP]);
156
+ d.domain([g.invert(this.chartSizes.chartHeight), g.invert(0)]).range(r).nice(), this.scales.y = d, this.scales.yOriginal = d.copy();
155
157
  }
156
158
  updateCaptionsSize() {
157
- const t = new F("600 14px Arial");
158
- function e(l) {
159
- return Math.max(...l.map((m) => t.getTextWidth(m)));
159
+ const t = new A("600 14px Arial");
160
+ function e(c) {
161
+ return Math.max(...c.map((m) => t.getTextWidth(m)));
160
162
  }
161
- const { ticks: i, format: r } = it(this.scales.y, !1), o = e(i.map(r));
163
+ const { ticks: i, format: l } = it(this.scales.y, !1), o = e(i.map(l));
162
164
  this.captionsSizes = {
163
165
  xAxisCaptionsWidth: 20,
164
166
  yAxisCaptionsWidth: o
@@ -174,90 +176,90 @@ class oe {
174
176
  updateMargins() {
175
177
  const t = Z * this.mainTitle.length, e = t > 0 ? t + tt * 2 : 0;
176
178
  this.margins = {
177
- top: Math.max(e, L),
178
- bottom: L + this.captionsSizes.xAxisCaptionsWidth + I,
179
- left: L + this.captionsSizes.yAxisCaptionsWidth + I,
180
- right: this.legend.width + L
179
+ top: Math.max(e, C),
180
+ bottom: C + this.captionsSizes.xAxisCaptionsWidth + I,
181
+ left: C + this.captionsSizes.yAxisCaptionsWidth + I,
182
+ right: this.legend.width + C
181
183
  }, this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartWidth + this.margins.right, this.chartSizes.totalHeight = this.margins.top + Math.max(this.chartSizes.chartHeight, this.legend.height) + this.margins.bottom, N(this.canvasNode).style("width", this.chartSizes.chartWidth + "px").style("height", this.chartSizes.chartHeight + "px").style("top", this.margins.top + "px").style("left", this.margins.left + "px");
182
184
  }
183
- updateLegendSize(t, e, i, r) {
185
+ updateLegendSize(t, e, i, l) {
184
186
  if (!t.show) {
185
187
  this.legend = { width: 0, height: 0, items: [] };
186
188
  return;
187
189
  }
188
- const o = [], l = { width: 0, height: 0, left: 0, top: 0 };
190
+ const o = [], c = { width: 0, height: 0, left: 0, top: 0 };
189
191
  if (i.forEach((d) => {
190
- const h = e[d.value];
191
- if (h.usedAes.length === 0 || !h.aesMap)
192
+ const r = e[d.value];
193
+ if (r.usedAes.length === 0 || !r.aesMap)
192
194
  return;
193
195
  const g = {};
194
- h.values.forEach((p) => {
195
- g[p] || (g[p] = { ...G }), h.usedAes.forEach((v) => {
196
- v === "dotFill" && (g[p].color = h.aesMap(p, v) ?? R), v === "dotSize" && (g[p].size = Number(h.aesMap(p, v) ?? 3));
196
+ r.values.forEach((p) => {
197
+ g[p] || (g[p] = { ...F }), r.usedAes.forEach((s) => {
198
+ s === "dotFill" && (g[p].color = r.aesMap(p, s) ?? G), s === "dotSize" && (g[p].size = Number(r.aesMap(p, s) ?? 3));
197
199
  });
198
200
  });
199
- const a = d.label ?? d.value, f = mt().domain(h.values).range(h.values.map((p) => g[p]));
200
- o.push({ ...l, id: d.value, type: "dots", title: a, scale: f, values: h.values, labels: h.labels });
201
- }), r.forEach((d) => {
202
- if (d.type === "dots" && A(d.aes.dotFill)) {
203
- const { domain: h, range: g, columnName: a, type: f = "linear" } = d.aes.dotFill, p = a.label ?? a.value, v = ot(g, h, "linear"), s = (f === "log" ? pt() : T()).domain(h).range([this.chartSizes.chartHeight, 0]), n = at(s, h);
204
- o.push({ ...l, id: "dotFill", type: "continuous", title: p, scale: v, tickPositionScale: s, values: n });
201
+ const n = d.label ?? d.value, f = pt().domain(r.values).range(r.values.map((p) => g[p]));
202
+ o.push({ ...c, id: d.value, type: "dots", title: n, scale: f, values: r.values, labels: r.labels });
203
+ }), l.forEach((d) => {
204
+ if (d.type === "dots" && R(d.aes.dotFill)) {
205
+ const { domain: r, range: g, columnName: n, type: f = "linear" } = d.aes.dotFill, p = n.label ?? n.value, s = ot(g, r, "linear"), a = (f === "log" ? gt() : L()).domain(r).range([this.chartSizes.chartHeight, 0]), v = at(a, r);
206
+ o.push({ ...c, id: "dotFill", type: "continuous", title: p, scale: s, tickPositionScale: a, values: v });
205
207
  }
206
- if (d.type === "dots" && A(d.aes.dotSize)) {
207
- const { columnName: h, domain: g, range: a } = d.aes.dotSize, f = h.label ?? h.value, p = gt(g, a), v = p.ticks(3), s = p.tickFormat(3), n = v.reduce((C, z) => (C[String(z)] = s(z), C), {});
208
- o.push({ ...l, id: h.value, type: "size", title: f, scale: p, values: v, labels: n });
208
+ if (d.type === "dots" && R(d.aes.dotSize)) {
209
+ const { columnName: r, domain: g, range: n } = d.aes.dotSize, f = r.label ?? r.value, p = ut(g, n), s = p.ticks(3), a = p.tickFormat(3), v = s.reduce((z, T) => (z[String(T)] = a(T), z), {});
210
+ o.push({ ...c, id: r.value, type: "size", title: f, scale: p, values: s, labels: v });
209
211
  }
210
212
  }), !o.length) {
211
213
  this.legend = { width: 0, height: 0, items: [] };
212
214
  return;
213
215
  }
214
- const m = dt(o, this.chartSizes.chartHeight), u = m[m.length - 1], S = u.left + u.width + rt, x = this.chartSizes.chartHeight;
216
+ const m = mt(o, this.chartSizes.chartHeight), u = m[m.length - 1], S = u.left + u.width + rt, x = this.chartSizes.chartHeight;
215
217
  this.legend = {
216
218
  width: S,
217
219
  height: x,
218
220
  items: m
219
221
  };
220
222
  }
221
- initSettings(t, e, i, r, o, l, m) {
222
- const { xAxis: u, yAxis: S, size: x, title: d, legend: h } = i;
223
- this.updateChartSizes(x), this.updateViewport(u, S, r), this.updateCaptionsSize(), this.updateLegendSize(h, o, m, l), this.createMainTitle(d), this.updateMargins(), this.aesGetters = U(t, o, l);
224
- const g = Y().data(e).value((s) => {
225
- const n = M(this.aesGetters.dotFill(s.idx));
226
- return n[3] = !s.dimmed && E(s.x, s.y, this.polygons) ? 1 : 0.4, P(n, n);
227
- }), a = X().equals((s, n) => s === n).size((s) => B(this.aesGetters.dotSize(s.idx))).crossValue((s) => s.x).mainValue((s) => s.y).decorate((s) => g(s)), f = $().scaleExtent([0.1, 1e3]).filter((s) => s.type === "wheel" || s.metaKey || s.ctrlKey).on("start", () => {
223
+ initSettings(t, e, i, l, o, c) {
224
+ const { xAxis: m, yAxis: u, size: S, title: x, legend: d } = e;
225
+ this.updateChartSizes(S), this.updateViewport(m, u, i), this.updateCaptionsSize(), this.updateLegendSize(d, l, c, o), this.createMainTitle(x), this.updateMargins(), this.aesGetters = U(this.dataFrame, l, o);
226
+ const r = Y().data(t).value((s) => {
227
+ const a = M(this.aesGetters.dotFill(s.idx));
228
+ return a[3] = !s.dimmed && E(s.x, s.y, this.polygons) ? 1 : 0.4, P(a, a);
229
+ }), g = X().equals((s, a) => s === a).size((s) => B(this.aesGetters.dotSize(s.idx))).crossValue((s) => s.x).mainValue((s) => s.y).decorate((s) => r(s)), n = $().scaleExtent([0.1, 1e3]).filter((s) => s.type === "wheel" || s.metaKey || s.ctrlKey).on("start", () => {
228
230
  this.selectedDot = null;
229
231
  }).on("zoom", (s) => {
230
- const n = s.transform, C = n.rescaleX(this.scales.xOriginal), z = n.rescaleY(this.scales.yOriginal);
231
- this.scales.x.domain(C.domain()), this.scales.y.domain(z.domain()), this.zoomTransform = n, this.zoomStateKey = `${n.x}_${n.y}_${n.k}`, this.updateLabelsPosition(this.visibleLabels), this.renderSvgLayer(t), this.renderWebglLayer();
232
+ const a = s.transform, v = a.rescaleX(this.scales.xOriginal), z = a.rescaleY(this.scales.yOriginal);
233
+ this.scales.x.domain(v.domain()), this.scales.y.domain(z.domain()), this.zoomTransform = a, this.zoomStateKey = `${a.x}_${a.y}_${a.k}`, this.updateLabelsPosition(this.visibleLabels), this.renderSvgLayer(), this.renderWebglLayer();
232
234
  }).on("end", () => {
233
- this.visibleLabels = this.computeLabels(this.allDots), this.renderSvgLayer(t);
234
- }), p = lt().on("point", ([s]) => {
235
+ this.visibleLabels = this.computeLabels(this.allDots), this.renderSvgLayer();
236
+ }), f = lt().on("point", ([s]) => {
235
237
  var z;
236
- let n;
237
- s && (n = this.getClosestDot(s.x, s.y));
238
- const C = this.selectedDot && !n || !this.selectedDot && n || ((z = this.selectedDot) == null ? void 0 : z.idx) !== (n == null ? void 0 : n.idx);
239
- this.selectedDot = n ?? null, C && this.renderSvgLayer(t);
240
- }), v = K({
238
+ let a;
239
+ s && (a = this.getClosestDot(s.x, s.y));
240
+ const v = this.selectedDot && !a || !this.selectedDot && a || ((z = this.selectedDot) == null ? void 0 : z.idx) !== (a == null ? void 0 : a.idx);
241
+ this.selectedDot = a ?? null, v && this.renderSvgLayer();
242
+ }), p = K({
241
243
  xScale: this.scales.x,
242
244
  yScale: this.scales.y
243
245
  }).xAxisHeight(() => "0").yAxisWidth(() => "0").svgPlotArea(j()).webglPlotArea(
244
246
  // only render the point series on the WebGL layer
245
- q().series([a]).mapping((s) => s)
247
+ q().series([g]).mapping((s) => s)
246
248
  ).decorate((s) => {
247
- const n = s.enter();
248
- n && !this.svgLayerElement && (n.style("grid-template-columns", "0 auto 1fr auto 0"), n.style("grid-template-rows", "0 auto 1fr auto 0"), this.svgLayerElement = n.select(".svg-plot-area.plot-area svg").node()), n.select(".svg-plot-area.plot-area").attr("class", "svg-plot-area plot-area miplots-scatterplot-plot-area").call(f).call(p);
249
+ const a = s.enter();
250
+ a && !this.svgLayerElement && (a.style("grid-template-columns", "0 auto 1fr auto 0"), a.style("grid-template-rows", "0 auto 1fr auto 0"), this.svgLayerElement = a.select(".svg-plot-area.plot-area svg").node()), a.select(".svg-plot-area.plot-area").attr("class", "svg-plot-area plot-area miplots-scatterplot-plot-area").call(n).call(f);
249
251
  });
250
252
  this.tools = {
251
- webglChart: v,
252
- zoom: f,
253
- fillColor: g,
254
- pointSeries: a
255
- }, N(this.canvasNode).datum(e).style("position", "absolute").style("width", this.chartSizes.chartWidth + "px").style("height", this.chartSizes.chartHeight + "px").style("top", this.margins.top + "px").style("left", this.margins.left + "px");
253
+ webglChart: p,
254
+ zoom: n,
255
+ fillColor: r,
256
+ pointSeries: g
257
+ }, N(this.canvasNode).datum(t).style("position", "absolute").style("width", this.chartSizes.chartWidth + "px").style("height", this.chartSizes.chartHeight + "px").style("top", this.margins.top + "px").style("left", this.margins.left + "px");
256
258
  }
257
- updateAes(t, e, i) {
258
- this.tools !== null && (this.aesGetters = U(t, e, i), this.tools.fillColor.value((r) => {
259
- const o = this.aesGetters.dotFill ?? O, l = M(o(r.idx));
260
- return l[3] = !r.dimmed && E(r.x, r.y, this.polygons) ? 1 : 0.4, P(l, l);
259
+ updateAes(t, e) {
260
+ this.tools !== null && (this.aesGetters = U(this.dataFrame, t, e), this.tools.fillColor.value((i) => {
261
+ const l = this.aesGetters.dotFill ?? O, o = M(l(i.idx));
262
+ return o[3] = !i.dimmed && E(i.x, i.y, this.polygons) ? 1 : 0.4, P(o, o);
261
263
  }));
262
264
  }
263
265
  updatePointSize() {
@@ -266,8 +268,8 @@ class oe {
266
268
  updateByLasso() {
267
269
  var t;
268
270
  this.tools !== null && ((t = this.tools) == null || t.fillColor.value((e) => {
269
- const i = this.aesGetters.dotFill ?? O, r = M(i(e.idx));
270
- return r[3] = !e.dimmed && E(e.x, e.y, this.polygons) ? 1 : 0.4, P(r, r);
271
+ const i = this.aesGetters.dotFill ?? O, l = M(i(e.idx));
272
+ return l[3] = !e.dimmed && E(e.x, e.y, this.polygons) ? 1 : 0.4, P(l, l);
271
273
  }), this.renderWebglLayer());
272
274
  }
273
275
  createQuadtree(t) {
@@ -277,51 +279,50 @@ class oe {
277
279
  return e.finish();
278
280
  }
279
281
  getClosestDot(t, e) {
280
- var a, f;
281
- const i = (a = this.tools) == null ? void 0 : a.qt;
282
+ var n, f;
283
+ const i = (n = this.tools) == null ? void 0 : n.qt;
282
284
  if (!i) return null;
283
- const r = this.allDots, o = this.scales.x.invert(t), l = this.scales.y.invert(e), m = 1 / (((f = this.zoomTransform) == null ? void 0 : f.k) || 1), u = o - m, S = o + m, x = l - m, d = l + m, h = i.range(u, x, S, d), g = h.reduce((p, v) => {
284
- const s = r[v], n = this.scales.x(s.x) - t, C = this.scales.y(s.y) - e, z = Math.hypot(n, C);
285
- return (p === null || z < p.distance) && (p.index = v, p.distance = z), p;
285
+ const l = this.allDots, o = this.scales.x.invert(t), c = this.scales.y.invert(e), m = 1 / (((f = this.zoomTransform) == null ? void 0 : f.k) || 1), u = o - m, S = o + m, x = c - m, d = c + m, r = i.range(u, x, S, d), g = r.reduce((p, s) => {
286
+ const a = l[s], v = this.scales.x(a.x) - t, z = this.scales.y(a.y) - e, T = Math.hypot(v, z);
287
+ return (p === null || T < p.distance) && (p.index = s, p.distance = T), p;
286
288
  }, {
287
289
  index: -1,
288
290
  distance: 1 / 0
289
291
  });
290
- return h.length === 0 || g.index === -1 ? null : r[g.index];
292
+ return r.length === 0 || g.index === -1 ? null : l[g.index];
291
293
  }
292
294
  updateDots(t) {
293
295
  this.tools !== null && (N(this.canvasNode).datum(t), this.tools.fillColor.data(t), this.tools.qt = this.createQuadtree(t), this.allDots = t);
294
296
  }
295
- render(t, e, i, r, o, l, m, u, S, x, d, h, g) {
296
- if (this.tools === null)
297
+ render(t, e, i, l, o, c, m, u, S, x, d, r, g) {
298
+ if (this.dataFrame = t, this.tools === null)
297
299
  this.initSettings(
298
- t,
299
300
  o,
300
301
  i,
301
- l,
302
+ c,
302
303
  S,
303
304
  u,
304
305
  x
305
306
  );
306
307
  else {
307
- const { title: a, legend: f, size: p } = i;
308
- this.updateChartSizes(p), this.updateLegendSize(f, S, x, u), this.createMainTitle(a), this.updateMargins(), this.updateAes(t, S, u);
308
+ const { title: n, legend: f, size: p } = i;
309
+ this.updateChartSizes(p), this.updateLegendSize(f, S, x, u), this.createMainTitle(n), this.updateMargins(), this.updateAes(S, u);
309
310
  }
310
- this.onPolygonUpdateOutside = d, this.onTooltipHintSwitch = h, this.onLassoControlsStateUpdate = g, this.allDots !== o && (this.updateDots(o), this.visibleLabels = this.computeLabels(o)), this.notCalculatedProps = {
311
+ this.onPolygonUpdateOutside = d, this.onTooltipHintSwitch = r, this.onLassoControlsStateUpdate = g, this.allDots !== o && (this.updateDots(o), this.visibleLabels = this.computeLabels(o)), this.notCalculatedProps = {
311
312
  settingsId: e,
312
313
  chartSettings: i,
313
- keyColumn: r,
314
+ keyColumn: l,
314
315
  dotsByGrouping: m,
315
316
  layers: u
316
- }, this.renderWebglLayer(), this.renderSvgLayer(t);
317
+ }, this.renderWebglLayer(), this.renderSvgLayer();
317
318
  }
318
319
  renderWebglLayer() {
319
320
  var t, e;
320
321
  (t = this.tools) != null && t.webglChart && N(this.canvasNode).call((e = this.tools) == null ? void 0 : e.webglChart);
321
322
  }
322
- renderSvgLayer(t) {
323
- var i;
324
- const e = {
323
+ renderSvgLayer() {
324
+ var e;
325
+ const t = {
325
326
  settingsId: this.notCalculatedProps.settingsId,
326
327
  chartSettings: this.notCalculatedProps.chartSettings,
327
328
  keyColumn: this.notCalculatedProps.keyColumn,
@@ -343,32 +344,32 @@ class oe {
343
344
  onTooltipHintSwitch: this.onTooltipHintSwitch,
344
345
  onLassoControlsStateUpdate: this.onLassoControlsStateUpdate
345
346
  };
346
- this.svgLayerComponent = /* @__PURE__ */ b.jsx(ct, { dataFrame: t, children: /* @__PURE__ */ b.jsx(nt, { ...e }) }), (i = this.reactRoot) == null || i.render(this.svgLayerComponent);
347
+ this.svgLayerComponent = /* @__PURE__ */ b.jsx(ct, { dataFrame: this.dataFrame, children: /* @__PURE__ */ b.jsx(nt, { ...t }) }), (e = this.reactRoot) == null || e.render(this.svgLayerComponent);
347
348
  }
348
349
  renderError(t) {
349
350
  var e;
350
351
  (e = this.reactRoot) == null || e.render(/* @__PURE__ */ b.jsx(J, { message: t }));
351
352
  }
352
353
  computeLabels(t) {
353
- const e = new F("16px Manrope"), i = st(this.chartSizes.chartWidth, this.chartSizes.chartHeight), r = [];
354
+ const e = new A("16px Manrope"), i = st(this.chartSizes.chartWidth, this.chartSizes.chartHeight), l = [];
354
355
  for (let o = 0; o < t.length; o++) {
355
- const l = t[o];
356
- if (l.label == null)
356
+ const c = t[o];
357
+ if (c.label == null)
357
358
  continue;
358
- const m = String(l.label), u = e.getTextMetrics(m), S = this.scales.x(l.x), x = this.scales.y(l.y), d = u.width, h = u.actualBoundingBoxAscent + u.actualBoundingBoxDescent, g = 10, a = i(S, x, d, h, g);
359
- a && r.push({
359
+ const m = String(c.label), u = e.getTextMetrics(m), S = this.scales.x(c.x), x = this.scales.y(c.y), d = u.width, r = u.actualBoundingBoxAscent + u.actualBoundingBoxDescent, g = 10, n = i(S, x, d, r, g);
360
+ n && l.push({
360
361
  x: S,
361
362
  y: x,
362
- dot: l,
363
+ dot: c,
363
364
  name: m,
364
365
  width: d,
365
- height: h,
366
+ height: r,
366
367
  padding: g,
367
- xPosition: a[0],
368
- yPosition: a[1]
368
+ xPosition: n[0],
369
+ yPosition: n[1]
369
370
  });
370
371
  }
371
- return r;
372
+ return l;
372
373
  }
373
374
  updateLabelsPosition(t) {
374
375
  for (let e = 0; e < t.length; e++) {
@@ -378,6 +379,6 @@ class oe {
378
379
  }
379
380
  }
380
381
  export {
381
- oe as default
382
+ ne as default
382
383
  };
383
384
  //# sourceMappingURL=ChartRenderer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChartRenderer.js","sources":["../../src/scatterplot-umap/ChartRenderer.tsx"],"sourcesContent":["import { chartCartesian } from '@d3fc/d3fc-chart';\nimport type { CartesianChart } from '@d3fc/d3fc-chart/src/cartesian';\nimport type { ScaleLinear } from 'd3-scale';\nimport { scaleLinear, scaleLog, scaleOrdinal, scaleSqrt, scaleSymlog } from 'd3-scale';\nimport { select } from 'd3-selection';\nimport type { D3ZoomEvent, ZoomBehavior, ZoomTransform } from 'd3-zoom';\nimport { zoom } from 'd3-zoom';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport type { DotAesItem, LegendData, LegendItem } from '../common/types';\nimport {\n BLACK,\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n TITLE_LINE_HEIGHT,\n TITLE_MARGIN\n} from '../constants';\nimport { splitTextByWidth } from '../discrete/utils';\nimport { DEFAULT_DOT_AES, MIN_MARGIN } from '../scatterplot/constants';\nimport { createAesGetter } from '../scatterplot/utils/createAesGetter';\nimport { getTicksAndFormat } from '../scatterplot/utils/getTicksAndFormat';\nimport type { Label } from '../scatterplot/utils/getVisibleLabels';\nimport { createLabelPositioner } from '../scatterplot/utils/getVisibleLabels';\nimport type { ColumnName, ScatterplotEventHandlers } from '../types';\nimport { isContinuousAes } from '../types';\nimport type { ScatterplotUmapLegendInfo } from '../types/scatterplot-umap';\nimport { getContinuousColorScale } from '../utils/getContinuousColorScale';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { SVGLayer } from './components/SVGLayer';\nimport { LEGEND_OFFSET, PADDINGS, TITLE_LINE } from './constants';\nimport type { CurveLayer, DotsLayer, ScatterplotUmapLayer, ScatterplotUmapSettingsImpl } from './SettingsImpl';\nimport type {\n AesGetters,\n CaptionsSizes,\n ChartScales, ChartSizes,\n Dot,\n DotsExtents,\n LassoControlsState,\n Margins,\n Polygon,\n SVGLayerProps,\n} from './types';\n// @ts-ignore\nimport { seriesSvgMulti, seriesWebglMulti, seriesWebglPoint } from '@d3fc/d3fc-series';\n// @ts-ignore\nimport { webglFillColor } from '@d3fc/d3fc-webgl';\n// @ts-ignore\nimport { pointer } from '@d3fc/d3fc-pointer';\nimport { polygonContains } from 'd3-polygon';\nimport KDBush from 'kdbush';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport type { DataFrame } from '../DataFrame';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { GET_BLACK, getColorWithFakeOpacity, stringToNumberRgba } from './colors';\n\nfunction convertDotRToSymbolSize(r:number) {\n return (r / 2.35) * (r / 2.35) * 64;\n}\n\nfunction isDotInsidePolygons(x:number, y:number, polygons: Polygon[]) {\n if (polygons.length === 0) {\n return true;\n }\n return polygons.some((p) => p.closed && p.points.length > 2 && polygonContains(p.points, [x, y]));\n}\n\nfunction getGettersFromLayers(\n dataFrame: DataFrame,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n): AesGetters {\n const dotLayer = layers.find(l => l.type === 'dots') as DotsLayer | undefined;\n const curveLayer = layers.find(l => l.type === 'curve') as CurveLayer | undefined;\n return {\n dotFill: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotFill ?? DEFAULT_DOT_AES.color, 'dotFill'),\n dotSize: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotSize ?? DEFAULT_DOT_AES.size, 'dotSize'),\n lineType: createAesGetter(dataFrame, legendInfo, curveLayer?.aes.lineShape ?? 'solid', 'lineShape')\n };\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n canvasNode: HTMLElement | null = null;\n\n svgLayerElement: SVGElement | null = null;\n svgLayerComponent: ReactElement = (<></>);\n\n aesGetters: AesGetters = {\n dotSize: () => 2,\n dotFill: () => BLACK,\n lineType: () => 'solid'\n };\n\n tools: {\n webglChart: CartesianChart<any, any>;\n qt?: KDBush;\n fillColor: () => {\n value: (setter: (d: Dot) => [number, number, number, number]) => void;\n data: (setter: () => Dot[]) => void;\n };\n pointSeries: () => any;\n zoom: ZoomBehavior<any, any>;\n } | null = null;\n\n margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n totalWidth: DEFAULT_WIDTH, // width of all charts in charts row, plus left axis, plus legend\n totalHeight: DEFAULT_HEIGHT, // width of all charts in charts height, plus bottom axis, plus top title\n };\n scales: ChartScales = {\n x: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH]),\n y: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]),\n xOriginal: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH]),\n yOriginal: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]),\n };\n\n polygons:Polygon[] = [];\n onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'] = () => undefined;\n onTooltipHintSwitch: ScatterplotEventHandlers['onTooltipHintSwitch'] = () => undefined;\n onLassoControlsStateUpdate: ScatterplotEventHandlers['onLassoControlsStateUpdate'] = () => undefined;\n\n zoomTransform: ZoomTransform | null = null;\n zoomStateKey = '';\n selectedDot: Dot | null = null;\n captionsSizes: CaptionsSizes = {\n xAxisCaptionsWidth: 30,\n yAxisCaptionsWidth: 100,\n };\n mainTitle: string[] = []; // can be multiline\n legend: LegendData = {width: 0, height: 0, items: []};\n\n notCalculatedProps: Partial<SVGLayerProps> = {};\n\n allDots: Dot[] = [];\n visibleLabels: Label[] = [];\n clear() {\n if (this.parentNode && this.rootNode && this.canvasNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode?.removeChild(this.canvasNode);\n this.parentNode = null;\n this.rootNode = null;\n this.canvasNode = null;\n this.svgLayerElement = null;\n this.tools = null;\n }\n // timeout to avoid trying to unmount during rendering\n setTimeout(() => {\n this.reactRoot?.unmount();\n this.reactRoot = null;\n });\n }\n\n init(node: HTMLElement) {\n if (this.parentNode === null) {\n this.parentNode = node;\n this.rootNode = document.createElement('div');\n this.canvasNode = document.createElement('div');\n this.parentNode.appendChild(this.rootNode);\n this.parentNode.appendChild(this.canvasNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateChartSizes(size: ScatterplotUmapSettingsImpl['chartSettings']['size']) {\n if (size.width !== this.chartSizes.chartWidth || size.height !== this.chartSizes.chartHeight) {\n // NB: now chart sizes always change with one multiplier for width/height so qt stays without changes\n this.chartSizes.chartWidth = size.width;\n this.chartSizes.chartHeight = size.height;\n this.scales.x.range([0, this.chartSizes.chartWidth]);\n this.scales.y.range([this.chartSizes.chartHeight, 0]);\n }\n \n }\n\n updateViewport(\n xAxis: ScatterplotUmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotUmapSettingsImpl['chartSettings']['yAxis'],\n dotsExtents: DotsExtents\n ) {\n const scaleX = xAxis.scale === 'log' ? scaleLog() : scaleLinear();\n\n let {minX, minY, maxX, maxY} = dotsExtents;\n if (xAxis.lowerValue !== undefined) {\n minX = Math.max(minX, xAxis.lowerValue);\n }\n if (xAxis.upperValue !== undefined) {\n maxX = Math.min(maxX, xAxis.upperValue);\n }\n if (yAxis.lowerValue !== undefined) {\n minY = Math.max(minY, yAxis.lowerValue);\n }\n if (yAxis.upperValue !== undefined) {\n maxY = Math.min(maxY, yAxis.upperValue);\n }\n if (xAxis.symmetricRange !== undefined) {\n const middle = xAxis.symmetricRange;\n if (middle >= minX && middle <= maxX) {\n const halfRange = Math.max(middle - minX, maxX - middle);\n minX = middle - halfRange;\n maxX = middle + halfRange;\n }\n }\n if (typeof yAxis.symmetricRange !== 'undefined') {\n const middle = yAxis.symmetricRange;\n if (middle >= minY && middle <= maxY) {\n const halfRange = Math.max(middle - minY, maxY - middle);\n minY = middle - halfRange;\n maxY = middle + halfRange;\n }\n }\n\n const rangeH = [0, this.chartSizes.chartWidth];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempX = scaleX\n .copy()\n .domain([minX, maxX])\n .range([PADDINGS.LEFT, this.chartSizes.chartWidth - PADDINGS.RIGHT]);\n scaleX\n .domain([tempX.invert(0), tempX.invert(this.chartSizes.chartWidth)])\n .range(rangeH)\n .nice();\n this.scales.x = scaleX;\n this.scales.xOriginal = scaleX.copy();\n\n const scaleY = yAxis.scale === 'log' ? scaleLog() : scaleLinear();\n const rangeV = [this.chartSizes.chartHeight, 0];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempY = scaleY\n .copy()\n .domain([minY, maxY])\n .range([this.chartSizes.chartHeight - PADDINGS.BOTTOM, PADDINGS.TOP]);\n scaleY\n .domain([tempY.invert(this.chartSizes.chartHeight), tempY.invert(0)])\n .range(rangeV)\n .nice();\n this.scales.y = scaleY;\n this.scales.yOriginal = scaleY.copy();\n }\n\n updateCaptionsSize() {\n const textMeasurer = new TextMeasurer('600 14px Arial');\n\n function getMaxTickWidth(ticks: string[]) {\n return Math.max(...ticks.map(key => textMeasurer.getTextWidth(key)));\n }\n\n const {ticks, format} = getTicksAndFormat(this.scales.y, false);\n const maxYTick = getMaxTickWidth(ticks.map(format));\n\n this.captionsSizes = {\n xAxisCaptionsWidth: 20,\n yAxisCaptionsWidth: maxYTick,\n };\n }\n\n createMainTitle(title: ScatterplotUmapSettingsImpl['chartSettings']['title']) {\n this.mainTitle = splitTextByWidth(\n title.name,\n this.chartSizes.totalWidth - this.margins.left - this.margins.right,\n 20\n );\n }\n\n updateMargins() {\n const titleTextHeight = TITLE_LINE_HEIGHT * this.mainTitle.length;\n const titleHeight = titleTextHeight > 0 ? titleTextHeight + TITLE_MARGIN * 2 : 0;\n this.margins = {\n top: Math.max(titleHeight, MIN_MARGIN),\n bottom: MIN_MARGIN + this.captionsSizes.xAxisCaptionsWidth + TITLE_LINE,\n left: MIN_MARGIN + this.captionsSizes.yAxisCaptionsWidth + TITLE_LINE,\n right: this.legend.width + MIN_MARGIN,\n };\n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartWidth + this.margins.right;\n this.chartSizes.totalHeight =\n this.margins.top + Math.max(this.chartSizes.chartHeight, this.legend.height) + this.margins.bottom;\n\n select(this.canvasNode)\n .style('width', this.chartSizes.chartWidth + 'px')\n .style('height', this.chartSizes.chartHeight + 'px')\n .style('top', this.margins.top + 'px')\n .style('left', this.margins.left + 'px');\n }\n\n updateLegendSize(\n legend: ScatterplotUmapSettingsImpl['chartSettings']['legend'],\n legendLabels: ScatterplotUmapLegendInfo,\n grouping: ColumnName[],\n layers: ScatterplotUmapLayer[]\n ) {\n if (!legend.show) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const legendItems: LegendItem[] = [];\n const emptySizes = {width:0, height:0, left:0, top: 0};\n \n grouping.forEach(column => {\n const info = legendLabels[column.value];\n if (info.usedAes.length === 0 || !info.aesMap) {\n return;\n }\n const aesData: Record<string, DotAesItem> = {};\n info.values.forEach(category => {\n if (!aesData[category]) {\n aesData[category] = {...DEFAULT_DOT_AES} as DotAesItem;\n }\n info.usedAes.forEach(key => {\n if (key === 'dotFill') {\n aesData[category].color = (info.aesMap(category, key) ?? BLACK) as string;\n }\n if (key === 'dotSize') {\n aesData[category].size = Number(info.aesMap(category, key) ?? 3);\n }\n });\n });\n\n const title = column.label ?? column.value;\n const scale = scaleOrdinal<DotAesItem>()\n .domain(info.values)\n .range(info.values.map(value => aesData[value]));\n legendItems.push({...emptySizes, id: column.value, type: 'dots', title, scale, values:info.values, labels:info.labels});\n });\n\n layers.forEach(layer => {\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotFill)) {\n const {domain, range, columnName, type = 'linear'} = layer.aes.dotFill;\n const title = columnName.label ?? columnName.value;\n const colorScale = getContinuousColorScale(range, domain, 'linear') as ScaleLinear<string, string>; // always linear for legend - scale to render gradient, not for dots\n const tickPositionScale = (type === 'log' ? scaleSymlog<string, string>() : scaleLinear<string, string>())\n .domain(domain)\n // @ts-ignore\n .range([this.chartSizes.chartHeight, 0]);\n const values = getContinuousLegendTicks(tickPositionScale, domain as [number, number]);\n legendItems.push({...emptySizes, id: 'dotFill', type: 'continuous', title, scale: colorScale, tickPositionScale, values});\n }\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotSize)) {\n const {columnName, domain, range} = layer.aes.dotSize;\n const title = columnName.label ?? columnName.value;\n const scale = scaleSqrt(domain, range);\n const values = scale.ticks(3);\n const format = scale.tickFormat(3);\n const labels = values.reduce((res: Record<string, string>, v) => {\n res[String(v)] = format(v);\n return res;\n }, {});\n legendItems.push({...emptySizes, id: columnName.value, type: 'size', title, scale, values, labels});\n }\n });\n\n if (!legendItems.length) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const items = arrangeLegendParts(legendItems, this.chartSizes.chartHeight);\n const lastItem = items[items.length - 1];\n const legendWidth = lastItem.left + lastItem.width + LEGEND_OFFSET;\n const legendHeight = this.chartSizes.chartHeight;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items,\n };\n }\n\n initSettings(\n dataFrame: DataFrame,\n dots: Dot[],\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'],\n dotExtents: DotsExtents,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n grouping: ColumnName[]\n ) {\n const {xAxis, yAxis, size, title, legend} = chartSettings;\n this.updateChartSizes(size);\n this.updateViewport(xAxis, yAxis, dotExtents);\n this.updateCaptionsSize();\n this.updateLegendSize(legend, legendInfo, grouping, layers);\n this.createMainTitle(title);\n this.updateMargins();\n\n this.aesGetters = getGettersFromLayers(dataFrame, legendInfo, layers);\n\n const fillColor = webglFillColor()\n .data(dots)\n .value((d: Dot) => {\n const rgba = stringToNumberRgba(this.aesGetters.dotFill(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n\n const pointSeries = seriesWebglPoint()\n .equals((a: Dot[], b: Dot[]) => a === b)\n .size((d: Dot) => convertDotRToSymbolSize(this.aesGetters.dotSize(d.idx)))\n .crossValue((d: Dot) => d.x)\n .mainValue((d: Dot) => d.y)\n .decorate((program: unknown) => fillColor(program));\n\n const z = zoom()\n .scaleExtent([0.1, 1000])\n .filter((e:MouseEvent) => {\n return e.type === 'wheel' || e.metaKey || e.ctrlKey;\n })\n .on('start', () => {\n this.selectedDot = null;\n })\n .on('zoom', (e: D3ZoomEvent<SVGElement, unknown>) => {\n const transform = e.transform;\n const x = transform.rescaleX(this.scales.xOriginal);\n const y = transform.rescaleY(this.scales.yOriginal);\n this.scales.x.domain(x.domain());\n this.scales.y.domain(y.domain());\n\n this.zoomTransform = transform;\n this.zoomStateKey = `${transform.x}_${transform.y}_${transform.k}`; // need it to update axes\n\n this.updateLabelsPosition(this.visibleLabels);\n this.renderSvgLayer(dataFrame);\n this.renderWebglLayer();\n }).on('end', () => {\n this.visibleLabels = this.computeLabels(this.allDots);\n this.renderSvgLayer(dataFrame);\n });\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const p = pointer().on('point', ([coord]) => {\n let closestDatum;\n if (coord) {\n closestDatum = this.getClosestDot(coord.x, coord.y);\n }\n \n const needRedraw =\n (this.selectedDot && !closestDatum) ||\n (!this.selectedDot && closestDatum) ||\n this.selectedDot?.idx !== closestDatum?.idx;\n\n this.selectedDot = closestDatum ?? null;\n\n if (needRedraw) {\n this.renderSvgLayer(dataFrame);\n }\n });\n\n const webglChart = chartCartesian({\n xScale: this.scales.x,\n yScale: this.scales.y,\n })\n .xAxisHeight(() => '0') // removing build-in axes from chartCartesian\n .yAxisWidth(() => '0') // removing build-in axes from chartCartesian\n .svgPlotArea(seriesSvgMulti())\n .webglPlotArea(\n // only render the point series on the WebGL layer\n seriesWebglMulti()\n .series([pointSeries])\n .mapping((d: unknown) => d)\n )\n .decorate(selection => {\n const s = selection.enter();\n if (s && !this.svgLayerElement) {\n s.style('grid-template-columns', '0 auto 1fr auto 0'); // removing build-in axes from chartCartesian\n s.style('grid-template-rows', '0 auto 1fr auto 0'); // removing build-in axes from chartCartesian\n this.svgLayerElement = s.select('.svg-plot-area.plot-area svg').node() as SVGElement;\n }\n s.select('.svg-plot-area.plot-area').attr('class', 'svg-plot-area plot-area miplots-scatterplot-plot-area')\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n .call(z)\n .call(p);\n });\n\n this.tools = {\n webglChart,\n zoom: z,\n fillColor,\n pointSeries,\n };\n\n select(this.canvasNode)\n .datum(dots)\n .style('position', 'absolute')\n .style('width', this.chartSizes.chartWidth + 'px')\n .style('height', this.chartSizes.chartHeight + 'px')\n .style('top', this.margins.top + 'px')\n .style('left', this.margins.left + 'px');\n }\n\n updateAes(\n dataFrame: DataFrame,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers']\n ) {\n if (this.tools === null) {\n return;\n }\n this.aesGetters = getGettersFromLayers(dataFrame, legendInfo, layers);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.fillColor.value((d: Dot) => {\n const colorGetter = this.aesGetters.dotFill ?? GET_BLACK;\n const rgba = stringToNumberRgba(colorGetter(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n }\n\n updatePointSize() {\n if (this.tools === null) {\n return;\n }\n // TODO: try remove array copy\n select(this.canvasNode).datum([...this.allDots]);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.pointSeries.size((d: Dot) => convertDotRToSymbolSize(this.aesGetters.dotSize(d.data)));\n }\n\n updateByLasso() {\n if (this.tools === null) {\n return;\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools?.fillColor.value((d: Dot) => {\n const colorGetter = this.aesGetters.dotFill ?? GET_BLACK;\n const rgba = stringToNumberRgba(colorGetter(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n this.renderWebglLayer();\n }\n\n createQuadtree(dots: Dot[]): KDBush {\n const tree = new KDBush(dots.length, 512);\n\n for (let i = 0; i < dots.length; i++) {\n tree.add(dots[i].x, dots[i].y);\n } \n\n return tree.finish();\n }\n\n getClosestDot(_x: number, _y: number): Dot | null {\n const tree = this.tools?.qt;\n if (!tree) return null;\n const dots = this.allDots;\n const x = this.scales.x.invert(_x);\n const y = this.scales.y.invert(_y);\n const radius = 1 / (this.zoomTransform?.k || 1);\n const minX = x - radius;\n const maxX = x + radius;\n const minY = y - radius;\n const maxY = y + radius;\n\n const indexes = tree.range(minX, minY, maxX, maxY);\n const closest = indexes.reduce((closest, idx: number) => {\n const dot = dots[idx];\n const dX = this.scales.x(dot.x) - _x;\n const dY = this.scales.y(dot.y) - _y;\n const distance = Math.hypot(dX, dY);\n if (closest === null || distance < closest.distance) {\n closest.index = idx;\n closest.distance = distance;\n }\n return closest;\n }, {\n index: -1,\n distance: Infinity\n });\n return indexes.length === 0 || closest.index === -1 ? null : dots[closest.index];\n }\n\n updateDots(dots: Dot[]) {\n if (this.tools === null) {\n return;\n }\n select(this.canvasNode).datum(dots);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.fillColor.data(dots);\n this.tools.qt = this.createQuadtree(dots);\n this.allDots = dots;\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'],\n keyColumn: ColumnName | null,\n dots: Dot[],\n dotExtents: DotsExtents,\n dotsByGrouping: Record<string, Dot[]>,\n layers: ScatterplotUmapSettingsImpl['layers'],\n legendInfo: ScatterplotUmapLegendInfo,\n grouping: ColumnName[],\n onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'],\n onTooltipHintSwitch: (v:boolean) => void,\n onLassoControlsStateUpdate: (v:LassoControlsState) => void,\n ) { \n if (this.tools === null) {\n this.initSettings(\n dataFrame,\n dots,\n chartSettings,\n dotExtents,\n legendInfo,\n layers,\n grouping\n ); \n } else {\n const {title, legend, size} = chartSettings;\n this.updateChartSizes(size);\n this.updateLegendSize(legend, legendInfo, grouping, layers);\n this.createMainTitle(title);\n this.updateMargins();\n this.updateAes(dataFrame, legendInfo, layers);\n }\n\n this.onPolygonUpdateOutside = onPolygonUpdateOutside;\n this.onTooltipHintSwitch = onTooltipHintSwitch;\n this.onLassoControlsStateUpdate = onLassoControlsStateUpdate;\n\n if (this.allDots !== dots) {\n this.updateDots(dots);\n this.visibleLabels = this.computeLabels(dots);\n }\n\n this.notCalculatedProps = {\n settingsId,\n chartSettings,\n keyColumn,\n dotsByGrouping,\n layers\n };\n\n this.renderWebglLayer();\n this.renderSvgLayer(dataFrame);\n }\n\n renderWebglLayer() {\n if (this.tools?.webglChart) {\n select(this.canvasNode).call(this.tools?.webglChart);\n }\n }\n\n onPolygonUpdate = (p:Polygon[]) => {\n this.polygons = p;\n this.updateByLasso();\n const filteredDotsIndexes = this.allDots\n .filter(d => isDotInsidePolygons(d.x, d.y, this.polygons))\n .map(d => d.idx);\n this.onPolygonUpdateOutside(filteredDotsIndexes, p);\n };\n\n renderSvgLayer(dataFrame: DataFrame) {\n const props = {\n settingsId: this.notCalculatedProps.settingsId,\n chartSettings: this.notCalculatedProps.chartSettings,\n keyColumn: this.notCalculatedProps.keyColumn,\n dotsByGrouping: this.notCalculatedProps.dotsByGrouping,\n layers: this.notCalculatedProps.layers,\n chartSizes: this.chartSizes,\n scales: this.scales,\n margins: this.margins,\n mainTitle: this.mainTitle,\n captionsSizes: this.captionsSizes,\n container: this.svgLayerElement,\n zoomStateKey: this.zoomStateKey,\n selectedDot: this.selectedDot,\n aesGetters: this.aesGetters,\n legendData: this.legend,\n labels: this.visibleLabels,\n defaultPolygons: this.polygons,\n onPolygonUpdate: this.onPolygonUpdate,\n onTooltipHintSwitch: this.onTooltipHintSwitch,\n onLassoControlsStateUpdate: this.onLassoControlsStateUpdate,\n } as SVGLayerProps;\n this.svgLayerComponent = (\n <DataFrameProvider dataFrame={dataFrame}>\n <SVGLayer {...props} />\n </DataFrameProvider>\n );\n this.reactRoot?.render(this.svgLayerComponent);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n\n private computeLabels(dots: Dot[]) {\n const textMeasurer = new TextMeasurer('16px Manrope');\n const getPosition = createLabelPositioner(this.chartSizes.chartWidth, this.chartSizes.chartHeight);\n const labels = [];\n\n for (let i = 0; i < dots.length; i++) {\n const dot = dots[i];\n if (dot.label == null) {\n continue;\n }\n const name = String(dot.label);\n const metrics = textMeasurer.getTextMetrics(name);\n const x = this.scales.x(dot.x);\n const y = this.scales.y(dot.y);\n const w = metrics.width;\n const h = (metrics.actualBoundingBoxAscent) + (metrics.actualBoundingBoxDescent);\n const p = 10;\n const position = getPosition(x, y, w, h, p);\n if (!position) {\n continue;\n }\n\n labels.push({\n x,\n y,\n dot,\n name,\n width: w,\n height: h,\n padding: p,\n xPosition: position[0],\n yPosition: position[1],\n } satisfies Label);\n }\n\n return labels;\n }\n\n private updateLabelsPosition(labels: Label[]) {\n for (let i = 0; i < labels.length; i++) {\n const label = labels[i];\n label.x = this.scales.x(label.dot.x as number);\n label.y = this.scales.y(label.dot.y as number);\n }\n }\n}\n\nexport default ChartRenderer;\n"],"names":["convertDotRToSymbolSize","r","isDotInsidePolygons","x","y","polygons","p","polygonContains","getGettersFromLayers","dataFrame","legendInfo","layers","dotLayer","l","curveLayer","createAesGetter","DEFAULT_DOT_AES","ChartRenderer","__publicField","jsx","Fragment","BLACK","MIN_MARGIN","DEFAULT_WIDTH","DEFAULT_HEIGHT","scaleLinear","filteredDotsIndexes","d","_a","_b","node","createRoot","size","xAxis","yAxis","dotsExtents","scaleX","scaleLog","minX","minY","maxX","maxY","middle","halfRange","rangeH","tempX","PADDINGS","scaleY","rangeV","tempY","textMeasurer","TextMeasurer","getMaxTickWidth","ticks","key","format","getTicksAndFormat","maxYTick","title","splitTextByWidth","titleTextHeight","TITLE_LINE_HEIGHT","titleHeight","TITLE_MARGIN","TITLE_LINE","select","legend","legendLabels","grouping","legendItems","emptySizes","column","info","aesData","category","scale","scaleOrdinal","value","layer","isContinuousAes","domain","range","columnName","type","colorScale","getContinuousColorScale","tickPositionScale","scaleSymlog","values","getContinuousLegendTicks","scaleSqrt","labels","res","v","items","arrangeLegendParts","lastItem","legendWidth","LEGEND_OFFSET","legendHeight","dots","chartSettings","dotExtents","fillColor","webglFillColor","rgba","stringToNumberRgba","getColorWithFakeOpacity","pointSeries","seriesWebglPoint","a","b","program","z","zoom","e","transform","pointer","coord","closestDatum","needRedraw","webglChart","chartCartesian","seriesSvgMulti","seriesWebglMulti","selection","s","colorGetter","GET_BLACK","tree","KDBush","_x","_y","radius","indexes","closest","idx","dot","dX","dY","distance","settingsId","keyColumn","dotsByGrouping","onPolygonUpdateOutside","onTooltipHintSwitch","onLassoControlsStateUpdate","props","DataFrameProvider","SVGLayer","message","Error","getPosition","createLabelPositioner","i","name","metrics","w","position","label"],"mappings":"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"}
1
+ {"version":3,"file":"ChartRenderer.js","sources":["../../src/scatterplot-umap/ChartRenderer.tsx"],"sourcesContent":["import { chartCartesian } from '@d3fc/d3fc-chart';\nimport type { CartesianChart } from '@d3fc/d3fc-chart/src/cartesian';\nimport type { ScaleLinear } from 'd3-scale';\nimport { scaleLinear, scaleLog, scaleOrdinal, scaleSqrt, scaleSymlog } from 'd3-scale';\nimport { select } from 'd3-selection';\nimport type { D3ZoomEvent, ZoomBehavior, ZoomTransform } from 'd3-zoom';\nimport { zoom } from 'd3-zoom';\nimport type { ReactElement } from 'react';\nimport type { Root } from 'react-dom/client';\nimport { createRoot } from 'react-dom/client';\nimport { Error } from '../common/Error';\nimport type { DotAesItem, LegendData, LegendItem } from '../common/types';\nimport {\n BLACK,\n DEFAULT_HEIGHT,\n DEFAULT_WIDTH,\n TITLE_LINE_HEIGHT,\n TITLE_MARGIN\n} from '../constants';\nimport { splitTextByWidth } from '../discrete/utils';\nimport { DEFAULT_DOT_AES, MIN_MARGIN } from '../scatterplot/constants';\nimport { createAesGetter } from '../scatterplot/utils/createAesGetter';\nimport { getTicksAndFormat } from '../scatterplot/utils/getTicksAndFormat';\nimport type { Label } from '../scatterplot/utils/getVisibleLabels';\nimport { createLabelPositioner } from '../scatterplot/utils/getVisibleLabels';\nimport type { ColumnName, ScatterplotEventHandlers } from '../types';\nimport { isContinuousAes } from '../types';\nimport type { ScatterplotUmapLegendInfo } from '../types/scatterplot-umap';\nimport { getContinuousColorScale } from '../utils/getContinuousColorScale';\nimport { getContinuousLegendTicks } from '../utils/getContinuousLegendTicks';\nimport { TextMeasurer } from '../utils/TextMeasurer/TextMeasurer';\nimport { SVGLayer } from './components/SVGLayer';\nimport { LEGEND_OFFSET, PADDINGS, TITLE_LINE } from './constants';\nimport type { CurveLayer, DotsLayer, ScatterplotUmapLayer, ScatterplotUmapSettingsImpl } from './SettingsImpl';\nimport type {\n AesGetters,\n CaptionsSizes,\n ChartScales, ChartSizes,\n Dot,\n DotsExtents,\n LassoControlsState,\n Margins,\n Polygon,\n SVGLayerProps,\n} from './types';\n// @ts-ignore\nimport { seriesSvgMulti, seriesWebglMulti, seriesWebglPoint } from '@d3fc/d3fc-series';\n// @ts-ignore\nimport { webglFillColor } from '@d3fc/d3fc-webgl';\n// @ts-ignore\nimport { pointer } from '@d3fc/d3fc-pointer';\nimport { polygonContains } from 'd3-polygon';\nimport KDBush from 'kdbush';\nimport { DataFrameProvider } from '../common/useDataFrame';\nimport { DataFrame } from '../DataFrame';\nimport { arrangeLegendParts } from '../utils/arrangeLegendParts';\nimport { GET_BLACK, getColorWithFakeOpacity, stringToNumberRgba } from './colors';\n\nfunction convertDotRToSymbolSize(r:number) {\n return (r / 2.35) * (r / 2.35) * 64;\n}\n\nfunction isDotInsidePolygons(x:number, y:number, polygons: Polygon[]) {\n if (polygons.length === 0) {\n return true;\n }\n return polygons.some((p) => p.closed && p.points.length > 2 && polygonContains(p.points, [x, y]));\n}\n\nfunction getGettersFromLayers(\n dataFrame: DataFrame,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n): AesGetters {\n const dotLayer = layers.find(l => l.type === 'dots') as DotsLayer | undefined;\n const curveLayer = layers.find(l => l.type === 'curve') as CurveLayer | undefined;\n return {\n dotFill: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotFill ?? DEFAULT_DOT_AES.color, 'dotFill'),\n dotSize: createAesGetter(dataFrame, legendInfo, dotLayer?.aes.dotSize ?? DEFAULT_DOT_AES.size, 'dotSize'),\n lineType: createAesGetter(dataFrame, legendInfo, curveLayer?.aes.lineShape ?? 'solid', 'lineShape')\n };\n}\n\nclass ChartRenderer {\n reactRoot: Root | null = null;\n parentNode: HTMLElement | null = null;\n rootNode: HTMLElement | null = null;\n canvasNode: HTMLElement | null = null;\n\n svgLayerElement: SVGElement | null = null;\n svgLayerComponent: ReactElement = (<></>);\n\n aesGetters: AesGetters = {\n dotSize: () => 2,\n dotFill: () => BLACK,\n lineType: () => 'solid'\n };\n\n tools: {\n webglChart: CartesianChart<any, any>;\n qt?: KDBush;\n fillColor: () => {\n value: (setter: (d: Dot) => [number, number, number, number]) => void;\n data: (setter: () => Dot[]) => void;\n };\n pointSeries: () => any;\n zoom: ZoomBehavior<any, any>;\n } | null = null;\n\n margins: Margins = {\n top: MIN_MARGIN,\n bottom: MIN_MARGIN,\n left: MIN_MARGIN,\n right: MIN_MARGIN,\n };\n chartSizes: ChartSizes = {\n chartWidth: DEFAULT_WIDTH, // width of single chart\n chartHeight: DEFAULT_HEIGHT, // height of single chart\n totalWidth: DEFAULT_WIDTH, // width of all charts in charts row, plus left axis, plus legend\n totalHeight: DEFAULT_HEIGHT, // width of all charts in charts height, plus bottom axis, plus top title\n };\n scales: ChartScales = {\n x: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH]),\n y: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]),\n xOriginal: scaleLinear().domain([0, 10]).range([0, DEFAULT_WIDTH]),\n yOriginal: scaleLinear().domain([0, 10]).range([DEFAULT_HEIGHT, 0]),\n };\n\n polygons:Polygon[] = [];\n onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'] = () => undefined;\n onTooltipHintSwitch: ScatterplotEventHandlers['onTooltipHintSwitch'] = () => undefined;\n onLassoControlsStateUpdate: ScatterplotEventHandlers['onLassoControlsStateUpdate'] = () => undefined;\n\n zoomTransform: ZoomTransform | null = null;\n zoomStateKey = '';\n selectedDot: Dot | null = null;\n captionsSizes: CaptionsSizes = {\n xAxisCaptionsWidth: 30,\n yAxisCaptionsWidth: 100,\n };\n mainTitle: string[] = []; // can be multiline\n legend: LegendData = {width: 0, height: 0, items: []};\n\n notCalculatedProps: Partial<SVGLayerProps> = {};\n\n allDots: Dot[] = [];\n visibleLabels: Label[] = [];\n dataFrame: DataFrame = new DataFrame('', {});\n\n clear() {\n if (this.parentNode && this.rootNode && this.canvasNode) {\n this.parentNode?.removeChild(this.rootNode);\n this.parentNode?.removeChild(this.canvasNode);\n this.parentNode = null;\n this.rootNode = null;\n this.canvasNode = null;\n this.svgLayerElement = null;\n this.tools = null;\n }\n // timeout to avoid trying to unmount during rendering\n setTimeout(() => {\n this.reactRoot?.unmount();\n this.reactRoot = null;\n });\n }\n\n init(node: HTMLElement) {\n if (this.parentNode === null) {\n this.parentNode = node;\n this.rootNode = document.createElement('div');\n this.canvasNode = document.createElement('div');\n this.parentNode.appendChild(this.rootNode);\n this.parentNode.appendChild(this.canvasNode);\n this.reactRoot = createRoot(this.rootNode);\n }\n }\n\n updateChartSizes(size: ScatterplotUmapSettingsImpl['chartSettings']['size']) {\n if (size.width !== this.chartSizes.chartWidth || size.height !== this.chartSizes.chartHeight) {\n // NB: now chart sizes always change with one multiplier for width/height so qt stays without changes\n this.chartSizes.chartWidth = size.width;\n this.chartSizes.chartHeight = size.height;\n this.scales.x.range([0, this.chartSizes.chartWidth]);\n this.scales.y.range([this.chartSizes.chartHeight, 0]);\n }\n \n }\n\n updateViewport(\n xAxis: ScatterplotUmapSettingsImpl['chartSettings']['xAxis'],\n yAxis: ScatterplotUmapSettingsImpl['chartSettings']['yAxis'],\n dotsExtents: DotsExtents\n ) {\n const scaleX = xAxis.scale === 'log' ? scaleLog() : scaleLinear();\n\n let {minX, minY, maxX, maxY} = dotsExtents;\n if (xAxis.lowerValue !== undefined) {\n minX = Math.max(minX, xAxis.lowerValue);\n }\n if (xAxis.upperValue !== undefined) {\n maxX = Math.min(maxX, xAxis.upperValue);\n }\n if (yAxis.lowerValue !== undefined) {\n minY = Math.max(minY, yAxis.lowerValue);\n }\n if (yAxis.upperValue !== undefined) {\n maxY = Math.min(maxY, yAxis.upperValue);\n }\n if (xAxis.symmetricRange !== undefined) {\n const middle = xAxis.symmetricRange;\n if (middle >= minX && middle <= maxX) {\n const halfRange = Math.max(middle - minX, maxX - middle);\n minX = middle - halfRange;\n maxX = middle + halfRange;\n }\n }\n if (typeof yAxis.symmetricRange !== 'undefined') {\n const middle = yAxis.symmetricRange;\n if (middle >= minY && middle <= maxY) {\n const halfRange = Math.max(middle - minY, maxY - middle);\n minY = middle - halfRange;\n maxY = middle + halfRange;\n }\n }\n\n const rangeH = [0, this.chartSizes.chartWidth];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempX = scaleX\n .copy()\n .domain([minX, maxX])\n .range([PADDINGS.LEFT, this.chartSizes.chartWidth - PADDINGS.RIGHT]);\n scaleX\n .domain([tempX.invert(0), tempX.invert(this.chartSizes.chartWidth)])\n .range(rangeH)\n .nice();\n this.scales.x = scaleX;\n this.scales.xOriginal = scaleX.copy();\n\n const scaleY = yAxis.scale === 'log' ? scaleLog() : scaleLinear();\n const rangeV = [this.chartSizes.chartHeight, 0];\n // supporting scale, it needs to add offsets of fixed size in pixels to general scale Y\n const tempY = scaleY\n .copy()\n .domain([minY, maxY])\n .range([this.chartSizes.chartHeight - PADDINGS.BOTTOM, PADDINGS.TOP]);\n scaleY\n .domain([tempY.invert(this.chartSizes.chartHeight), tempY.invert(0)])\n .range(rangeV)\n .nice();\n this.scales.y = scaleY;\n this.scales.yOriginal = scaleY.copy();\n }\n\n updateCaptionsSize() {\n const textMeasurer = new TextMeasurer('600 14px Arial');\n\n function getMaxTickWidth(ticks: string[]) {\n return Math.max(...ticks.map(key => textMeasurer.getTextWidth(key)));\n }\n\n const {ticks, format} = getTicksAndFormat(this.scales.y, false);\n const maxYTick = getMaxTickWidth(ticks.map(format));\n\n this.captionsSizes = {\n xAxisCaptionsWidth: 20,\n yAxisCaptionsWidth: maxYTick,\n };\n }\n\n createMainTitle(title: ScatterplotUmapSettingsImpl['chartSettings']['title']) {\n this.mainTitle = splitTextByWidth(\n title.name,\n this.chartSizes.totalWidth - this.margins.left - this.margins.right,\n 20\n );\n }\n\n updateMargins() {\n const titleTextHeight = TITLE_LINE_HEIGHT * this.mainTitle.length;\n const titleHeight = titleTextHeight > 0 ? titleTextHeight + TITLE_MARGIN * 2 : 0;\n this.margins = {\n top: Math.max(titleHeight, MIN_MARGIN),\n bottom: MIN_MARGIN + this.captionsSizes.xAxisCaptionsWidth + TITLE_LINE,\n left: MIN_MARGIN + this.captionsSizes.yAxisCaptionsWidth + TITLE_LINE,\n right: this.legend.width + MIN_MARGIN,\n };\n this.chartSizes.totalWidth = this.margins.left + this.chartSizes.chartWidth + this.margins.right;\n this.chartSizes.totalHeight =\n this.margins.top + Math.max(this.chartSizes.chartHeight, this.legend.height) + this.margins.bottom;\n\n select(this.canvasNode)\n .style('width', this.chartSizes.chartWidth + 'px')\n .style('height', this.chartSizes.chartHeight + 'px')\n .style('top', this.margins.top + 'px')\n .style('left', this.margins.left + 'px');\n }\n\n updateLegendSize(\n legend: ScatterplotUmapSettingsImpl['chartSettings']['legend'],\n legendLabels: ScatterplotUmapLegendInfo,\n grouping: ColumnName[],\n layers: ScatterplotUmapLayer[]\n ) {\n if (!legend.show) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const legendItems: LegendItem[] = [];\n const emptySizes = {width:0, height:0, left:0, top: 0};\n \n grouping.forEach(column => {\n const info = legendLabels[column.value];\n if (info.usedAes.length === 0 || !info.aesMap) {\n return;\n }\n const aesData: Record<string, DotAesItem> = {};\n info.values.forEach(category => {\n if (!aesData[category]) {\n aesData[category] = {...DEFAULT_DOT_AES} as DotAesItem;\n }\n info.usedAes.forEach(key => {\n if (key === 'dotFill') {\n aesData[category].color = (info.aesMap(category, key) ?? BLACK) as string;\n }\n if (key === 'dotSize') {\n aesData[category].size = Number(info.aesMap(category, key) ?? 3);\n }\n });\n });\n\n const title = column.label ?? column.value;\n const scale = scaleOrdinal<DotAesItem>()\n .domain(info.values)\n .range(info.values.map(value => aesData[value]));\n legendItems.push({...emptySizes, id: column.value, type: 'dots', title, scale, values:info.values, labels:info.labels});\n });\n\n layers.forEach(layer => {\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotFill)) {\n const {domain, range, columnName, type = 'linear'} = layer.aes.dotFill;\n const title = columnName.label ?? columnName.value;\n const colorScale = getContinuousColorScale(range, domain, 'linear') as ScaleLinear<string, string>; // always linear for legend - scale to render gradient, not for dots\n const tickPositionScale = (type === 'log' ? scaleSymlog<string, string>() : scaleLinear<string, string>())\n .domain(domain)\n // @ts-ignore\n .range([this.chartSizes.chartHeight, 0]);\n const values = getContinuousLegendTicks(tickPositionScale, domain as [number, number]);\n legendItems.push({...emptySizes, id: 'dotFill', type: 'continuous', title, scale: colorScale, tickPositionScale, values});\n }\n if (layer.type === 'dots' && isContinuousAes(layer.aes.dotSize)) {\n const {columnName, domain, range} = layer.aes.dotSize;\n const title = columnName.label ?? columnName.value;\n const scale = scaleSqrt(domain, range);\n const values = scale.ticks(3);\n const format = scale.tickFormat(3);\n const labels = values.reduce((res: Record<string, string>, v) => {\n res[String(v)] = format(v);\n return res;\n }, {});\n legendItems.push({...emptySizes, id: columnName.value, type: 'size', title, scale, values, labels});\n }\n });\n\n if (!legendItems.length) {\n this.legend = {width: 0, height: 0, items: []};\n return;\n }\n\n const items = arrangeLegendParts(legendItems, this.chartSizes.chartHeight);\n const lastItem = items[items.length - 1];\n const legendWidth = lastItem.left + lastItem.width + LEGEND_OFFSET;\n const legendHeight = this.chartSizes.chartHeight;\n\n this.legend = {\n width: legendWidth,\n height: legendHeight,\n items,\n };\n }\n\n initSettings(\n dots: Dot[],\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'],\n dotExtents: DotsExtents,\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers'],\n grouping: ColumnName[]\n ) {\n const {xAxis, yAxis, size, title, legend} = chartSettings;\n this.updateChartSizes(size);\n this.updateViewport(xAxis, yAxis, dotExtents);\n this.updateCaptionsSize();\n this.updateLegendSize(legend, legendInfo, grouping, layers);\n this.createMainTitle(title);\n this.updateMargins();\n\n this.aesGetters = getGettersFromLayers(this.dataFrame, legendInfo, layers);\n\n const fillColor = webglFillColor()\n .data(dots)\n .value((d: Dot) => {\n const rgba = stringToNumberRgba(this.aesGetters.dotFill(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n\n const pointSeries = seriesWebglPoint()\n .equals((a: Dot[], b: Dot[]) => a === b)\n .size((d: Dot) => convertDotRToSymbolSize(this.aesGetters.dotSize(d.idx)))\n .crossValue((d: Dot) => d.x)\n .mainValue((d: Dot) => d.y)\n .decorate((program: unknown) => fillColor(program));\n\n const z = zoom()\n .scaleExtent([0.1, 1000])\n .filter((e:MouseEvent) => {\n return e.type === 'wheel' || e.metaKey || e.ctrlKey;\n })\n .on('start', () => {\n this.selectedDot = null;\n })\n .on('zoom', (e: D3ZoomEvent<SVGElement, unknown>) => {\n const transform = e.transform;\n const x = transform.rescaleX(this.scales.xOriginal);\n const y = transform.rescaleY(this.scales.yOriginal);\n this.scales.x.domain(x.domain());\n this.scales.y.domain(y.domain());\n\n this.zoomTransform = transform;\n this.zoomStateKey = `${transform.x}_${transform.y}_${transform.k}`; // need it to update axes\n\n this.updateLabelsPosition(this.visibleLabels);\n this.renderSvgLayer();\n this.renderWebglLayer();\n }).on('end', () => {\n this.visibleLabels = this.computeLabels(this.allDots);\n this.renderSvgLayer();\n });\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const p = pointer().on('point', ([coord]) => {\n let closestDatum;\n if (coord) {\n closestDatum = this.getClosestDot(coord.x, coord.y);\n }\n \n const needRedraw =\n (this.selectedDot && !closestDatum) ||\n (!this.selectedDot && closestDatum) ||\n this.selectedDot?.idx !== closestDatum?.idx;\n\n this.selectedDot = closestDatum ?? null;\n\n if (needRedraw) {\n this.renderSvgLayer();\n }\n });\n\n const webglChart = chartCartesian({\n xScale: this.scales.x,\n yScale: this.scales.y,\n })\n .xAxisHeight(() => '0') // removing build-in axes from chartCartesian\n .yAxisWidth(() => '0') // removing build-in axes from chartCartesian\n .svgPlotArea(seriesSvgMulti())\n .webglPlotArea(\n // only render the point series on the WebGL layer\n seriesWebglMulti()\n .series([pointSeries])\n .mapping((d: unknown) => d)\n )\n .decorate(selection => {\n const s = selection.enter();\n if (s && !this.svgLayerElement) {\n s.style('grid-template-columns', '0 auto 1fr auto 0'); // removing build-in axes from chartCartesian\n s.style('grid-template-rows', '0 auto 1fr auto 0'); // removing build-in axes from chartCartesian\n this.svgLayerElement = s.select('.svg-plot-area.plot-area svg').node() as SVGElement;\n }\n s.select('.svg-plot-area.plot-area').attr('class', 'svg-plot-area plot-area miplots-scatterplot-plot-area')\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n .call(z)\n .call(p);\n });\n\n this.tools = {\n webglChart,\n zoom: z,\n fillColor,\n pointSeries,\n };\n\n select(this.canvasNode)\n .datum(dots)\n .style('position', 'absolute')\n .style('width', this.chartSizes.chartWidth + 'px')\n .style('height', this.chartSizes.chartHeight + 'px')\n .style('top', this.margins.top + 'px')\n .style('left', this.margins.left + 'px');\n }\n\n updateAes(\n legendInfo: ScatterplotUmapLegendInfo,\n layers: ScatterplotUmapSettingsImpl['layers']\n ) {\n if (this.tools === null) {\n return;\n }\n this.aesGetters = getGettersFromLayers(this.dataFrame, legendInfo, layers);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.fillColor.value((d: Dot) => {\n const colorGetter = this.aesGetters.dotFill ?? GET_BLACK;\n const rgba = stringToNumberRgba(colorGetter(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n }\n\n updatePointSize() {\n if (this.tools === null) {\n return;\n }\n // TODO: try remove array copy\n select(this.canvasNode).datum([...this.allDots]);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.pointSeries.size((d: Dot) => convertDotRToSymbolSize(this.aesGetters.dotSize(d.data)));\n }\n\n updateByLasso() {\n if (this.tools === null) {\n return;\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools?.fillColor.value((d: Dot) => {\n const colorGetter = this.aesGetters.dotFill ?? GET_BLACK;\n const rgba = stringToNumberRgba(colorGetter(d.idx));\n rgba[3] = !d.dimmed && isDotInsidePolygons(d.x, d.y, this.polygons) ? 1 : 0.4;\n return getColorWithFakeOpacity(rgba, rgba);\n });\n this.renderWebglLayer();\n }\n\n createQuadtree(dots: Dot[]): KDBush {\n const tree = new KDBush(dots.length, 512);\n\n for (let i = 0; i < dots.length; i++) {\n tree.add(dots[i].x, dots[i].y);\n } \n\n return tree.finish();\n }\n\n getClosestDot(_x: number, _y: number): Dot | null {\n const tree = this.tools?.qt;\n if (!tree) return null;\n const dots = this.allDots;\n const x = this.scales.x.invert(_x);\n const y = this.scales.y.invert(_y);\n const radius = 1 / (this.zoomTransform?.k || 1);\n const minX = x - radius;\n const maxX = x + radius;\n const minY = y - radius;\n const maxY = y + radius;\n\n const indexes = tree.range(minX, minY, maxX, maxY);\n const closest = indexes.reduce((closest, idx: number) => {\n const dot = dots[idx];\n const dX = this.scales.x(dot.x) - _x;\n const dY = this.scales.y(dot.y) - _y;\n const distance = Math.hypot(dX, dY);\n if (closest === null || distance < closest.distance) {\n closest.index = idx;\n closest.distance = distance;\n }\n return closest;\n }, {\n index: -1,\n distance: Infinity\n });\n return indexes.length === 0 || closest.index === -1 ? null : dots[closest.index];\n }\n\n updateDots(dots: Dot[]) {\n if (this.tools === null) {\n return;\n }\n select(this.canvasNode).datum(dots);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.tools.fillColor.data(dots);\n this.tools.qt = this.createQuadtree(dots);\n this.allDots = dots;\n }\n\n render(\n dataFrame: DataFrame,\n settingsId: string,\n chartSettings: ScatterplotUmapSettingsImpl['chartSettings'],\n keyColumn: ColumnName | null,\n dots: Dot[],\n dotExtents: DotsExtents,\n dotsByGrouping: Record<string, Dot[]>,\n layers: ScatterplotUmapSettingsImpl['layers'],\n legendInfo: ScatterplotUmapLegendInfo,\n grouping: ColumnName[],\n onPolygonUpdateOutside: ScatterplotEventHandlers['onPolygonUpdate'],\n onTooltipHintSwitch: (v:boolean) => void,\n onLassoControlsStateUpdate: (v:LassoControlsState) => void,\n ) {\n this.dataFrame = dataFrame; \n if (this.tools === null) {\n this.initSettings(\n dots,\n chartSettings,\n dotExtents,\n legendInfo,\n layers,\n grouping\n ); \n } else {\n const {title, legend, size} = chartSettings;\n this.updateChartSizes(size);\n this.updateLegendSize(legend, legendInfo, grouping, layers);\n this.createMainTitle(title);\n this.updateMargins();\n this.updateAes(legendInfo, layers);\n }\n\n this.onPolygonUpdateOutside = onPolygonUpdateOutside;\n this.onTooltipHintSwitch = onTooltipHintSwitch;\n this.onLassoControlsStateUpdate = onLassoControlsStateUpdate;\n\n if (this.allDots !== dots) {\n this.updateDots(dots);\n this.visibleLabels = this.computeLabels(dots);\n }\n\n this.notCalculatedProps = {\n settingsId,\n chartSettings,\n keyColumn,\n dotsByGrouping,\n layers\n };\n\n this.renderWebglLayer();\n this.renderSvgLayer();\n }\n\n renderWebglLayer() {\n if (this.tools?.webglChart) {\n select(this.canvasNode).call(this.tools?.webglChart);\n }\n }\n\n onPolygonUpdate = (p:Polygon[]) => {\n this.polygons = p;\n this.updateByLasso();\n const filteredDotsIndexes = this.allDots\n .filter(d => isDotInsidePolygons(d.x, d.y, this.polygons))\n .map(d => d.idx);\n this.onPolygonUpdateOutside(filteredDotsIndexes, p);\n };\n\n renderSvgLayer() {\n const props = {\n settingsId: this.notCalculatedProps.settingsId,\n chartSettings: this.notCalculatedProps.chartSettings,\n keyColumn: this.notCalculatedProps.keyColumn,\n dotsByGrouping: this.notCalculatedProps.dotsByGrouping,\n layers: this.notCalculatedProps.layers,\n chartSizes: this.chartSizes,\n scales: this.scales,\n margins: this.margins,\n mainTitle: this.mainTitle,\n captionsSizes: this.captionsSizes,\n container: this.svgLayerElement,\n zoomStateKey: this.zoomStateKey,\n selectedDot: this.selectedDot,\n aesGetters: this.aesGetters,\n legendData: this.legend,\n labels: this.visibleLabels,\n defaultPolygons: this.polygons,\n onPolygonUpdate: this.onPolygonUpdate,\n onTooltipHintSwitch: this.onTooltipHintSwitch,\n onLassoControlsStateUpdate: this.onLassoControlsStateUpdate,\n } as SVGLayerProps;\n this.svgLayerComponent = (\n <DataFrameProvider dataFrame={this.dataFrame}>\n <SVGLayer {...props} />\n </DataFrameProvider>\n );\n this.reactRoot?.render(this.svgLayerComponent);\n }\n\n renderError(message: string) {\n this.reactRoot?.render(<Error message={message} />);\n }\n\n private computeLabels(dots: Dot[]) {\n const textMeasurer = new TextMeasurer('16px Manrope');\n const getPosition = createLabelPositioner(this.chartSizes.chartWidth, this.chartSizes.chartHeight);\n const labels = [];\n\n for (let i = 0; i < dots.length; i++) {\n const dot = dots[i];\n if (dot.label == null) {\n continue;\n }\n const name = String(dot.label);\n const metrics = textMeasurer.getTextMetrics(name);\n const x = this.scales.x(dot.x);\n const y = this.scales.y(dot.y);\n const w = metrics.width;\n const h = (metrics.actualBoundingBoxAscent) + (metrics.actualBoundingBoxDescent);\n const p = 10;\n const position = getPosition(x, y, w, h, p);\n if (!position) {\n continue;\n }\n\n labels.push({\n x,\n y,\n dot,\n name,\n width: w,\n height: h,\n padding: p,\n xPosition: position[0],\n yPosition: position[1],\n } satisfies Label);\n }\n\n return labels;\n }\n\n private updateLabelsPosition(labels: Label[]) {\n for (let i = 0; i < labels.length; i++) {\n const label = labels[i];\n label.x = this.scales.x(label.dot.x as number);\n label.y = this.scales.y(label.dot.y as number);\n }\n }\n}\n\nexport default ChartRenderer;\n"],"names":["convertDotRToSymbolSize","r","isDotInsidePolygons","x","y","polygons","p","polygonContains","getGettersFromLayers","dataFrame","legendInfo","layers","dotLayer","l","curveLayer","createAesGetter","DEFAULT_DOT_AES","ChartRenderer","__publicField","jsx","Fragment","BLACK","MIN_MARGIN","DEFAULT_WIDTH","DEFAULT_HEIGHT","scaleLinear","DataFrame","filteredDotsIndexes","d","_a","_b","node","createRoot","size","xAxis","yAxis","dotsExtents","scaleX","scaleLog","minX","minY","maxX","maxY","middle","halfRange","rangeH","tempX","PADDINGS","scaleY","rangeV","tempY","textMeasurer","TextMeasurer","getMaxTickWidth","ticks","key","format","getTicksAndFormat","maxYTick","title","splitTextByWidth","titleTextHeight","TITLE_LINE_HEIGHT","titleHeight","TITLE_MARGIN","TITLE_LINE","select","legend","legendLabels","grouping","legendItems","emptySizes","column","info","aesData","category","scale","scaleOrdinal","value","layer","isContinuousAes","domain","range","columnName","type","colorScale","getContinuousColorScale","tickPositionScale","scaleSymlog","values","getContinuousLegendTicks","scaleSqrt","labels","res","v","items","arrangeLegendParts","lastItem","legendWidth","LEGEND_OFFSET","legendHeight","dots","chartSettings","dotExtents","fillColor","webglFillColor","rgba","stringToNumberRgba","getColorWithFakeOpacity","pointSeries","seriesWebglPoint","a","b","program","z","zoom","e","transform","pointer","coord","closestDatum","needRedraw","webglChart","chartCartesian","seriesSvgMulti","seriesWebglMulti","selection","s","colorGetter","GET_BLACK","tree","KDBush","_x","_y","radius","indexes","closest","idx","dot","dX","dY","distance","settingsId","keyColumn","dotsByGrouping","onPolygonUpdateOutside","onTooltipHintSwitch","onLassoControlsStateUpdate","props","DataFrameProvider","SVGLayer","message","Error","getPosition","createLabelPositioner","i","name","metrics","w","h","position","label"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milaboratories/miplots4",
3
- "version": "1.0.136",
3
+ "version": "1.0.137",
4
4
  "description": "Data visualization library",
5
5
  "author": "erohinaelena",
6
6
  "license": "ISC",