@genome-spy/app 0.88.1 → 0.90.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.
Files changed (65) hide show
  1. package/dist/{agentApi-BIpg3JKh.js → agentApi-Z65dw-sD.js} +5976 -6711
  2. package/dist/agentApi.es.js +3580 -4470
  3. package/dist/agentShared.es.js +742 -683
  4. package/dist/{canvas2d-BVQ7-2eJ.js → canvas2d-DiPQvNtZ.js} +122 -109
  5. package/dist/{canvas2d-D7SZK3xv.js → canvas2d-t_N10CeW.js} +114 -101
  6. package/dist/{canvasSizeHelper-7h_8rOcx.js → canvasSizeHelper-foL2YvGL.js} +15 -8
  7. package/dist/{clipOptions-DTMcB_9z.js → clipOptions-B5PibDq3.js} +1610 -1342
  8. package/dist/{clipOptions-BWHr3aTa.js → clipOptions-Cba4I0AO.js} +1872 -1644
  9. package/dist/{componentStyles-FsNmIb22.js → componentStyles-DGtQXvwc.js} +17 -15
  10. package/dist/{debug-CVpoEOWx.js → debug-CVAlrcZt.js} +2 -2
  11. package/dist/{debug-DYAMZZKl.js → debug-DP4WzTNo.js} +2 -2
  12. package/dist/dialog.es.js +4 -3
  13. package/dist/esm-BiqrFjMh.js +443 -0
  14. package/dist/{esm-lwYrRdbg.js → esm-Bv7Frz7C.js} +142 -79
  15. package/dist/{esm-VvpZ9hsq.js → esm-C3A-AuRi.js} +1 -1
  16. package/dist/esm-CvpR1OcU.js +322 -0
  17. package/dist/esm-DFHFX1sH.js +1526 -0
  18. package/dist/esm-Dndm-NaA.js +1193 -0
  19. package/dist/{esm-CcDLRSvC.js → esm-DtNElqRr.js} +64 -63
  20. package/dist/esm-L53qjcYH.js +1155 -0
  21. package/dist/esm-VFJeyk9i.js +249 -0
  22. package/dist/{esm-BdLYkz-m.js → esm-_xCtpDwm.js} +1 -1
  23. package/dist/index.es.js +4203 -3910
  24. package/dist/index.js +971 -482
  25. package/dist/{indexer-CXjZDo2Q.js → indexer-DbFTKGlm.js} +1 -1
  26. package/dist/{indexer-DAH_ruVn.js → indexer-En7gpvLN.js} +1 -1
  27. package/dist/{lit-ByuJ0FJ4.js → lit-CoXp9NFX.js} +12 -10
  28. package/dist/order-BkYCnwD7.js +1062 -0
  29. package/dist/order-R043xTpC.js +1062 -0
  30. package/dist/{parquetRead-Cs2xRrvz.js → parquetRead-0hFIa3Cc.js} +532 -350
  31. package/dist/rasterExport-C_FcNBkC.js +52 -0
  32. package/dist/rasterExport-Z7gs5346.js +52 -0
  33. package/dist/rasterization-_-9JmSas.js +63 -0
  34. package/dist/rectangle-DE98gIxF.js +108 -0
  35. package/dist/{renderCanvas2D-DxturTEW.js → renderCanvas2D-DK1c9TFK.js} +68 -67
  36. package/dist/{renderCanvas2D-DtcJjqpB.js → renderCanvas2D-IM-A9DYG.js} +57 -56
  37. package/dist/schema.json +599 -116
  38. package/dist/{src-DjOlFqSn.js → src-DJtvThVC.js} +3 -5
  39. package/dist/style.css +1 -1
  40. package/dist/{svg-SDJMzL--.js → svg-DW3tfUmm.js} +339 -326
  41. package/dist/{svg-CyrLfa9e.js → svg-PabUdcDi.js} +365 -352
  42. package/dist/{svgRasterizer-f7DJ3UO0.js → svgRasterizer-B6YtWLJs.js} +6 -5
  43. package/dist/{svgRasterizer-mWK7HTkx.js → svgRasterizer-BEVDyyS3.js} +6 -5
  44. package/dist/{vega-scale-DLKCwWRs.js → vega-scale-Byaw1K8O.js} +823 -780
  45. package/dist/{vega-scale-CypF85iS.js → vega-scale-Ctz_wa3z.js} +963 -923
  46. package/dist/{viewIdentityRegistry-Dl-vMN9I.js → viewIdentityRegistry-BW415b3o.js} +1 -1
  47. package/dist/{viewIdentityRegistry-DIDo44XQ.js → viewIdentityRegistry-_F0E7nkA.js} +1 -1
  48. package/dist/{viewSelectors-CymbZyE6.js → viewSelectors-DYz-PhTO.js} +407 -340
  49. package/dist/{viewSelectors-DNiDip5e.js → viewSelectors-KtD-QSN0.js} +349 -282
  50. package/dist/{viewUtils-BrJLIj2o.js → viewUtils-BZGPseMx.js} +2052 -1871
  51. package/dist/{webgl-tZfZ8y3q.js → webgl-BKSGqHaz.js} +2144 -784
  52. package/dist/{webgl-CTJt7jQd.js → webgl-tdKf9SlZ.js} +2386 -1026
  53. package/package.json +5 -5
  54. package/dist/esm-80V4xF_D.js +0 -1098
  55. package/dist/esm-BA6yMcc-.js +0 -1222
  56. package/dist/esm-BdT7qUL-.js +0 -157
  57. package/dist/esm-CfYZhLHN.js +0 -1367
  58. package/dist/esm-D-iG_TIX.js +0 -441
  59. package/dist/esm-JAiZmFIS.js +0 -128
  60. package/dist/order-C5CzA37O.js +0 -918
  61. package/dist/order-DvY7KNcu.js +0 -918
  62. package/dist/rasterExport-BgZ98e6U.js +0 -44
  63. package/dist/rasterExport-DEr8fOLm.js +0 -44
  64. package/dist/rasterization-CFogVB3B.js +0 -50
  65. package/dist/rectangle-DKnrAmKs.js +0 -142
@@ -0,0 +1,52 @@
1
+ import { t as e } from "./rasterization-_-9JmSas.js";
2
+ import { t } from "./rectangle-DE98gIxF.js";
3
+ import { t as n } from "./layoutResult-D50MSHXR.js";
4
+ import { r } from "./order-BkYCnwD7.js";
5
+ import { t as i } from "./renderCanvas2D-DK1c9TFK.js";
6
+ //#region ../core/src/rendering/canvas2d/rasterExport.js
7
+ async function a(e) {
8
+ let t = e.mimeType ?? "image/png";
9
+ if (t != "image/png") throw Error(`Unsupported raster export MIME type: ${t}`);
10
+ let n = e.textMetrics ?? e.viewRoot.context.textMetrics;
11
+ await r(n, e.viewRoot);
12
+ let i = s({
13
+ ...e,
14
+ textMetrics: n
15
+ });
16
+ return new Promise((e, n) => {
17
+ i.toBlob((t) => {
18
+ t ? e(t) : n(/* @__PURE__ */ Error("Canvas2D could not encode the raster export."));
19
+ }, t);
20
+ });
21
+ }
22
+ function o(e) {
23
+ return s({
24
+ ...e,
25
+ pixelRatio: e.devicePixelRatio ?? e.pixelRatio
26
+ }).toDataURL("image/png");
27
+ }
28
+ function s(r) {
29
+ let a = r.logicalWidth ?? r.liveSize.width, o = r.logicalHeight ?? r.liveSize.height, s = r.pixelRatio ?? r.liveDevicePixelRatio, c, l;
30
+ try {
31
+ c = document.createElement("canvas"), c.width = Math.floor(a * s), c.height = Math.floor(o * s), l = c.getContext("2d");
32
+ } catch (t) {
33
+ throw new e("Unable to initialize a Canvas2D export context.", { cause: t });
34
+ }
35
+ if (!l) throw new e("Unable to initialize a Canvas2D export context.");
36
+ let u = n(r.viewRoot, t.create(0, 0, a, o), {
37
+ devicePixelRatio: s,
38
+ renderingOptions: { firstFacet: !0 }
39
+ });
40
+ return i({
41
+ layoutResult: u,
42
+ context: l,
43
+ width: a,
44
+ height: o,
45
+ devicePixelRatio: s,
46
+ background: r.clearColor ?? null,
47
+ paint: !0,
48
+ textMetrics: r.textMetrics ?? r.viewRoot.context.textMetrics
49
+ }), c;
50
+ }
51
+ //#endregion
52
+ export { o as exportCanvas, a as exportRaster };
@@ -0,0 +1,52 @@
1
+ import { t as e } from "./rasterization-_-9JmSas.js";
2
+ import { t } from "./rectangle-DE98gIxF.js";
3
+ import { t as n } from "./layoutResult-D50MSHXR.js";
4
+ import { r } from "./order-R043xTpC.js";
5
+ import { t as i } from "./renderCanvas2D-IM-A9DYG.js";
6
+ //#region ../core/src/rendering/canvas2d/rasterExport.js
7
+ async function a(e) {
8
+ let t = e.mimeType ?? "image/png";
9
+ if (t != "image/png") throw Error(`Unsupported raster export MIME type: ${t}`);
10
+ let n = e.textMetrics ?? e.viewRoot.context.textMetrics;
11
+ await r(n, e.viewRoot);
12
+ let i = s({
13
+ ...e,
14
+ textMetrics: n
15
+ });
16
+ return new Promise((e, n) => {
17
+ i.toBlob((t) => {
18
+ t ? e(t) : n(/* @__PURE__ */ Error("Canvas2D could not encode the raster export."));
19
+ }, t);
20
+ });
21
+ }
22
+ function o(e) {
23
+ return s({
24
+ ...e,
25
+ pixelRatio: e.devicePixelRatio ?? e.pixelRatio
26
+ }).toDataURL("image/png");
27
+ }
28
+ function s(r) {
29
+ let a = r.logicalWidth ?? r.liveSize.width, o = r.logicalHeight ?? r.liveSize.height, s = r.pixelRatio ?? r.liveDevicePixelRatio, c, l;
30
+ try {
31
+ c = document.createElement("canvas"), c.width = Math.floor(a * s), c.height = Math.floor(o * s), l = c.getContext("2d");
32
+ } catch (t) {
33
+ throw new e("Unable to initialize a Canvas2D export context.", { cause: t });
34
+ }
35
+ if (!l) throw new e("Unable to initialize a Canvas2D export context.");
36
+ let u = n(r.viewRoot, t.create(0, 0, a, o), {
37
+ devicePixelRatio: s,
38
+ renderingOptions: { firstFacet: !0 }
39
+ });
40
+ return i({
41
+ layoutResult: u,
42
+ context: l,
43
+ width: a,
44
+ height: o,
45
+ devicePixelRatio: s,
46
+ background: r.clearColor ?? null,
47
+ paint: !0,
48
+ textMetrics: r.textMetrics ?? r.viewRoot.context.textMetrics
49
+ }), c;
50
+ }
51
+ //#endregion
52
+ export { o as exportCanvas, a as exportRaster };
@@ -0,0 +1,63 @@
1
+ //#region ../core/src/rendering/renderingModuleRegistry.js
2
+ var e = {};
3
+ //#endregion
4
+ //#region ../core/src/scales/scalePosition.js
5
+ function t(e, t = .5) {
6
+ if (e.type == "band" || e.type == "point") return e.bandwidth() * t;
7
+ if (e.type == "index" || e.type == "locus") {
8
+ let n = e;
9
+ return Math.sign(n.step()) * n.bandwidth() * t;
10
+ }
11
+ return 0;
12
+ }
13
+ //#endregion
14
+ //#region ../core/src/rendering/rasterization.js
15
+ var n = class extends Error {
16
+ constructor(e, t) {
17
+ super(e, t), this.name = "RasterizationUnavailableError";
18
+ }
19
+ };
20
+ async function r(t, r) {
21
+ if (t.exportRaster) try {
22
+ return await t.exportRaster(r);
23
+ } catch (e) {
24
+ if (!(e instanceof n)) throw e;
25
+ }
26
+ if (!e.canvasRasterExport) throw a();
27
+ let i;
28
+ try {
29
+ i = await e.canvasRasterExport();
30
+ } catch (e) {
31
+ throw a(e);
32
+ }
33
+ try {
34
+ return await i.exportRaster({
35
+ ...r,
36
+ liveSize: t.surface.getLogicalCanvasSize(),
37
+ liveDevicePixelRatio: t.surface.getDevicePixelRatio()
38
+ });
39
+ } catch (e) {
40
+ throw e instanceof n ? a(e) : e;
41
+ }
42
+ }
43
+ async function i(t, r) {
44
+ if (t.rasterizeSvgRuns) try {
45
+ await t.rasterizeSvgRuns(r);
46
+ return;
47
+ } catch (e) {
48
+ if (!(e instanceof n)) throw e;
49
+ }
50
+ if (!e.canvasSvgRasterizer) throw new n("No raster backend supports selective SVG rasterization. Import \"@genome-spy/core/rendering/canvas.js\" to enable the Canvas2D fallback.");
51
+ let i;
52
+ try {
53
+ i = await e.canvasSvgRasterizer();
54
+ } catch (e) {
55
+ throw new n("No raster backend supports selective SVG rasterization.", { cause: e });
56
+ }
57
+ await i.createCanvas2DSvgRasterizer()(r);
58
+ }
59
+ function a(e) {
60
+ return new n("Raster export is unsupported because no raster rendering backend is available. Import \"@genome-spy/core/rendering/canvas.js\" to enable the Canvas2D fallback.", { cause: e });
61
+ }
62
+ //#endregion
63
+ export { e as a, t as i, r as n, i as r, n as t };
@@ -0,0 +1,108 @@
1
+ //#region ../core/src/view/layout/rectangle.js
2
+ function e(e) {
3
+ return () => e;
4
+ }
5
+ var t = class t {
6
+ static create(n, r, i, a) {
7
+ return new t(e(n), e(r), e(i), e(a));
8
+ }
9
+ static ZERO = t.create(0, 0, 0, 0);
10
+ _offset(e, t) {
11
+ let n = this["_" + e];
12
+ if (t === 0) return n;
13
+ switch (typeof t) {
14
+ case "number": return () => n() + t;
15
+ case "function": return () => n() + t();
16
+ default: throw Error("Not a number of function");
17
+ }
18
+ }
19
+ _passThrough(e) {
20
+ return this._offset(e, 0);
21
+ }
22
+ constructor(e, t, n, r) {
23
+ this._x = e, this._y = t, this._width = n, this._height = r;
24
+ }
25
+ get x() {
26
+ return this._x();
27
+ }
28
+ get y() {
29
+ return this._y();
30
+ }
31
+ get width() {
32
+ return this._width();
33
+ }
34
+ get height() {
35
+ return this._height();
36
+ }
37
+ get x2() {
38
+ return this._x() + this._width();
39
+ }
40
+ get y2() {
41
+ return this._y() + this._height();
42
+ }
43
+ equals(e) {
44
+ return e ? this === e || this.x === e.x && this.y === e.y && this.width === e.width && this.height === e.height : !1;
45
+ }
46
+ modify(n) {
47
+ if (!Object.keys(n).length) return this;
48
+ let r = (t) => {
49
+ let r = n[t];
50
+ return typeof r == "number" ? e(r) : typeof r == "function" ? r : this._passThrough(t);
51
+ };
52
+ return new t(r("x"), r("y"), r("width"), r("height"));
53
+ }
54
+ translate(e, n) {
55
+ return e === 0 && n === 0 ? this : new t(this._offset("x", e), this._offset("y", n), this._passThrough("width"), this._passThrough("height"));
56
+ }
57
+ translateBy(e) {
58
+ return this.translate(e.x, e.y);
59
+ }
60
+ expand(e, n = 1) {
61
+ return e.left == 0 && e.top == 0 && e.right == 0 && e.bottom == 0 ? this : new t(e.left ? this._offset("x", -e.left * n) : this._passThrough("x"), e.top ? this._offset("y", -e.top * n) : this._passThrough("y"), e.width ? this._offset("width", e.width * n) : this._passThrough("width"), e.height ? this._offset("height", e.height * n) : this._passThrough("height"));
62
+ }
63
+ shrink(e) {
64
+ return this.expand(e, -1);
65
+ }
66
+ intersect(e) {
67
+ return this === e || e == null ? this : new t(() => Math.max(this.x, e.x), () => Math.max(this.y, e.y), () => Math.min(this.x2, e.x2) - Math.max(this.x, e.x), () => Math.min(this.y2, e.y2) - Math.max(this.y, e.y));
68
+ }
69
+ intersectX(e) {
70
+ return this === e || e == null ? this : new t(() => Math.max(this.x, e.x), this._passThrough("y"), () => Math.min(this.x2, e.x2) - Math.max(this.x, e.x), this._passThrough("height"));
71
+ }
72
+ intersectY(e) {
73
+ return this === e || e == null ? this : new t(this._passThrough("x"), () => Math.max(this.y, e.y), this._passThrough("width"), () => Math.min(this.y2, e.y2) - Math.max(this.y, e.y));
74
+ }
75
+ union(e) {
76
+ return this === e || e == null ? this : new t(() => Math.min(this.x, e.x), () => Math.min(this.y, e.y), () => Math.max(this.x2, e.x2) - Math.min(this.x, e.x), () => Math.max(this.y2, e.y2) - Math.min(this.y, e.y));
77
+ }
78
+ isDefined() {
79
+ return this.width >= 0 && this.height >= 0;
80
+ }
81
+ flatten() {
82
+ return new t(e(this.x), e(this.y), e(this.width), e(this.height));
83
+ }
84
+ containsPoint(e, t) {
85
+ return e >= this.x && e < this.x2 && t >= this.y && t < this.y2;
86
+ }
87
+ normalizePoint(e, t, n = !1) {
88
+ let r = {
89
+ x: (e - this.x) / this.width,
90
+ y: (t - this.y) / this.height
91
+ };
92
+ return n && (r.y = 1 - r.y), r;
93
+ }
94
+ denormalizePoint(e, t, n = !1) {
95
+ return n && (t = 1 - t), {
96
+ x: this.x + e * this.width,
97
+ y: this.y + t * this.height
98
+ };
99
+ }
100
+ toString() {
101
+ return `Rectangle: x: ${this.x}, y: ${this.y}, width: ${this.width}, height: ${this.height}`;
102
+ }
103
+ toRoundedString() {
104
+ return `Rectangle: x: ${Math.round(this.x)}, y: ${Math.round(this.y)}, width: ${Math.round(this.width)}, height: ${Math.round(this.height)}`;
105
+ }
106
+ };
107
+ //#endregion
108
+ export { t };
@@ -1,14 +1,14 @@
1
- import { a as e, m as t, o as n, s as r, un as i } from "./clipOptions-BWHr3aTa.js";
1
+ import { Kt as e, a as t, m as n, o as r, s as i } from "./clipOptions-B5PibDq3.js";
2
2
  import { t as a } from "./warning-CpIIpk8e.js";
3
3
  import { n as o } from "./performanceProfiler-CPLEjApa.js";
4
4
  import { n as s } from "./layoutResult-D50MSHXR.js";
5
- import { A as c, C as l, D as u, E as d, M as f, N as p, O as m, _ as h, a as g, c as _, d as v, f as y, g as b, h as x, i as S, k as C, l as w, m as ee, n as T, o as E, p as D, r as O, s as k, t as A, u as j, v as M, x as N, y as P } from "./order-C5CzA37O.js";
5
+ import { A as c, E as l, F as u, I as d, M as f, N as p, S as m, _ as h, a as g, b as _, c as v, d as y, f as b, g as x, h as S, i as C, j as w, k as T, l as ee, m as E, p as D, s as O, t as k, u as A, v as j, w as M, x as N, y as P } from "./order-BkYCnwD7.js";
6
6
  //#region ../core/src/rendering/canvas2d/renderers/arrow.js
7
7
  function F(e, t) {
8
- let n = e, r = t.context, i = n.encoders, a = P(n);
8
+ let n = e, r = t.context, i = n.encoders, a = m(n);
9
9
  r.lineJoin = "miter";
10
10
  let o, s;
11
- return N(n, a, t, (e) => {
11
+ return M(n, a, t, (e) => {
12
12
  e.headShapeFallback && t.warn(`Canvas2D rendered unsupported arrow headShape "${a.headShape}" as a triangle.`), r.beginPath();
13
13
  for (let t of e.boundaryLoops) {
14
14
  let e = t[0];
@@ -16,41 +16,41 @@ function F(e, t) {
16
16
  for (let e = 1; e < t.length; e++) r.lineTo(t[e].x, t[e].y);
17
17
  r.closePath();
18
18
  }
19
- let n = u(i.fill(e.datum)), c = l(i.fillOpacity, e.datum) * t.viewOpacity;
20
- n != "none" && c > 0 && (o != n && (r.fillStyle = n, o = n), r.globalAlpha = c, r.fill());
21
- let d = u(i.stroke(e.datum)), f = l(i.strokeOpacity, e.datum) * t.viewOpacity;
19
+ let n = c(i.fill(e.datum)), u = l(i.fillOpacity, e.datum) * t.viewOpacity;
20
+ n != "none" && u > 0 && (o != n && (r.fillStyle = n, o = n), r.globalAlpha = u, r.fill());
21
+ let d = c(i.stroke(e.datum)), f = l(i.strokeOpacity, e.datum) * t.viewOpacity;
22
22
  d != "none" && f > 0 && e.strokeWidth > 0 && (s != d && (r.strokeStyle = d, s = d), r.globalAlpha = f, r.lineWidth = e.strokeWidth, r.stroke());
23
23
  });
24
24
  }
25
25
  //#endregion
26
26
  //#region ../core/src/rendering/canvas2d/renderers/link.js
27
- function I(e, n) {
28
- let r = e, i = n.context, a = r.encoders, o = ee(r), s = M(r, o.shape, n.secondOrderPass);
27
+ function I(e, t) {
28
+ let r = e, i = t.context, a = r.encoders, o = h(r), s = N(r, o.shape, t.secondOrderPass);
29
29
  i.lineCap = "butt";
30
- let c;
31
- return x(r, o, n, (e) => {
32
- let r = u(a.color(e.datum)), o = l(a.opacity, e.datum) * n.viewOpacity;
30
+ let u;
31
+ return j(r, o, t, (e) => {
32
+ let r = c(a.color(e.datum)), o = l(a.opacity, e.datum) * t.viewOpacity;
33
33
  if (r == "none" || o <= 0 || e.strokeWidth <= 0) return;
34
- let d = s && h(e.points[0], e.points[3], s);
34
+ let d = s && _(e.points[0], e.points[3], s);
35
35
  if (d) {
36
- let { normalX: e, normalY: n, offset: a, start: o, end: s } = d, l = i.createLinearGradient(e * (a - s), n * (a - s), e * (a + s), n * (a + s)), u = t(r), f = u.opacity;
37
- for (let e of b(o, s)) u.opacity = f * e.opacity, l.addColorStop(e.offset, u.formatRgb());
38
- i.strokeStyle = l, c = void 0;
39
- } else c != r && (i.strokeStyle = r, c = r);
36
+ let { normalX: e, normalY: t, offset: a, start: o, end: s } = d, c = i.createLinearGradient(e * (a - s), t * (a - s), e * (a + s), t * (a + s)), l = n(r), f = l.opacity;
37
+ for (let e of P(o, s)) l.opacity = f * e.opacity, c.addColorStop(e.offset, l.formatRgb());
38
+ i.strokeStyle = c, u = void 0;
39
+ } else u != r && (i.strokeStyle = r, u = r);
40
40
  i.globalAlpha = o, i.lineWidth = e.strokeWidth;
41
- let [f, p, m, g] = e.points;
42
- i.beginPath(), i.moveTo(f[0], f[1]), i.bezierCurveTo(p[0], p[1], m[0], m[1], g[0], g[1]), i.stroke();
41
+ let [f, p, m, h] = e.points;
42
+ i.beginPath(), i.moveTo(f[0], f[1]), i.bezierCurveTo(p[0], p[1], m[0], m[1], h[0], h[1]), i.stroke();
43
43
  });
44
44
  }
45
45
  //#endregion
46
46
  //#region ../core/src/rendering/canvas2d/renderers/point.js
47
47
  function L(e, t) {
48
48
  let n = e;
49
- d(n, n.properties.fillGradientStrength) && t.warn("Canvas2D ignored unsupported point property fillGradientStrength."), n.properties.geometricZoomBound && t.warn("Canvas2D ignored unsupported point property geometricZoomBound.");
50
- let r = y(n), i = t.context, a = n.encoders, o, s;
51
- return D(n, r, t, (e) => {
52
- let n = e.datum, r = e.lineShape, c = u(a.fill(n)), d = l(a.fillOpacity, n) * t.viewOpacity, f = u(a.stroke(n)), p = l(a.strokeOpacity, n) * t.viewOpacity;
53
- r && (f == "none" || p <= 0) && (f = c, p = d), i.beginPath();
49
+ T(n, n.properties.fillGradientStrength) && t.warn("Canvas2D ignored unsupported point property fillGradientStrength."), n.properties.geometricZoomBound && t.warn("Canvas2D ignored unsupported point property geometricZoomBound.");
50
+ let r = S(n), i = t.context, a = n.encoders, o, s;
51
+ return x(n, r, t, (e) => {
52
+ let n = e.datum, r = e.lineShape, u = c(a.fill(n)), d = l(a.fillOpacity, n) * t.viewOpacity, f = c(a.stroke(n)), p = l(a.strokeOpacity, n) * t.viewOpacity;
53
+ r && (f == "none" || p <= 0) && (f = u, p = d), i.beginPath();
54
54
  let m = e.angle != 0 && e.shape != "circle";
55
55
  m && (i.save(), i.translate(e.x, e.y), i.rotate(e.angle * Math.PI / 180));
56
56
  let h = m ? 0 : e.x, g = m ? 0 : e.y, _ = !0;
@@ -58,8 +58,8 @@ function L(e, t) {
58
58
  else if (e.shape == "square") {
59
59
  let t = e.geometryRadius * 2;
60
60
  i.rect(h - e.geometryRadius, g - e.geometryRadius, t, t);
61
- } else _ = v(e.shape, h, g, e.geometryRadius, i);
62
- m && i.restore(), _ || (t.warn(`Canvas2D rendered unsupported point shape "${e.shape}" as a circle.`), i.arc(e.x, e.y, e.geometryRadius, 0, Math.PI * 2)), !r && c != "none" && d > 0 && (o != c && (i.fillStyle = c, o = c), R(i, d), i.fill()), f != "none" && p > 0 && e.strokeWidth > 0 && (r && i.lineCap != "butt" && (i.lineCap = "butt"), s != f && (i.strokeStyle = f, s = f), R(i, p), z(i, e.strokeWidth), i.stroke());
61
+ } else _ = E(e.shape, h, g, e.geometryRadius, i);
62
+ m && i.restore(), _ || (t.warn(`Canvas2D rendered unsupported point shape "${e.shape}" as a circle.`), i.arc(e.x, e.y, e.geometryRadius, 0, Math.PI * 2)), !r && u != "none" && d > 0 && (o != u && (i.fillStyle = u, o = u), R(i, d), i.fill()), f != "none" && p > 0 && e.strokeWidth > 0 && (r && i.lineCap != "butt" && (i.lineCap = "butt"), s != f && (i.strokeStyle = f, s = f), R(i, p), z(i, e.strokeWidth), i.stroke());
63
63
  });
64
64
  }
65
65
  function R(e, t) {
@@ -71,20 +71,20 @@ function z(e, t) {
71
71
  //#endregion
72
72
  //#region ../core/src/rendering/canvas2d/renderers/rect.js
73
73
  function B(e, t) {
74
- let n = e, r = w(n);
74
+ let n = e, r = b(n);
75
75
  r.hatch != "none" && t.warn("Canvas2D ignored unsupported rect hatch.");
76
76
  let i = t.start ?? 0;
77
77
  if (i === (t.end ?? t.data.length)) return 0;
78
- let a = t.context, o = n.encoders, s, c, d = [
78
+ let a = t.context, o = n.encoders, s, u, d = [
79
79
  0,
80
80
  0,
81
81
  0,
82
82
  0
83
- ], f = o.stroke.constant, p = o.strokeOpacity.constant, m = f ? u(o.stroke(t.data[i])) : "none", h = f && m == "none", g = !h && p ? l(o.strokeOpacity, t.data[i]) : 0;
84
- return j(n, r, t, (e) => {
83
+ ], f = o.stroke.constant, p = o.strokeOpacity.constant, m = f ? c(o.stroke(t.data[i])) : "none", h = f && m == "none", g = !h && p ? l(o.strokeOpacity, t.data[i]) : 0;
84
+ return D(n, r, t, (e) => {
85
85
  r.shadow.opacity > 0 && V(e, r.shadow, t, d);
86
- let n = e.opacityFactor, i = e.fill != "none" && e.fillOpacity > 0, _ = f ? m : u(o.stroke(e.datum)), v = (p ? g : l(o.strokeOpacity, e.datum)) * t.viewOpacity * n, y = !h && _ != "none" && v > 0 && e.strokeWidth > 0, b = r.hasCornerRadii && (e.radii.topLeft != 0 || e.radii.topRight != 0 || e.radii.bottomRight != 0 || e.radii.bottomLeft != 0);
87
- b && (i || y) && (d[0] = e.radii.topLeft, d[1] = e.radii.topRight, d[2] = e.radii.bottomRight, d[3] = e.radii.bottomLeft, a.beginPath(), a.roundRect(e.x, e.y, e.width, e.height, d)), i && (s != e.fill && (a.fillStyle = e.fill, s = e.fill), H(a, e.fillOpacity * n), b ? a.fill() : a.fillRect(e.x, e.y, e.width, e.height)), y && (c != _ && (a.strokeStyle = _, c = _), H(a, v), U(a, e.strokeWidth), b ? a.stroke() : a.strokeRect(e.x, e.y, e.width, e.height));
86
+ let n = e.opacityFactor, i = e.fill != "none" && e.fillOpacity > 0, _ = f ? m : c(o.stroke(e.datum)), v = (p ? g : l(o.strokeOpacity, e.datum)) * t.viewOpacity * n, y = !h && _ != "none" && v > 0 && e.strokeWidth > 0, b = r.hasCornerRadii && (e.radii.topLeft != 0 || e.radii.topRight != 0 || e.radii.bottomRight != 0 || e.radii.bottomLeft != 0);
87
+ b && (i || y) && (d[0] = e.radii.topLeft, d[1] = e.radii.topRight, d[2] = e.radii.bottomRight, d[3] = e.radii.bottomLeft, a.beginPath(), a.roundRect(e.x, e.y, e.width, e.height, d)), i && (s != e.fill && (a.fillStyle = e.fill, s = e.fill), H(a, e.fillOpacity * n), b ? a.fill() : a.fillRect(e.x, e.y, e.width, e.height)), y && (u != _ && (a.strokeStyle = _, u = _), H(a, v), U(a, e.strokeWidth), b ? a.stroke() : a.strokeRect(e.x, e.y, e.width, e.height));
88
88
  });
89
89
  }
90
90
  function V(e, t, n, r) {
@@ -106,32 +106,32 @@ function U(e, t) {
106
106
  //#region ../core/src/rendering/canvas2d/renderers/rule.js
107
107
  function W(e, t) {
108
108
  let n = e, r = t.context, i = n.encoders;
109
- r.lineCap = d(n, n.properties.strokeCap), r.setLineDash(d(n, n.properties.strokeDash) ?? []), r.lineDashOffset = d(n, n.properties.strokeDashOffset);
109
+ r.lineCap = T(n, n.properties.strokeCap), r.setLineDash(T(n, n.properties.strokeDash) ?? []), r.lineDashOffset = T(n, n.properties.strokeDashOffset);
110
110
  let a;
111
- return _(n, k(n), t, (e) => {
112
- let n = u(i.color(e.datum)), o = l(i.opacity, e.datum) * t.viewOpacity;
111
+ return y(n, A(n), t, (e) => {
112
+ let n = c(i.color(e.datum)), o = l(i.opacity, e.datum) * t.viewOpacity;
113
113
  n == "none" || o <= 0 || e.strokeWidth <= 0 || (a != n && (r.strokeStyle = n, a = n), r.globalAlpha = o, r.lineWidth = e.strokeWidth, r.beginPath(), r.moveTo(e.x1, e.y1), r.lineTo(e.x2, e.y2), r.stroke());
114
114
  });
115
115
  }
116
116
  //#endregion
117
117
  //#region ../core/src/rendering/canvas2d/renderers/text.js
118
118
  function G(e, t) {
119
- let n = e, r = n.properties, i = g(n), a = t.context, o = n.encoders, s = T(r.font), c = `${r.fontStyle ?? "normal"} ${S(r.fontWeight ?? "normal")} `, f = i.baseline == "baseline" ? "alphabetic" : i.baseline;
119
+ let n = e, r = n.properties, i = t.textMetrics ?? n.unitView.context.textMetrics, a = i.requestFont(r), o = C(i, r), s = v(n), u = t.context, d = n.encoders, f = g(r.font), p = `${r.fontStyle ?? "normal"} ${O(r.fontWeight ?? "normal")} `, m = s.baseline == "baseline" ? "alphabetic" : s.baseline;
120
120
  [
121
121
  r.viewportEdgeFadeWidthTop,
122
122
  r.viewportEdgeFadeWidthRight,
123
123
  r.viewportEdgeFadeWidthBottom,
124
124
  r.viewportEdgeFadeWidthLeft
125
- ].some((e) => d(n, e) > 0) && t.warn("Canvas2D ignored unsupported text viewport edge fading.");
126
- let p, m;
127
- return i.logoLetters || (a.textAlign = i.align, a.textBaseline = f), E(n, i, t, (e) => {
125
+ ].some((e) => T(n, e) > 0) && t.warn("Canvas2D ignored unsupported text viewport edge fading.");
126
+ let h, _;
127
+ return s.logoLetters || (u.textAlign = s.align, u.textBaseline = m), ee(n, s, {
128
+ ...t,
129
+ fontMeasurement: a,
130
+ measureLogoInkBounds: o
131
+ }, (e) => {
128
132
  e.multiCharacterLogo && t.warn("Canvas2D stretches multi-character logo text as a single glyph cell.");
129
- let n = u(o.color(e.datum)), r = l(o.opacity, e.datum) * t.viewOpacity * e.fadeOpacity;
130
- if (!(n == "none" || r <= 0)) if (p != n && (a.fillStyle = n, p = n), a.globalAlpha = r, m != e.size && (a.font = `${c}${e.size}px ${s}`, m = e.size), e.logoScale) {
131
- a.save(), a.translate(e.x, e.y), a.rotate(e.angle * Math.PI / 180), a.translate(e.dx, e.dy);
132
- let t = a.measureText(e.text).width;
133
- a.scale(e.logoScale.width / t, e.logoScale.heightScale), a.textAlign = "center", a.textBaseline = "alphabetic", a.fillText(e.text, 0, O("middle", 1)), a.restore();
134
- } else e.angle ? (a.save(), a.translate(e.x, e.y), a.rotate(e.angle * Math.PI / 180), a.fillText(e.text, e.dx, e.dy, e.width), a.restore()) : a.fillText(e.text, e.x + e.dx, e.y + e.dy, e.width);
133
+ let n = c(d.color(e.datum)), r = l(d.opacity, e.datum) * t.viewOpacity * e.fadeOpacity;
134
+ n == "none" || r <= 0 || (h != n && (u.fillStyle = n, h = n), u.globalAlpha = r, _ != e.size && (u.font = `${p}${e.size}px ${f}`, _ = e.size), e.logoTransform ? (u.save(), u.translate(e.x, e.y), u.rotate(e.angle * Math.PI / 180), u.translate(e.dx, e.dy), u.scale(e.logoTransform.scaleX, e.logoTransform.scaleY), u.translate(-e.logoTransform.originX, -e.logoTransform.originY), u.textAlign = "left", u.textBaseline = "alphabetic", u.fillText(e.text, 0, 0), u.restore()) : e.angle || e.scale != 1 ? (u.save(), u.translate(e.x, e.y), u.rotate(e.angle * Math.PI / 180), u.translate(e.dx, e.dy), u.scale(e.scale, e.scale), u.fillText(e.text, 0, 0), u.restore()) : u.fillText(e.text, e.x + e.dx, e.y + e.dy));
135
135
  });
136
136
  }
137
137
  //#endregion
@@ -153,14 +153,14 @@ var J = 8, Y = 16777216, X = class extends s {
153
153
  #n = /* @__PURE__ */ new WeakMap();
154
154
  #r;
155
155
  #i;
156
- #a = new f();
156
+ #a = new u();
157
157
  #o;
158
158
  #s = [0, 0];
159
159
  #c;
160
160
  #l;
161
161
  #u = [];
162
162
  constructor(e, t) {
163
- if (super(e), this.context = t.context, this.width = t.width, this.height = t.height, this.devicePixelRatio = t.devicePixelRatio, this.paint = t.paint, this.#r = t.markPredicate ?? (() => !0), this.#i = o(), this.#o = t.xIndexManager, this.#l = t.opacityLayers ?? [], this.#c = {
163
+ if (super(e), this.context = t.context, this.width = t.width, this.height = t.height, this.devicePixelRatio = t.devicePixelRatio, this.paint = t.paint, this.textMetrics = t.textMetrics, this.#r = t.markPredicate ?? (() => !0), this.#i = o(), this.#o = t.xIndexManager, this.#l = t.opacityLayers ?? [], this.#c = {
164
164
  x: 0,
165
165
  y: 0,
166
166
  width: this.context.canvas.width,
@@ -173,18 +173,18 @@ var J = 8, Y = 16777216, X = class extends s {
173
173
  getDevicePixelRatio() {
174
174
  return this.devicePixelRatio;
175
175
  }
176
- pushView(t, n) {
177
- this.paint && !this.#t.has(t) && (t.onBeforeRender(), this.#t.add(t));
178
- let r = t.getOpacity();
176
+ pushView(e, n) {
177
+ this.paint && !this.#t.has(e) && (e.onBeforeRender(), this.#t.add(e));
178
+ let r = e.getOpacity();
179
179
  if (this.paint && r > 0 && r !== 1) {
180
- let r = e(t), i = Z(n, this.devicePixelRatio, this.#c, r), a = Q(this.#l, this.#u.length, i.width, i.height);
180
+ let r = t(e), i = Z(n, this.devicePixelRatio, this.#c, r), a = Q(this.#l, this.#u.length, i.width, i.height);
181
181
  a.setTransform(this.devicePixelRatio, 0, 0, this.devicePixelRatio, -i.x, -i.y), this.#u.push({
182
182
  context: this.context,
183
183
  bounds: this.#c
184
184
  }), this.context = a, this.#c = i;
185
185
  }
186
186
  this.#e.push({
187
- view: t,
187
+ view: e,
188
188
  coords: n,
189
189
  opacity: r
190
190
  });
@@ -206,24 +206,24 @@ var J = 8, Y = 16777216, X = class extends s {
206
206
  }
207
207
  renderMark(e, t) {
208
208
  if (!this.paint || !this.#r(e)) return;
209
- let i = this.#n.get(e.unitView);
210
- if (i === void 0 && (i = e.unitView.getEffectiveOpacity(), this.#n.set(e.unitView, i)), i <= 0) return;
209
+ let n = this.#n.get(e.unitView);
210
+ if (n === void 0 && (n = e.unitView.getEffectiveOpacity(), this.#n.set(e.unitView, n)), n <= 0) return;
211
211
  e.initializeRenderingRevisions(Object.keys(e.properties));
212
212
  let o = t.sampleFacetRenderingOptions;
213
213
  if (o && !e.encoders.facetIndex && (this.#i?.addCount("canvasSampleFacetOccurrences"), !q(o))) {
214
214
  this.#i?.addCount("canvasCulledSampleFacetOccurrences");
215
215
  return;
216
216
  }
217
- let s = this.currentCoords, l = n(t), u = r(l, e.properties.clip, s), d = C(this.width, this.height, u);
218
- if (!c(d)) return;
219
- let f = m(s, l, e.properties.cullByVisibleRange), h = this.#o?.prepare(e) ?? !1, g = this.context;
220
- if (g.save(), u) {
221
- let e = u.rect.flatten(), t = u.clipX ? e.x : 0, n = u.clipY ? e.y : 0, r = u.clipX ? e.width : this.width, i = u.clipY ? e.height : this.height;
217
+ let s = this.currentCoords, c = r(t), l = i(c, e.properties.clip, s), u = f(this.width, this.height, l);
218
+ if (!p(u)) return;
219
+ let m = w(s, c, e.properties.cullByVisibleRange), h = this.#o?.prepare(e) ?? !1, g = this.context;
220
+ if (g.save(), l) {
221
+ let e = l.rect.flatten(), t = l.clipX ? e.x : 0, n = l.clipY ? e.y : 0, r = l.clipX ? e.width : this.width, i = l.clipY ? e.height : this.height;
222
222
  g.beginPath(), g.rect(t, n, r, i), g.clip();
223
223
  }
224
224
  try {
225
225
  let n = e.getOrder?.(), r = n && n.isActive();
226
- p(e, t, s, this.#a, (t, i) => {
226
+ d(e, t, s, this.#a, (t, i) => {
227
227
  let o = 0, s = i.length;
228
228
  h && this.#o.query(i, this.#s) && (o = this.#s[0], s = this.#s[1]);
229
229
  let c = (n, r, i, o = !1) => K(e, {
@@ -234,14 +234,15 @@ var J = 8, Y = 16777216, X = class extends s {
234
234
  secondOrderPass: o,
235
235
  start: r,
236
236
  end: i,
237
- visibleBounds: d,
238
- anchorCullBounds: f,
237
+ visibleBounds: u,
238
+ anchorCullBounds: m,
239
239
  viewOpacity: 1,
240
+ textMetrics: this.textMetrics,
240
241
  warn: (t) => a(`${t} View: ${e.unitView.getPathString()}`)
241
242
  });
242
243
  if (!r) return c(i, o, s);
243
- let l = 0, u = A(i, o, s, n.predicate, n.passes);
244
- for (let [e, t] of u.entries()) t.length > 0 && (l += c(t, 0, t.length, e === 1));
244
+ let l = 0, d = k(i, o, s, n.predicate, n.passes);
245
+ for (let [e, t] of d.entries()) t.length > 0 && (l += c(t, 0, t.length, e === 1));
245
246
  return l;
246
247
  }, (t) => a(`Canvas2D could not resolve sample facet index ${t}. View: ${e.unitView.getPathString()}`));
247
248
  } finally {
@@ -249,9 +250,9 @@ var J = 8, Y = 16777216, X = class extends s {
249
250
  }
250
251
  }
251
252
  get currentCoords() {
252
- let e = i(this.#e);
253
- if (!e) throw Error("No current view in Canvas2D rendering context.");
254
- return e.coords;
253
+ let t = e(this.#e);
254
+ if (!t) throw Error("No current view in Canvas2D rendering context.");
255
+ return t.coords;
255
256
  }
256
257
  };
257
258
  function Z(e, t, n, r) {