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.
Files changed (106) hide show
  1. package/dist/apexcharts.common.js +2 -2
  2. package/dist/apexcharts.esm.js +769 -117
  3. package/dist/apexcharts.js +769 -117
  4. package/dist/apexcharts.min.js +2 -2
  5. package/dist/apexcharts.ssr.common.js +2 -2
  6. package/dist/apexcharts.ssr.esm.js +769 -117
  7. package/dist/area.common.js +2 -2
  8. package/dist/area.esm.js +3 -3
  9. package/dist/bar.common.js +2 -2
  10. package/dist/bar.esm.js +208 -109
  11. package/dist/boxPlot.common.js +2 -2
  12. package/dist/boxPlot.esm.js +208 -109
  13. package/dist/bubble.common.js +2 -2
  14. package/dist/bubble.esm.js +3 -3
  15. package/dist/candlestick.common.js +2 -2
  16. package/dist/candlestick.esm.js +208 -109
  17. package/dist/column.common.js +2 -2
  18. package/dist/column.esm.js +208 -109
  19. package/dist/core.common.js +2 -2
  20. package/dist/core.esm.js +372 -62
  21. package/dist/donut.common.js +1 -1
  22. package/dist/donut.esm.js +1 -1
  23. package/dist/features/all.common.js +2 -2
  24. package/dist/features/all.esm.js +282 -9
  25. package/dist/features/annotations.common.js +1 -1
  26. package/dist/features/annotations.esm.js +1 -1
  27. package/dist/features/context-menu.common.js +1 -1
  28. package/dist/features/context-menu.esm.js +1 -1
  29. package/dist/features/drilldown.common.js +1 -1
  30. package/dist/features/drilldown.esm.js +1 -1
  31. package/dist/features/exports.common.js +1 -1
  32. package/dist/features/exports.esm.js +1 -1
  33. package/dist/features/facet.common.js +1 -1
  34. package/dist/features/facet.esm.js +1 -1
  35. package/dist/features/history.common.js +1 -1
  36. package/dist/features/history.esm.js +1 -1
  37. package/dist/features/ink.common.js +1 -1
  38. package/dist/features/ink.esm.js +1 -1
  39. package/dist/features/keyboard.common.js +1 -1
  40. package/dist/features/keyboard.esm.js +1 -1
  41. package/dist/features/legend.common.js +1 -1
  42. package/dist/features/legend.esm.js +1 -1
  43. package/dist/features/link.common.js +1 -1
  44. package/dist/features/link.esm.js +1 -1
  45. package/dist/features/marks.common.js +1 -1
  46. package/dist/features/marks.esm.js +1 -1
  47. package/dist/features/measure.common.js +1 -1
  48. package/dist/features/measure.esm.js +1 -1
  49. package/dist/features/morph.common.js +1 -1
  50. package/dist/features/morph.esm.js +1 -1
  51. package/dist/features/perspectives.common.js +1 -1
  52. package/dist/features/perspectives.esm.js +1 -1
  53. package/dist/features/renderer-canvas.common.js +2 -2
  54. package/dist/features/renderer-canvas.esm.js +280 -7
  55. package/dist/features/storyboard.common.js +1 -1
  56. package/dist/features/storyboard.esm.js +1 -1
  57. package/dist/features/toolbar.common.js +1 -1
  58. package/dist/features/toolbar.esm.js +1 -1
  59. package/dist/features/weave.common.js +1 -1
  60. package/dist/features/weave.esm.js +1 -1
  61. package/dist/heatmap.common.js +2 -2
  62. package/dist/heatmap.esm.js +79 -41
  63. package/dist/line.common.js +2 -2
  64. package/dist/line.esm.js +3 -3
  65. package/dist/pie.common.js +1 -1
  66. package/dist/pie.esm.js +1 -1
  67. package/dist/polarArea.common.js +1 -1
  68. package/dist/polarArea.esm.js +1 -1
  69. package/dist/radar.common.js +1 -1
  70. package/dist/radar.esm.js +1 -1
  71. package/dist/radialBar.common.js +1 -1
  72. package/dist/radialBar.esm.js +1 -1
  73. package/dist/rangeArea.common.js +2 -2
  74. package/dist/rangeArea.esm.js +3 -3
  75. package/dist/rangeBar.common.js +2 -2
  76. package/dist/rangeBar.esm.js +208 -109
  77. package/dist/scatter.common.js +2 -2
  78. package/dist/scatter.esm.js +3 -3
  79. package/dist/treemap.common.js +1 -1
  80. package/dist/treemap.esm.js +1 -1
  81. package/dist/violin.common.js +2 -2
  82. package/dist/violin.esm.js +208 -109
  83. package/package.json +1 -1
  84. package/src/apexcharts.js +7 -0
  85. package/src/charts/Bar.js +38 -6
  86. package/src/charts/HeatMap.js +126 -55
  87. package/src/charts/common/bar/DataLabels.js +16 -0
  88. package/src/modules/Data.js +14 -2
  89. package/src/modules/Filters.js +34 -6
  90. package/src/modules/Graphics.js +4 -4
  91. package/src/modules/Series.js +6 -0
  92. package/src/modules/animations/AxisTransition.js +57 -15
  93. package/src/modules/animations/DataLabelTransition.js +235 -0
  94. package/src/modules/animations/LengthTransition.js +15 -2
  95. package/src/modules/axes/YAxis.js +21 -1
  96. package/src/modules/settings/Defaults.js +12 -1
  97. package/src/modules/settings/Options.js +16 -0
  98. package/src/modules/tooltip/Intersect.js +145 -32
  99. package/src/modules/tooltip/Labels.js +9 -0
  100. package/src/modules/tooltip/Tooltip.js +28 -7
  101. package/src/renderers/Renderer.js +8 -2
  102. package/src/renderers/canvas/CanvasCompositor.js +100 -1
  103. package/src/renderers/canvas/CanvasGraphics.js +184 -0
  104. package/src/renderers/canvas/CanvasRenderer.js +46 -6
  105. package/src/types/internal.d.ts +8 -0
  106. package/types/apexcharts.d.ts +30 -0
@@ -54,7 +54,7 @@ var __async = (__this, __arguments, generator) => {
54
54
  });
55
55
  };
56
56
  /*!
57
- * ApexCharts v6.3.0
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
- followCursor: true,
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 brightnessFactor = filterType === "lighten" ? 2 : 0.3;
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
- ${brightnessFactor} 0 0 0 0
8238
- 0 ${brightnessFactor} 0 0 0
8239
- 0 0 ${brightnessFactor} 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 val = lbFormatter(labels[i], i, w);
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
- if (!old || !isFinite(old.pos) || old.transform || label.getAttribute("transform")) {
15200
+ const labelTransform = label.getAttribute("transform");
15201
+ if (!old || !isFinite(old.pos)) {
15149
15202
  if (!old) {
15150
- if (project && isFinite(to) && !label.getAttribute("transform")) {
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
- tweenPos(w, label, [posAttr], old.pos, to, duration, ease);
15164
- if (line) {
15165
- const lineTo = parseFloat(line.getAttribute(lineAttrs[0]) || "");
15166
- const lineFrom = oldLines[old.i];
15167
- if (isFinite(lineTo) && isFinite(lineFrom)) {
15168
- tweenPos(w, line, lineAttrs, lineFrom, lineTo, duration, ease);
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
- if (e.target.classList.contains(`apexcharts-${type}-rect`)) {
21993
- const i = this.getAttr(e, "i");
21994
- const j = this.getAttr(e, "j");
21995
- const cx = this.getAttr(e, "cx");
21996
- const cy = this.getAttr(e, "cy");
21997
- const width = this.getAttr(e, "width");
21998
- const height = this.getAttr(e, "height");
21999
- ttCtx.tooltipLabels.drawSeriesTexts({
22000
- ttItems: opt.ttItems,
22001
- i,
22002
- j,
22003
- shared: false,
22004
- e
22005
- });
22006
- w.interact.capturedSeriesIndex = i;
22007
- w.interact.capturedDataPointIndex = j;
22008
- x = cx + ttCtx.tooltipRect.ttWidth / 2 + width;
22009
- y = cy + ttCtx.tooltipRect.ttHeight / 2 - height / 2;
22010
- ttCtx.tooltipPosition.moveXCrosshairs(cx + width / 2);
22011
- if (x > w.layout.gridWidth / 2) {
22012
- x = cx - ttCtx.tooltipRect.ttWidth / 2 + width;
22013
- }
22014
- if (ttCtx.w.config.tooltip.followCursor) {
22015
- const seriesBound = w.dom.elWrap.getBoundingClientRect();
22016
- x = ((_a = w.interact.clientX) != null ? _a : 0) - seriesBound.left - (x > w.layout.gridWidth / 2 ? ttCtx.tooltipRect.ttWidth : 0);
22017
- y = ((_b = w.interact.clientY) != null ? _b : 0) - seriesBound.top - (y > w.layout.gridHeight / 2 ? ttCtx.tooltipRect.ttHeight : 0);
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
- tooltipEl.style.left = x + "px";
23086
- tooltipEl.style.top = y + "px";
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
- // Shared tooltip/zoom/click resolve via coordinate lookup (pointsArray), so
35911
- // there is no per-mark hit surface to query; hitTest stays a no-op unless a
35912
- // future per-point feature needs it.
35913
- /**
35914
- * @param {number} _px
35915
- * @param {number} _py
35916
- */
35917
- hitTest(_px, _py) {
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
- holdUntilComplete: this.isLengthTransition(realIndex)
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 && ((_a = w.config.plotOptions.funnel) == null ? void 0 : _a.shape) !== "trapezoid" && this.pathArr.length && j > 0) {
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" && ((_b = pathFill.color) == null ? void 0 : _b.indexOf("url")) === -1 ? pathFill.color : Utils$1.hexToRgba(w.globals.colors[i]),
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.isLengthTransition(realIndex));
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
- graphics.setupEventDelegation(elSeries, ".apexcharts-heatmap-rect");
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 : xDivision,
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 rect = graphics.drawRect(x1, y1, xDivision, yDivision, radius);
43419
- rect.attr({
43420
- cx: x1,
43421
- cy: y1
43422
- });
43423
- rect.node.classList.add("apexcharts-heatmap-rect");
43424
- elSeries.add(rect);
43425
- rect.attr({
43426
- fill: color,
43427
- i,
43428
- index: i,
43429
- j,
43430
- val: series[i][j],
43431
- "stroke-width": this.strokeWidth,
43432
- stroke: w.config.plotOptions.heatmap.useFillColorAsStroke ? color : w.globals.stroke.colors[0],
43433
- color
43434
- });
43435
- if (w.config.chart.animations.enabled && !w.globals.dataChanged) {
43436
- let speed = 1;
43437
- if (!w.globals.resized) {
43438
- speed = w.config.chart.animations.speed;
43439
- }
43440
- this.animateHeatMap(rect, x1, y1, xDivision, yDivision, speed, i, j);
43441
- }
43442
- if (w.globals.dataChanged) {
43443
- let speed = 1;
43444
- if (this.dynamicAnim.enabled && w.globals.shouldAnimate) {
43445
- speed = this.dynamicAnim.speed;
43446
- let colorFrom = w.globals.previousPaths[i] && w.globals.previousPaths[i][j] && w.globals.previousPaths[i][j].color;
43447
- if (!colorFrom) colorFrom = "rgba(255, 255, 255, 0)";
43448
- this.animateHeatColor(
43449
- rect,
43450
- Utils$1.isColorHex(colorFrom) ? colorFrom : Utils$1.rgb2hex(colorFrom),
43451
- Utils$1.isColorHex(color) ? color : Utils$1.rgb2hex(color),
43452
- speed
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 + xDivision / 2,
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;