apexcharts 6.3.0 → 6.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/apexcharts.common.js +2 -2
- package/dist/apexcharts.esm.js +769 -117
- package/dist/apexcharts.js +769 -117
- package/dist/apexcharts.min.js +2 -2
- package/dist/apexcharts.ssr.common.js +2 -2
- package/dist/apexcharts.ssr.esm.js +769 -117
- package/dist/area.common.js +2 -2
- package/dist/area.esm.js +3 -3
- package/dist/bar.common.js +2 -2
- package/dist/bar.esm.js +208 -109
- package/dist/boxPlot.common.js +2 -2
- package/dist/boxPlot.esm.js +208 -109
- package/dist/bubble.common.js +2 -2
- package/dist/bubble.esm.js +3 -3
- package/dist/candlestick.common.js +2 -2
- package/dist/candlestick.esm.js +208 -109
- package/dist/column.common.js +2 -2
- package/dist/column.esm.js +208 -109
- package/dist/core.common.js +2 -2
- package/dist/core.esm.js +372 -62
- package/dist/donut.common.js +1 -1
- package/dist/donut.esm.js +1 -1
- package/dist/features/all.common.js +2 -2
- package/dist/features/all.esm.js +282 -9
- package/dist/features/annotations.common.js +1 -1
- package/dist/features/annotations.esm.js +1 -1
- package/dist/features/context-menu.common.js +1 -1
- package/dist/features/context-menu.esm.js +1 -1
- package/dist/features/drilldown.common.js +1 -1
- package/dist/features/drilldown.esm.js +1 -1
- package/dist/features/exports.common.js +1 -1
- package/dist/features/exports.esm.js +1 -1
- package/dist/features/facet.common.js +1 -1
- package/dist/features/facet.esm.js +1 -1
- package/dist/features/history.common.js +1 -1
- package/dist/features/history.esm.js +1 -1
- package/dist/features/ink.common.js +1 -1
- package/dist/features/ink.esm.js +1 -1
- package/dist/features/keyboard.common.js +1 -1
- package/dist/features/keyboard.esm.js +1 -1
- package/dist/features/legend.common.js +1 -1
- package/dist/features/legend.esm.js +1 -1
- package/dist/features/link.common.js +1 -1
- package/dist/features/link.esm.js +1 -1
- package/dist/features/marks.common.js +1 -1
- package/dist/features/marks.esm.js +1 -1
- package/dist/features/measure.common.js +1 -1
- package/dist/features/measure.esm.js +1 -1
- package/dist/features/morph.common.js +1 -1
- package/dist/features/morph.esm.js +1 -1
- package/dist/features/perspectives.common.js +1 -1
- package/dist/features/perspectives.esm.js +1 -1
- package/dist/features/renderer-canvas.common.js +2 -2
- package/dist/features/renderer-canvas.esm.js +280 -7
- package/dist/features/storyboard.common.js +1 -1
- package/dist/features/storyboard.esm.js +1 -1
- package/dist/features/toolbar.common.js +1 -1
- package/dist/features/toolbar.esm.js +1 -1
- package/dist/features/weave.common.js +1 -1
- package/dist/features/weave.esm.js +1 -1
- package/dist/heatmap.common.js +2 -2
- package/dist/heatmap.esm.js +79 -41
- package/dist/line.common.js +2 -2
- package/dist/line.esm.js +3 -3
- package/dist/pie.common.js +1 -1
- package/dist/pie.esm.js +1 -1
- package/dist/polarArea.common.js +1 -1
- package/dist/polarArea.esm.js +1 -1
- package/dist/radar.common.js +1 -1
- package/dist/radar.esm.js +1 -1
- package/dist/radialBar.common.js +1 -1
- package/dist/radialBar.esm.js +1 -1
- package/dist/rangeArea.common.js +2 -2
- package/dist/rangeArea.esm.js +3 -3
- package/dist/rangeBar.common.js +2 -2
- package/dist/rangeBar.esm.js +208 -109
- package/dist/scatter.common.js +2 -2
- package/dist/scatter.esm.js +3 -3
- package/dist/treemap.common.js +1 -1
- package/dist/treemap.esm.js +1 -1
- package/dist/violin.common.js +2 -2
- package/dist/violin.esm.js +208 -109
- package/package.json +1 -1
- package/src/apexcharts.js +7 -0
- package/src/charts/Bar.js +38 -6
- package/src/charts/HeatMap.js +126 -55
- package/src/charts/common/bar/DataLabels.js +16 -0
- package/src/modules/Data.js +14 -2
- package/src/modules/Filters.js +34 -6
- package/src/modules/Graphics.js +4 -4
- package/src/modules/Series.js +6 -0
- package/src/modules/animations/AxisTransition.js +57 -15
- package/src/modules/animations/DataLabelTransition.js +235 -0
- package/src/modules/animations/LengthTransition.js +15 -2
- package/src/modules/axes/YAxis.js +21 -1
- package/src/modules/settings/Defaults.js +12 -1
- package/src/modules/settings/Options.js +16 -0
- package/src/modules/tooltip/Intersect.js +145 -32
- package/src/modules/tooltip/Labels.js +9 -0
- package/src/modules/tooltip/Tooltip.js +28 -7
- package/src/renderers/Renderer.js +8 -2
- package/src/renderers/canvas/CanvasCompositor.js +100 -1
- package/src/renderers/canvas/CanvasGraphics.js +184 -0
- package/src/renderers/canvas/CanvasRenderer.js +46 -6
- package/src/types/internal.d.ts +8 -0
- package/types/apexcharts.d.ts +30 -0
package/dist/apexcharts.js
CHANGED
|
@@ -54,7 +54,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
54
54
|
});
|
|
55
55
|
};
|
|
56
56
|
/*!
|
|
57
|
-
* ApexCharts v6.
|
|
57
|
+
* ApexCharts v6.4.0
|
|
58
58
|
* (c) 2018-2026 ApexCharts
|
|
59
59
|
*/
|
|
60
60
|
|
|
@@ -2819,7 +2819,14 @@ var __async = (__this, __arguments, generator) => {
|
|
|
2819
2819
|
heatmap() {
|
|
2820
2820
|
return {
|
|
2821
2821
|
chart: {
|
|
2822
|
-
stacked: false
|
|
2822
|
+
stacked: false,
|
|
2823
|
+
// A heatmap is a fixed grid: zooming/panning only distorts the cells
|
|
2824
|
+
// and (on a datetime axis) collapses the month labels to repeats, so
|
|
2825
|
+
// it is off by default, mirroring treemap. Users can opt back in with
|
|
2826
|
+
// chart.zoom.enabled: true.
|
|
2827
|
+
zoom: {
|
|
2828
|
+
enabled: false
|
|
2829
|
+
}
|
|
2823
2830
|
},
|
|
2824
2831
|
fill: {
|
|
2825
2832
|
opacity: 1
|
|
@@ -2833,7 +2840,11 @@ var __async = (__this, __arguments, generator) => {
|
|
|
2833
2840
|
colors: ["#fff"]
|
|
2834
2841
|
},
|
|
2835
2842
|
tooltip: {
|
|
2836
|
-
|
|
2843
|
+
// Anchor the tooltip above the hovered cell with a downward arrow
|
|
2844
|
+
// (flipping below near the top edge), the same treatment horizontal
|
|
2845
|
+
// bars get, rather than trailing the cursor. Opt back into the old
|
|
2846
|
+
// behavior with tooltip.followCursor: true.
|
|
2847
|
+
followCursor: false,
|
|
2837
2848
|
marker: {
|
|
2838
2849
|
show: false
|
|
2839
2850
|
},
|
|
@@ -4514,6 +4525,20 @@ var __async = (__this, __arguments, generator) => {
|
|
|
4514
4525
|
blur: 1,
|
|
4515
4526
|
color: "#000",
|
|
4516
4527
|
opacity: 0.8
|
|
4528
|
+
},
|
|
4529
|
+
// Ride data labels to their new position on a data-change update
|
|
4530
|
+
// (e.g. a bar chart race), instead of snapping. Off by default so
|
|
4531
|
+
// existing charts are unchanged. Speed/easing follow
|
|
4532
|
+
// chart.animations.dynamicAnimation. Bar/column only.
|
|
4533
|
+
animate: {
|
|
4534
|
+
enabled: false
|
|
4535
|
+
},
|
|
4536
|
+
// Count the numeric value up/down from its previous value on update,
|
|
4537
|
+
// like countUp.js. Off by default. The dataLabels.formatter runs each
|
|
4538
|
+
// frame, so number formatting (decimals, separators, prefixes) is
|
|
4539
|
+
// preserved. Bar/column only.
|
|
4540
|
+
countUp: {
|
|
4541
|
+
enabled: false
|
|
4517
4542
|
}
|
|
4518
4543
|
},
|
|
4519
4544
|
fill: {
|
|
@@ -4705,13 +4730,15 @@ var __async = (__this, __arguments, generator) => {
|
|
|
4705
4730
|
states: {
|
|
4706
4731
|
hover: {
|
|
4707
4732
|
filter: {
|
|
4708
|
-
type: "lighten"
|
|
4733
|
+
type: "lighten",
|
|
4734
|
+
value: 0.15
|
|
4709
4735
|
}
|
|
4710
4736
|
},
|
|
4711
4737
|
active: {
|
|
4712
4738
|
allowMultipleDataPointsSelection: false,
|
|
4713
4739
|
filter: {
|
|
4714
|
-
type: "darken"
|
|
4740
|
+
type: "darken",
|
|
4741
|
+
value: 0.35
|
|
4715
4742
|
}
|
|
4716
4743
|
}
|
|
4717
4744
|
},
|
|
@@ -8191,6 +8218,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
8191
8218
|
});
|
|
8192
8219
|
}
|
|
8193
8220
|
}
|
|
8221
|
+
const DEFAULT_INTENSITY = { lighten: 0.15, darken: 0.35 };
|
|
8194
8222
|
class Filters {
|
|
8195
8223
|
/**
|
|
8196
8224
|
* @param {import('../types/internal').ChartStateW} w
|
|
@@ -8216,8 +8244,9 @@ var __async = (__this, __arguments, generator) => {
|
|
|
8216
8244
|
* @param {any} el
|
|
8217
8245
|
* @param {number} i
|
|
8218
8246
|
* @param {string} filterType
|
|
8247
|
+
* @param {number} [intensity] Blend strength (0 to 1). Defaults per type.
|
|
8219
8248
|
*/
|
|
8220
|
-
applyFilter(el, i, filterType) {
|
|
8249
|
+
applyFilter(el, i, filterType, intensity) {
|
|
8221
8250
|
var _a, _b, _c;
|
|
8222
8251
|
const w = this.w;
|
|
8223
8252
|
if (el.unfilter) {
|
|
@@ -8228,15 +8257,21 @@ var __async = (__this, __arguments, generator) => {
|
|
|
8228
8257
|
return;
|
|
8229
8258
|
}
|
|
8230
8259
|
const shadowAttr = w.config.chart.dropShadow;
|
|
8231
|
-
const
|
|
8260
|
+
const fallback = filterType === "lighten" ? DEFAULT_INTENSITY.lighten : DEFAULT_INTENSITY.darken;
|
|
8261
|
+
const t = Math.max(
|
|
8262
|
+
0,
|
|
8263
|
+
Math.min(1, typeof intensity === "number" ? intensity : fallback)
|
|
8264
|
+
);
|
|
8265
|
+
const diag = 1 - t;
|
|
8266
|
+
const offset = filterType === "lighten" ? t : 0;
|
|
8232
8267
|
if (el.filterWith) {
|
|
8233
8268
|
el.filterWith((add) => {
|
|
8234
8269
|
add.colorMatrix({
|
|
8235
8270
|
type: "matrix",
|
|
8236
8271
|
values: `
|
|
8237
|
-
${
|
|
8238
|
-
0 ${
|
|
8239
|
-
0 0 ${
|
|
8272
|
+
${diag} 0 0 0 ${offset}
|
|
8273
|
+
0 ${diag} 0 0 ${offset}
|
|
8274
|
+
0 0 ${diag} 0 ${offset}
|
|
8240
8275
|
0 0 0 1 0
|
|
8241
8276
|
`,
|
|
8242
8277
|
in: "SourceGraphic",
|
|
@@ -8335,7 +8370,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
8335
8370
|
el.node.setAttribute("selected", true);
|
|
8336
8371
|
const activeFilter = w.config.states.active.filter;
|
|
8337
8372
|
if (activeFilter !== "none") {
|
|
8338
|
-
this.applyFilter(el, realIndex, activeFilter.type);
|
|
8373
|
+
this.applyFilter(el, realIndex, activeFilter.type, activeFilter.value);
|
|
8339
8374
|
}
|
|
8340
8375
|
}
|
|
8341
8376
|
}
|
|
@@ -9174,7 +9209,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
9174
9209
|
if (w.config.states.hover.filter.type !== "none") {
|
|
9175
9210
|
if (!w.interact.isTouchDevice) {
|
|
9176
9211
|
const hoverFilter = w.config.states.hover.filter;
|
|
9177
|
-
filters.applyFilter(path, i, hoverFilter.type);
|
|
9212
|
+
filters.applyFilter(path, i, hoverFilter.type, hoverFilter.value);
|
|
9178
9213
|
}
|
|
9179
9214
|
}
|
|
9180
9215
|
}
|
|
@@ -9259,12 +9294,12 @@ var __async = (__this, __arguments, generator) => {
|
|
|
9259
9294
|
if (selected === "true") {
|
|
9260
9295
|
const activeFilter = w.config.states.active.filter;
|
|
9261
9296
|
if (activeFilter !== "none") {
|
|
9262
|
-
filters.applyFilter(path, i, activeFilter.type);
|
|
9297
|
+
filters.applyFilter(path, i, activeFilter.type, activeFilter.value);
|
|
9263
9298
|
} else {
|
|
9264
9299
|
if (w.config.states.hover.filter !== "none") {
|
|
9265
9300
|
if (!w.interact.isTouchDevice) {
|
|
9266
9301
|
const hoverFilter = w.config.states.hover.filter;
|
|
9267
|
-
filters.applyFilter(path, i, hoverFilter.type);
|
|
9302
|
+
filters.applyFilter(path, i, hoverFilter.type, hoverFilter.value);
|
|
9268
9303
|
}
|
|
9269
9304
|
}
|
|
9270
9305
|
}
|
|
@@ -9272,7 +9307,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
9272
9307
|
if (w.config.states.active.filter.type !== "none") {
|
|
9273
9308
|
if (w.config.states.hover.filter.type !== "none" && !w.interact.isTouchDevice) {
|
|
9274
9309
|
const hoverFilter = w.config.states.hover.filter;
|
|
9275
|
-
filters.applyFilter(path, i, hoverFilter.type);
|
|
9310
|
+
filters.applyFilter(path, i, hoverFilter.type, hoverFilter.value);
|
|
9276
9311
|
} else {
|
|
9277
9312
|
filters.getDefaultFilter(path, i);
|
|
9278
9313
|
}
|
|
@@ -9911,12 +9946,13 @@ var __async = (__this, __arguments, generator) => {
|
|
|
9911
9946
|
const markerSize = w.config.markers && w.config.markers.size;
|
|
9912
9947
|
const markersOn = Array.isArray(markerSize) ? markerSize.some((s) => s > 0) : (markerSize || 0) > 0;
|
|
9913
9948
|
const labelsOn = !!(w.config.dataLabels && w.config.dataLabels.enabled);
|
|
9949
|
+
const isHeatmap = type === "heatmap";
|
|
9914
9950
|
let total = 0;
|
|
9915
9951
|
let maxLen = 0;
|
|
9916
9952
|
series.forEach((s) => {
|
|
9917
9953
|
const n = Array.isArray(s.data) ? s.data.length : 0;
|
|
9918
9954
|
if (n > maxLen) maxLen = n;
|
|
9919
|
-
if (scatterish || markersOn) total += n;
|
|
9955
|
+
if (scatterish || markersOn || isHeatmap) total += n;
|
|
9920
9956
|
if (labelsOn) total += n;
|
|
9921
9957
|
});
|
|
9922
9958
|
const LARGE_D = 5e4;
|
|
@@ -13478,6 +13514,13 @@ var __async = (__this, __arguments, generator) => {
|
|
|
13478
13514
|
realIndex,
|
|
13479
13515
|
w.globals.yAxisScale[realIndex].result.slice()
|
|
13480
13516
|
);
|
|
13517
|
+
let labelStep = 1;
|
|
13518
|
+
if (w.config.chart.type === "heatmap" && !w.config.yaxis[realIndex].labels.formatter) {
|
|
13519
|
+
const fs = parseInt(yaxisFontSize, 10) || 11;
|
|
13520
|
+
const maxLabels = Math.max(1, Math.floor(w.layout.gridHeight / (fs * 1.4)));
|
|
13521
|
+
const count = tickAmount + 1;
|
|
13522
|
+
if (count > maxLabels) labelStep = Math.ceil(count / maxLabels);
|
|
13523
|
+
}
|
|
13481
13524
|
if (w.config.yaxis[realIndex].labels.show) {
|
|
13482
13525
|
let lY = w.layout.translateY + w.config.yaxis[realIndex].labels.offsetY;
|
|
13483
13526
|
if (w.globals.isBarHorizontal) lY = 0;
|
|
@@ -13485,7 +13528,8 @@ var __async = (__this, __arguments, generator) => {
|
|
|
13485
13528
|
lY += parseInt(yaxisFontSize, 10) / 3;
|
|
13486
13529
|
let firstLabel = null;
|
|
13487
13530
|
for (let i = tickAmount; i >= 0; i--) {
|
|
13488
|
-
const
|
|
13531
|
+
const thinned = labelStep > 1 && i % labelStep !== 0;
|
|
13532
|
+
const val = thinned ? "" : lbFormatter(labels[i], i, w);
|
|
13489
13533
|
let xPad = w.config.yaxis[realIndex].labels.padding;
|
|
13490
13534
|
if (w.config.yaxis[realIndex].opposite && w.config.yaxis.length !== 0)
|
|
13491
13535
|
xPad *= -1;
|
|
@@ -14720,7 +14764,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
14720
14764
|
return count === 0 ? k : `${k}#${count}`;
|
|
14721
14765
|
});
|
|
14722
14766
|
}
|
|
14723
|
-
function seriesJoin(w, realIndex, includeIdentity = false) {
|
|
14767
|
+
function seriesJoin(w, realIndex, includeIdentity = false, allowReorder = false) {
|
|
14724
14768
|
var _a, _b;
|
|
14725
14769
|
if (!lengthTransitionEnabled(w)) return null;
|
|
14726
14770
|
const frame = w.globals.prevStreamFrame;
|
|
@@ -14734,7 +14778,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
14734
14778
|
);
|
|
14735
14779
|
const newKeys = uniquifyKeys(newY.map((_, j) => datumKey(w, realIndex, j)));
|
|
14736
14780
|
const join = joinKeys(oldKeys, newKeys);
|
|
14737
|
-
if (!join.ordered) return null;
|
|
14781
|
+
if (!join.ordered && !allowReorder) return null;
|
|
14738
14782
|
if (!join.changed && !includeIdentity) return null;
|
|
14739
14783
|
return { join, oldKeys, newKeys };
|
|
14740
14784
|
}
|
|
@@ -15043,7 +15087,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
15043
15087
|
gl.prevChromeFrame = null;
|
|
15044
15088
|
}
|
|
15045
15089
|
}
|
|
15046
|
-
function fadeIn(w, node, duration, ease) {
|
|
15090
|
+
function fadeIn$1(w, node, duration, ease) {
|
|
15047
15091
|
const style = (
|
|
15048
15092
|
/** @type {any} */
|
|
15049
15093
|
node.style
|
|
@@ -15140,34 +15184,59 @@ var __async = (__this, __arguments, generator) => {
|
|
|
15140
15184
|
const spanHi = Math.max(...spanPs);
|
|
15141
15185
|
const margin = Math.max(40, (spanHi - spanLo) * 0.25);
|
|
15142
15186
|
const clamp = (p) => Math.max(spanLo - margin, Math.min(spanHi + margin, p));
|
|
15187
|
+
const tweenPairedLine = (line, old) => {
|
|
15188
|
+
if (!line) return;
|
|
15189
|
+
const lineTo = parseFloat(line.getAttribute(lineAttrs[0]) || "");
|
|
15190
|
+
const lineFrom = oldLines[old.i];
|
|
15191
|
+
if (isFinite(lineTo) && isFinite(lineFrom)) {
|
|
15192
|
+
tweenPos(w, line, lineAttrs, lineFrom, lineTo, duration, ease);
|
|
15193
|
+
}
|
|
15194
|
+
};
|
|
15143
15195
|
newLabels.forEach((label, i) => {
|
|
15144
15196
|
const to = parseFloat(label.getAttribute(posAttr) || "");
|
|
15145
15197
|
const old = oldByText.get(label.textContent || "");
|
|
15146
15198
|
const line = newLinesAligned ? newLines[i] : null;
|
|
15147
15199
|
if (old) matchedOld.add(old.i);
|
|
15148
|
-
|
|
15200
|
+
const labelTransform = label.getAttribute("transform");
|
|
15201
|
+
if (!old || !isFinite(old.pos)) {
|
|
15149
15202
|
if (!old) {
|
|
15150
|
-
if (project && isFinite(to) && !
|
|
15203
|
+
if (project && isFinite(to) && !labelTransform) {
|
|
15151
15204
|
const from = isFinite(project.toOld(to)) ? clamp(project.toOld(to)) : NaN;
|
|
15152
15205
|
if (isFinite(from) && Math.abs(from - to) > 0.5) {
|
|
15153
15206
|
tweenPos(w, label, [posAttr], from, to, duration, ease);
|
|
15154
15207
|
if (line) tweenPos(w, line, lineAttrs, from, to, duration, ease);
|
|
15155
15208
|
}
|
|
15156
15209
|
}
|
|
15157
|
-
fadeIn(w, label, duration, ease);
|
|
15158
|
-
if (line) fadeIn(w, line, duration, ease);
|
|
15210
|
+
fadeIn$1(w, label, duration, ease);
|
|
15211
|
+
if (line) fadeIn$1(w, line, duration, ease);
|
|
15159
15212
|
}
|
|
15160
15213
|
return;
|
|
15161
15214
|
}
|
|
15162
15215
|
if (!isFinite(to) || Math.abs(old.pos - to) < 0.5) return;
|
|
15163
|
-
|
|
15164
|
-
|
|
15165
|
-
|
|
15166
|
-
|
|
15167
|
-
|
|
15168
|
-
|
|
15216
|
+
if (labelTransform || old.transform) {
|
|
15217
|
+
const delta = old.pos - to;
|
|
15218
|
+
if (isFinite(delta)) {
|
|
15219
|
+
const base = labelTransform || "";
|
|
15220
|
+
rafTween(
|
|
15221
|
+
w,
|
|
15222
|
+
duration,
|
|
15223
|
+
ease,
|
|
15224
|
+
(eased) => {
|
|
15225
|
+
const v = delta * (1 - eased);
|
|
15226
|
+
const t = posAttr === "x" ? `translate(${v} 0)` : `translate(0 ${v})`;
|
|
15227
|
+
label.setAttribute("transform", `${t} ${base}`.trim());
|
|
15228
|
+
},
|
|
15229
|
+
() => {
|
|
15230
|
+
if (base) label.setAttribute("transform", base);
|
|
15231
|
+
else label.removeAttribute("transform");
|
|
15232
|
+
}
|
|
15233
|
+
);
|
|
15169
15234
|
}
|
|
15235
|
+
tweenPairedLine(line, old);
|
|
15236
|
+
return;
|
|
15170
15237
|
}
|
|
15238
|
+
tweenPos(w, label, [posAttr], old.pos, to, duration, ease);
|
|
15239
|
+
tweenPairedLine(line, old);
|
|
15171
15240
|
});
|
|
15172
15241
|
if (!project || !newLabels.length) return;
|
|
15173
15242
|
let ghosts = 0;
|
|
@@ -15206,7 +15275,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
15206
15275
|
if (!chrome || !gl.axisCharts || !Environment.isBrowser()) return;
|
|
15207
15276
|
if (!lengthTransitionEnabled(w)) return;
|
|
15208
15277
|
const anyMotion = (w.seriesData.series || []).some(
|
|
15209
|
-
(_, i) => seriesJoin(w, i, true) !== null
|
|
15278
|
+
(_, i) => seriesJoin(w, i, true, true) !== null
|
|
15210
15279
|
);
|
|
15211
15280
|
if (!anyMotion) return;
|
|
15212
15281
|
const root = w.dom.baseEl;
|
|
@@ -15250,6 +15319,158 @@ var __async = (__this, __arguments, generator) => {
|
|
|
15250
15319
|
} catch (_) {
|
|
15251
15320
|
}
|
|
15252
15321
|
}
|
|
15322
|
+
const DL_GROUP_SEL = ".apexcharts-data-labels[data\\:dlKey]";
|
|
15323
|
+
const DL_TEXT_SEL = ".apexcharts-datalabel";
|
|
15324
|
+
function dataLabelMotionEnabled(w) {
|
|
15325
|
+
var _a, _b;
|
|
15326
|
+
const dl = w.config.dataLabels;
|
|
15327
|
+
return !!(((_a = dl == null ? void 0 : dl.animate) == null ? void 0 : _a.enabled) || ((_b = dl == null ? void 0 : dl.countUp) == null ? void 0 : _b.enabled));
|
|
15328
|
+
}
|
|
15329
|
+
function decimalsOf(n) {
|
|
15330
|
+
if (!isFinite(n)) return 0;
|
|
15331
|
+
const s = String(n);
|
|
15332
|
+
const dot = s.indexOf(".");
|
|
15333
|
+
return dot === -1 ? 0 : Math.min(6, s.length - dot - 1);
|
|
15334
|
+
}
|
|
15335
|
+
function writeLabel(textEl, s) {
|
|
15336
|
+
const tspan = textEl.querySelector("tspan");
|
|
15337
|
+
if (tspan) tspan.textContent = s;
|
|
15338
|
+
else textEl.textContent = s;
|
|
15339
|
+
}
|
|
15340
|
+
function captureDataLabels(w) {
|
|
15341
|
+
const gl = w.globals;
|
|
15342
|
+
gl.prevDataLabels = null;
|
|
15343
|
+
if (!gl.axisCharts || !Environment.isBrowser()) return;
|
|
15344
|
+
if (!dataLabelMotionEnabled(w)) return;
|
|
15345
|
+
const root = w.dom.baseEl;
|
|
15346
|
+
if (!Utils$1.elementExists(root)) return;
|
|
15347
|
+
try {
|
|
15348
|
+
const map = /* @__PURE__ */ new Map();
|
|
15349
|
+
root.querySelectorAll(DL_GROUP_SEL).forEach((group) => {
|
|
15350
|
+
const key = group.getAttribute("data:dlKey");
|
|
15351
|
+
if (!key) return;
|
|
15352
|
+
const textEl = group.querySelector(DL_TEXT_SEL);
|
|
15353
|
+
if (!textEl) return;
|
|
15354
|
+
map.set(key, {
|
|
15355
|
+
cx: parseFloat(textEl.getAttribute("cx") || ""),
|
|
15356
|
+
cy: parseFloat(textEl.getAttribute("cy") || ""),
|
|
15357
|
+
val: parseFloat(group.getAttribute("data:dlVal") || "")
|
|
15358
|
+
});
|
|
15359
|
+
});
|
|
15360
|
+
gl.prevDataLabels = map.size ? map : null;
|
|
15361
|
+
} catch (_) {
|
|
15362
|
+
gl.prevDataLabels = null;
|
|
15363
|
+
}
|
|
15364
|
+
}
|
|
15365
|
+
function fadeIn(w, node, duration, ease) {
|
|
15366
|
+
const style = (
|
|
15367
|
+
/** @type {any} */
|
|
15368
|
+
node.style
|
|
15369
|
+
);
|
|
15370
|
+
style.opacity = "0";
|
|
15371
|
+
rafTween(
|
|
15372
|
+
w,
|
|
15373
|
+
duration,
|
|
15374
|
+
ease,
|
|
15375
|
+
(eased) => {
|
|
15376
|
+
style.opacity = String(eased);
|
|
15377
|
+
},
|
|
15378
|
+
() => {
|
|
15379
|
+
style.opacity = "";
|
|
15380
|
+
}
|
|
15381
|
+
);
|
|
15382
|
+
}
|
|
15383
|
+
function applyDataLabelTransition(w) {
|
|
15384
|
+
var _a, _b;
|
|
15385
|
+
const gl = w.globals;
|
|
15386
|
+
const prev = gl.prevDataLabels;
|
|
15387
|
+
gl.prevDataLabels = null;
|
|
15388
|
+
if (!prev || !gl.axisCharts || !Environment.isBrowser()) return;
|
|
15389
|
+
if (!dataLabelMotionEnabled(w)) return;
|
|
15390
|
+
if (!lengthTransitionEnabled(w)) return;
|
|
15391
|
+
const root = w.dom.baseEl;
|
|
15392
|
+
if (!Utils$1.elementExists(root)) return;
|
|
15393
|
+
const dl = w.config.dataLabels;
|
|
15394
|
+
const ride = !!((_a = dl.animate) == null ? void 0 : _a.enabled);
|
|
15395
|
+
const countUp = !!((_b = dl.countUp) == null ? void 0 : _b.enabled);
|
|
15396
|
+
const formatter = dl.formatter;
|
|
15397
|
+
const duration = Math.max(1, w.config.chart.animations.dynamicAnimation.speed || 1);
|
|
15398
|
+
const ease = morphEasing(w);
|
|
15399
|
+
try {
|
|
15400
|
+
root.querySelectorAll(DL_GROUP_SEL).forEach((group) => {
|
|
15401
|
+
const key = group.getAttribute("data:dlKey");
|
|
15402
|
+
if (!key) return;
|
|
15403
|
+
const textEl = group.querySelector(DL_TEXT_SEL);
|
|
15404
|
+
if (!textEl) return;
|
|
15405
|
+
const old = prev.get(key);
|
|
15406
|
+
if (ride) {
|
|
15407
|
+
if (old && isFinite(old.cx) && isFinite(old.cy)) {
|
|
15408
|
+
const newCx = parseFloat(textEl.getAttribute("cx") || "");
|
|
15409
|
+
const newCy = parseFloat(textEl.getAttribute("cy") || "");
|
|
15410
|
+
const dx = old.cx - newCx;
|
|
15411
|
+
const dy = old.cy - newCy;
|
|
15412
|
+
if (isFinite(dx) && isFinite(dy) && Math.abs(dx) + Math.abs(dy) > 0.5) {
|
|
15413
|
+
const base = group.getAttribute("transform") || "";
|
|
15414
|
+
rafTween(
|
|
15415
|
+
w,
|
|
15416
|
+
duration,
|
|
15417
|
+
ease,
|
|
15418
|
+
(eased) => {
|
|
15419
|
+
const t = 1 - eased;
|
|
15420
|
+
group.setAttribute(
|
|
15421
|
+
"transform",
|
|
15422
|
+
`translate(${dx * t} ${dy * t}) ${base}`.trim()
|
|
15423
|
+
);
|
|
15424
|
+
},
|
|
15425
|
+
() => {
|
|
15426
|
+
group.setAttribute("transform", base);
|
|
15427
|
+
}
|
|
15428
|
+
);
|
|
15429
|
+
}
|
|
15430
|
+
} else if (!old) {
|
|
15431
|
+
fadeIn(w, group, duration, ease);
|
|
15432
|
+
}
|
|
15433
|
+
}
|
|
15434
|
+
if (countUp && old && isFinite(old.val)) {
|
|
15435
|
+
const newVal = parseFloat(group.getAttribute("data:dlVal") || "");
|
|
15436
|
+
if (isFinite(newVal) && Math.abs(newVal - old.val) > 1e-9) {
|
|
15437
|
+
const from = old.val;
|
|
15438
|
+
const dec = Math.max(decimalsOf(from), decimalsOf(newVal));
|
|
15439
|
+
const realIndex = parseInt(key, 10);
|
|
15440
|
+
const j = parseInt(group.getAttribute("data:dlJ") || "", 10);
|
|
15441
|
+
const format = (v) => {
|
|
15442
|
+
const rounded = Number(v.toFixed(dec));
|
|
15443
|
+
let out = rounded;
|
|
15444
|
+
if (typeof formatter === "function") {
|
|
15445
|
+
try {
|
|
15446
|
+
out = formatter(rounded, __spreadProps(__spreadValues({}, w), {
|
|
15447
|
+
seriesIndex: realIndex,
|
|
15448
|
+
dataPointIndex: isFinite(j) ? j : 0,
|
|
15449
|
+
w
|
|
15450
|
+
}));
|
|
15451
|
+
} catch (_) {
|
|
15452
|
+
out = rounded;
|
|
15453
|
+
}
|
|
15454
|
+
}
|
|
15455
|
+
return String(out);
|
|
15456
|
+
};
|
|
15457
|
+
rafTween(
|
|
15458
|
+
w,
|
|
15459
|
+
duration,
|
|
15460
|
+
ease,
|
|
15461
|
+
(eased) => {
|
|
15462
|
+
writeLabel(textEl, format(from + (newVal - from) * eased));
|
|
15463
|
+
},
|
|
15464
|
+
() => {
|
|
15465
|
+
writeLabel(textEl, format(newVal));
|
|
15466
|
+
}
|
|
15467
|
+
);
|
|
15468
|
+
}
|
|
15469
|
+
}
|
|
15470
|
+
});
|
|
15471
|
+
} catch (_) {
|
|
15472
|
+
}
|
|
15473
|
+
}
|
|
15253
15474
|
class Series {
|
|
15254
15475
|
/**
|
|
15255
15476
|
* @param {import('../types/internal').ChartStateW} w
|
|
@@ -15623,6 +15844,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
15623
15844
|
const w = this.w;
|
|
15624
15845
|
captureStreamFrame(w);
|
|
15625
15846
|
captureAxisChrome(w);
|
|
15847
|
+
captureDataLabels(w);
|
|
15626
15848
|
if (!w.globals.axisCharts) {
|
|
15627
15849
|
w.globals.previousPaths = w.seriesData.series;
|
|
15628
15850
|
return;
|
|
@@ -19463,7 +19685,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
19463
19685
|
* @param {any[]} ser
|
|
19464
19686
|
*/
|
|
19465
19687
|
parseData(ser) {
|
|
19466
|
-
var _a, _b, _c, _d, _e, _f;
|
|
19688
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
19467
19689
|
const w = this.w;
|
|
19468
19690
|
const cnf = w.config;
|
|
19469
19691
|
const gl = w.globals;
|
|
@@ -19489,8 +19711,11 @@ var __async = (__this, __arguments, generator) => {
|
|
|
19489
19711
|
gl.dataReducerRawMaxX = rawMaxX;
|
|
19490
19712
|
}
|
|
19491
19713
|
}
|
|
19492
|
-
cnf.series = ser;
|
|
19493
19714
|
if (gl.dataReducerRawSeries && ((_f = cnf.chart.dataReducer) == null ? void 0 : _f.enabled)) {
|
|
19715
|
+
ser = ser.map((s) => __spreadValues({}, s));
|
|
19716
|
+
}
|
|
19717
|
+
cnf.series = ser;
|
|
19718
|
+
if (gl.dataReducerRawSeries && ((_g = cnf.chart.dataReducer) == null ? void 0 : _g.enabled)) {
|
|
19494
19719
|
const stash = gl.dataReducerRawSeries;
|
|
19495
19720
|
gl.initialSeries = ser.map((s, i) => {
|
|
19496
19721
|
var _a2, _b2, _c2;
|
|
@@ -21131,12 +21356,14 @@ var __async = (__this, __arguments, generator) => {
|
|
|
21131
21356
|
w
|
|
21132
21357
|
});
|
|
21133
21358
|
if (tooltipEl) {
|
|
21359
|
+
const arrowEl = tooltipEl.querySelector(".apexcharts-tooltip-arrow");
|
|
21134
21360
|
if (typeof customTooltip === "string" || typeof customTooltip === "number") {
|
|
21135
21361
|
tooltipEl.innerHTML = String(customTooltip);
|
|
21136
21362
|
} else if (customTooltip instanceof Element || typeof customTooltip.nodeName === "string") {
|
|
21137
21363
|
tooltipEl.innerHTML = "";
|
|
21138
21364
|
tooltipEl.appendChild(customTooltip.cloneNode(true));
|
|
21139
21365
|
}
|
|
21366
|
+
if (arrowEl) tooltipEl.appendChild(arrowEl);
|
|
21140
21367
|
}
|
|
21141
21368
|
}
|
|
21142
21369
|
}
|
|
@@ -21989,33 +22216,107 @@ var __async = (__this, __arguments, generator) => {
|
|
|
21989
22216
|
var _a, _b;
|
|
21990
22217
|
const ttCtx = this.ttCtx;
|
|
21991
22218
|
const w = this.w;
|
|
21992
|
-
|
|
21993
|
-
|
|
21994
|
-
|
|
21995
|
-
|
|
21996
|
-
const
|
|
21997
|
-
const
|
|
21998
|
-
const
|
|
21999
|
-
|
|
22000
|
-
|
|
22001
|
-
|
|
22002
|
-
|
|
22003
|
-
|
|
22004
|
-
|
|
22005
|
-
}
|
|
22006
|
-
|
|
22007
|
-
|
|
22008
|
-
|
|
22009
|
-
|
|
22010
|
-
|
|
22011
|
-
|
|
22012
|
-
|
|
22013
|
-
|
|
22014
|
-
|
|
22015
|
-
|
|
22016
|
-
|
|
22017
|
-
|
|
22219
|
+
const renderer = w.globals.activeRenderer;
|
|
22220
|
+
const canvasCells = type === "heatmap" && renderer && renderer.kind === "canvas" && typeof renderer.hitTest === "function";
|
|
22221
|
+
let i, j, cx, cy, width, height;
|
|
22222
|
+
if (canvasCells) {
|
|
22223
|
+
const seriesBound = opt.elGrid.getBoundingClientRect();
|
|
22224
|
+
const clientX = e.type === "touchmove" ? e.touches[0].clientX : e.clientX;
|
|
22225
|
+
const clientY = e.type === "touchmove" ? e.touches[0].clientY : e.clientY;
|
|
22226
|
+
const hit = renderer.hitTest(
|
|
22227
|
+
clientX - seriesBound.left,
|
|
22228
|
+
clientY - seriesBound.top
|
|
22229
|
+
);
|
|
22230
|
+
if (!hit) {
|
|
22231
|
+
return { x, y, noHit: true };
|
|
22232
|
+
}
|
|
22233
|
+
i = hit.seriesIndex;
|
|
22234
|
+
j = hit.dataPointIndex;
|
|
22235
|
+
cx = hit.x;
|
|
22236
|
+
cy = hit.y;
|
|
22237
|
+
width = hit.width;
|
|
22238
|
+
height = hit.height;
|
|
22239
|
+
} else if (e.target.classList.contains(`apexcharts-${type}-rect`)) {
|
|
22240
|
+
i = this.getAttr(e, "i");
|
|
22241
|
+
j = this.getAttr(e, "j");
|
|
22242
|
+
cx = this.getAttr(e, "cx");
|
|
22243
|
+
cy = this.getAttr(e, "cy");
|
|
22244
|
+
width = this.getAttr(e, "width");
|
|
22245
|
+
height = this.getAttr(e, "height");
|
|
22246
|
+
} else {
|
|
22247
|
+
return { x, y };
|
|
22248
|
+
}
|
|
22249
|
+
ttCtx.tooltipLabels.drawSeriesTexts({
|
|
22250
|
+
ttItems: opt.ttItems,
|
|
22251
|
+
i,
|
|
22252
|
+
j,
|
|
22253
|
+
shared: false,
|
|
22254
|
+
e
|
|
22255
|
+
});
|
|
22256
|
+
w.interact.capturedSeriesIndex = i;
|
|
22257
|
+
w.interact.capturedDataPointIndex = j;
|
|
22258
|
+
ttCtx.tooltipPosition.moveXCrosshairs(cx + width / 2);
|
|
22259
|
+
const tooltipEl = ttCtx.getElTooltip();
|
|
22260
|
+
if (type === "heatmap" && w.config.tooltip.arrow && !w.config.tooltip.followCursor && tooltipEl) {
|
|
22261
|
+
const elGridRect = opt.elGrid.getBoundingClientRect();
|
|
22262
|
+
const elWrapRect = w.dom.elWrap.getBoundingClientRect();
|
|
22263
|
+
const gridOffsetXInElWrap = elGridRect.left - elWrapRect.left;
|
|
22264
|
+
let clLeft, clTop, clRight, clBottom;
|
|
22265
|
+
if (canvasCells) {
|
|
22266
|
+
clLeft = cx;
|
|
22267
|
+
clTop = cy;
|
|
22268
|
+
clRight = cx + width;
|
|
22269
|
+
clBottom = cy + height;
|
|
22270
|
+
} else {
|
|
22271
|
+
const r = e.target.getBoundingClientRect();
|
|
22272
|
+
clLeft = r.left - elGridRect.left;
|
|
22273
|
+
clTop = r.top - elGridRect.top;
|
|
22274
|
+
clRight = r.right - elGridRect.left;
|
|
22275
|
+
clBottom = r.bottom - elGridRect.top;
|
|
22276
|
+
}
|
|
22277
|
+
const ttW = ttCtx.tooltipRect.ttWidth || 0;
|
|
22278
|
+
const ttH = ttCtx.tooltipRect.ttHeight || 0;
|
|
22279
|
+
const ARROW_TIP_OVERHANG = 7;
|
|
22280
|
+
const cellCenterXInElWrap = (clLeft + clRight) / 2 + gridOffsetXInElWrap;
|
|
22281
|
+
const cellTopInElWrap = clTop + w.layout.translateY;
|
|
22282
|
+
const cellBottomInElWrap = clBottom + w.layout.translateY;
|
|
22283
|
+
const gridTop = w.layout.translateY;
|
|
22284
|
+
const gridBottom = w.layout.translateY + w.layout.gridHeight;
|
|
22285
|
+
const gridLeft = gridOffsetXInElWrap;
|
|
22286
|
+
const gridRight = gridOffsetXInElWrap + w.layout.gridWidth;
|
|
22287
|
+
let placement = "top";
|
|
22288
|
+
let finalY = cellTopInElWrap - ttH - ARROW_TIP_OVERHANG;
|
|
22289
|
+
if (finalY < gridTop) {
|
|
22290
|
+
const belowTop = cellBottomInElWrap + ARROW_TIP_OVERHANG;
|
|
22291
|
+
if (belowTop + ttH <= gridBottom) {
|
|
22292
|
+
placement = "bottom";
|
|
22293
|
+
finalY = belowTop;
|
|
22294
|
+
} else {
|
|
22295
|
+
finalY = gridTop;
|
|
22296
|
+
}
|
|
22018
22297
|
}
|
|
22298
|
+
let finalX = cellCenterXInElWrap - ttW / 2;
|
|
22299
|
+
if (finalX < gridLeft) finalX = gridLeft;
|
|
22300
|
+
if (finalX + ttW > gridRight) finalX = gridRight - ttW;
|
|
22301
|
+
const arrowX = Math.max(10, Math.min(ttW - 10, cellCenterXInElWrap - finalX));
|
|
22302
|
+
ttCtx.tooltipPosition.applyTooltipPosition(tooltipEl, {
|
|
22303
|
+
x: finalX,
|
|
22304
|
+
y: finalY,
|
|
22305
|
+
placement,
|
|
22306
|
+
arrowY: null,
|
|
22307
|
+
arrowX
|
|
22308
|
+
});
|
|
22309
|
+
return { x: finalX, y: finalY, positioned: true };
|
|
22310
|
+
}
|
|
22311
|
+
x = cx + ttCtx.tooltipRect.ttWidth / 2 + width;
|
|
22312
|
+
y = cy + ttCtx.tooltipRect.ttHeight / 2 - height / 2;
|
|
22313
|
+
if (x > w.layout.gridWidth / 2) {
|
|
22314
|
+
x = cx - ttCtx.tooltipRect.ttWidth / 2 + width;
|
|
22315
|
+
}
|
|
22316
|
+
if (ttCtx.w.config.tooltip.followCursor) {
|
|
22317
|
+
const seriesBound = w.dom.elWrap.getBoundingClientRect();
|
|
22318
|
+
x = ((_a = w.interact.clientX) != null ? _a : 0) - seriesBound.left - (x > w.layout.gridWidth / 2 ? ttCtx.tooltipRect.ttWidth : 0);
|
|
22319
|
+
y = ((_b = w.interact.clientY) != null ? _b : 0) - seriesBound.top - (y > w.layout.gridHeight / 2 ? ttCtx.tooltipRect.ttHeight : 0);
|
|
22019
22320
|
}
|
|
22020
22321
|
return {
|
|
22021
22322
|
x,
|
|
@@ -22654,7 +22955,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
22654
22955
|
this.tConfig.style.background
|
|
22655
22956
|
);
|
|
22656
22957
|
}
|
|
22657
|
-
const isSharedMulti = this.tConfig.shared && w.config.series.length > 1 && !w.globals.isBarHorizontal;
|
|
22958
|
+
const isSharedMulti = this.tConfig.shared && w.config.series.length > 1 && !w.globals.isBarHorizontal && w.config.chart.type !== "heatmap";
|
|
22658
22959
|
const shouldDrawArrow = this.tConfig.arrow && !this.tConfig.followCursor && !this.tConfig.fixed.enabled && !isSharedMulti && !this.tConfig.fillSeriesColor && w.globals.axisCharts;
|
|
22659
22960
|
if (shouldDrawArrow) {
|
|
22660
22961
|
const arrowEl = BrowserAPIs.createElementNS(
|
|
@@ -22831,6 +23132,8 @@ var __async = (__this, __arguments, generator) => {
|
|
|
22831
23132
|
this.addPathsEventListeners([hoverArea], seriesHoverParams);
|
|
22832
23133
|
} else if (commonBar && !w.globals.comboCharts || chartWithmarkers && this.showOnIntersect) {
|
|
22833
23134
|
this.addDatapointEventsListeners(seriesHoverParams);
|
|
23135
|
+
} else if (type === "heatmap" && w.globals.activeRenderer && w.globals.activeRenderer.kind === "canvas") {
|
|
23136
|
+
this.addPathsEventListeners([hoverArea], seriesHoverParams);
|
|
22834
23137
|
} else if (!w.globals.axisCharts || type === "heatmap" || type === "treemap") {
|
|
22835
23138
|
const seriesAll = w.dom.baseEl.querySelectorAll(".apexcharts-series");
|
|
22836
23139
|
this.addPathsEventListeners(seriesAll, seriesHoverParams);
|
|
@@ -23080,10 +23383,16 @@ var __async = (__this, __arguments, generator) => {
|
|
|
23080
23383
|
y,
|
|
23081
23384
|
type: w.config.chart.type
|
|
23082
23385
|
});
|
|
23386
|
+
if (markerXY.noHit) {
|
|
23387
|
+
this.handleMouseOut(opt);
|
|
23388
|
+
return;
|
|
23389
|
+
}
|
|
23083
23390
|
x = markerXY.x;
|
|
23084
23391
|
y = markerXY.y;
|
|
23085
|
-
|
|
23086
|
-
|
|
23392
|
+
if (!markerXY.positioned) {
|
|
23393
|
+
tooltipEl.style.left = x + "px";
|
|
23394
|
+
tooltipEl.style.top = y + "px";
|
|
23395
|
+
}
|
|
23087
23396
|
} else {
|
|
23088
23397
|
if (this.tooltipUtil.hasBars()) {
|
|
23089
23398
|
this.intersect.handleBarTooltip({
|
|
@@ -25680,6 +25989,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
25680
25989
|
var _a;
|
|
25681
25990
|
(_a = this.morphTypeChange) == null ? void 0 : _a.applyChromeFade();
|
|
25682
25991
|
applyAxisTransition(this.w);
|
|
25992
|
+
applyDataLabelTransition(this.w);
|
|
25683
25993
|
if (typeof this.w.config.chart.events.updated === "function") {
|
|
25684
25994
|
this.w.config.chart.events.updated(this, this.w);
|
|
25685
25995
|
}
|
|
@@ -34934,6 +35244,30 @@ var __async = (__this, __arguments, generator) => {
|
|
|
34934
35244
|
return NOOP_RUNNER;
|
|
34935
35245
|
}
|
|
34936
35246
|
}
|
|
35247
|
+
const SHARED_RECT_REF = {
|
|
35248
|
+
__isCanvasMark: true,
|
|
35249
|
+
node: SHARED_MARKER_NODE,
|
|
35250
|
+
/** @returns {any} */
|
|
35251
|
+
attr() {
|
|
35252
|
+
return SHARED_RECT_REF;
|
|
35253
|
+
},
|
|
35254
|
+
add() {
|
|
35255
|
+
return SHARED_RECT_REF;
|
|
35256
|
+
},
|
|
35257
|
+
addTo() {
|
|
35258
|
+
return SHARED_RECT_REF;
|
|
35259
|
+
},
|
|
35260
|
+
remove() {
|
|
35261
|
+
return SHARED_RECT_REF;
|
|
35262
|
+
},
|
|
35263
|
+
/** @returns {any} */
|
|
35264
|
+
css() {
|
|
35265
|
+
return SHARED_RECT_REF;
|
|
35266
|
+
},
|
|
35267
|
+
animate() {
|
|
35268
|
+
return NOOP_RUNNER;
|
|
35269
|
+
}
|
|
35270
|
+
};
|
|
34937
35271
|
class CanvasMark {
|
|
34938
35272
|
/** @param {any} cmd */
|
|
34939
35273
|
constructor(cmd) {
|
|
@@ -35061,6 +35395,16 @@ var __async = (__this, __arguments, generator) => {
|
|
|
35061
35395
|
this._msi = new Int32Array(16);
|
|
35062
35396
|
this._mn = 0;
|
|
35063
35397
|
this._mcap = 16;
|
|
35398
|
+
this._crx = new Float64Array(16);
|
|
35399
|
+
this._cry = new Float64Array(16);
|
|
35400
|
+
this._crw = new Float64Array(16);
|
|
35401
|
+
this._crh = new Float64Array(16);
|
|
35402
|
+
this._crstyle = new Int32Array(16);
|
|
35403
|
+
this._crsi = new Int32Array(16);
|
|
35404
|
+
this._crdi = new Int32Array(16);
|
|
35405
|
+
this._crn = 0;
|
|
35406
|
+
this._crcap = 16;
|
|
35407
|
+
this._cellRadius = 0;
|
|
35064
35408
|
this._styles = [];
|
|
35065
35409
|
this._styleMap = /* @__PURE__ */ new Map();
|
|
35066
35410
|
this._lf = NEVER;
|
|
@@ -35073,6 +35417,12 @@ var __async = (__this, __arguments, generator) => {
|
|
|
35073
35417
|
this._lofFill = NEVER;
|
|
35074
35418
|
this._lofBase = -1;
|
|
35075
35419
|
this._lofId = -1;
|
|
35420
|
+
this._rlf = NEVER;
|
|
35421
|
+
this._rls = NEVER;
|
|
35422
|
+
this._rlsw = NEVER;
|
|
35423
|
+
this._rlfo = NEVER;
|
|
35424
|
+
this._rlso = NEVER;
|
|
35425
|
+
this._rlid = -1;
|
|
35076
35426
|
}
|
|
35077
35427
|
_resetStyleCache() {
|
|
35078
35428
|
this._lf = NEVER;
|
|
@@ -35085,6 +35435,12 @@ var __async = (__this, __arguments, generator) => {
|
|
|
35085
35435
|
this._lofFill = NEVER;
|
|
35086
35436
|
this._lofBase = -1;
|
|
35087
35437
|
this._lofId = -1;
|
|
35438
|
+
this._rlf = NEVER;
|
|
35439
|
+
this._rls = NEVER;
|
|
35440
|
+
this._rlsw = NEVER;
|
|
35441
|
+
this._rlfo = NEVER;
|
|
35442
|
+
this._rlso = NEVER;
|
|
35443
|
+
this._rlid = -1;
|
|
35088
35444
|
}
|
|
35089
35445
|
/** Start a fresh scene (columnar marker store + object-command list). */
|
|
35090
35446
|
reset() {
|
|
@@ -35101,6 +35457,46 @@ var __async = (__this, __arguments, generator) => {
|
|
|
35101
35457
|
}
|
|
35102
35458
|
cap = Math.ceil(cap * 1.15) + 16;
|
|
35103
35459
|
if (cap > this._mcap) this._allocMarkers(cap);
|
|
35460
|
+
this._crn = 0;
|
|
35461
|
+
this._cellRadius = 0;
|
|
35462
|
+
if (cap > this._crcap) this._allocRects(cap);
|
|
35463
|
+
}
|
|
35464
|
+
/** @param {number} cap */
|
|
35465
|
+
_allocRects(cap) {
|
|
35466
|
+
this._crcap = cap;
|
|
35467
|
+
this._crx = new Float64Array(cap);
|
|
35468
|
+
this._cry = new Float64Array(cap);
|
|
35469
|
+
this._crw = new Float64Array(cap);
|
|
35470
|
+
this._crh = new Float64Array(cap);
|
|
35471
|
+
this._crstyle = new Int32Array(cap);
|
|
35472
|
+
this._crsi = new Int32Array(cap);
|
|
35473
|
+
this._crdi = new Int32Array(cap);
|
|
35474
|
+
}
|
|
35475
|
+
/** Grow the rect columns (rare: capacity estimate was low). */
|
|
35476
|
+
_growRects() {
|
|
35477
|
+
const cap = this._crcap * 2;
|
|
35478
|
+
const nx = new Float64Array(cap);
|
|
35479
|
+
nx.set(this._crx);
|
|
35480
|
+
this._crx = nx;
|
|
35481
|
+
const ny = new Float64Array(cap);
|
|
35482
|
+
ny.set(this._cry);
|
|
35483
|
+
this._cry = ny;
|
|
35484
|
+
const nw = new Float64Array(cap);
|
|
35485
|
+
nw.set(this._crw);
|
|
35486
|
+
this._crw = nw;
|
|
35487
|
+
const nh = new Float64Array(cap);
|
|
35488
|
+
nh.set(this._crh);
|
|
35489
|
+
this._crh = nh;
|
|
35490
|
+
const nst = new Int32Array(cap);
|
|
35491
|
+
nst.set(this._crstyle);
|
|
35492
|
+
this._crstyle = nst;
|
|
35493
|
+
const nsi = new Int32Array(cap);
|
|
35494
|
+
nsi.set(this._crsi);
|
|
35495
|
+
this._crsi = nsi;
|
|
35496
|
+
const ndi = new Int32Array(cap);
|
|
35497
|
+
ndi.set(this._crdi);
|
|
35498
|
+
this._crdi = ndi;
|
|
35499
|
+
this._crcap = cap;
|
|
35104
35500
|
}
|
|
35105
35501
|
/** @param {number} cap */
|
|
35106
35502
|
_allocMarkers(cap) {
|
|
@@ -35210,6 +35606,65 @@ var __async = (__this, __arguments, generator) => {
|
|
|
35210
35606
|
shapeName(id) {
|
|
35211
35607
|
return SHAPE_NAME[id] || "circle";
|
|
35212
35608
|
}
|
|
35609
|
+
// ── columnar rect cell (heatmap): parallel unboxed arrays, no per-cell object ──
|
|
35610
|
+
/**
|
|
35611
|
+
* Record a heatmap-style cell (a filled, optionally stroked rect). Geometry
|
|
35612
|
+
* and style are captured up front into the columns; the returned handle is a
|
|
35613
|
+
* shared no-op (the emit site sets nothing back on it in canvas mode).
|
|
35614
|
+
* @param {number} x @param {number} y @param {number} w @param {number} h
|
|
35615
|
+
* @param {any} opts {fill, fillOpacity, stroke, strokeWidth, radius, seriesIndex, dataPointIndex}
|
|
35616
|
+
* @returns {any}
|
|
35617
|
+
*/
|
|
35618
|
+
drawRectCell(x, y, w, h, opts = {}) {
|
|
35619
|
+
const styleId = this._rectStyleId(opts);
|
|
35620
|
+
if (this._crn >= this._crcap) this._growRects();
|
|
35621
|
+
const i = this._crn++;
|
|
35622
|
+
this._crx[i] = x || 0;
|
|
35623
|
+
this._cry[i] = y || 0;
|
|
35624
|
+
this._crw[i] = w > 0 ? w : 0;
|
|
35625
|
+
this._crh[i] = h > 0 ? h : 0;
|
|
35626
|
+
this._crstyle[i] = styleId;
|
|
35627
|
+
this._crsi[i] = opts.seriesIndex == null ? -1 : opts.seriesIndex;
|
|
35628
|
+
this._crdi[i] = opts.dataPointIndex == null ? -1 : opts.dataPointIndex;
|
|
35629
|
+
if (opts.radius) this._cellRadius = opts.radius;
|
|
35630
|
+
return SHARED_RECT_REF;
|
|
35631
|
+
}
|
|
35632
|
+
/**
|
|
35633
|
+
* Resolve (and dedupe) a rect-cell style → shared-palette id. A last-style
|
|
35634
|
+
* cache keeps the Map/string work off the path for runs of same-style cells.
|
|
35635
|
+
* @param {any} opts
|
|
35636
|
+
* @returns {number}
|
|
35637
|
+
*/
|
|
35638
|
+
_rectStyleId(opts) {
|
|
35639
|
+
const fill = opts.fill;
|
|
35640
|
+
const stroke = opts.stroke;
|
|
35641
|
+
const sw = opts.strokeWidth;
|
|
35642
|
+
const fo = opts.fillOpacity;
|
|
35643
|
+
const so = opts.strokeOpacity;
|
|
35644
|
+
if (fill === this._rlf && stroke === this._rls && sw === this._rlsw && fo === this._rlfo && so === this._rlso) {
|
|
35645
|
+
return this._rlid;
|
|
35646
|
+
}
|
|
35647
|
+
const id = this._internStyle(fill, stroke, sw, 0, fo, so);
|
|
35648
|
+
this._rlf = fill;
|
|
35649
|
+
this._rls = stroke;
|
|
35650
|
+
this._rlsw = sw;
|
|
35651
|
+
this._rlfo = fo;
|
|
35652
|
+
this._rlso = so;
|
|
35653
|
+
this._rlid = id;
|
|
35654
|
+
return id;
|
|
35655
|
+
}
|
|
35656
|
+
/** @returns {number} number of recorded rect cells */
|
|
35657
|
+
rectCount() {
|
|
35658
|
+
return this._crn;
|
|
35659
|
+
}
|
|
35660
|
+
/** @param {number} i @returns {any} the style object for a rect cell */
|
|
35661
|
+
rectStyle(i) {
|
|
35662
|
+
return this._styles[this._crstyle[i]];
|
|
35663
|
+
}
|
|
35664
|
+
/** @param {number} i @returns {number} series (realIndex) of a cell, -1 if none */
|
|
35665
|
+
rectSeries(i) {
|
|
35666
|
+
return this._crsi[i];
|
|
35667
|
+
}
|
|
35213
35668
|
/**
|
|
35214
35669
|
* @param {string} tag
|
|
35215
35670
|
* @param {number} z
|
|
@@ -35525,9 +35980,97 @@ var __async = (__this, __arguments, generator) => {
|
|
|
35525
35980
|
this._paintOne(ctx, c);
|
|
35526
35981
|
}
|
|
35527
35982
|
}
|
|
35983
|
+
this._paintRects(ctx, shim2);
|
|
35528
35984
|
this._paintMarkers(ctx, shim2);
|
|
35529
35985
|
this._alpha = 1;
|
|
35530
35986
|
}
|
|
35987
|
+
/**
|
|
35988
|
+
* Paint the columnar rect cells (heatmap) as STYLE BATCHES: one fill/stroke
|
|
35989
|
+
* state application per run of consecutive same-style cells, then a fast
|
|
35990
|
+
* fillRect (or a roundRect path when the shared corner radius is non-zero)
|
|
35991
|
+
* per cell. Clipped to the plot rect so cells never bleed into the canvas
|
|
35992
|
+
* margin (mirrors the SVG gridRectMask). Per-cell globalAlpha carries the
|
|
35993
|
+
* hover/legend dim multiplier when a dim spec is active.
|
|
35994
|
+
* @param {any} ctx
|
|
35995
|
+
* @param {any} shim
|
|
35996
|
+
*/
|
|
35997
|
+
_paintRects(ctx, shim2) {
|
|
35998
|
+
const n = shim2.rectCount ? shim2.rectCount() : 0;
|
|
35999
|
+
if (!n) return;
|
|
36000
|
+
const rx = shim2._crx;
|
|
36001
|
+
const ry = shim2._cry;
|
|
36002
|
+
const rw = shim2._crw;
|
|
36003
|
+
const rh = shim2._crh;
|
|
36004
|
+
const rstyle = shim2._crstyle;
|
|
36005
|
+
const radius = shim2._cellRadius || 0;
|
|
36006
|
+
const cx = (
|
|
36007
|
+
/** @type {any} */
|
|
36008
|
+
ctx
|
|
36009
|
+
);
|
|
36010
|
+
const useRound = radius > 0 && typeof cx.roundRect === "function";
|
|
36011
|
+
const dimming = !!this._dim;
|
|
36012
|
+
const gw = Math.max(0, this.w.layout.gridWidth || 0);
|
|
36013
|
+
const gh = Math.max(0, this.w.layout.gridHeight || 0);
|
|
36014
|
+
ctx.save();
|
|
36015
|
+
ctx.beginPath();
|
|
36016
|
+
ctx.rect(0, 0, gw, gh);
|
|
36017
|
+
ctx.clip();
|
|
36018
|
+
let i = 0;
|
|
36019
|
+
while (i < n) {
|
|
36020
|
+
const styleId = rstyle[i];
|
|
36021
|
+
const style = shim2.rectStyle(i);
|
|
36022
|
+
if (!style) {
|
|
36023
|
+
i++;
|
|
36024
|
+
continue;
|
|
36025
|
+
}
|
|
36026
|
+
const fill = style.fill;
|
|
36027
|
+
const doFill = fill && fill !== "none" && !(typeof fill === "string" && fill.indexOf("url(") === 0);
|
|
36028
|
+
const stroke = style.stroke;
|
|
36029
|
+
const sw = style.strokeWidth == null ? 0 : Number(style.strokeWidth);
|
|
36030
|
+
const doStroke = stroke && stroke !== "none" && sw > 0 && !(typeof stroke === "string" && stroke.indexOf("url(") === 0);
|
|
36031
|
+
if (doFill) ctx.fillStyle = fill;
|
|
36032
|
+
if (doStroke) {
|
|
36033
|
+
ctx.strokeStyle = stroke;
|
|
36034
|
+
ctx.lineWidth = sw;
|
|
36035
|
+
ctx.setLineDash([]);
|
|
36036
|
+
}
|
|
36037
|
+
const baseFillA = style.fillOpacity == null ? 1 : Number(style.fillOpacity);
|
|
36038
|
+
const baseStrokeA = style.strokeOpacity == null ? 1 : Number(style.strokeOpacity);
|
|
36039
|
+
let j = i;
|
|
36040
|
+
while (j < n && rstyle[j] === styleId) {
|
|
36041
|
+
const w = rw[j];
|
|
36042
|
+
const h = rh[j];
|
|
36043
|
+
if (w > 0 && h > 0) {
|
|
36044
|
+
const f = dimming ? this._seriesAlpha(shim2.rectSeries(j)) : 1;
|
|
36045
|
+
if (useRound) {
|
|
36046
|
+
ctx.beginPath();
|
|
36047
|
+
cx.roundRect(rx[j], ry[j], w, h, radius);
|
|
36048
|
+
if (doFill) {
|
|
36049
|
+
ctx.globalAlpha = baseFillA * f;
|
|
36050
|
+
ctx.fill();
|
|
36051
|
+
}
|
|
36052
|
+
if (doStroke) {
|
|
36053
|
+
ctx.globalAlpha = baseStrokeA * f;
|
|
36054
|
+
ctx.stroke();
|
|
36055
|
+
}
|
|
36056
|
+
} else {
|
|
36057
|
+
if (doFill) {
|
|
36058
|
+
ctx.globalAlpha = baseFillA * f;
|
|
36059
|
+
ctx.fillRect(rx[j], ry[j], w, h);
|
|
36060
|
+
}
|
|
36061
|
+
if (doStroke) {
|
|
36062
|
+
ctx.globalAlpha = baseStrokeA * f;
|
|
36063
|
+
ctx.strokeRect(rx[j], ry[j], w, h);
|
|
36064
|
+
}
|
|
36065
|
+
}
|
|
36066
|
+
}
|
|
36067
|
+
j++;
|
|
36068
|
+
}
|
|
36069
|
+
i = j;
|
|
36070
|
+
}
|
|
36071
|
+
ctx.globalAlpha = 1;
|
|
36072
|
+
ctx.restore();
|
|
36073
|
+
}
|
|
35531
36074
|
/**
|
|
35532
36075
|
* Reusable unit Path2D for a (shape, size): the shape's geometry built at the
|
|
35533
36076
|
* origin once, then translated per marker via setTransform. Returns null when
|
|
@@ -35878,6 +36421,16 @@ var __async = (__this, __arguments, generator) => {
|
|
|
35878
36421
|
this._g.drawRect(...args)
|
|
35879
36422
|
);
|
|
35880
36423
|
}
|
|
36424
|
+
/**
|
|
36425
|
+
* Columnar heatmap-cell rect (dense same-shape rects): recorded into typed
|
|
36426
|
+
* arrays, painted as style batches. Distinct from drawRect (object command)
|
|
36427
|
+
* so 100k cells don't allocate 100k retained commands.
|
|
36428
|
+
* @param {number} x @param {number} y @param {number} w @param {number} h
|
|
36429
|
+
* @param {any} opts
|
|
36430
|
+
*/
|
|
36431
|
+
drawRectCell(x, y, w, h, opts) {
|
|
36432
|
+
return this._g.drawRectCell(x, y, w, h, opts);
|
|
36433
|
+
}
|
|
35881
36434
|
/**
|
|
35882
36435
|
* @param {number} r
|
|
35883
36436
|
* @param {any} attrs
|
|
@@ -35907,14 +36460,44 @@ var __async = (__this, __arguments, generator) => {
|
|
|
35907
36460
|
return feature === "solidFill" || feature === "dashArray";
|
|
35908
36461
|
}
|
|
35909
36462
|
// ── interaction ──
|
|
35910
|
-
//
|
|
35911
|
-
//
|
|
35912
|
-
//
|
|
35913
|
-
|
|
35914
|
-
|
|
35915
|
-
*
|
|
35916
|
-
|
|
35917
|
-
|
|
36463
|
+
// Line/area/bar/scatter tooltips resolve via coordinate lookup (pointsArray),
|
|
36464
|
+
// so those need no per-mark query. Heatmap cells, however, are hovered by
|
|
36465
|
+
// point (the SVG path hit-tests the <rect> under the cursor); with cells on
|
|
36466
|
+
// canvas there is no node, so hitTest resolves the columnar rect store.
|
|
36467
|
+
/**
|
|
36468
|
+
* Find the cell under a plot-local point (0,0 = plot origin, the same space
|
|
36469
|
+
* as the recorded cell geometry). Reverse scan so a later-painted cell wins
|
|
36470
|
+
* when cells overlap (continuous-x edges). A linear scan stays well under a
|
|
36471
|
+
* frame even at 100k cells (~100k integer compares). Returns the cell's
|
|
36472
|
+
* series/dataPoint index plus its geometry for tooltip positioning, or null
|
|
36473
|
+
* when the point is off every cell.
|
|
36474
|
+
* @param {number} px
|
|
36475
|
+
* @param {number} py
|
|
36476
|
+
* @returns {({seriesIndex:number,dataPointIndex:number,x:number,y:number,width:number,height:number})|null}
|
|
36477
|
+
*/
|
|
36478
|
+
hitTest(px, py) {
|
|
36479
|
+
const g = this._g;
|
|
36480
|
+
const n = g.rectCount ? g.rectCount() : 0;
|
|
36481
|
+
if (!n) return null;
|
|
36482
|
+
const rx = g._crx;
|
|
36483
|
+
const ry = g._cry;
|
|
36484
|
+
const rw = g._crw;
|
|
36485
|
+
const rh = g._crh;
|
|
36486
|
+
for (let k = n - 1; k >= 0; k--) {
|
|
36487
|
+
const w = rw[k];
|
|
36488
|
+
const h = rh[k];
|
|
36489
|
+
if (w <= 0 || h <= 0) continue;
|
|
36490
|
+
if (px >= rx[k] && px < rx[k] + w && py >= ry[k] && py < ry[k] + h) {
|
|
36491
|
+
return {
|
|
36492
|
+
seriesIndex: g._crsi[k],
|
|
36493
|
+
dataPointIndex: g._crdi[k],
|
|
36494
|
+
x: rx[k],
|
|
36495
|
+
y: ry[k],
|
|
36496
|
+
width: w,
|
|
36497
|
+
height: h
|
|
36498
|
+
};
|
|
36499
|
+
}
|
|
36500
|
+
}
|
|
35918
36501
|
return null;
|
|
35919
36502
|
}
|
|
35920
36503
|
/**
|
|
@@ -39775,6 +40358,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
39775
40358
|
barWidth,
|
|
39776
40359
|
dataLabelsConfig
|
|
39777
40360
|
}) {
|
|
40361
|
+
var _a, _b;
|
|
39778
40362
|
const w = this.w;
|
|
39779
40363
|
let rotate = "rotate(0)";
|
|
39780
40364
|
if (w.config.plotOptions.bar.dataLabels.orientation === "vertical")
|
|
@@ -39789,6 +40373,17 @@ var __async = (__this, __arguments, generator) => {
|
|
|
39789
40373
|
class: "apexcharts-data-labels",
|
|
39790
40374
|
transform: rotate
|
|
39791
40375
|
});
|
|
40376
|
+
const dlCfg = w.config.dataLabels;
|
|
40377
|
+
if (((_a = dlCfg.animate) == null ? void 0 : _a.enabled) || ((_b = dlCfg.countUp) == null ? void 0 : _b.enabled)) {
|
|
40378
|
+
elDataLabelsWrap.node.setAttribute(
|
|
40379
|
+
"data:dlKey",
|
|
40380
|
+
`${i}::${datumKey(w, i, j)}`
|
|
40381
|
+
);
|
|
40382
|
+
elDataLabelsWrap.node.setAttribute("data:dlJ", String(j));
|
|
40383
|
+
if (typeof val === "number" && isFinite(val)) {
|
|
40384
|
+
elDataLabelsWrap.node.setAttribute("data:dlVal", String(val));
|
|
40385
|
+
}
|
|
40386
|
+
}
|
|
39792
40387
|
let text = "";
|
|
39793
40388
|
if (typeof val !== "undefined") {
|
|
39794
40389
|
text = formatter(val, __spreadProps(__spreadValues({}, w), {
|
|
@@ -40746,6 +41341,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
40746
41341
|
this.pathArr = [];
|
|
40747
41342
|
this._prevKeyed = null;
|
|
40748
41343
|
this._ltCache = null;
|
|
41344
|
+
this._layoutShiftCache = null;
|
|
40749
41345
|
this.series = [];
|
|
40750
41346
|
this.elSeries = null;
|
|
40751
41347
|
this.visibleI = 0;
|
|
@@ -40774,7 +41370,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
40774
41370
|
* @return {Element} element which is supplied to parent chart draw method for appending
|
|
40775
41371
|
**/
|
|
40776
41372
|
draw(series, seriesIndex) {
|
|
40777
|
-
var _a, _b;
|
|
41373
|
+
var _a, _b, _c;
|
|
40778
41374
|
const w = this.w;
|
|
40779
41375
|
const graphics = new Graphics(this.w);
|
|
40780
41376
|
const coreUtils = new CoreUtils(this.w);
|
|
@@ -40848,8 +41444,10 @@ var __async = (__this, __arguments, generator) => {
|
|
|
40848
41444
|
el: elDataLabelsWrap.node,
|
|
40849
41445
|
// On a layout-changing update the labels must stay hidden through the
|
|
40850
41446
|
// reflow morph (the updateOptions flow otherwise reveals them at
|
|
40851
|
-
// frame 0, where they float over sliding bars).
|
|
40852
|
-
|
|
41447
|
+
// frame 0, where they float over sliding bars). When dataLabels.animate
|
|
41448
|
+
// is on the labels instead RIDE the morph (see DataLabelTransition), so
|
|
41449
|
+
// keep them visible: holding would hide the very motion we want to show.
|
|
41450
|
+
holdUntilComplete: !((_a = w.config.dataLabels.animate) == null ? void 0 : _a.enabled) && this.isLengthTransition(realIndex)
|
|
40853
41451
|
});
|
|
40854
41452
|
elDataLabelsWrap.node.classList.add("apexcharts-element-hidden");
|
|
40855
41453
|
const elGoalsMarkers = graphics.group({
|
|
@@ -40902,9 +41500,9 @@ var __async = (__this, __arguments, generator) => {
|
|
|
40902
41500
|
j,
|
|
40903
41501
|
realIndex
|
|
40904
41502
|
);
|
|
40905
|
-
if (this.isFunnel && !this.isPyramid && this.barOptions.isFunnel3d && ((
|
|
41503
|
+
if (this.isFunnel && !this.isPyramid && this.barOptions.isFunnel3d && ((_b = w.config.plotOptions.funnel) == null ? void 0 : _b.shape) !== "trapezoid" && this.pathArr.length && j > 0) {
|
|
40906
41504
|
const barShadow = this.barHelpers.drawBarShadow({
|
|
40907
|
-
color: typeof pathFill.color === "string" && ((
|
|
41505
|
+
color: typeof pathFill.color === "string" && ((_c = pathFill.color) == null ? void 0 : _c.indexOf("url")) === -1 ? pathFill.color : Utils$1.hexToRgba(w.globals.colors[i]),
|
|
40908
41506
|
prevPaths: this.pathArr[this.pathArr.length - 1],
|
|
40909
41507
|
currPaths: paths,
|
|
40910
41508
|
realIndex,
|
|
@@ -41076,7 +41674,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
41076
41674
|
}
|
|
41077
41675
|
const animCfg = w.config.chart.animations;
|
|
41078
41676
|
const gradCfg = animCfg.animateGradually;
|
|
41079
|
-
const staggerEnabled = gradCfg && gradCfg.enabled !== false && !(w.globals.dataChanged && this.
|
|
41677
|
+
const staggerEnabled = gradCfg && gradCfg.enabled !== false && !(w.globals.dataChanged && this.isLayoutShift(realIndex));
|
|
41080
41678
|
let delay = 0;
|
|
41081
41679
|
if (staggerEnabled) {
|
|
41082
41680
|
const totalBars = w.globals.dataPoints || 1;
|
|
@@ -41490,6 +42088,26 @@ var __async = (__this, __arguments, generator) => {
|
|
|
41490
42088
|
this._ltCache[realIndex] = result;
|
|
41491
42089
|
return result;
|
|
41492
42090
|
}
|
|
42091
|
+
/**
|
|
42092
|
+
* Whether this update moves survivors to new slots: a length change
|
|
42093
|
+
* (enter/exit, via isLengthTransition) OR a pure reorder (a "bar chart race"
|
|
42094
|
+
* swap, same datum set in a new order). Used to drop the per-bar stagger so
|
|
42095
|
+
* all bars slide on one shared clock, staying locked to the axis/data labels.
|
|
42096
|
+
* Broader than isLengthTransition, which is deliberately enter/exit-only
|
|
42097
|
+
* (exit ghosts / baseline enters must not fire on a plain reorder).
|
|
42098
|
+
* @param {number} realIndex
|
|
42099
|
+
*/
|
|
42100
|
+
isLayoutShift(realIndex) {
|
|
42101
|
+
if (this.isLengthTransition(realIndex)) return true;
|
|
42102
|
+
if (!this._layoutShiftCache) this._layoutShiftCache = {};
|
|
42103
|
+
if (this._layoutShiftCache[realIndex] !== void 0) {
|
|
42104
|
+
return this._layoutShiftCache[realIndex];
|
|
42105
|
+
}
|
|
42106
|
+
const sj = seriesJoin(this.w, realIndex, true, true);
|
|
42107
|
+
const result = !!(sj && sj.join.changed);
|
|
42108
|
+
this._layoutShiftCache[realIndex] = result;
|
|
42109
|
+
return result;
|
|
42110
|
+
}
|
|
41493
42111
|
/**
|
|
41494
42112
|
* Resolve `pathFrom` for a bar on data update, joining old and new datums
|
|
41495
42113
|
* by KEY (category label / x value) so survivors keep their identity across
|
|
@@ -43351,14 +43969,24 @@ var __async = (__this, __arguments, generator) => {
|
|
|
43351
43969
|
* @param {any[]} series
|
|
43352
43970
|
*/
|
|
43353
43971
|
draw(series) {
|
|
43972
|
+
var _a, _b;
|
|
43354
43973
|
const w = this.w;
|
|
43355
43974
|
const graphics = new Graphics(this.w, this.ctx);
|
|
43975
|
+
const emit = seriesEmitter(this.ctx, graphics);
|
|
43976
|
+
const useCanvas = emit !== graphics && typeof emit.drawRectCell === "function";
|
|
43356
43977
|
const ret = graphics.group({
|
|
43357
43978
|
class: "apexcharts-heatmap"
|
|
43358
43979
|
});
|
|
43359
43980
|
ret.attr("clip-path", `url(#gridRectMask${w.globals.cuid})`);
|
|
43360
43981
|
const xDivision = w.layout.gridWidth / w.globals.dataPoints;
|
|
43361
43982
|
const yDivision = w.layout.gridHeight / w.seriesData.series.length;
|
|
43983
|
+
const isContinuousX = (w.config.xaxis.type === "numeric" || w.config.xaxis.type === "datetime") && w.axisFlags.isXNumeric && this.xRatio > 0;
|
|
43984
|
+
let binPx = xDivision;
|
|
43985
|
+
if (isContinuousX) {
|
|
43986
|
+
const diff = w.globals.minXDiff;
|
|
43987
|
+
binPx = Number.isFinite(diff) && diff > 0 ? diff / this.xRatio : xDivision;
|
|
43988
|
+
}
|
|
43989
|
+
const cellFillOpacity = Array.isArray(w.config.fill.opacity) ? (_a = w.config.fill.opacity[0]) != null ? _a : 1 : (_b = w.config.fill.opacity) != null ? _b : 1;
|
|
43362
43990
|
let y1 = 0;
|
|
43363
43991
|
let rev = false;
|
|
43364
43992
|
this.negRange = this.helpers.checkColorRange();
|
|
@@ -43375,7 +44003,9 @@ var __async = (__this, __arguments, generator) => {
|
|
|
43375
44003
|
"data:realIndex": i
|
|
43376
44004
|
});
|
|
43377
44005
|
Series.addCollapsedClassToSeries(this.w, elSeries, i);
|
|
43378
|
-
|
|
44006
|
+
if (!useCanvas) {
|
|
44007
|
+
graphics.setupEventDelegation(elSeries, ".apexcharts-heatmap-rect");
|
|
44008
|
+
}
|
|
43379
44009
|
if (w.config.chart.dropShadow.enabled) {
|
|
43380
44010
|
const shadow = w.config.chart.dropShadow;
|
|
43381
44011
|
const filters = new Filters(this.w);
|
|
@@ -43385,13 +44015,22 @@ var __async = (__this, __arguments, generator) => {
|
|
|
43385
44015
|
const shadeIntensity = w.config.plotOptions.heatmap.shadeIntensity;
|
|
43386
44016
|
let j = 0;
|
|
43387
44017
|
for (let dIndex = 0; dIndex < w.globals.dataPoints; dIndex++) {
|
|
43388
|
-
if (w.seriesData.seriesX.length && !w.globals.allSeriesHasEqualX) {
|
|
44018
|
+
if (!isContinuousX && w.seriesData.seriesX.length && !w.globals.allSeriesHasEqualX) {
|
|
43389
44019
|
if (w.globals.minX + w.globals.minXDiff * dIndex < w.seriesData.seriesX[i][j]) {
|
|
43390
44020
|
x1 = x1 + xDivision;
|
|
43391
44021
|
continue;
|
|
43392
44022
|
}
|
|
43393
44023
|
}
|
|
43394
44024
|
if (j >= heatSeries[i].length) break;
|
|
44025
|
+
const cellW = isContinuousX ? binPx : xDivision;
|
|
44026
|
+
if (isContinuousX) {
|
|
44027
|
+
const xVal = w.seriesData.seriesX[i] ? w.seriesData.seriesX[i][j] : null;
|
|
44028
|
+
if (xVal == null || xVal !== xVal) {
|
|
44029
|
+
j++;
|
|
44030
|
+
continue;
|
|
44031
|
+
}
|
|
44032
|
+
x1 = (xVal - w.globals.minX) / this.xRatio - binPx / 2;
|
|
44033
|
+
}
|
|
43395
44034
|
const heatColor = this.helpers.getShadeColor(
|
|
43396
44035
|
w.config.chart.type,
|
|
43397
44036
|
i,
|
|
@@ -43410,47 +44049,60 @@ var __async = (__this, __arguments, generator) => {
|
|
|
43410
44049
|
w.globals.hasNegs ? heatColorProps.percent < 0 ? 1 - (1 + heatColorProps.percent / 100) : shadeIntensity + heatColorProps.percent / 100 : heatColorProps.percent / 100
|
|
43411
44050
|
),
|
|
43412
44051
|
patternID: Utils$1.randomId(),
|
|
43413
|
-
width: w.config.fill.image.width ? w.config.fill.image.width :
|
|
44052
|
+
width: w.config.fill.image.width ? w.config.fill.image.width : cellW,
|
|
43414
44053
|
height: w.config.fill.image.height ? w.config.fill.image.height : yDivision
|
|
43415
44054
|
});
|
|
43416
44055
|
}
|
|
43417
44056
|
const radius = this.rectRadius;
|
|
43418
|
-
const
|
|
43419
|
-
|
|
43420
|
-
|
|
43421
|
-
|
|
43422
|
-
|
|
43423
|
-
|
|
43424
|
-
|
|
43425
|
-
|
|
43426
|
-
|
|
43427
|
-
|
|
43428
|
-
|
|
43429
|
-
|
|
43430
|
-
|
|
43431
|
-
|
|
43432
|
-
|
|
43433
|
-
|
|
43434
|
-
|
|
43435
|
-
|
|
43436
|
-
|
|
43437
|
-
|
|
43438
|
-
|
|
43439
|
-
|
|
43440
|
-
|
|
43441
|
-
|
|
43442
|
-
|
|
43443
|
-
|
|
43444
|
-
|
|
43445
|
-
|
|
43446
|
-
|
|
43447
|
-
|
|
43448
|
-
|
|
43449
|
-
|
|
43450
|
-
|
|
43451
|
-
|
|
43452
|
-
|
|
43453
|
-
|
|
44057
|
+
const stroke = w.config.plotOptions.heatmap.useFillColorAsStroke ? color : w.globals.stroke.colors[0];
|
|
44058
|
+
if (useCanvas) {
|
|
44059
|
+
emit.drawRectCell(x1, y1, cellW, yDivision, {
|
|
44060
|
+
fill: color,
|
|
44061
|
+
fillOpacity: cellFillOpacity,
|
|
44062
|
+
stroke,
|
|
44063
|
+
strokeWidth: this.strokeWidth,
|
|
44064
|
+
radius,
|
|
44065
|
+
seriesIndex: i,
|
|
44066
|
+
dataPointIndex: j
|
|
44067
|
+
});
|
|
44068
|
+
} else {
|
|
44069
|
+
const rect = graphics.drawRect(x1, y1, cellW, yDivision, radius);
|
|
44070
|
+
rect.attr({
|
|
44071
|
+
cx: x1,
|
|
44072
|
+
cy: y1
|
|
44073
|
+
});
|
|
44074
|
+
rect.node.classList.add("apexcharts-heatmap-rect");
|
|
44075
|
+
elSeries.add(rect);
|
|
44076
|
+
rect.attr({
|
|
44077
|
+
fill: color,
|
|
44078
|
+
i,
|
|
44079
|
+
index: i,
|
|
44080
|
+
j,
|
|
44081
|
+
val: series[i][j],
|
|
44082
|
+
"stroke-width": this.strokeWidth,
|
|
44083
|
+
stroke,
|
|
44084
|
+
color
|
|
44085
|
+
});
|
|
44086
|
+
if (w.config.chart.animations.enabled && !w.globals.dataChanged) {
|
|
44087
|
+
let speed = 1;
|
|
44088
|
+
if (!w.globals.resized) {
|
|
44089
|
+
speed = w.config.chart.animations.speed;
|
|
44090
|
+
}
|
|
44091
|
+
this.animateHeatMap(rect, x1, y1, cellW, yDivision, speed, i, j);
|
|
44092
|
+
}
|
|
44093
|
+
if (w.globals.dataChanged) {
|
|
44094
|
+
let speed = 1;
|
|
44095
|
+
if (this.dynamicAnim.enabled && w.globals.shouldAnimate) {
|
|
44096
|
+
speed = this.dynamicAnim.speed;
|
|
44097
|
+
let colorFrom = w.globals.previousPaths[i] && w.globals.previousPaths[i][j] && w.globals.previousPaths[i][j].color;
|
|
44098
|
+
if (!colorFrom) colorFrom = "rgba(255, 255, 255, 0)";
|
|
44099
|
+
this.animateHeatColor(
|
|
44100
|
+
rect,
|
|
44101
|
+
Utils$1.isColorHex(colorFrom) ? colorFrom : Utils$1.rgb2hex(colorFrom),
|
|
44102
|
+
Utils$1.isColorHex(color) ? color : Utils$1.rgb2hex(color),
|
|
44103
|
+
speed
|
|
44104
|
+
);
|
|
44105
|
+
}
|
|
43454
44106
|
}
|
|
43455
44107
|
}
|
|
43456
44108
|
const formatter = w.config.dataLabels.formatter;
|
|
@@ -43462,7 +44114,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
43462
44114
|
});
|
|
43463
44115
|
const dataLabels = this.helpers.calculateDataLabels({
|
|
43464
44116
|
text: formattedText,
|
|
43465
|
-
x: x1 +
|
|
44117
|
+
x: x1 + cellW / 2,
|
|
43466
44118
|
y: y1 + yDivision / 2,
|
|
43467
44119
|
i,
|
|
43468
44120
|
j,
|
|
@@ -43472,7 +44124,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
43472
44124
|
if (dataLabels !== null) {
|
|
43473
44125
|
elSeries.add(dataLabels);
|
|
43474
44126
|
}
|
|
43475
|
-
x1 = x1 + xDivision;
|
|
44127
|
+
if (!isContinuousX) x1 = x1 + xDivision;
|
|
43476
44128
|
j++;
|
|
43477
44129
|
}
|
|
43478
44130
|
y1 = y1 + yDivision;
|