@dpuse/dpuse-tool-highcharts-visualiser 0.0.79 → 0.0.82
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AnimationUtilities-Bby2idBR.js → AnimationUtilities-CJw-tdb_.js} +74 -83
- package/dist/AnimationUtilities-CJw-tdb_.js.map +1 -0
- package/dist/BorderRadius-CqHYi9va.js +135 -0
- package/dist/BorderRadius-CqHYi9va.js.map +1 -0
- package/dist/CenteredUtilities-BTUT7_Ld.js +1316 -0
- package/dist/CenteredUtilities-BTUT7_Ld.js.map +1 -0
- package/dist/{SVGElement-BmvC_qu3.js → SVGElement-uTuGcjav.js} +101 -103
- package/dist/SVGElement-uTuGcjav.js.map +1 -0
- package/dist/SeriesRegistry-CXsAINSj.js +376 -0
- package/dist/SeriesRegistry-CXsAINSj.js.map +1 -0
- package/dist/{TextPath-DK4Jkzd7.js → TextPath-Coabnrz0.js} +32 -34
- package/dist/{TextPath-DK4Jkzd7.js.map → TextPath-Coabnrz0.js.map} +1 -1
- package/dist/{dependency-wheel.src-BHmwx9rW.js → dependency-wheel.src-ByNiAiZS.js} +26 -27
- package/dist/dependency-wheel.src-ByNiAiZS.js.map +1 -0
- package/dist/dpuse-tool-highcharts-visualiser.es.js +2437 -2415
- package/dist/dpuse-tool-highcharts-visualiser.es.js.map +1 -1
- package/dist/highchartsMoreCustom-Cm6MkFMu.js +1178 -0
- package/dist/highchartsMoreCustom-Cm6MkFMu.js.map +1 -0
- package/dist/{pattern-fill.src-BPmr3DQg.js → pattern-fill.src-CGZp553r.js} +30 -32
- package/dist/{pattern-fill.src-BPmr3DQg.js.map → pattern-fill.src-CGZp553r.js.map} +1 -1
- package/dist/{sankey.src-DocCurOx.js → sankey.src-Buj1zAlU.js} +115 -117
- package/dist/sankey.src-Buj1zAlU.js.map +1 -0
- package/dist/{streamgraph.src-Bn6PY8Fd.js → streamgraph.src-DjMW1U2g.js} +4 -6
- package/dist/{streamgraph.src-Bn6PY8Fd.js.map → streamgraph.src-DjMW1U2g.js.map} +1 -1
- package/package.json +12 -12
- package/dist/AnimationUtilities-Bby2idBR.js.map +0 -1
- package/dist/BorderRadius-2zMZW_aK.js +0 -1445
- package/dist/BorderRadius-2zMZW_aK.js.map +0 -1
- package/dist/SVGElement-BmvC_qu3.js.map +0 -1
- package/dist/SeriesRegistry-0cj0ZJqn.js +0 -374
- package/dist/SeriesRegistry-0cj0ZJqn.js.map +0 -1
- package/dist/dependency-wheel.src-BHmwx9rW.js.map +0 -1
- package/dist/highchartsMoreCustom-CcpfmVny.js +0 -1110
- package/dist/highchartsMoreCustom-CcpfmVny.js.map +0 -1
- package/dist/sankey.src-DocCurOx.js.map +0 -1
|
@@ -1,88 +1,88 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { n as h, t as g } from "./SeriesRegistry-
|
|
3
|
-
import { t as _ } from "./SVGElement-
|
|
4
|
-
import { n as v, t as y } from "./TextPath-
|
|
1
|
+
import { K as e, Q as t, S as n, U as r, W as i, et as a, h as o, it as s, j as c, k as l, lt as u, s as d, w as f, y as p, z as m } from "./AnimationUtilities-CJw-tdb_.js";
|
|
2
|
+
import { n as h, t as g } from "./SeriesRegistry-CXsAINSj.js";
|
|
3
|
+
import { t as _ } from "./SVGElement-uTuGcjav.js";
|
|
4
|
+
import { n as v, t as y } from "./TextPath-Coabnrz0.js";
|
|
5
5
|
//#region node_modules/highcharts/es-modules/Series/NodesComposition.js
|
|
6
6
|
var { series: { prototype: b, prototype: { pointClass: { prototype: x } } } } = g, S;
|
|
7
|
-
(function(
|
|
8
|
-
function
|
|
7
|
+
(function(n) {
|
|
8
|
+
function r(e, t) {
|
|
9
9
|
let n = e.prototype, r = t.prototype;
|
|
10
|
-
return n.setNodeState =
|
|
10
|
+
return n.setNodeState = p, n.setState = p, n.update = m, r.destroy = s, r.setData = d, o(t, "afterUpdate", i), t;
|
|
11
11
|
}
|
|
12
|
-
|
|
13
|
-
function
|
|
12
|
+
n.compose = r;
|
|
13
|
+
function i() {
|
|
14
14
|
if (!this.hasDataLabels?.() && this.nodes) for (let e of this.nodes) e.destroyElements({ dataLabel: 1 });
|
|
15
15
|
}
|
|
16
|
-
function
|
|
17
|
-
let n = this.pointClass,
|
|
18
|
-
if (!
|
|
19
|
-
|
|
20
|
-
let
|
|
16
|
+
function a(e) {
|
|
17
|
+
let n = this.pointClass, r = (e, t) => c(e, (e) => e.id === t), i = r(this.nodes, e), a;
|
|
18
|
+
if (!i) {
|
|
19
|
+
a = this.options.nodes && r(this.options.nodes, e);
|
|
20
|
+
let t = new n(this, l({
|
|
21
21
|
className: "highcharts-node",
|
|
22
22
|
isNode: !0,
|
|
23
23
|
id: e,
|
|
24
24
|
y: 1
|
|
25
|
-
},
|
|
26
|
-
|
|
27
|
-
let e = 0,
|
|
28
|
-
return
|
|
25
|
+
}, a));
|
|
26
|
+
t.linksTo = [], t.linksFrom = [], t.getSum = function() {
|
|
27
|
+
let e = 0, n = 0;
|
|
28
|
+
return t.linksTo.forEach((t) => {
|
|
29
29
|
e += t.weight || 0;
|
|
30
|
-
}),
|
|
31
|
-
|
|
32
|
-
}), Math.max(e,
|
|
33
|
-
},
|
|
34
|
-
let
|
|
35
|
-
for (let i = 0; i <
|
|
36
|
-
if (
|
|
37
|
-
|
|
30
|
+
}), t.linksFrom.forEach((e) => {
|
|
31
|
+
n += e.weight || 0;
|
|
32
|
+
}), Math.max(e, n);
|
|
33
|
+
}, t.offset = function(e, n) {
|
|
34
|
+
let r = 0;
|
|
35
|
+
for (let i = 0; i < t[n].length; i++) {
|
|
36
|
+
if (t[n][i] === e) return r;
|
|
37
|
+
r += t[n][i].weight;
|
|
38
38
|
}
|
|
39
|
-
},
|
|
39
|
+
}, t.hasShape = function() {
|
|
40
40
|
let e = 0;
|
|
41
|
-
return
|
|
41
|
+
return t.linksTo.forEach((t) => {
|
|
42
42
|
t.outgoing && e++;
|
|
43
|
-
}), !
|
|
44
|
-
},
|
|
43
|
+
}), !t.linksTo.length || e !== t.linksTo.length;
|
|
44
|
+
}, t.index = this.nodes.push(t) - 1, i = t;
|
|
45
45
|
}
|
|
46
|
-
return
|
|
46
|
+
return i.formatPrefix = "node", i.name = i.name || i.options.id || "", i.mass = t(i.options.mass, i.options.marker && i.options.marker.radius, this.options.marker && this.options.marker.radius, 4), i;
|
|
47
47
|
}
|
|
48
|
-
|
|
49
|
-
function
|
|
48
|
+
n.createNode = a;
|
|
49
|
+
function s() {
|
|
50
50
|
return this.data = [].concat(this.points || [], this.nodes), b.destroy.apply(this, arguments);
|
|
51
51
|
}
|
|
52
|
-
|
|
52
|
+
n.destroy = s;
|
|
53
53
|
function u() {
|
|
54
|
-
let e = this.chart,
|
|
54
|
+
let e = this.chart, n = {};
|
|
55
55
|
b.generatePoints.call(this), this.nodes ||= [], this.colorCounter = 0, this.nodes.forEach((e) => {
|
|
56
56
|
e.linksFrom.length = 0, e.linksTo.length = 0, e.level = e.options.level;
|
|
57
|
-
}), this.points.forEach((
|
|
58
|
-
|
|
59
|
-
}, this), this.nodeLookup =
|
|
57
|
+
}), this.points.forEach((r) => {
|
|
58
|
+
f(r.from) && (n[r.from] || (n[r.from] = this.createNode(r.from)), n[r.from].linksFrom.push(r), r.fromNode = n[r.from], e.styledMode ? r.colorIndex = t(r.options.colorIndex, n[r.from].colorIndex) : r.color = r.options.color || n[r.from].color), f(r.to) && (n[r.to] || (n[r.to] = this.createNode(r.to)), n[r.to].linksTo.push(r), r.toNode = n[r.to]), r.name = r.name || r.id;
|
|
59
|
+
}, this), this.nodeLookup = n;
|
|
60
60
|
}
|
|
61
|
-
|
|
61
|
+
n.generatePoints = u;
|
|
62
62
|
function d() {
|
|
63
63
|
this.nodes && (this.nodes.forEach((e) => {
|
|
64
64
|
e.destroy();
|
|
65
65
|
}), this.nodes.length = 0), b.setData.apply(this, arguments);
|
|
66
66
|
}
|
|
67
|
-
function
|
|
67
|
+
function p(e) {
|
|
68
68
|
let t = arguments, n = this.isNode ? this.linksTo.concat(this.linksFrom) : [this.fromNode, this.toNode];
|
|
69
69
|
e !== "select" && n.forEach((e) => {
|
|
70
70
|
e && e.series && (x.setState.apply(e, t), e.isNode || (e.fromNode.graphic && x.setState.apply(e.fromNode, t), e.toNode && e.toNode.graphic && x.setState.apply(e.toNode, t)));
|
|
71
71
|
}), x.setState.apply(this, t);
|
|
72
72
|
}
|
|
73
|
-
|
|
74
|
-
function m(
|
|
75
|
-
let
|
|
76
|
-
if (x.update.call(this,
|
|
77
|
-
let
|
|
78
|
-
s && (l ? s[this.index] = l : s.length = c),
|
|
73
|
+
n.setNodeState = p;
|
|
74
|
+
function m(n, r, i, a) {
|
|
75
|
+
let o = this.series.options.nodes, s = this.series.options.data, c = s?.length || 0, l = s?.[this.index];
|
|
76
|
+
if (x.update.call(this, n, !this.isNode && r, i, a), this.isNode) {
|
|
77
|
+
let n = (o || []).reduce((e, t, n) => this.id === t.id ? n : e, -1), a = e(o && o[n] || {}, s?.[this.index] || {});
|
|
78
|
+
s && (l ? s[this.index] = l : s.length = c), o ? n >= 0 ? o[n] = a : o.push(a) : this.series.options.nodes = [a], t(r, !0) && this.series.chart.redraw(i);
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
|
-
|
|
81
|
+
n.updateNode = m;
|
|
82
82
|
})(S ||= {});
|
|
83
83
|
var C = S, { column: w } = g.seriesTypes, T = class extends w.prototype.pointClass {
|
|
84
84
|
applyOptions(e, t) {
|
|
85
|
-
return h.prototype.applyOptions.call(this, e, t),
|
|
85
|
+
return h.prototype.applyOptions.call(this, e, t), f(this.options.level) && (this.options.column = this.column = this.options.level), this;
|
|
86
86
|
}
|
|
87
87
|
getClassName() {
|
|
88
88
|
return (this.isNode ? "highcharts-node " : "highcharts-link ") + h.prototype.getClassName.call(this);
|
|
@@ -100,7 +100,7 @@ var C = S, { column: w } = g.seriesTypes, T = class extends w.prototype.pointCla
|
|
|
100
100
|
}
|
|
101
101
|
setNodeColumn() {
|
|
102
102
|
let e = this;
|
|
103
|
-
|
|
103
|
+
f(e.options.column) || (e.column = e.linksTo.length === 0 ? 0 : e.getFromNode().fromColumn + 1);
|
|
104
104
|
}
|
|
105
105
|
isValid() {
|
|
106
106
|
return this.isNode || typeof this.weight == "number";
|
|
@@ -151,49 +151,49 @@ var C = S, { column: w } = g.seriesTypes, T = class extends w.prototype.pointCla
|
|
|
151
151
|
};
|
|
152
152
|
//#endregion
|
|
153
153
|
//#region node_modules/highcharts/es-modules/Series/TreeUtilities.js
|
|
154
|
-
function D(e,
|
|
155
|
-
let
|
|
156
|
-
return e && (m =
|
|
154
|
+
function D(e, n) {
|
|
155
|
+
let r = n.index, i = n.mapOptionsToLevel, a = n.parentColor, o = n.parentColorIndex, s = n.series, c = n.colors, l = n.siblings, u = s.points, f = s.chart.options.chart, p, m, h, g, _, v, y;
|
|
156
|
+
return e && (m = u[e.i], h = i[e.level] || {}, p = m && h.colorByPoint, p && (_ = m.index % (c ? c.length : f.colorCount), g = c && c[_]), s.chart.styledMode || (v = t(m && m.options.color, h && h.color, g, a && ((e) => {
|
|
157
157
|
let t = h && h.colorVariation;
|
|
158
|
-
return t && t.key === "brightness" &&
|
|
159
|
-
})(
|
|
158
|
+
return t && t.key === "brightness" && r && l ? d.parse(e).brighten(t.to * (r / l)).get() : e;
|
|
159
|
+
})(a), s.color)), y = t(m && m.options.colorIndex, h && h.colorIndex, _, o, n.colorIndex)), {
|
|
160
160
|
color: v,
|
|
161
161
|
colorIndex: y
|
|
162
162
|
};
|
|
163
163
|
}
|
|
164
|
-
function O(
|
|
165
|
-
let
|
|
166
|
-
if (
|
|
167
|
-
let
|
|
168
|
-
return a
|
|
169
|
-
}, {})),
|
|
170
|
-
return
|
|
164
|
+
function O(n) {
|
|
165
|
+
let a = {}, o, s, c, l, u, d;
|
|
166
|
+
if (i(n)) for (l = r(n.from) ? n.from : 1, d = n.levels, s = {}, o = i(n.defaults) ? n.defaults : {}, m(d) && (s = d.reduce((n, a) => {
|
|
167
|
+
let s, c, u;
|
|
168
|
+
return i(a) && r(a.level) && (u = e({}, a), c = t(u.levelIsConstant, o.levelIsConstant), delete u.levelIsConstant, delete u.level, s = a.level + (c ? 0 : l - 1), i(n[s]) ? e(!0, n[s], u) : n[s] = u), n;
|
|
169
|
+
}, {})), u = r(n.to) ? n.to : 1, c = 0; c <= u; c++) a[c] = e({}, o, i(s[c]) ? s[c] : {});
|
|
170
|
+
return a;
|
|
171
171
|
}
|
|
172
172
|
function k(e, n) {
|
|
173
|
-
let r = n.before, i = n.idRoot, a = n.mapIdToNode[i],
|
|
174
|
-
e.levelDynamic = e.level - (
|
|
175
|
-
let
|
|
176
|
-
|
|
177
|
-
index:
|
|
173
|
+
let r = n.before, i = n.idRoot, a = n.mapIdToNode[i], o = n.levelIsConstant !== !1, s = n.points[e.i], c = s && s.options || {}, u = [], d = 0;
|
|
174
|
+
e.levelDynamic = e.level - (o ? 0 : a.level), e.name = t(s && s.name, ""), e.visible = i === e.id || n.visible === !0, typeof r == "function" && (e = r(e, n)), e.children.forEach((t, r) => {
|
|
175
|
+
let i = l({}, n);
|
|
176
|
+
l(i, {
|
|
177
|
+
index: r,
|
|
178
178
|
siblings: e.children.length,
|
|
179
179
|
visible: e.visible
|
|
180
|
-
}),
|
|
180
|
+
}), t = k(t, i), u.push(t), t.visible && (d += t.val);
|
|
181
181
|
});
|
|
182
|
-
let f =
|
|
182
|
+
let f = t(c.value, d);
|
|
183
183
|
return e.visible = f >= 0 && (d > 0 || e.visible), e.children = u, e.childrenTotal = d, e.isLeaf = e.visible && !d, e.val = f, e;
|
|
184
184
|
}
|
|
185
185
|
function A(e) {
|
|
186
|
-
let
|
|
187
|
-
return
|
|
186
|
+
let n, r;
|
|
187
|
+
return i(e) && (r = i(e.options) ? e.options : {}, n = t(e.rootNode, r.rootId, ""), i(e.userOptions) && (e.userOptions.rootId = n), e.rootNode = n), n;
|
|
188
188
|
}
|
|
189
189
|
function j(e, t) {
|
|
190
|
-
let { chart: n, options: r } = e, { nodeDistance: i = 0, nodeWidth:
|
|
191
|
-
if (
|
|
192
|
-
if (typeof i == "string" && /%$/.test(i)) return
|
|
190
|
+
let { chart: n, options: r } = e, { nodeDistance: i = 0, nodeWidth: o = 0 } = r, { plotSizeX: s = 1 } = n;
|
|
191
|
+
if (o === "auto") {
|
|
192
|
+
if (typeof i == "string" && /%$/.test(i)) return s / (t + parseFloat(i) / 100 * (t - 1));
|
|
193
193
|
let e = Number(i);
|
|
194
|
-
return (
|
|
194
|
+
return (s + e) / (t || 1) - e;
|
|
195
195
|
}
|
|
196
|
-
return
|
|
196
|
+
return a(o, s);
|
|
197
197
|
}
|
|
198
198
|
var M = {
|
|
199
199
|
getColor: D,
|
|
@@ -201,12 +201,12 @@ var M = {
|
|
|
201
201
|
getNodeWidth: j,
|
|
202
202
|
setTreeValues: k,
|
|
203
203
|
updateRootId: A
|
|
204
|
-
}, { column: N, line: P } = g.seriesTypes, { parse: F } =
|
|
204
|
+
}, { column: N, line: P } = g.seriesTypes, { parse: F } = d, { getLevelOptions: I, getNodeWidth: L } = M;
|
|
205
205
|
y(_);
|
|
206
|
-
var R = class
|
|
207
|
-
static getDLOptions(
|
|
208
|
-
let
|
|
209
|
-
return
|
|
206
|
+
var R = class r extends N {
|
|
207
|
+
static getDLOptions(t) {
|
|
208
|
+
let n = i(t.optionsPoint) ? t.optionsPoint.dataLabels : {}, r = i(t.level) ? t.level.dataLabels : {};
|
|
209
|
+
return e({ style: {} }, r, n, { zIndex: r?.zIndex });
|
|
210
210
|
}
|
|
211
211
|
createNodeColumns() {
|
|
212
212
|
let e = [];
|
|
@@ -225,7 +225,7 @@ var R = class e extends N {
|
|
|
225
225
|
generatePoints() {
|
|
226
226
|
if (C.generatePoints.apply(this, arguments), this.orderNodes) {
|
|
227
227
|
for (let e of this.nodes) e.linksTo.length === 0 && this.order(e, 0);
|
|
228
|
-
|
|
228
|
+
s(this.nodes, (e, t) => e.level - t.level);
|
|
229
229
|
}
|
|
230
230
|
}
|
|
231
231
|
getNodePadding() {
|
|
@@ -239,15 +239,15 @@ var R = class e extends N {
|
|
|
239
239
|
hasData() {
|
|
240
240
|
return !!this.dataTable.rowCount;
|
|
241
241
|
}
|
|
242
|
-
pointAttribs(e,
|
|
242
|
+
pointAttribs(e, n) {
|
|
243
243
|
if (!e) return {};
|
|
244
|
-
let
|
|
244
|
+
let r = this, i = e.isNode ? e.level : e.fromNode.level, a = r.mapOptionsToLevel[i || 0] || {}, o = e.options, s = a.states && a.states[n || ""] || {}, c = [
|
|
245
245
|
"colorByPoint",
|
|
246
246
|
"borderColor",
|
|
247
247
|
"borderWidth",
|
|
248
248
|
"linkOpacity",
|
|
249
249
|
"opacity"
|
|
250
|
-
].reduce((e,
|
|
250
|
+
].reduce((e, n) => (e[n] = t(s[n], o[n], a[n], r.options[n]), e), {}), l = t(s.color, o.color, c.colorByPoint ? e.color : a.color);
|
|
251
251
|
return e.isNode ? {
|
|
252
252
|
fill: l,
|
|
253
253
|
stroke: c.borderColor,
|
|
@@ -294,9 +294,9 @@ var R = class e extends N {
|
|
|
294
294
|
let i = (t.offset(e, n) || 0) * this.translationFactor;
|
|
295
295
|
return Math.min(t.nodeY + i, t.nodeY + (t.shapeArgs && t.shapeArgs.height || 0) - r);
|
|
296
296
|
}
|
|
297
|
-
translateLink(e,
|
|
298
|
-
let
|
|
299
|
-
if (
|
|
297
|
+
translateLink(e, n) {
|
|
298
|
+
let r = e.fromNode, i = e.toNode, a = this.chart, { inverted: o } = a, s = this.translationFactor, c = this.options, l = t(e.linkColorMode, c.linkColorMode), u = (a.inverted ? -this.colDistance : this.colDistance) * c.curveFactor, d = r.nodeX, f = i.nodeX, p = e.outgoing, m = Math.max((e.weight || 0) * s, this.options.minLinkWidth || 0), h = this.getY(e, r, "linksFrom", m), g = n || this.getY(e, i, "linksTo", m), _ = this.nodeWidth, v = f > d + _;
|
|
299
|
+
if (a.inverted && (h = a.plotSizeY - h, g = (a.plotSizeY || 0) - g, _ = -_, m = -m, v = d > f), e.shapeType = "path", e.linkBase = [
|
|
300
300
|
h,
|
|
301
301
|
h + m,
|
|
302
302
|
g,
|
|
@@ -338,7 +338,7 @@ var R = class e extends N {
|
|
|
338
338
|
["Z"]
|
|
339
339
|
] };
|
|
340
340
|
else if (typeof g == "number") {
|
|
341
|
-
let t =
|
|
341
|
+
let t = a.plotHeight - h - m, n = f - 20 - m, r = f - 20, i = f, o = d + _, s = o + 20, c = s + m, l = h, u = h + m, p = u + 20, v = p + t, y = v + 20, b = y + m, x = g, S = x + m, C = S + 20, w = u - m * .7, T = y + m * .7, E = S - m * .7, D = i - m * .7, O = o + m * .7;
|
|
342
342
|
e.shapeArgs = { d: [
|
|
343
343
|
[
|
|
344
344
|
"M",
|
|
@@ -370,7 +370,7 @@ var R = class e extends N {
|
|
|
370
370
|
],
|
|
371
371
|
[
|
|
372
372
|
"L",
|
|
373
|
-
|
|
373
|
+
i,
|
|
374
374
|
b
|
|
375
375
|
],
|
|
376
376
|
[
|
|
@@ -393,12 +393,12 @@ var R = class e extends N {
|
|
|
393
393
|
E,
|
|
394
394
|
D,
|
|
395
395
|
x,
|
|
396
|
-
|
|
396
|
+
i,
|
|
397
397
|
x
|
|
398
398
|
],
|
|
399
399
|
[
|
|
400
400
|
"L",
|
|
401
|
-
|
|
401
|
+
i,
|
|
402
402
|
S
|
|
403
403
|
],
|
|
404
404
|
[
|
|
@@ -421,7 +421,7 @@ var R = class e extends N {
|
|
|
421
421
|
y,
|
|
422
422
|
r,
|
|
423
423
|
y,
|
|
424
|
-
|
|
424
|
+
i,
|
|
425
425
|
y
|
|
426
426
|
],
|
|
427
427
|
[
|
|
@@ -460,11 +460,11 @@ var R = class e extends N {
|
|
|
460
460
|
y: h + (g - h) / 2,
|
|
461
461
|
height: m,
|
|
462
462
|
width: 0
|
|
463
|
-
}, e.tooltipPos =
|
|
464
|
-
if (l === "from") e.color =
|
|
465
|
-
else if (l === "to") e.color =
|
|
463
|
+
}, e.tooltipPos = a.inverted ? [a.plotSizeY - e.dlBox.y - m / 2, a.plotSizeX - e.dlBox.x] : [e.dlBox.x, e.dlBox.y + m / 2], e.y = e.plotY = 1, e.x = e.plotX = 1, !e.options.color) {
|
|
464
|
+
if (l === "from") e.color = r.color;
|
|
465
|
+
else if (l === "to") e.color = i.color;
|
|
466
466
|
else if (l === "gradient") {
|
|
467
|
-
let t = F(
|
|
467
|
+
let t = F(r.color).get(), n = F(i.color).get();
|
|
468
468
|
e.color = {
|
|
469
469
|
linearGradient: {
|
|
470
470
|
x1: 1,
|
|
@@ -472,34 +472,34 @@ var R = class e extends N {
|
|
|
472
472
|
y1: 0,
|
|
473
473
|
y2: 0
|
|
474
474
|
},
|
|
475
|
-
stops: [[0,
|
|
475
|
+
stops: [[0, o ? t : n], [1, o ? n : t]]
|
|
476
476
|
};
|
|
477
477
|
}
|
|
478
478
|
}
|
|
479
479
|
}
|
|
480
|
-
translateNode(
|
|
481
|
-
let
|
|
482
|
-
if (
|
|
483
|
-
|
|
484
|
-
let
|
|
485
|
-
|
|
486
|
-
...
|
|
487
|
-
level: this.mapOptionsToLevel[
|
|
488
|
-
optionsPoint:
|
|
480
|
+
translateNode(e, o) {
|
|
481
|
+
let s = this.translationFactor, c = this.chart, l = this.options, { borderRadius: u, borderWidth: d = 0 } = l, f = e.getSum(), m = Math.max(Math.round(f * s), this.options.minLinkWidth), h = Math.round(this.nodeWidth), g = o.sankeyColumn.offset(e, s), _ = n(t(g.absoluteTop, o.sankeyColumn.top(s) + g.relativeTop), d), v = n(this.colDistance * e.column + d / 2, d) + a(e.options[c.inverted ? "offsetVertical" : "offsetHorizontal"] || 0, h), y = c.inverted ? c.plotSizeX - v : v;
|
|
482
|
+
if (e.sum = f, f) {
|
|
483
|
+
e.shapeType = "roundedRect", e.nodeX = y, e.nodeY = _;
|
|
484
|
+
let t = y, n = _, o = e.options.width || l.width || h, s = e.options.height || l.height || m, d = p(a((i(u) ? u.radius : u) || 0, o), 0, m / 2);
|
|
485
|
+
c.inverted && (t = y - h, n = c.plotSizeY - _ - m, o = e.options.height || l.height || h, s = e.options.width || l.width || m), e.dlOptions = {
|
|
486
|
+
...r.getDLOptions({
|
|
487
|
+
level: this.mapOptionsToLevel[e.level],
|
|
488
|
+
optionsPoint: e.options
|
|
489
489
|
}),
|
|
490
490
|
zIndex: void 0
|
|
491
|
-
}, delete
|
|
492
|
-
x:
|
|
493
|
-
y:
|
|
491
|
+
}, delete e.dlOptions.zIndex, e.plotX = 1, e.plotY = 1, e.tooltipPos = c.inverted ? [c.plotSizeY - n - s / 2, c.plotSizeX - t - o / 2] : [t + o / 2, n + s / 2], e.shapeArgs = {
|
|
492
|
+
x: t,
|
|
493
|
+
y: n,
|
|
494
494
|
width: o,
|
|
495
|
-
height:
|
|
495
|
+
height: s,
|
|
496
496
|
r: d,
|
|
497
|
-
display:
|
|
497
|
+
display: e.hasShape() ? "" : "none"
|
|
498
498
|
};
|
|
499
|
-
} else
|
|
499
|
+
} else e.dlOptions = { enabled: !1 };
|
|
500
500
|
}
|
|
501
501
|
};
|
|
502
|
-
R.defaultOptions =
|
|
502
|
+
R.defaultOptions = e(N.defaultOptions, E), C.compose(T, R), l(R.prototype, {
|
|
503
503
|
animate: P.prototype.animate,
|
|
504
504
|
createNode: C.createNode,
|
|
505
505
|
forceDL: !0,
|
|
@@ -513,12 +513,10 @@ R.defaultOptions = i(N.defaultOptions, E), C.compose(T, R), t(R.prototype, {
|
|
|
513
513
|
"weight"
|
|
514
514
|
],
|
|
515
515
|
pointClass: T,
|
|
516
|
-
searchPoint:
|
|
516
|
+
searchPoint: u.noop
|
|
517
517
|
}), g.registerSeriesType("sankey", R);
|
|
518
518
|
//#endregion
|
|
519
519
|
//#region node_modules/highcharts/es-modules/masters/modules/sankey.src.js
|
|
520
|
-
var z =
|
|
520
|
+
var z = u;
|
|
521
521
|
//#endregion
|
|
522
522
|
export { z as default };
|
|
523
|
-
|
|
524
|
-
//# sourceMappingURL=sankey.src-DocCurOx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sankey.src-Buj1zAlU.js","names":["SeriesRegistry","ColumnSeries","SeriesRegistry","getLevelOptions","getNodeWidth","SeriesRegistry","TU","SankeyColumnComposition","NodesComposition","H","Highcharts"],"sources":["../node_modules/highcharts/es-modules/Series/NodesComposition.js","../node_modules/highcharts/es-modules/Series/Sankey/SankeyPoint.js","../node_modules/highcharts/es-modules/Series/Sankey/SankeySeriesDefaults.js","../node_modules/highcharts/es-modules/Series/TreeUtilities.js","../node_modules/highcharts/es-modules/Series/Sankey/SankeySeries.js","../node_modules/highcharts/es-modules/masters/modules/sankey.src.js"],"sourcesContent":["/* *\n *\n *\n * */\n'use strict';\nimport SeriesRegistry from '../Core/Series/SeriesRegistry.js';\nconst { series: { prototype: seriesProto, prototype: { pointClass: { prototype: pointProto } } } } = SeriesRegistry;\nimport { addEvent, defined, extend, find, merge, pick } from '../Shared/Utilities.js';\n/* *\n *\n * Composition\n *\n * */\nvar NodesComposition;\n(function (NodesComposition) {\n /* *\n *\n * Declarations\n *\n * */\n /* *\n *\n * Functions\n *\n * */\n /**\n * @private\n */\n function compose(PointClass, SeriesClass) {\n const pointProto = PointClass.prototype, seriesProto = SeriesClass.prototype;\n pointProto.setNodeState = setNodeState;\n pointProto.setState = setNodeState;\n pointProto.update = updateNode;\n seriesProto.destroy = destroy;\n seriesProto.setData = setData;\n addEvent(SeriesClass, 'afterUpdate', afterUpdate);\n return SeriesClass;\n }\n NodesComposition.compose = compose;\n /**\n * Destroy data labels on nodes.\n * @private\n */\n function afterUpdate() {\n if (!this.hasDataLabels?.() && this.nodes) { // #23385\n for (const node of this.nodes) {\n node.destroyElements({ dataLabel: 1 });\n }\n }\n }\n /**\n * Create a single node that holds information on incoming and outgoing\n * links.\n * @private\n */\n function createNode(id) {\n const PointClass = this.pointClass, findById = (nodes, id) => find(nodes, (node) => node.id === id);\n let node = findById(this.nodes, id), options;\n if (!node) {\n options = this.options.nodes && findById(this.options.nodes, id);\n const newNode = new PointClass(this, extend({\n className: 'highcharts-node',\n isNode: true,\n id: id,\n y: 1 // Pass isNull test\n }, options));\n newNode.linksTo = [];\n newNode.linksFrom = [];\n /**\n * Return the largest sum of either the incoming or outgoing links.\n * @private\n */\n newNode.getSum = function () {\n let sumTo = 0, sumFrom = 0;\n newNode.linksTo.forEach((link) => {\n sumTo += link.weight || 0;\n });\n newNode.linksFrom.forEach((link) => {\n sumFrom += link.weight || 0;\n });\n return Math.max(sumTo, sumFrom);\n };\n /**\n * Get the offset in weight values of a point/link.\n * @private\n */\n newNode.offset = function (point, coll) {\n let offset = 0;\n for (let i = 0; i < newNode[coll].length; i++) {\n if (newNode[coll][i] === point) {\n return offset;\n }\n offset += newNode[coll][i].weight;\n }\n };\n // Return true if the node has a shape, otherwise all links are\n // outgoing.\n newNode.hasShape = function () {\n let outgoing = 0;\n newNode.linksTo.forEach((link) => {\n if (link.outgoing) {\n outgoing++;\n }\n });\n return (!newNode.linksTo.length ||\n outgoing !== newNode.linksTo.length);\n };\n newNode.index = this.nodes.push(newNode) - 1;\n node = newNode;\n }\n node.formatPrefix = 'node';\n // For use in formats\n node.name = node.name || node.options.id || '';\n // Mass is used in networkgraph:\n node.mass = pick(\n // Node:\n node.options.mass, node.options.marker && node.options.marker.radius, \n // Series:\n this.options.marker && this.options.marker.radius, \n // Default:\n 4);\n return node;\n }\n NodesComposition.createNode = createNode;\n /**\n * Destroy all nodes and links.\n * @private\n */\n function destroy() {\n // Nodes must also be destroyed (#8682, #9300)\n this.data = []\n .concat(this.points || [], this.nodes);\n return seriesProto.destroy.apply(this, arguments);\n }\n NodesComposition.destroy = destroy;\n /**\n * Extend generatePoints by adding the nodes, which are Point objects but\n * pushed to the this.nodes array.\n * @private\n */\n function generatePoints() {\n const chart = this.chart, nodeLookup = {};\n seriesProto.generatePoints.call(this);\n if (!this.nodes) {\n this.nodes = []; // List of Point-like node items\n }\n this.colorCounter = 0;\n // Reset links from previous run\n this.nodes.forEach((node) => {\n node.linksFrom.length = 0;\n node.linksTo.length = 0;\n node.level = node.options.level;\n });\n // Create the node list and set up links\n this.points.forEach((point) => {\n if (defined(point.from)) {\n if (!nodeLookup[point.from]) {\n nodeLookup[point.from] = this.createNode(point.from);\n }\n nodeLookup[point.from].linksFrom.push(point);\n point.fromNode = nodeLookup[point.from];\n // Point color defaults to the fromNode's color\n if (chart.styledMode) {\n point.colorIndex = pick(point.options.colorIndex, nodeLookup[point.from].colorIndex);\n }\n else {\n point.color =\n point.options.color || nodeLookup[point.from].color;\n }\n }\n if (defined(point.to)) {\n if (!nodeLookup[point.to]) {\n nodeLookup[point.to] = this.createNode(point.to);\n }\n nodeLookup[point.to].linksTo.push(point);\n point.toNode = nodeLookup[point.to];\n }\n point.name = point.name || point.id; // For use in formats\n }, this);\n // Store lookup table for later use\n this.nodeLookup = nodeLookup;\n }\n NodesComposition.generatePoints = generatePoints;\n /**\n * Destroy all nodes on setting new data\n * @private\n */\n function setData() {\n if (this.nodes) {\n this.nodes.forEach((node) => {\n node.destroy();\n });\n this.nodes.length = 0;\n }\n seriesProto.setData.apply(this, arguments);\n }\n /**\n * When hovering node, highlight all connected links. When hovering a link,\n * highlight all connected nodes.\n * @private\n */\n function setNodeState(state) {\n const args = arguments, others = this.isNode ? this.linksTo.concat(this.linksFrom) :\n [this.fromNode, this.toNode];\n if (state !== 'select') {\n others.forEach((linkOrNode) => {\n if (linkOrNode && linkOrNode.series) {\n pointProto.setState.apply(linkOrNode, args);\n if (!linkOrNode.isNode) {\n if (linkOrNode.fromNode.graphic) {\n pointProto.setState.apply(linkOrNode.fromNode, args);\n }\n if (linkOrNode.toNode && linkOrNode.toNode.graphic) {\n pointProto.setState.apply(linkOrNode.toNode, args);\n }\n }\n }\n });\n }\n pointProto.setState.apply(this, args);\n }\n NodesComposition.setNodeState = setNodeState;\n /**\n * When updating a node, don't update `series.options.data`, but\n * `series.options.nodes`\n * @private\n */\n function updateNode(options, redraw, animation, runEvent) {\n const nodes = this.series.options.nodes, data = this.series.options.data, dataLength = data?.length || 0, linkConfig = data?.[this.index];\n pointProto.update.call(this, options, this.isNode ? false : redraw, // Hold the redraw for nodes\n animation, runEvent);\n if (this.isNode) {\n // `this.index` refers to `series.nodes`, not `options.nodes` array\n const nodeIndex = (nodes || [])\n .reduce(// Array.findIndex needs a polyfill\n (prevIndex, n, index) => (this.id === n.id ? index : prevIndex), -1), \n // Merge old config with new config. New config is stored in\n // options.data, because of default logic in point.update()\n nodeConfig = merge(nodes && nodes[nodeIndex] || {}, data?.[this.index] || {});\n // Restore link config\n if (data) {\n if (linkConfig) {\n data[this.index] = linkConfig;\n }\n else {\n // Remove node from config if there's more nodes than links\n data.length = dataLength;\n }\n }\n // Set node config\n if (nodes) {\n if (nodeIndex >= 0) {\n nodes[nodeIndex] = nodeConfig;\n }\n else {\n nodes.push(nodeConfig);\n }\n }\n else {\n this.series.options.nodes = [nodeConfig];\n }\n if (pick(redraw, true)) {\n this.series.chart.redraw(animation);\n }\n }\n }\n NodesComposition.updateNode = updateNode;\n})(NodesComposition || (NodesComposition = {}));\n/* *\n *\n * Default Export\n *\n * */\nexport default NodesComposition;\n","/* *\n *\n * Sankey diagram module\n *\n * (c) 2010-2026 Highsoft AS\n * Author: Torstein Hønsi\n *\n * Integration of this software requires a license.\n * - For commercial use, see www.highcharts.com/license\n * - For non-commercial, see www.highcharts.com/license-eula\n *\n *\n * */\n'use strict';\nimport Point from '../../Core/Series/Point.js';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nimport { defined } from '../../Shared/Utilities.js';\nconst { column: ColumnSeries } = SeriesRegistry.seriesTypes;\n/* *\n *\n * Class\n *\n * */\nclass SankeyPoint extends ColumnSeries.prototype.pointClass {\n /* *\n *\n * Functions\n *\n * */\n /**\n * @private\n */\n applyOptions(options, x) {\n Point.prototype.applyOptions.call(this, options, x);\n // Treat point.level as a synonym of point.column\n if (defined(this.options.level)) {\n this.options.column = this.column = this.options.level;\n }\n return this;\n }\n /**\n * @private\n */\n getClassName() {\n return (this.isNode ? 'highcharts-node ' : 'highcharts-link ') +\n Point.prototype.getClassName.call(this);\n }\n /**\n * If there are incoming links, place it to the right of the\n * highest order column that links to this one.\n *\n * @private\n */\n getFromNode() {\n const node = this;\n let fromColumn = -1, fromNode;\n for (let i = 0; i < node.linksTo.length; i++) {\n const point = node.linksTo[i];\n if (point.fromNode.column > fromColumn &&\n point.fromNode !== node // #16080\n ) {\n fromNode = point.fromNode;\n fromColumn = fromNode.column;\n }\n }\n return { fromNode, fromColumn };\n }\n /**\n * Calculate node.column if it's not set by user\n * @private\n */\n setNodeColumn() {\n const node = this;\n if (!defined(node.options.column)) {\n // No links to this node, place it left\n if (node.linksTo.length === 0) {\n node.column = 0;\n }\n else {\n node.column = node.getFromNode().fromColumn + 1;\n }\n }\n }\n /**\n * @private\n */\n isValid() {\n return this.isNode || typeof this.weight === 'number';\n }\n}\n/* *\n *\n * Default Export\n *\n * */\nexport default SankeyPoint;\n","/* *\n *\n * Sankey diagram module\n *\n * (c) 2010-2026 Highsoft AS\n * Author: Torstein Hønsi\n *\n * Integration of this software requires a license.\n * - For commercial use, see www.highcharts.com/license\n * - For non-commercial, see www.highcharts.com/license-eula\n *\n *\n * */\n'use strict';\n/* *\n *\n * API Options\n *\n * */\n/**\n * A sankey diagram is a type of flow diagram, in which the width of the\n * link between two nodes is shown proportionally to the flow quantity.\n *\n * @sample highcharts/demo/sankey-diagram/\n * Sankey diagram\n * @sample highcharts/plotoptions/sankey-inverted/\n * Inverted sankey diagram\n * @sample highcharts/plotoptions/sankey-outgoing\n * Sankey diagram with outgoing links\n *\n * @extends plotOptions.column\n * @since 6.0.0\n * @product highcharts\n * @excluding animationLimit, boostBlending, boostThreshold,\n * crisp, cropThreshold, colorAxis, colorKey, dataSorting, depth,\n * dragDrop, edgeColor, edgeWidth, findNearestPointBy, grouping,\n * groupPadding, groupZPadding, legendSymbolColor, maxPointWidth,\n * minPointLength, negativeColor, pointInterval,\n * pointIntervalUnit, pointPadding, pointPlacement, pointRange,\n * pointStart, pointWidth, shadow, softThreshold, stacking,\n * threshold, zoneAxis, zones\n * @requires modules/sankey\n * @optionparent plotOptions.sankey\n *\n * @private\n */\nconst SankeySeriesDefaults = {\n borderWidth: 0,\n colorByPoint: true,\n /**\n * Higher numbers makes the links in a sankey diagram or dependency\n * wheel render more curved. A `curveFactor` of 0 makes the lines\n * straight.\n *\n * @private\n */\n curveFactor: 0.33,\n /**\n * Options for the data labels appearing on top of the nodes and links.\n * For sankey charts, data labels are visible for the nodes by default,\n * but hidden for links. This is controlled by modifying the\n * `nodeFormat`, and the `format` that applies to links and is an empty\n * string by default.\n *\n * @declare Highcharts.SeriesSankeyDataLabelsOptionsObject\n *\n * @private\n */\n dataLabels: {\n enabled: true,\n backgroundColor: 'none', // Enable padding\n crop: false,\n /**\n * The\n * [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n * specifying what to show for _nodes_ in the sankey diagram. By\n * default the `nodeFormatter` returns `{point.name}`.\n *\n * @sample highcharts/plotoptions/sankey-link-datalabels/\n * Node and link data labels\n *\n * @type {string}\n */\n nodeFormat: void 0,\n /**\n * Callback to format data labels for _nodes_ in the sankey diagram.\n * The `nodeFormat` option takes precedence over the\n * `nodeFormatter`.\n *\n * @type {Highcharts.SeriesSankeyDataLabelsFormatterCallbackFunction}\n * @since 6.0.2\n */\n nodeFormatter: function () {\n return this.point.name;\n },\n format: void 0,\n /**\n * @type {Highcharts.SeriesSankeyDataLabelsFormatterCallbackFunction}\n */\n formatter: function () {\n return;\n },\n inside: true\n },\n /**\n * @default true\n * @extends plotOptions.series.inactiveOtherPoints\n * @private\n */\n inactiveOtherPoints: true,\n /**\n * Set options on specific levels. Takes precedence over series options,\n * but not node and link options.\n *\n * @sample highcharts/demo/sunburst\n * Sunburst chart\n *\n * @type {Array<*>}\n * @since 7.1.0\n * @apioption plotOptions.sankey.levels\n */\n /**\n * Can set `borderColor` on all nodes which lay on the same level.\n *\n * @type {Highcharts.ColorString}\n * @apioption plotOptions.sankey.levels.borderColor\n */\n /**\n * Can set `borderWidth` on all nodes which lay on the same level.\n *\n * @type {number}\n * @apioption plotOptions.sankey.levels.borderWidth\n */\n /**\n * Can set `color` on all nodes which lay on the same level.\n *\n * @type {Highcharts.ColorType}\n * @apioption plotOptions.sankey.levels.color\n */\n /**\n * Can set `colorByPoint` on all nodes which lay on the same level.\n *\n * @type {boolean}\n * @default true\n * @apioption plotOptions.sankey.levels.colorByPoint\n */\n /**\n * Can set `dataLabels` on all points which lay on the same level.\n *\n * @extends plotOptions.sankey.dataLabels\n * @apioption plotOptions.sankey.levels.dataLabels\n */\n /**\n * Decides which level takes effect from the options set in the levels\n * object.\n *\n * @type {number}\n * @apioption plotOptions.sankey.levels.level\n */\n /**\n * Can set `linkOpacity` on all points which lay on the same level.\n *\n * @type {number}\n * @default 0.5\n * @apioption plotOptions.sankey.levels.linkOpacity\n */\n /**\n * Can set `states` on all nodes and points which lay on the same level.\n *\n * @extends plotOptions.sankey.states\n * @apioption plotOptions.sankey.levels.states\n */\n /**\n * Determines color mode for sankey links. Available options:\n *\n * - `from` color of the sankey link will be the same as the 'from node'\n *\n * - `gradient` color of the sankey link will be set to gradient between\n * colors of 'from node' and 'to node'\n *\n * - `to` color of the sankey link will be same as the 'to node'.\n *\n * @sample highcharts/demo/vertical-sankey\n * Vertical sankey diagram with gradients\n * @sample highcharts/series-sankey/link-color-mode\n * Sankey diagram with gradients and explanation\n *\n * @type {('from'|'gradient'|'to')}\n * @since 11.2.0\n */\n linkColorMode: 'from',\n /**\n * Opacity for the links between nodes in the sankey diagram.\n *\n * @private\n */\n linkOpacity: 0.5,\n /**\n * Opacity for the nodes in the sankey diagram.\n *\n * @private\n */\n opacity: 1,\n /**\n * The minimal width for a line of a sankey. By default,\n * 0 values are not shown.\n *\n * @sample highcharts/plotoptions/sankey-minlinkwidth\n * Sankey diagram with minimal link height\n *\n * @type {number}\n * @since 7.1.3\n * @default 0\n * @apioption plotOptions.sankey.minLinkWidth\n *\n * @private\n */\n minLinkWidth: 0,\n /**\n * Determines which side of the chart the nodes are to be aligned to. When\n * the chart is inverted, `top` aligns to the left and `bottom` to the\n * right.\n *\n * @sample highcharts/plotoptions/sankey-nodealignment\n * Node alignment demonstrated\n *\n * @type {'top'|'center'|'bottom'}\n * @apioption plotOptions.sankey.nodeAlignment\n */\n nodeAlignment: 'center',\n /**\n * The pixel width of each node in a sankey diagram or dependency wheel, or\n * the height in case the chart is inverted.\n *\n * Can be a number or a percentage string.\n *\n * Sankey series also support setting it to `auto`. With this setting, the\n * nodes are sized to fill up the plot area in the longitudinal direction,\n * regardless of the number of levels.\n *\n * @see [sankey.nodeDistance](#nodeDistance)\n * @sample highcharts/series-sankey/node-distance\n * Sankey with auto node width combined with node distance\n * @sample highcharts/series-organization/node-distance\n * Organization chart with node distance of 50%\n *\n * @type {number|string}\n */\n nodeWidth: 20,\n /**\n * The padding between nodes in a sankey diagram or dependency wheel, in\n * pixels. For sankey charts, this applies to the nodes of the same column,\n * so vertical distance by default, or horizontal distance in an inverted\n * (vertical) sankey.\n *\n * If the number of nodes is so great that it is impossible to lay them out\n * within the plot area with the given `nodePadding`, they will be rendered\n * with a smaller padding as a strategy to avoid overflow.\n */\n nodePadding: 10,\n /**\n * The distance between nodes in a sankey diagram in the longitudinal\n * direction. The longitudinal direction means the direction that the chart\n * flows - in a horizontal chart the distance is horizontal, in an inverted\n * chart (vertical), the distance is vertical.\n *\n * If a number is given, it denotes pixels. If a percentage string is given,\n * the distance is a percentage of the rendered node width. A `nodeDistance`\n * of `100%` will render equal widths for the nodes and the gaps between\n * them.\n *\n * This option applies only when the `nodeWidth` option is `auto`, making\n * the node width respond to the number of columns.\n *\n * @since 11.4.0\n * @sample highcharts/series-sankey/node-distance\n * Sankey with dnode distance of 100% means equal to node width\n * @sample highcharts/series-organization/node-distance\n * Organization chart with node distance of 50%\n * @type {number|string}\n */\n nodeDistance: 30,\n showInLegend: false,\n states: {\n hover: {\n /**\n * Opacity for the links between nodes in the sankey diagram in\n * hover mode.\n */\n linkOpacity: 1,\n /**\n * Opacity for the nodes in the sankey diagram in hover mode.\n */\n opacity: 1\n },\n /**\n * The opposite state of a hover for a single point node/link.\n *\n * @declare Highcharts.SeriesStatesInactiveOptionsObject\n */\n inactive: {\n /**\n * Opacity for the links between nodes in the sankey diagram in\n * inactive mode.\n */\n linkOpacity: 0.1,\n /**\n * Opacity of the nodes in the sankey diagram in inactive mode.\n */\n opacity: 0.1,\n /**\n * Animation when not hovering over the marker.\n *\n * @type {boolean|Partial<Highcharts.AnimationOptionsObject>}\n * @default { duration: 50 }\n * @apioption plotOptions.series.states.inactive.animation\n */\n animation: {\n /** @internal */\n duration: 50\n }\n }\n },\n tooltip: {\n /**\n * A callback for defining the format for _nodes_ in the chart's\n * tooltip, as opposed to links.\n *\n * @type {Highcharts.FormatterCallbackFunction<Highcharts.SankeyNodeObject>}\n * @since 6.0.2\n * @apioption plotOptions.sankey.tooltip.nodeFormatter\n */\n /**\n * Whether the tooltip should follow the pointer or stay fixed on\n * the item.\n */\n followPointer: true,\n headerFormat: '<span style=\"font-size: 0.8em\">{series.name}</span><br/>',\n pointFormat: '{point.fromNode.name} \\u2192 {point.toNode.name}: <b>{point.weight}</b><br/>',\n /**\n * The\n * [format string](https://www.highcharts.com/docs/chart-concepts/labels-and-string-formatting)\n * specifying what to show for _nodes_ in tooltip of a diagram\n * series, as opposed to links.\n */\n nodeFormat: '{point.name}: <b>{point.sum}</b><br/>'\n }\n};\n/**\n * A `sankey` series. If the [type](#series.sankey.type) option is not\n * specified, it is inherited from [chart.type](#chart.type).\n *\n * @extends series,plotOptions.sankey\n * @excluding animationLimit, boostBlending, boostThreshold, borderColor,\n * borderWidth, crisp, cropThreshold, dataParser,\n * dataURL, depth, dragDrop, edgeColor, edgeWidth,\n * findNearestPointBy, getExtremesFromAll, grouping, groupPadding,\n * groupZPadding, label, maxPointWidth, negativeColor, pointInterval,\n * pointIntervalUnit, pointPadding, pointPlacement, pointRange,\n * pointStart, pointWidth, shadow, softThreshold, stacking,\n * threshold, zoneAxis, zones, dataSorting\n * @product highcharts\n * @requires modules/sankey\n * @apioption series.sankey\n */\n/**\n * A collection of options for the individual nodes. The nodes in a sankey\n * diagram are auto-generated instances of `Highcharts.Point`, but options can\n * be applied here and linked by the `id`.\n *\n * @sample highcharts/css/sankey/\n * Sankey diagram with node options\n *\n * @declare Highcharts.SeriesSankeyNodesOptionsObject\n * @type {Array<*>}\n * @product highcharts\n * @apioption series.sankey.nodes\n */\n/**\n * The id of the auto-generated node, referring to the `from` or `to` setting of\n * the link.\n *\n * @type {string}\n * @product highcharts\n * @apioption series.sankey.nodes.id\n */\n/**\n * The color of the auto generated node.\n *\n * @type {Highcharts.ColorType}\n * @product highcharts\n * @apioption series.sankey.nodes.color\n */\n/**\n * The color index of the auto generated node, especially for use in styled\n * mode.\n *\n * @type {number}\n * @product highcharts\n * @apioption series.sankey.nodes.colorIndex\n */\n/**\n * An optional column index of where to place the node. The default behavior is\n * to place it next to the preceding node. Note that this option name is\n * counter intuitive in inverted charts, like for example an organization chart\n * rendered top down. In this case the \"columns\" are horizontal.\n *\n * @sample highcharts/plotoptions/sankey-node-column/\n * Specified node column\n *\n * @type {number}\n * @since 6.0.5\n * @product highcharts\n * @apioption series.sankey.nodes.column\n */\n/**\n * Individual data label for each node. The options are the same as\n * the ones for [series.sankey.dataLabels](#series.sankey.dataLabels).\n *\n * @extends plotOptions.sankey.dataLabels\n * @apioption series.sankey.nodes.dataLabels\n */\n/**\n * The height of the node.\n *\n * @sample highcharts/series-sankey/height/\n * Sankey diagram with height options\n *\n * @type {number}\n * @since 11.3.0\n * @apioption series.sankey.nodes.height\n */\n/**\n * An optional level index of where to place the node. The default behavior is\n * to place it next to the preceding node. Alias of `nodes.column`, but in\n * inverted sankey and org chart, the levels are laid out as rows.\n *\n * @type {number}\n * @since 7.1.0\n * @product highcharts\n * @apioption series.sankey.nodes.level\n */\n/**\n * The name to display for the node in data labels and tooltips. Use this when\n * the name is different from the `id`. Where the id must be unique for each\n * node, this is not necessary for the name.\n *\n * @sample highcharts/css/sankey/\n * Sankey diagram with node options\n *\n * @type {string}\n * @product highcharts\n * @apioption series.sankey.nodes.name\n */\n/**\n * This option is deprecated, use\n * [offsetHorizontal](#series.sankey.nodes.offsetHorizontal) and\n * [offsetVertical](#series.sankey.nodes.offsetVertical) instead.\n *\n * In a horizontal layout, the vertical offset of a node in terms of weight.\n * Positive values shift the node downwards, negative shift it upwards. In a\n * vertical layout, like organization chart, the offset is horizontal.\n *\n * If a percentage string is given, the node is offset by the percentage of the\n * node size plus `nodePadding`.\n *\n * @deprecated 9.3.0\n * @type {number|string}\n * @default 0\n * @since 6.0.5\n * @product highcharts\n * @apioption series.sankey.nodes.offset\n */\n/**\n * The horizontal offset of a node. Positive values shift the node right,\n * negative shift it left.\n *\n * If a percentage string is given, the node is offset by the percentage of the\n * node size.\n *\n * @sample highcharts/plotoptions/sankey-node-column/\n * Specified node offset\n *\n * @type {number|string}\n * @since 9.3.0\n * @product highcharts\n * @apioption series.sankey.nodes.offsetHorizontal\n */\n/**\n * The vertical offset of a node. Positive values shift the node down,\n * negative shift it up.\n *\n * If a percentage string is given, the node is offset by the percentage of the\n * node size.\n *\n * @sample highcharts/plotoptions/sankey-node-column/\n * Specified node offset\n *\n * @type {number|string}\n * @since 9.3.0\n * @product highcharts\n * @apioption series.sankey.nodes.offsetVertical\n */\n/**\n * An array of data points for the series. For the `sankey` series type,\n * points can be given in the following way:\n *\n * An array of objects with named values. The following snippet shows only a\n * few settings, see the complete options set below. If the total number of data\n * points exceeds the series' [turboThreshold](#series.area.turboThreshold),\n * this option is not available.\n *\n * ```js\n * data: [{\n * from: 'Category1',\n * to: 'Category2',\n * weight: 2\n * }, {\n * from: 'Category1',\n * to: 'Category3',\n * weight: 5\n * }]\n * ```\n *\n * When you provide the data as tuples, the keys option has to be set as well.\n *\n * ```js\n * keys: ['from', 'to', 'weight'],\n * data: [\n * ['Category1', 'Category2', 2],\n * ['Category1', 'Category3', 5]\n * ]\n * ```\n *\n * @sample {highcharts} highcharts/series/data-array-of-objects/\n * Config objects\n *\n * @basic\n * @declare Highcharts.SeriesSankeyPointOptionsObject\n * @type {Array<*>|Array<Array<(string|number)>>}\n * @extends series.line.data\n * @excluding dragDrop, drilldown, marker, x, y\n * @product highcharts\n * @apioption series.sankey.data\n */\n/**\n * The color for the individual _link_. By default, the link color is the same\n * as the node it extends from. The `series.fillOpacity` option also applies to\n * the points, so when setting a specific link color, consider setting the\n * `fillOpacity` to 1.\n *\n * @type {Highcharts.ColorType}\n * @product highcharts\n * @apioption series.sankey.data.color\n */\n/**\n * @type {Highcharts.SeriesSankeyDataLabelsOptionsObject|Array<Highcharts.SeriesSankeyDataLabelsOptionsObject>}\n * @product highcharts\n * @apioption series.sankey.data.dataLabels\n */\n/**\n * The node that the link runs from.\n *\n * @type {string}\n * @product highcharts\n * @apioption series.sankey.data.from\n */\n/**\n * The node that the link runs to.\n *\n * @type {string}\n * @product highcharts\n * @apioption series.sankey.data.to\n */\n/**\n * Whether the link goes out of the system.\n *\n * @sample highcharts/plotoptions/sankey-outgoing\n * Sankey chart with outgoing links\n *\n * @type {boolean}\n * @default false\n * @product highcharts\n * @apioption series.sankey.data.outgoing\n */\n/**\n * The weight of the link.\n *\n * @type {number|null}\n * @product highcharts\n * @apioption series.sankey.data.weight\n */\n''; // Adds doclets above to transpiled file\n/* *\n *\n * Default Export\n *\n * */\nexport default SankeySeriesDefaults;\n","/* *\n *\n * (c) 2014-2026 Highsoft AS\n *\n * Authors: Jon Arild Nygård / Øystein Moseng\n *\n * Integration of this software requires a license.\n * - For commercial use, see www.highcharts.com/license\n * - For non-commercial, see www.highcharts.com/license-eula\n *\n *\n * */\n'use strict';\nimport Color from '../Core/Color/Color.js';\nimport { extend, isArray, isNumber, isObject, merge, pick, relativeLength } from '../Shared/Utilities.js';\n/* *\n *\n * Functions\n *\n * */\n/**\n * @private\n */\nfunction getColor(node, options) {\n const index = options.index, mapOptionsToLevel = options.mapOptionsToLevel, parentColor = options.parentColor, parentColorIndex = options.parentColorIndex, series = options.series, colors = options.colors, siblings = options.siblings, points = series.points, chartOptionsChart = series.chart.options.chart;\n let getColorByPoint, point, level, colorByPoint, colorIndexByPoint, color, colorIndex;\n /**\n * @private\n */\n const variateColor = (color) => {\n const colorVariation = level && level.colorVariation;\n if (colorVariation &&\n colorVariation.key === 'brightness' &&\n index &&\n siblings) {\n return Color.parse(color).brighten(colorVariation.to * (index / siblings)).get();\n }\n return color;\n };\n if (node) {\n point = points[node.i];\n level = mapOptionsToLevel[node.level] || {};\n getColorByPoint = point && level.colorByPoint;\n if (getColorByPoint) {\n colorIndexByPoint = point.index % (colors ?\n colors.length :\n chartOptionsChart.colorCount);\n colorByPoint = colors && colors[colorIndexByPoint];\n }\n // Select either point color, level color or inherited color.\n if (!series.chart.styledMode) {\n color = pick(point && point.options.color, level && level.color, colorByPoint, parentColor && variateColor(parentColor), series.color);\n }\n colorIndex = pick(point && point.options.colorIndex, level && level.colorIndex, colorIndexByPoint, parentColorIndex, options.colorIndex);\n }\n return {\n color: color,\n colorIndex: colorIndex\n };\n}\n/**\n * Creates a map from level number to its given options.\n *\n * @private\n *\n * @param {Object} params\n * Object containing parameters.\n * - `defaults` Object containing default options. The default options are\n * merged with the userOptions to get the final options for a specific\n * level.\n * - `from` The lowest level number.\n * - `levels` User options from series.levels.\n * - `to` The highest level number.\n *\n * @return {Highcharts.Dictionary<object>|null}\n * Returns a map from level number to its given options.\n */\nfunction getLevelOptions(params) {\n const result = {};\n let defaults, converted, i, from, to, levels;\n if (isObject(params)) {\n from = isNumber(params.from) ? params.from : 1;\n levels = params.levels;\n converted = {};\n defaults = isObject(params.defaults) ? params.defaults : {};\n if (isArray(levels)) {\n converted = levels.reduce((obj, item) => {\n let level, levelIsConstant, options;\n if (isObject(item) && isNumber(item.level)) {\n options = merge({}, item);\n levelIsConstant = pick(options.levelIsConstant, defaults.levelIsConstant);\n // Delete redundant properties.\n delete options.levelIsConstant;\n delete options.level;\n // Calculate which level these options apply to.\n level = item.level + (levelIsConstant ? 0 : from - 1);\n if (isObject(obj[level])) {\n merge(true, obj[level], options); // #16329\n }\n else {\n obj[level] = options;\n }\n }\n return obj;\n }, {});\n }\n to = isNumber(params.to) ? params.to : 1;\n for (i = 0; i <= to; i++) {\n result[i] = merge({}, defaults, isObject(converted[i]) ? converted[i] : {});\n }\n }\n return result;\n}\n/**\n * @private\n * @todo Combine buildTree and buildNode with setTreeValues\n * @todo Remove logic from Treemap and make it utilize this mixin.\n */\nfunction setTreeValues(tree, options) {\n const before = options.before, idRoot = options.idRoot, mapIdToNode = options.mapIdToNode, nodeRoot = mapIdToNode[idRoot], levelIsConstant = (options.levelIsConstant !== false), points = options.points, point = points[tree.i], optionsPoint = point && point.options || {}, children = [];\n let childrenTotal = 0;\n tree.levelDynamic = tree.level - (levelIsConstant ? 0 : nodeRoot.level);\n tree.name = pick(point && point.name, '');\n tree.visible = (idRoot === tree.id ||\n options.visible === true);\n if (typeof before === 'function') {\n tree = before(tree, options);\n }\n // First give the children some values\n tree.children.forEach((child, i) => {\n const newOptions = extend({}, options);\n extend(newOptions, {\n index: i,\n siblings: tree.children.length,\n visible: tree.visible\n });\n child = setTreeValues(child, newOptions);\n children.push(child);\n if (child.visible) {\n childrenTotal += child.val;\n }\n });\n // Set the values\n const value = pick(optionsPoint.value, childrenTotal);\n tree.visible = value >= 0 && (childrenTotal > 0 || tree.visible);\n tree.children = children;\n tree.childrenTotal = childrenTotal;\n tree.isLeaf = tree.visible && !childrenTotal;\n tree.val = value;\n return tree;\n}\n/**\n * Update the rootId property on the series. Also makes sure that it is\n * accessible to exporting.\n *\n * @private\n *\n * @param {Object} series\n * The series to operate on.\n *\n * @return {string}\n * Returns the resulting rootId after update.\n */\nfunction updateRootId(series) {\n let rootId, options;\n if (isObject(series)) {\n // Get the series options.\n options = isObject(series.options) ? series.options : {};\n // Calculate the rootId.\n rootId = pick(series.rootNode, options.rootId, '');\n // Set rootId on series.userOptions to pick it up in exporting.\n if (isObject(series.userOptions)) {\n series.userOptions.rootId = rootId;\n }\n // Set rootId on series to pick it up on next update.\n series.rootNode = rootId;\n }\n return rootId;\n}\n/**\n * Get the node width, which relies on the plot width and the nodeDistance\n * option.\n *\n * @private\n */\nfunction getNodeWidth(series, columnCount) {\n const { chart, options } = series, { nodeDistance = 0, nodeWidth = 0 } = options, { plotSizeX = 1 } = chart;\n // Node width auto means they are evenly distributed along the width of\n // the plot area\n if (nodeWidth === 'auto') {\n if (typeof nodeDistance === 'string' && /%$/.test(nodeDistance)) {\n const fraction = parseFloat(nodeDistance) / 100, total = columnCount + fraction * (columnCount - 1);\n return plotSizeX / total;\n }\n const nDistance = Number(nodeDistance);\n return ((plotSizeX + nDistance) /\n (columnCount || 1)) - nDistance;\n }\n return relativeLength(nodeWidth, plotSizeX);\n}\n/* *\n *\n * Default Export\n *\n * */\nconst TreeUtilities = {\n getColor,\n getLevelOptions,\n getNodeWidth,\n setTreeValues,\n updateRootId\n};\nexport default TreeUtilities;\n","/* *\n *\n * Sankey diagram module\n *\n * (c) 2010-2026 Highsoft AS\n * Author: Torstein Hønsi\n *\n * Integration of this software requires a license.\n * - For commercial use, see www.highcharts.com/license\n * - For non-commercial, see www.highcharts.com/license-eula\n *\n *\n * */\n'use strict';\nimport H from '../../Core/Globals.js';\nimport NodesComposition from '../NodesComposition.js';\nimport SankeyPoint from './SankeyPoint.js';\nimport SankeySeriesDefaults from './SankeySeriesDefaults.js';\nimport SeriesRegistry from '../../Core/Series/SeriesRegistry.js';\nimport SankeyColumnComposition from './SankeyColumnComposition.js';\nconst { column: ColumnSeries, line: LineSeries } = SeriesRegistry.seriesTypes;\nimport Color from '../../Core/Color/Color.js';\nconst { parse: color } = Color;\nimport TU from '../TreeUtilities.js';\nconst { getLevelOptions, getNodeWidth } = TU;\nimport SVGElement from '../../Core/Renderer/SVG/SVGElement.js';\nimport { composeTextPath } from '../../Extensions/TextPath.js';\nimport { clamp, crisp, extend, isObject, merge, pick, relativeLength, stableSort } from '../../Shared/Utilities.js';\ncomposeTextPath(SVGElement);\n/* *\n *\n * Class\n *\n * */\n/**\n * @private\n * @class\n * @name Highcharts.seriesTypes.sankey\n *\n * @augments Highcharts.Series\n */\nclass SankeySeries extends ColumnSeries {\n /* *\n *\n * Static Functions\n *\n * */\n /**\n * @private\n */\n static getDLOptions(params) {\n const optionsPoint = (isObject(params.optionsPoint) ?\n params.optionsPoint.dataLabels :\n {}), optionsLevel = (isObject(params.level) ?\n params.level.dataLabels :\n {}), options = merge({\n style: {}\n }, optionsLevel, optionsPoint, {\n // Not a point option. zIndex is set for the data labels group.\n zIndex: optionsLevel?.zIndex\n });\n return options;\n }\n /* *\n *\n * Functions\n *\n * */\n /**\n * Create node columns by analyzing the nodes and the relations between\n * incoming and outgoing links.\n * @private\n */\n createNodeColumns() {\n const columns = [];\n for (const node of this.nodes) {\n node.setNodeColumn();\n if (!columns[node.column]) {\n columns[node.column] =\n SankeyColumnComposition.compose([], this);\n }\n columns[node.column].push(node);\n }\n // Fill in empty columns (#8865)\n for (let i = 0; i < columns.length; i++) {\n if (typeof columns[i] === 'undefined') {\n columns[i] =\n SankeyColumnComposition.compose([], this);\n }\n }\n return columns;\n }\n /**\n * Order the nodes, starting with the root node(s). (#9818)\n * @private\n */\n order(node, level, visited) {\n const series = this;\n // Watch the visited nodes\n if (!visited) {\n visited = new Set();\n }\n // Prevents circular recursion, but updates level if a longer\n // path is found from a different branch\n if (typeof node.level === 'undefined' || node.level < level) {\n node.level = level;\n visited.add(node);\n for (const link of node.linksFrom) {\n if (link.toNode && !visited.has(link.toNode)) {\n series.order(link.toNode, level + 1, visited);\n }\n }\n visited.delete(node);\n }\n }\n /**\n * Extend generatePoints by adding the nodes, which are Point objects\n * but pushed to the this.nodes array.\n * @private\n */\n generatePoints() {\n NodesComposition.generatePoints.apply(this, arguments);\n if (this.orderNodes) {\n for (const node of this.nodes) {\n // Identify the root node(s)\n if (node.linksTo.length === 0) {\n // Start by the root node(s) and recursively set the level\n // on all following nodes.\n this.order(node, 0);\n }\n }\n stableSort(this.nodes, (a, b) => (a.level - b.level));\n }\n }\n /**\n * Overridable function to get node padding, overridden in dependency\n * wheel series type.\n * @private\n */\n getNodePadding() {\n let nodePadding = this.options.nodePadding || 0;\n // If the number of columns is so great that they will overflow with\n // the given nodePadding, we sacrifice the padding in order to\n // render all nodes within the plot area (#11917).\n if (this.nodeColumns) {\n const maxLength = this.nodeColumns.reduce((acc, col) => Math.max(acc, col.length), 0);\n if (maxLength * nodePadding > this.chart.plotSizeY) {\n nodePadding = this.chart.plotSizeY / maxLength;\n }\n }\n return nodePadding;\n }\n /**\n * Define hasData function for non-cartesian series.\n * @private\n * @return {boolean}\n * Returns true if the series has points at all.\n */\n hasData() {\n return !!this.dataTable.rowCount;\n }\n /**\n * Return the presentational attributes.\n * @private\n */\n pointAttribs(point, state) {\n if (!point) {\n return {};\n }\n const series = this, level = point.isNode ? point.level : point.fromNode.level, levelOptions = series.mapOptionsToLevel[level || 0] || {}, options = point.options, stateOptions = (levelOptions.states && levelOptions.states[state || '']) || {}, values = [\n 'colorByPoint',\n 'borderColor',\n 'borderWidth',\n 'linkOpacity',\n 'opacity'\n ].reduce((obj, key) => {\n obj[key] = pick(stateOptions[key], options[key], levelOptions[key], series.options[key]);\n return obj;\n }, {}), color = pick(stateOptions.color, options.color, values.colorByPoint ? point.color : levelOptions.color);\n // Node attributes\n if (point.isNode) {\n return {\n fill: color,\n stroke: values.borderColor,\n 'stroke-width': values.borderWidth,\n opacity: values.opacity\n };\n }\n // Link attributes\n return {\n fill: color,\n 'fill-opacity': values.linkOpacity\n };\n }\n drawTracker() {\n ColumnSeries.prototype.drawTracker.call(this, this.points);\n ColumnSeries.prototype.drawTracker.call(this, this.nodes);\n }\n drawPoints() {\n ColumnSeries.prototype.drawPoints.call(this, this.points);\n ColumnSeries.prototype.drawPoints.call(this, this.nodes);\n }\n drawDataLabels() {\n ColumnSeries.prototype.drawDataLabels.call(this, this.points);\n ColumnSeries.prototype.drawDataLabels.call(this, this.nodes);\n }\n /**\n * Run pre-translation by generating the nodeColumns.\n * @private\n */\n translate() {\n this.generatePoints();\n this.nodeColumns = this.createNodeColumns();\n const series = this, chart = this.chart, options = this.options, nodeColumns = this.nodeColumns, columnCount = nodeColumns.length;\n this.nodeWidth = getNodeWidth(this, columnCount);\n this.nodePadding = this.getNodePadding();\n // Find out how much space is needed. Base it on the translation\n // factor of the most spacious column.\n this.translationFactor = nodeColumns.reduce((translationFactor, column) => Math.min(translationFactor, column.sankeyColumn.getTranslationFactor(series)), Infinity);\n this.colDistance =\n (chart.plotSizeX - this.nodeWidth -\n options.borderWidth) / Math.max(1, nodeColumns.length - 1);\n // Calculate level options used in sankey and organization\n series.mapOptionsToLevel = getLevelOptions({\n // NOTE: if support for allowTraversingTree is added, then from\n // should be the level of the root node.\n from: 1,\n levels: options.levels,\n to: nodeColumns.length - 1, // Height of the tree\n defaults: {\n borderColor: options.borderColor,\n borderRadius: options.borderRadius, // Organization series\n borderWidth: options.borderWidth,\n color: series.color,\n colorByPoint: options.colorByPoint,\n // NOTE: if support for allowTraversingTree is added, then\n // levelIsConstant should be optional.\n levelIsConstant: true,\n linkColor: options.linkColor, // Organization series\n linkLineWidth: options.linkLineWidth, // Organization series\n linkOpacity: options.linkOpacity,\n states: options.states\n }\n });\n // First translate all nodes so we can use them when drawing links\n for (const column of nodeColumns) {\n for (const node of column) {\n series.translateNode(node, column);\n }\n }\n // Then translate links\n for (const node of this.nodes) {\n // Translate the links from this node\n for (const linkPoint of node.linksFrom) {\n // If weight is 0 - don't render the link path #12453,\n // render null points (for organization chart)\n if ((linkPoint.weight || linkPoint.isNull) && linkPoint.to) {\n series.translateLink(linkPoint);\n linkPoint.allowShadow = false;\n }\n }\n }\n }\n /**\n * Get the Y position of a link.\n * @internal\n */\n getY(point, node, fromOrTo, linkHeight) {\n const linkTop = (node.offset(point, fromOrTo) || 0) * this.translationFactor;\n const y = Math.min(node.nodeY + linkTop, \n // Prevent links from spilling below the node (#12014)\n node.nodeY + (node.shapeArgs && node.shapeArgs.height || 0) - linkHeight);\n return y;\n }\n /**\n * Run translation operations for one link.\n * @internal\n */\n translateLink(point, linkToY) {\n const fromNode = point.fromNode, toNode = point.toNode, chart = this.chart, { inverted } = chart, translationFactor = this.translationFactor, options = this.options, linkColorMode = pick(point.linkColorMode, options.linkColorMode), curvy = ((chart.inverted ? -this.colDistance : this.colDistance) *\n options.curveFactor), nodeLeft = fromNode.nodeX, right = toNode.nodeX, outgoing = point.outgoing;\n let linkHeight = Math.max((point.weight || 0) * translationFactor, this.options.minLinkWidth || 0), fromY = this.getY(point, fromNode, 'linksFrom', linkHeight), toY = linkToY || this.getY(point, toNode, 'linksTo', linkHeight), nodeW = this.nodeWidth, straight = right > nodeLeft + nodeW;\n if (chart.inverted) {\n fromY = chart.plotSizeY - fromY;\n toY = (chart.plotSizeY || 0) - toY;\n nodeW = -nodeW;\n linkHeight = -linkHeight;\n straight = nodeLeft > right;\n }\n point.shapeType = 'path';\n point.linkBase = [\n fromY,\n fromY + linkHeight,\n toY,\n toY + linkHeight\n ];\n // Links going from left to right\n if (straight && typeof toY === 'number') {\n point.shapeArgs = {\n d: [\n ['M', nodeLeft + nodeW, fromY],\n [\n 'C',\n nodeLeft + nodeW + curvy,\n fromY,\n right - curvy,\n toY,\n right,\n toY\n ],\n ['L', right + (outgoing ? nodeW : 0), toY + linkHeight / 2],\n ['L', right, toY + linkHeight],\n [\n 'C',\n right - curvy,\n toY + linkHeight,\n nodeLeft + nodeW + curvy,\n fromY + linkHeight,\n nodeLeft + nodeW, fromY + linkHeight\n ],\n ['Z']\n ]\n };\n // Experimental: Circular links pointing backwards. In\n // v6.1.0 this breaks the rendering completely, so even\n // this experimental rendering is an improvement. #8218.\n // @todo\n // - Make room for the link in the layout\n // - Automatically determine if the link should go up or\n // down.\n }\n else if (typeof toY === 'number') {\n const bend = 20, vDist = chart.plotHeight - fromY - linkHeight, x1 = right - bend - linkHeight, x2 = right - bend, x3 = right, x4 = nodeLeft + nodeW, x5 = x4 + bend, x6 = x5 + linkHeight, fy1 = fromY, fy2 = fromY + linkHeight, fy3 = fy2 + bend, y4 = fy3 + vDist, y5 = y4 + bend, y6 = y5 + linkHeight, ty1 = toY, ty2 = ty1 + linkHeight, ty3 = ty2 + bend, cfy1 = fy2 - linkHeight * 0.7, cy2 = y5 + linkHeight * 0.7, cty1 = ty2 - linkHeight * 0.7, cx1 = x3 - linkHeight * 0.7, cx2 = x4 + linkHeight * 0.7;\n point.shapeArgs = {\n d: [\n ['M', x4, fy1],\n ['C', cx2, fy1, x6, cfy1, x6, fy3],\n ['L', x6, y4],\n ['C', x6, cy2, cx2, y6, x4, y6],\n ['L', x3, y6],\n ['C', cx1, y6, x1, cy2, x1, y4],\n ['L', x1, ty3],\n ['C', x1, cty1, cx1, ty1, x3, ty1],\n ['L', x3, ty2],\n ['C', x2, ty2, x2, ty2, x2, ty3],\n ['L', x2, y4],\n ['C', x2, y5, x2, y5, x3, y5],\n ['L', x4, y5],\n ['C', x5, y5, x5, y5, x5, y4],\n ['L', x5, fy3],\n ['C', x5, fy2, x5, fy2, x4, fy2],\n ['Z']\n ]\n };\n }\n // Place data labels in the middle\n point.dlBox = {\n x: nodeLeft + (right - nodeLeft + nodeW) / 2,\n y: fromY + (toY - fromY) / 2,\n height: linkHeight,\n width: 0\n };\n // And set the tooltip anchor in the middle\n point.tooltipPos = chart.inverted ? [\n chart.plotSizeY - point.dlBox.y - linkHeight / 2,\n chart.plotSizeX - point.dlBox.x\n ] : [\n point.dlBox.x,\n point.dlBox.y + linkHeight / 2\n ];\n // Pass test in drawPoints. plotX/Y needs to be defined for dataLabels.\n // #15863\n point.y = point.plotY = 1;\n point.x = point.plotX = 1;\n if (!point.options.color) {\n if (linkColorMode === 'from') {\n point.color = fromNode.color;\n }\n else if (linkColorMode === 'to') {\n point.color = toNode.color;\n }\n else if (linkColorMode === 'gradient') {\n const fromColor = color(fromNode.color).get(), toColor = color(toNode.color).get();\n point.color = {\n linearGradient: {\n x1: 1,\n x2: 0,\n y1: 0,\n y2: 0\n },\n stops: [\n [0, inverted ? fromColor : toColor],\n [1, inverted ? toColor : fromColor]\n ]\n };\n }\n }\n }\n /**\n * Run translation operations for one node.\n * @internal\n */\n translateNode(node, column) {\n const translationFactor = this.translationFactor, chart = this.chart, options = this.options, { borderRadius, borderWidth = 0 } = options, sum = node.getSum(), nodeHeight = Math.max(Math.round(sum * translationFactor), this.options.minLinkWidth), nodeWidth = Math.round(this.nodeWidth), nodeOffset = column.sankeyColumn.offset(node, translationFactor), fromNodeTop = crisp(pick(nodeOffset.absoluteTop, (column.sankeyColumn.top(translationFactor) +\n nodeOffset.relativeTop)), borderWidth), left = crisp(this.colDistance * node.column +\n borderWidth / 2, borderWidth) + relativeLength(node.options[chart.inverted ?\n 'offsetVertical' :\n 'offsetHorizontal'] || 0, nodeWidth), nodeLeft = chart.inverted ?\n chart.plotSizeX - left :\n left;\n node.sum = sum;\n // If node sum is 0, don't render the rect #12453\n if (sum) {\n // Draw the node\n node.shapeType = 'roundedRect';\n node.nodeX = nodeLeft;\n node.nodeY = fromNodeTop;\n let x = nodeLeft, y = fromNodeTop, width = node.options.width || options.width || nodeWidth, height = node.options.height || options.height || nodeHeight;\n // Border radius should not greater than half the height of the node\n // #18956\n const r = clamp(relativeLength((isObject(borderRadius) ?\n borderRadius.radius :\n borderRadius) || 0, width), 0, nodeHeight / 2);\n if (chart.inverted) {\n x = nodeLeft - nodeWidth;\n y = chart.plotSizeY - fromNodeTop - nodeHeight;\n width = node.options.height || options.height || nodeWidth;\n height = node.options.width || options.width || nodeHeight;\n }\n // Calculate data label options for the point\n node.dlOptions = {\n ...SankeySeries.getDLOptions({\n level: this.mapOptionsToLevel[node.level],\n optionsPoint: node.options\n }),\n zIndex: void 0\n };\n // Delete so it doesn't override anything on merge.\n delete node.dlOptions.zIndex;\n // Pass test in drawPoints\n node.plotX = 1;\n node.plotY = 1;\n // Set the anchor position for tooltips\n node.tooltipPos = chart.inverted ? [\n chart.plotSizeY - y - height / 2,\n chart.plotSizeX - x - width / 2\n ] : [\n x + width / 2,\n y + height / 2\n ];\n node.shapeArgs = {\n x,\n y,\n width,\n height,\n r,\n display: node.hasShape() ? '' : 'none'\n };\n }\n else {\n node.dlOptions = {\n enabled: false\n };\n }\n }\n}\n/* *\n *\n * Static Properties\n *\n * */\nSankeySeries.defaultOptions = merge(ColumnSeries.defaultOptions, SankeySeriesDefaults);\nNodesComposition.compose(SankeyPoint, SankeySeries);\nextend(SankeySeries.prototype, {\n animate: LineSeries.prototype.animate,\n // Create a single node that holds information on incoming and outgoing\n // links.\n createNode: NodesComposition.createNode,\n forceDL: true,\n invertible: true,\n isCartesian: false,\n orderNodes: true,\n noSharedTooltip: true,\n pointArrayMap: ['from', 'to', 'weight'],\n pointClass: SankeyPoint,\n searchPoint: H.noop\n});\nSeriesRegistry.registerSeriesType('sankey', SankeySeries);\n/* *\n *\n * Default Export\n *\n * */\nexport default SankeySeries;\n/* *\n *\n * API Declarations\n *\n * */\n/**\n * A node in a sankey diagram.\n *\n * @interface Highcharts.SankeyNodeObject\n * @extends Highcharts.Point\n * @product highcharts\n */ /**\n* The color of the auto generated node.\n*\n* @name Highcharts.SankeyNodeObject#color\n* @type {Highcharts.ColorType}\n*/ /**\n* The color index of the auto generated node, especially for use in styled\n* mode.\n*\n* @name Highcharts.SankeyNodeObject#colorIndex\n* @type {number}\n*/ /**\n* An optional column index of where to place the node. The default behavior is\n* to place it next to the preceding node.\n*\n* @see {@link https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/sankey-node-column/|Highcharts-Demo:}\n* Specified node column\n*\n* @name Highcharts.SankeyNodeObject#column\n* @type {number}\n* @since 6.0.5\n*/ /**\n* The id of the auto-generated node, referring to the `from` or `to` setting of\n* the link.\n*\n* @name Highcharts.SankeyNodeObject#id\n* @type {string}\n*/ /**\n* The name to display for the node in data labels and tooltips. Use this when\n* the name is different from the `id`. Where the id must be unique for each\n* node, this is not necessary for the name.\n*\n* @see {@link https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/css/sankey/|Highcharts-Demo:}\n* Sankey diagram with node options\n*\n* @name Highcharts.SankeyNodeObject#name\n* @type {string}\n* @product highcharts\n*/ /**\n* This option is deprecated, use\n* {@link Highcharts.SankeyNodeObject#offsetHorizontal} and\n* {@link Highcharts.SankeyNodeObject#offsetVertical} instead.\n*\n* The vertical offset of a node in terms of weight. Positive values shift the\n* node downwards, negative shift it upwards.\n*\n* If a percentage string is given, the node is offset by the percentage of the\n* node size plus `nodePadding`.\n*\n* @see {@link https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/sankey-node-column/|Highcharts-Demo:}\n* Specified node offset\n*\n* @deprecated 9.3.0\n* @name Highcharts.SankeyNodeObject#offset\n* @type {number|string}\n* @default 0\n* @since 6.0.5\n*/ /**\n* The horizontal offset of a node. Positive values shift the node right,\n* negative shift it left.\n*\n* If a percentage string is given, the node is offset by the percentage of the\n* node size.\n*\n* @see {@link https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/sankey-node-column/|Highcharts-Demo:}\n* Specified node offset\n*\n* @name Highcharts.SankeyNodeObject#offsetHorizontal\n* @type {number|string}\n* @since 9.3.0\n*/ /**\n* The vertical offset of a node. Positive values shift the node down,\n* negative shift it up.\n*\n* If a percentage string is given, the node is offset by the percentage of the\n* node size.\n*\n* @see {@link https://jsfiddle.net/gh/get/library/pure/highcharts/highcharts/tree/master/samples/highcharts/plotoptions/sankey-node-column/|Highcharts-Demo:}\n* Specified node offset\n*\n* @name Highcharts.SankeyNodeObject#offsetVertical\n* @type {number|string}\n* @since 9.3.0\n*/\n/**\n * Formatter callback function.\n *\n * @callback Highcharts.SeriesSankeyDataLabelsFormatterCallbackFunction\n *\n * @param {Highcharts.Point} this\n * Data label context to format\n *\n * @return {string|undefined}\n * Formatted data label text\n */\n''; // Detach doclets above\n","// SPDX-License-Identifier: LicenseRef-Highcharts\n/**\n * @license Highcharts JS v13.0.1 (2026-08-17)\n * @module highcharts/modules/sankey\n * @requires highcharts\n *\n * Sankey diagram module\n *\n * (c) 2010-2026 Highsoft AS\n * Author: Torstein Hønsi\n *\n * A commercial license may be required depending on use,\n * see www.highcharts.com/license\n */\n'use strict';\nimport Highcharts from '../../Core/Globals.js';\nimport '../../Series/Sankey/SankeySeries.js';\nexport default Highcharts;\n"],"x_google_ignoreList":[0,1,2,3,4,5],"mappings":"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"}
|