apexcharts 8.2.0 → 8.3.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 (222) hide show
  1. package/README.md +7 -7
  2. package/dist/apexcharts.common.js +2 -2
  3. package/dist/apexcharts.core.js +271 -173
  4. package/dist/apexcharts.core.min.js +2 -2
  5. package/dist/apexcharts.css +35 -0
  6. package/dist/apexcharts.esm.js +1722 -1527
  7. package/dist/apexcharts.full.js +1459 -1075
  8. package/dist/apexcharts.full.min.js +2 -2
  9. package/dist/apexcharts.js +994 -715
  10. package/dist/apexcharts.min.js +2 -2
  11. package/dist/apexcharts.ssr.common.js +2 -2
  12. package/dist/apexcharts.ssr.esm.js +994 -715
  13. package/dist/area.common.js +2 -2
  14. package/dist/area.esm.js +91 -40
  15. package/dist/bar.common.js +2 -2
  16. package/dist/bar.esm.js +433 -394
  17. package/dist/bar.js +2 -2
  18. package/dist/boxPlot.common.js +2 -2
  19. package/dist/boxPlot.esm.js +364 -322
  20. package/dist/bubble.common.js +2 -2
  21. package/dist/bubble.esm.js +91 -40
  22. package/dist/candlestick.common.js +2 -2
  23. package/dist/candlestick.esm.js +364 -322
  24. package/dist/candlestick.js +2 -2
  25. package/dist/column.common.js +2 -2
  26. package/dist/column.esm.js +433 -394
  27. package/dist/core.common.js +2 -2
  28. package/dist/core.esm.js +271 -173
  29. package/dist/donut.common.js +1 -1
  30. package/dist/donut.esm.js +1 -1
  31. package/dist/dumbbell.common.js +2 -2
  32. package/dist/dumbbell.esm.js +433 -394
  33. package/dist/features/all.common.js +2 -2
  34. package/dist/features/all.esm.js +250 -187
  35. package/dist/features/annotations.common.js +1 -1
  36. package/dist/features/annotations.esm.js +1 -1
  37. package/dist/features/annotations.js +1 -1
  38. package/dist/features/context-menu.common.js +1 -1
  39. package/dist/features/context-menu.esm.js +1 -1
  40. package/dist/features/context-menu.js +1 -1
  41. package/dist/features/drilldown.common.js +2 -2
  42. package/dist/features/drilldown.esm.js +4 -2
  43. package/dist/features/drilldown.js +2 -2
  44. package/dist/features/dumbbell.common.js +1 -1
  45. package/dist/features/dumbbell.esm.js +1 -1
  46. package/dist/features/dumbbell.js +1 -1
  47. package/dist/features/exports.common.js +1 -1
  48. package/dist/features/exports.esm.js +1 -1
  49. package/dist/features/exports.js +1 -1
  50. package/dist/features/facet.common.js +1 -1
  51. package/dist/features/facet.esm.js +1 -1
  52. package/dist/features/facet.js +1 -1
  53. package/dist/features/highlight-filter.common.js +2 -2
  54. package/dist/features/highlight-filter.esm.js +14 -9
  55. package/dist/features/highlight-filter.js +2 -2
  56. package/dist/features/history.common.js +1 -1
  57. package/dist/features/history.esm.js +1 -1
  58. package/dist/features/history.js +1 -1
  59. package/dist/features/ink.common.js +1 -1
  60. package/dist/features/ink.esm.js +1 -1
  61. package/dist/features/ink.js +1 -1
  62. package/dist/features/keyboard.common.js +2 -2
  63. package/dist/features/keyboard.esm.js +97 -145
  64. package/dist/features/keyboard.js +2 -2
  65. package/dist/features/legend.common.js +2 -2
  66. package/dist/features/legend.esm.js +63 -43
  67. package/dist/features/legend.js +2 -2
  68. package/dist/features/link.common.js +1 -1
  69. package/dist/features/link.esm.js +1 -1
  70. package/dist/features/link.js +1 -1
  71. package/dist/features/marks.common.js +1 -1
  72. package/dist/features/marks.esm.js +1 -1
  73. package/dist/features/marks.js +1 -1
  74. package/dist/features/measure.common.js +1 -1
  75. package/dist/features/measure.esm.js +1 -1
  76. package/dist/features/measure.js +1 -1
  77. package/dist/features/morph.common.js +1 -1
  78. package/dist/features/morph.esm.js +1 -1
  79. package/dist/features/morph.js +1 -1
  80. package/dist/features/perspectives.common.js +1 -1
  81. package/dist/features/perspectives.esm.js +1 -1
  82. package/dist/features/perspectives.js +1 -1
  83. package/dist/features/raincloud.common.js +1 -1
  84. package/dist/features/raincloud.esm.js +1 -1
  85. package/dist/features/raincloud.js +1 -1
  86. package/dist/features/renderer-canvas.common.js +2 -2
  87. package/dist/features/renderer-canvas.esm.js +2 -1
  88. package/dist/features/renderer-canvas.js +2 -2
  89. package/dist/features/stats.common.js +1 -1
  90. package/dist/features/stats.esm.js +1 -1
  91. package/dist/features/stats.js +1 -1
  92. package/dist/features/storyboard.common.js +1 -1
  93. package/dist/features/storyboard.esm.js +1 -1
  94. package/dist/features/storyboard.js +1 -1
  95. package/dist/features/streamgraph.common.js +2 -2
  96. package/dist/features/streamgraph.esm.js +3 -2
  97. package/dist/features/streamgraph.js +2 -2
  98. package/dist/features/toolbar.common.js +2 -2
  99. package/dist/features/toolbar.esm.js +92 -2
  100. package/dist/features/toolbar.js +2 -2
  101. package/dist/features/trellis.common.js +2 -2
  102. package/dist/features/trellis.esm.js +83 -47
  103. package/dist/features/trellis.js +2 -2
  104. package/dist/features/waterfall.common.js +1 -1
  105. package/dist/features/waterfall.esm.js +1 -1
  106. package/dist/features/waterfall.js +1 -1
  107. package/dist/features/weave.common.js +1 -1
  108. package/dist/features/weave.esm.js +1 -1
  109. package/dist/features/weave.js +1 -1
  110. package/dist/full.common.js +2 -2
  111. package/dist/full.esm.js +950 -795
  112. package/dist/heatmap.common.js +2 -2
  113. package/dist/heatmap.esm.js +3 -17
  114. package/dist/heatmap.js +2 -2
  115. package/dist/histogram.common.js +2 -2
  116. package/dist/histogram.esm.js +433 -394
  117. package/dist/icicle.common.js +2 -2
  118. package/dist/icicle.esm.js +54 -38
  119. package/dist/icicle.js +2 -2
  120. package/dist/line.common.js +2 -2
  121. package/dist/line.esm.js +91 -40
  122. package/dist/line.js +2 -2
  123. package/dist/locales/en.json +2 -1
  124. package/dist/locales/ro.json +3 -2
  125. package/dist/pictograms.common.js +1 -1
  126. package/dist/pictograms.esm.js +1 -1
  127. package/dist/pictograms.js +1 -1
  128. package/dist/pie.common.js +1 -1
  129. package/dist/pie.esm.js +1 -1
  130. package/dist/pie.js +1 -1
  131. package/dist/polarArea.common.js +1 -1
  132. package/dist/polarArea.esm.js +1 -1
  133. package/dist/radar.common.js +2 -2
  134. package/dist/radar.esm.js +5 -4
  135. package/dist/radar.js +2 -2
  136. package/dist/radialBar.common.js +1 -1
  137. package/dist/radialBar.esm.js +1 -1
  138. package/dist/radialBar.js +1 -1
  139. package/dist/raincloud.common.js +2 -2
  140. package/dist/raincloud.esm.js +72 -26
  141. package/dist/rangeArea.common.js +2 -2
  142. package/dist/rangeArea.esm.js +91 -40
  143. package/dist/rangeBar.common.js +2 -2
  144. package/dist/rangeBar.esm.js +433 -394
  145. package/dist/scatter.common.js +2 -2
  146. package/dist/scatter.esm.js +91 -40
  147. package/dist/streamgraph.common.js +2 -2
  148. package/dist/streamgraph.esm.js +93 -41
  149. package/dist/sunburst.common.js +2 -2
  150. package/dist/sunburst.esm.js +103 -93
  151. package/dist/sunburst.js +2 -2
  152. package/dist/treemap.common.js +2 -2
  153. package/dist/treemap.esm.js +105 -86
  154. package/dist/treemap.js +2 -2
  155. package/dist/unit-shapes.common.js +1 -1
  156. package/dist/unit-shapes.esm.js +1 -1
  157. package/dist/unit-shapes.js +1 -1
  158. package/dist/unit.common.js +2 -2
  159. package/dist/unit.esm.js +280 -202
  160. package/dist/unit.js +2 -2
  161. package/dist/violin.common.js +2 -2
  162. package/dist/violin.esm.js +72 -26
  163. package/dist/violin.js +2 -2
  164. package/dist/waterfall.common.js +2 -2
  165. package/dist/waterfall.esm.js +432 -393
  166. package/package.json +1 -1
  167. package/src/apexcharts.js +13 -6
  168. package/src/assets/apexcharts.css +35 -0
  169. package/src/charts/Bar.js +62 -55
  170. package/src/charts/BarStacked.js +80 -88
  171. package/src/charts/BoxCandleStick.js +28 -31
  172. package/src/charts/Icicle.js +37 -37
  173. package/src/charts/Line.js +118 -42
  174. package/src/charts/Radar.js +5 -7
  175. package/src/charts/RangeBar.js +47 -43
  176. package/src/charts/Sunburst.js +101 -98
  177. package/src/charts/Treemap.js +108 -66
  178. package/src/charts/Unit.js +368 -250
  179. package/src/charts/Violin.js +48 -30
  180. package/src/charts/common/Breadcrumb.js +2 -2
  181. package/src/charts/common/Hierarchy.js +32 -11
  182. package/src/charts/common/Jitter.js +32 -7
  183. package/src/charts/common/bar/DataLabels.js +76 -81
  184. package/src/charts/common/bar/Helpers.js +43 -7
  185. package/src/charts/common/line/Helpers.js +12 -15
  186. package/src/charts/common/partition/NodeTooltip.js +8 -1
  187. package/src/charts/common/partition/Partition.js +33 -1
  188. package/src/charts/common/treemap/Helpers.js +3 -11
  189. package/src/locales/en.json +2 -1
  190. package/src/locales/ro.json +3 -2
  191. package/src/modules/Core.js +4 -0
  192. package/src/modules/CoreUtils.js +18 -42
  193. package/src/modules/Data.js +23 -24
  194. package/src/modules/DataLabels.js +6 -6
  195. package/src/modules/Graphics.js +62 -49
  196. package/src/modules/Markers.js +3 -1
  197. package/src/modules/Range.js +44 -29
  198. package/src/modules/RendererController.js +17 -3
  199. package/src/modules/Scales.js +32 -9
  200. package/src/modules/Series.js +39 -18
  201. package/src/modules/Theme.js +1 -1
  202. package/src/modules/ZoomPanSelection.js +119 -2
  203. package/src/modules/accessibility/KeyboardNavigation.js +114 -186
  204. package/src/modules/animations/LengthTransition.js +22 -2
  205. package/src/modules/drilldown/Breadcrumb.js +5 -2
  206. package/src/modules/helpers/Destroy.js +1 -1
  207. package/src/modules/highlightFilter/HighlightFilter.js +8 -9
  208. package/src/modules/highlightFilter/TreemapPart.js +2 -2
  209. package/src/modules/legend/HeatmapGradientLegend.js +76 -45
  210. package/src/modules/legend/Helpers.js +2 -0
  211. package/src/modules/legend/Legend.js +11 -12
  212. package/src/modules/settings/Options.js +7 -0
  213. package/src/modules/streamgraph/StreamLabels.js +1 -0
  214. package/src/modules/tooltip/Tooltip.js +20 -4
  215. package/src/modules/tooltip/Utils.js +8 -0
  216. package/src/modules/trellis/Trellis.js +6 -0
  217. package/src/modules/trellis/TrellisChrome.js +18 -7
  218. package/src/modules/trellis/TrellisSync.js +2 -0
  219. package/src/renderers/canvas/CanvasGraphics.js +1 -0
  220. package/src/ssr/DOMShim.js +10 -0
  221. package/src/types/internal.d.ts +9 -3
  222. package/types/apexcharts.d.ts +31 -12
@@ -7,6 +7,7 @@ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
7
7
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
8
  var __hasOwnProp = Object.prototype.hasOwnProperty;
9
9
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
10
+ var __pow = Math.pow;
10
11
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11
12
  var __spreadValues = (a, b) => {
12
13
  for (var prop in b || (b = {}))
@@ -54,7 +55,7 @@ var __async = (__this, __arguments, generator) => {
54
55
  });
55
56
  };
56
57
  /*!
57
- * ApexCharts v8.2.0
58
+ * ApexCharts v8.3.0
58
59
  * (c) 2018-2026 ApexCharts
59
60
  */
60
61
 
@@ -128,6 +129,15 @@ var __async = (__this, __arguments, generator) => {
128
129
  setAttribute(name2, value) {
129
130
  this.attributes.set(name2, value);
130
131
  }
132
+ /**
133
+ * Namespaced attributes serialize by their qualified name.
134
+ * @param {any} _ns
135
+ * @param {string} name
136
+ * @param {any} value
137
+ */
138
+ setAttributeNS(_ns, name2, value) {
139
+ this.setAttribute(name2, value);
140
+ }
131
141
  /**
132
142
  * @param {string} name
133
143
  */
@@ -1925,7 +1935,7 @@ var __async = (__this, __arguments, generator) => {
1925
1935
  }
1926
1936
  }
1927
1937
  const name = "en";
1928
- const options = { "months": ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], "shortMonths": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], "days": ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], "shortDays": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], "toolbar": { "exportToSVG": "Download SVG", "exportToPNG": "Download PNG", "exportToCSV": "Download CSV", "menu": "Menu", "selection": "Selection", "selectionZoom": "Selection Zoom", "zoomIn": "Zoom In", "zoomOut": "Zoom Out", "pan": "Panning", "reset": "Reset Zoom", "measure": "Measure" } };
1938
+ const options = { "months": ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], "shortMonths": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], "days": ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], "shortDays": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], "toolbar": { "exportToSVG": "Download SVG", "exportToPNG": "Download PNG", "exportToCSV": "Download CSV", "menu": "Menu", "selection": "Selection", "selectionZoom": "Selection Zoom", "zoomIn": "Zoom In", "zoomOut": "Zoom Out", "pan": "Panning", "reset": "Reset Zoom", "measure": "Measure", "wheelZoomHint": "Use {key} + scroll to zoom" } };
1929
1939
  const en = {
1930
1940
  name,
1931
1941
  options
@@ -2735,7 +2745,14 @@ var __async = (__this, __arguments, generator) => {
2735
2745
  // asked for and nobody can undo is a trap. Set either to true to
2736
2746
  // force the gesture on regardless (for a page that supplies its own
2737
2747
  // reset control), or false to turn it off outright.
2748
+ //
2749
+ // The 'auto' wheel is also cooperative: a bare wheel scrolls the
2750
+ // page, and Ctrl/Cmd + wheel (or a trackpad pinch) zooms, so a page
2751
+ // of charts scrolls past them. `true` zooms on every wheel.
2738
2752
  allowMouseWheelZoom: "auto",
2753
+ // With the cooperative wheel, a bare scroll over the chart briefly
2754
+ // shows how to zoom it ("Use Ctrl + scroll to zoom").
2755
+ wheelHint: true,
2739
2756
  // Momentum: two-finger pinch-zoom on touch devices. Zooms the x-axis
2740
2757
  // around the pinch centroid (matching the x-only wheel/toolbar zoom),
2741
2758
  // frame-by-frame rather than the 400ms wheel throttle.
@@ -9073,21 +9090,6 @@ var __async = (__this, __arguments, generator) => {
9073
9090
  });
9074
9091
  gl.seriesYAxisMap = axisSeriesMap.map((x2) => x2);
9075
9092
  gl.seriesYAxisReverseMap = seriesYAxisReverseMap.map((x2) => x2);
9076
- gl.seriesYAxisMap.forEach((axisSeries, ai) => {
9077
- axisSeries.forEach((si) => {
9078
- if (
9079
- /** @type {any} */
9080
- cnf.series[si] && /** @type {any} */
9081
- cnf.series[si].group === void 0
9082
- ) {
9083
- const _series = (
9084
- /** @type {any} */
9085
- cnf.series[si]
9086
- );
9087
- _series.group = "apexcharts-axis-".concat(ai.toString());
9088
- }
9089
- });
9090
- });
9091
9093
  }
9092
9094
  /**
9093
9095
  * @param {number | null} [index]
@@ -9221,12 +9223,15 @@ var __async = (__this, __arguments, generator) => {
9221
9223
  (s2, i2) => isBarSeries(s2) ? -1 : i2
9222
9224
  ).filter((i2) => i2 !== -1) : [];
9223
9225
  const stackedTotals = excluded.length ? this.getStackedSeriesTotals(excluded) : w.seriesData.stackedSeriesTotals;
9224
- const sx = w.axisFlags.isXNumeric && !w.config.plotOptions.bar.horizontal && w.seriesData.seriesX;
9226
+ const sx = w.axisFlags.isXNumeric && w.seriesData.seriesX;
9227
+ const gi = w.labelData.seriesGroupIndex;
9228
+ const byKey = sx || w.labelData.seriesGroups.length > 1;
9229
+ const key = (i2, j2) => gi[i2] + " " + (sx ? sx[i2][j2] : j2);
9225
9230
  const byX = /* @__PURE__ */ new Map();
9226
- if (sx) {
9231
+ if (byKey) {
9227
9232
  w.seriesData.series.forEach((s2, i2) => {
9228
9233
  if (excluded.indexOf(i2) < 0) {
9229
- s2.forEach((v, j2) => byX.set(sx[i2][j2], (byX.get(sx[i2][j2]) || 0) + v));
9234
+ s2.forEach((v, j2) => byX.set(key(i2, j2), (byX.get(key(i2, j2)) || 0) + v));
9230
9235
  }
9231
9236
  });
9232
9237
  }
@@ -9234,7 +9239,7 @@ var __async = (__this, __arguments, generator) => {
9234
9239
  const seriesPercent = [];
9235
9240
  if (Array.isArray(ser)) {
9236
9241
  for (let j2 = 0; j2 < ser.length; j2++) {
9237
- const total = sx ? byX.get(sx[i2][j2]) : stackedTotals[j2];
9242
+ const total = byKey ? byX.get(key(i2, j2)) : stackedTotals[j2];
9238
9243
  let percent = 0;
9239
9244
  if (total) {
9240
9245
  percent = 100 * ser[j2] / total;
@@ -9281,13 +9286,11 @@ var __async = (__this, __arguments, generator) => {
9281
9286
  if (!zRatio) {
9282
9287
  zRatio = 1;
9283
9288
  }
9284
- if (gl.minY !== Number.MIN_VALUE && Math.abs(gl.minY) !== 0) {
9285
- const _hasNegsGl = (
9286
- /** @type {any} */
9287
- gl
9288
- );
9289
- _hasNegsGl.hasNegs = true;
9290
- }
9289
+ const _hasNegsGl = (
9290
+ /** @type {any} */
9291
+ gl
9292
+ );
9293
+ _hasNegsGl.hasNegs = gl.minY !== Number.MIN_VALUE && Math.abs(gl.minY) !== 0;
9291
9294
  if (w.globals.seriesYAxisReverseMap.length > 0) {
9292
9295
  const scaleBaseLineYScale = (y, i2) => {
9293
9296
  const yAxis = w.config.yaxis[w.globals.seriesYAxisReverseMap[i2]];
@@ -9444,7 +9447,7 @@ var __async = (__this, __arguments, generator) => {
9444
9447
  // other series of the same type on the same axis.
9445
9448
  /**
9446
9449
  * @param {Record<string, any>} typeSeries
9447
- * @param {string[]} typeGroups
9450
+ * @param {number[]} typeGroups
9448
9451
  * @param {string} type
9449
9452
  * @param {string} chartClass
9450
9453
  */
@@ -9456,10 +9459,7 @@ var __async = (__this, __arguments, generator) => {
9456
9459
  const gs = [];
9457
9460
  const gi = [];
9458
9461
  typeSeries.i.forEach((i2, ii) => {
9459
- if (
9460
- /** @type {Record<string,any>} */
9461
- w.config.series[i2].group === gn
9462
- ) {
9462
+ if (w.labelData.seriesGroupIndex[i2] === gn) {
9463
9463
  gs.push(typeSeries.series[ii]);
9464
9464
  gi.push(i2);
9465
9465
  }
@@ -11572,6 +11572,22 @@ var __async = (__this, __arguments, generator) => {
11572
11572
  ].join(" ");
11573
11573
  return arc;
11574
11574
  }
11575
+ /**
11576
+ * stroke.dashArray of a series, shared with the canvas renderer. A plugin
11577
+ * may have claimed it: resolved here rather than written into the config,
11578
+ * so the caller's own dashing is untouched and there is nothing to restore
11579
+ * when the claim goes. See weave/Claims.
11580
+ * @param {number} realIndex
11581
+ */
11582
+ seriesDash(realIndex) {
11583
+ const d = this.w.config.stroke.dashArray;
11584
+ return resolveClaimed(
11585
+ this.w,
11586
+ "stroke.dashArray",
11587
+ realIndex,
11588
+ Array.isArray(d) ? d[realIndex] : d
11589
+ );
11590
+ }
11575
11591
  /**
11576
11592
  * @memberof Graphics
11577
11593
  * @param {Record<string, any>} opts
@@ -11644,19 +11660,6 @@ var __async = (__this, __arguments, generator) => {
11644
11660
  w.globals.animationEnded = true;
11645
11661
  }
11646
11662
  }
11647
- const strokeDashArrayOpt = w.config.stroke.dashArray;
11648
- let strokeDashArray = 0;
11649
- if (Array.isArray(strokeDashArrayOpt)) {
11650
- strokeDashArray = strokeDashArrayOpt[realIndex];
11651
- } else {
11652
- strokeDashArray = w.config.stroke.dashArray;
11653
- }
11654
- strokeDashArray = resolveClaimed(
11655
- w,
11656
- "stroke.dashArray",
11657
- realIndex,
11658
- strokeDashArray
11659
- );
11660
11663
  const el = this.drawPath({
11661
11664
  d,
11662
11665
  stroke,
@@ -11665,7 +11668,7 @@ var __async = (__this, __arguments, generator) => {
11665
11668
  fillOpacity: 1,
11666
11669
  classes: className,
11667
11670
  strokeLinecap,
11668
- strokeDashArray
11671
+ strokeDashArray: this.seriesDash(realIndex)
11669
11672
  });
11670
11673
  el.attr("index", realIndex);
11671
11674
  if (shouldClipToGrid) {
@@ -11858,13 +11861,19 @@ var __async = (__this, __arguments, generator) => {
11858
11861
  }
11859
11862
  return g;
11860
11863
  }
11861
- /** @param {{ text: any, maxWidth: any, fontSize: any, fontFamily?: any }} opts */
11862
- getTextBasedOnMaxWidth({ text, maxWidth, fontSize, fontFamily }) {
11863
- const tRects = this.getTextRects(text, fontSize, fontFamily, "");
11864
- const wordWidth = tRects.width / text.length;
11865
- const wordsBasedOnWidth = Math.floor(maxWidth / wordWidth);
11864
+ /** @param {{ text: any, maxWidth: any, fontSize: any, fontFamily?: any, fontWeight?: any }} opts */
11865
+ getTextBasedOnMaxWidth({ text, maxWidth, fontSize, fontFamily, fontWeight }) {
11866
+ const tRects = this.getTextRects(
11867
+ text,
11868
+ fontSize,
11869
+ fontFamily,
11870
+ "",
11871
+ true,
11872
+ fontWeight
11873
+ );
11874
+ const n2 = Math.floor(maxWidth / (tRects.width / text.length)) - 3;
11866
11875
  if (maxWidth < tRects.width) {
11867
- return text.slice(0, wordsBasedOnWidth - 3) + "...";
11876
+ return n2 < 0 ? "" : text.slice(0, n2) + "...";
11868
11877
  }
11869
11878
  return text;
11870
11879
  }
@@ -11901,7 +11910,8 @@ var __async = (__this, __arguments, generator) => {
11901
11910
  const commonProps = {
11902
11911
  maxWidth,
11903
11912
  fontSize,
11904
- fontFamily
11913
+ fontFamily,
11914
+ fontWeight
11905
11915
  };
11906
11916
  let elText;
11907
11917
  if (Array.isArray(text)) {
@@ -12102,7 +12112,12 @@ var __async = (__this, __arguments, generator) => {
12102
12112
  if (w.config.states.hover.filter.type !== "none") {
12103
12113
  if (!w.interact.isTouchDevice) {
12104
12114
  const hoverFilter = w.config.states.hover.filter;
12105
- filters.applyFilter(path, i2, hoverFilter.type, hoverFilter.value);
12115
+ filters.applyFilter(
12116
+ path,
12117
+ Filters.isSliceChart(w) ? j2 : i2,
12118
+ hoverFilter.type,
12119
+ hoverFilter.value
12120
+ );
12106
12121
  }
12107
12122
  }
12108
12123
  }
@@ -12136,33 +12151,28 @@ var __async = (__this, __arguments, generator) => {
12136
12151
  }
12137
12152
  if (Filters.hoverOutlineOwnsHoverState(w)) return;
12138
12153
  if (w.config.states.hover.filter.type !== "none") {
12139
- filters.getDefaultFilter(path, i2);
12154
+ filters.getDefaultFilter(path, Filters.isSliceChart(w) ? j2 : i2);
12140
12155
  }
12141
12156
  }
12142
12157
  /**
12143
12158
  * Clear every selected data point (single-select mode): reset the selection
12144
- * array and restore the default filter on all series path/circle/rect nodes.
12145
- * NOTE: preserves the original behavior of passing the clicked series index
12146
- * `i` to getDefaultFilter for every element (not each element's own index).
12147
- * @param {any} filters @param {number} i
12159
+ * array and restore the default filter on each selected node, with its own
12160
+ * series index (dropShadow.enabledOnSeries is per series; a pie slice's
12161
+ * shadow is per slice, j).
12162
+ * @param {any} filters
12148
12163
  */
12149
- _clearAllDataPointSelections(filters, i2) {
12164
+ _clearAllDataPointSelections(filters) {
12150
12165
  const w = this.w;
12151
12166
  w.interact.selectedDataPoints = [];
12152
- const elPaths = w.dom.Paper.find(
12153
- ".apexcharts-series path:not(.apexcharts-decoration-element)"
12154
- );
12155
- const elCircles = w.dom.Paper.find(
12156
- ".apexcharts-series circle:not(.apexcharts-decoration-element), .apexcharts-series rect:not(.apexcharts-decoration-element)"
12157
- );
12158
- const deSelect = (els) => {
12159
- Array.prototype.forEach.call(els, (el) => {
12167
+ w.dom.Paper.find('.apexcharts-series [selected="true"]').forEach(
12168
+ (el) => {
12160
12169
  el.node.setAttribute("selected", "false");
12161
- filters.getDefaultFilter(el, i2);
12162
- });
12163
- };
12164
- deSelect(elPaths);
12165
- deSelect(elCircles);
12170
+ filters.getDefaultFilter(
12171
+ el,
12172
+ +el.node.getAttribute(Filters.isSliceChart(w) ? "j" : "index")
12173
+ );
12174
+ }
12175
+ );
12166
12176
  }
12167
12177
  /**
12168
12178
  * Toggle the selected state of a single data point. Mutates
@@ -12182,7 +12192,7 @@ var __async = (__this, __arguments, generator) => {
12182
12192
  return "false";
12183
12193
  }
12184
12194
  if (!w.config.states.active.allowMultipleDataPointsSelection && w.interact.selectedDataPoints.length > 0) {
12185
- this._clearAllDataPointSelections(filters, i2);
12195
+ this._clearAllDataPointSelections(filters);
12186
12196
  }
12187
12197
  path.node.setAttribute("selected", "true");
12188
12198
  if (typeof w.interact.selectedDataPoints[i2] === "undefined") {
@@ -12202,10 +12212,10 @@ var __async = (__this, __arguments, generator) => {
12202
12212
  if (Filters.sliceOffsetOwnsActiveState(w)) return;
12203
12213
  if (selected === "true") {
12204
12214
  const activeFilter = w.config.states.active.filter;
12205
- if (activeFilter !== "none") {
12215
+ if (activeFilter.type !== "none") {
12206
12216
  filters.applyFilter(path, i2, activeFilter.type, activeFilter.value);
12207
12217
  } else {
12208
- if (w.config.states.hover.filter !== "none") {
12218
+ if (w.config.states.hover.filter.type !== "none") {
12209
12219
  if (!w.interact.isTouchDevice) {
12210
12220
  const hoverFilter = w.config.states.hover.filter;
12211
12221
  filters.applyFilter(path, i2, hoverFilter.type, hoverFilter.value);
@@ -12238,7 +12248,12 @@ var __async = (__this, __arguments, generator) => {
12238
12248
  const crossfilterClick = !!(link && (typeof link.dimension === "function" || link.enabled));
12239
12249
  if (!crossfilterClick) {
12240
12250
  const selected = this._togglePointSelection(path, filters, i2, j2);
12241
- this._applyPointSelectionFilter(path, filters, i2, selected);
12251
+ this._applyPointSelectionFilter(
12252
+ path,
12253
+ filters,
12254
+ Filters.isSliceChart(w) ? j2 : i2,
12255
+ selected
12256
+ );
12242
12257
  }
12243
12258
  if (typeof w.config.chart.events.dataPointSelection === "function") {
12244
12259
  w.config.chart.events.dataPointSelection(e2, this.ctx, {
@@ -13026,7 +13041,7 @@ var __async = (__this, __arguments, generator) => {
13026
13041
  }
13027
13042
  setGlobalMarkerSize() {
13028
13043
  const w = this.w;
13029
- w.globals.markers.size = Array.isArray(w.config.markers.size) ? w.config.markers.size : [w.config.markers.size];
13044
+ w.globals.markers.size = Array.isArray(w.config.markers.size) ? w.config.markers.size.slice() : [w.config.markers.size];
13030
13045
  if (w.globals.markers.size.length > 0) {
13031
13046
  if (w.globals.markers.size.length < w.seriesData.series.length + 1) {
13032
13047
  for (let i2 = 0; i2 <= w.seriesData.series.length; i2++) {
@@ -13736,6 +13751,7 @@ var __async = (__this, __arguments, generator) => {
13736
13751
  * @param {string} fontSize
13737
13752
  */
13738
13753
  dataLabelsCorrection(x2, y, val, i2, dataPointIndex, alwaysDrawDataLabel, fontSize) {
13754
+ var _a;
13739
13755
  const w = this.w;
13740
13756
  const graphics = new Graphics(this.w);
13741
13757
  let drawnextLabel = false;
@@ -13778,6 +13794,9 @@ var __async = (__this, __arguments, generator) => {
13778
13794
  if (dataPointIndex === 0 || alwaysDrawDataLabel) {
13779
13795
  drawnextLabel = true;
13780
13796
  }
13797
+ if (drawnextLabel) {
13798
+ ((_a = w.globals.lastDrawnDataLabelsIndexes)[i2] || (_a[i2] = [])).push(len + 1);
13799
+ }
13781
13800
  return {
13782
13801
  x: x2,
13783
13802
  y,
@@ -14023,10 +14042,6 @@ var __async = (__this, __arguments, generator) => {
14023
14042
  }
14024
14043
  parent.add(dataLabelText);
14025
14044
  if (penDrawn(w, i2)) applyProgressiveReveal(dataLabelText, x2, w);
14026
- if (typeof w.globals.lastDrawnDataLabelsIndexes[i2] === "undefined") {
14027
- w.globals.lastDrawnDataLabelsIndexes[i2] = [];
14028
- }
14029
- w.globals.lastDrawnDataLabelsIndexes[i2].push(j2);
14030
14045
  }
14031
14046
  return dataLabelText;
14032
14047
  }
@@ -15990,6 +16005,13 @@ var __async = (__this, __arguments, generator) => {
15990
16005
  if (typeof gl.yAxisScale[index] === "undefined") {
15991
16006
  gl.yAxisScale[index] = [];
15992
16007
  }
16008
+ if (y.logarithmic && minY <= Number.MIN_VALUE) {
16009
+ const s2 = this.w.seriesData.series;
16010
+ const map = gl.isMultipleYAxis && gl.seriesYAxisMap[index];
16011
+ const b = y.logBase || 10;
16012
+ const m = (map ? map.map((i2) => s2[i2]) : s2).flat().reduce((a2, v) => v > 0 && (!a2 || v < a2) ? v : a2, 0);
16013
+ minY = m && Math.min(b, __pow(b, Math.floor(Math.log(m) / Math.log(b))));
16014
+ }
15993
16015
  const range = Math.abs(maxY - minY);
15994
16016
  const spansABase = y.logarithmic && this._logDomainSpan(minY, maxY, y.logBase) >= 1;
15995
16017
  const validLogScale = y.logarithmic && (spansABase || range > 5);
@@ -16022,19 +16044,26 @@ var __async = (__this, __arguments, generator) => {
16022
16044
  * @param {number} maxX
16023
16045
  */
16024
16046
  setXScale(minX, maxX) {
16047
+ var _a;
16025
16048
  const w = this.w;
16026
16049
  const gl = w.globals;
16027
16050
  if (maxX === -Number.MAX_VALUE || !Utils$1.isNumber(maxX)) {
16028
16051
  gl.xAxisScale = this.linearScale(0, 10, 10);
16029
16052
  } else {
16030
- const ticks = gl.xTickAmount;
16031
- gl.xAxisScale = this.linearScale(
16032
- minX,
16033
- maxX,
16034
- ticks,
16035
- 0,
16036
- w.config.xaxis.max === void 0 ? w.config.xaxis.stepSize : void 0
16037
- );
16053
+ const x2 = w.config.xaxis;
16054
+ let step = ((_a = x2.max) != null ? _a : x2.range) === void 0 ? x2.stepSize : void 0;
16055
+ const fit = step > 0 && !gl.isBarHorizontal && x2.type !== "datetime";
16056
+ if (fit) {
16057
+ const n2 = Math.ceil((maxX - minX) / step - 1e-9);
16058
+ n2 > 1e3 ? step = void 0 : gl.xTickAmount = n2;
16059
+ }
16060
+ let s2 = this.linearScale(minX, maxX, gl.xTickAmount, 0, step);
16061
+ if (fit && step) {
16062
+ while (s2.niceMax < maxX)
16063
+ s2 = this.linearScale(minX, maxX, ++gl.xTickAmount, 0, step);
16064
+ gl.maxX = s2.niceMax;
16065
+ }
16066
+ gl.xAxisScale = s2;
16038
16067
  }
16039
16068
  return gl.xAxisScale;
16040
16069
  }
@@ -16669,22 +16698,21 @@ var __async = (__this, __arguments, generator) => {
16669
16698
  gl.barGroups = [];
16670
16699
  gl.lineGroups = [];
16671
16700
  gl.areaGroups = [];
16672
- cnf.series.forEach((s2) => {
16673
- const _s = (
16701
+ cnf.series.forEach((s2, i2) => {
16702
+ const g = this.w.labelData.seriesGroupIndex[i2];
16703
+ switch (
16674
16704
  /** @type {any} */
16675
- s2
16676
- );
16677
- const type = _s.type || cnf.chart.type;
16678
- switch (type) {
16705
+ s2.type || cnf.chart.type
16706
+ ) {
16679
16707
  case "bar":
16680
16708
  case "column":
16681
- gl.barGroups.push(_s.group);
16709
+ gl.barGroups.push(g);
16682
16710
  break;
16683
16711
  case "line":
16684
- gl.lineGroups.push(_s.group);
16712
+ gl.lineGroups.push(g);
16685
16713
  break;
16686
16714
  case "area":
16687
- gl.areaGroups.push(_s.group);
16715
+ gl.areaGroups.push(g);
16688
16716
  break;
16689
16717
  }
16690
16718
  });
@@ -16769,9 +16797,10 @@ var __async = (__this, __arguments, generator) => {
16769
16797
  ticks = gl.dataPoints - 1;
16770
16798
  }
16771
16799
  } else if (cnf.xaxis.tickAmount === "dataPoints") {
16772
- if (this.w.seriesData.series.length > 1) {
16773
- ticks = this.w.seriesData.series[gl.maxValsInArrayIndex].length - 1;
16774
- }
16800
+ ticks = Math.max(
16801
+ 1,
16802
+ (this.w.seriesData.series[gl.maxValsInArrayIndex] || []).length - 1
16803
+ );
16775
16804
  if (this.w.axisFlags.isXNumeric) {
16776
16805
  const diff = Math.round(gl.maxX - gl.minX);
16777
16806
  if (diff < 30) {
@@ -16829,8 +16858,26 @@ var __async = (__this, __arguments, generator) => {
16829
16858
  }
16830
16859
  }
16831
16860
  if (isXNumeric && gl.isBarHorizontal) {
16861
+ const rows = (this.w.seriesData.seriesX[gl.maxValsInArrayIndex] || []).slice();
16862
+ const seen = new Set(rows);
16863
+ const n2 = rows.length;
16864
+ if (cnf.chart.type === "bar") {
16865
+ this.w.seriesData.seriesX.forEach(
16866
+ (s2) => s2 == null ? void 0 : s2.forEach((x2) => {
16867
+ if (x2 != null && !seen.has(x2)) {
16868
+ seen.add(x2);
16869
+ rows.push(x2);
16870
+ }
16871
+ })
16872
+ );
16873
+ }
16874
+ if (rows.length > n2) {
16875
+ const dir = rows[0] > rows[n2 - 1] ? -1 : 1;
16876
+ rows.sort((a2, b) => (a2 - b) * dir);
16877
+ gl.dataPoints = rows.length;
16878
+ }
16832
16879
  this.w.labelData.labels = /** @type {any} */
16833
- (this.w.seriesData.seriesX[gl.maxValsInArrayIndex] || []).slice();
16880
+ rows;
16834
16881
  } else if (isXNumeric) {
16835
16882
  this.w.labelData.labels = /** @type {any} */
16836
16883
  gl.xAxisScale.result.slice();
@@ -16955,7 +17002,7 @@ var __async = (__this, __arguments, generator) => {
16955
17002
  const windowed = this._autoScaleYEnabled();
16956
17003
  if (!this.w.seriesData.series.length) return;
16957
17004
  const gIdx = this.w.labelData.seriesGroupIndex;
16958
- const byX = this.w.axisFlags.isXNumeric && !this.w.config.plotOptions.bar.horizontal;
17005
+ const byX = this.w.axisFlags.isXNumeric;
16959
17006
  const stacks = /* @__PURE__ */ new Map();
16960
17007
  this.w.config.series.forEach(
16961
17008
  (serie, i2) => {
@@ -16970,7 +17017,7 @@ var __async = (__this, __arguments, generator) => {
16970
17017
  if (!st) stacks.set(key, st = [0, 0]);
16971
17018
  const v = this.w.seriesData.series[i2][j2];
16972
17019
  if (stackSeries && v !== null && Utils$1.isNumber(v)) {
16973
- v > 0 ? st[0] += parseFloat(String(v)) + 1e-4 : st[1] += parseFloat(String(v));
17020
+ v > 0 ? st[0] += v * 1.000001 : st[1] += +v;
16974
17021
  }
16975
17022
  }
16976
17023
  }
@@ -18683,6 +18730,11 @@ var __async = (__this, __arguments, generator) => {
18683
18730
  return count === 0 ? k2 : `${k2}#${count}`;
18684
18731
  });
18685
18732
  }
18733
+ function seriesKeys(w, realIndex, n2 = ((_a) => (_a = w.seriesData.series[realIndex]) == null ? void 0 : _a.length)() | 0) {
18734
+ return uniquifyKeys(
18735
+ Array.from({ length: n2 }, (_, j2) => datumKey(w, realIndex, j2))
18736
+ );
18737
+ }
18686
18738
  function seriesJoin(w, realIndex, includeIdentity = false, allowReorder = false) {
18687
18739
  var _a, _b;
18688
18740
  if (!lengthTransitionEnabled(w)) return null;
@@ -18695,7 +18747,7 @@ var __async = (__this, __arguments, generator) => {
18695
18747
  const oldKeys = uniquifyKeys(
18696
18748
  oldY.map((_, j2) => frameDatumKey(frame, realIndex, j2))
18697
18749
  );
18698
- const newKeys = uniquifyKeys(newY.map((_, j2) => datumKey(w, realIndex, j2)));
18750
+ const newKeys = seriesKeys(w, realIndex);
18699
18751
  const join = joinKeys(oldKeys, newKeys);
18700
18752
  if (!join.ordered && !allowReorder) return null;
18701
18753
  if (!join.changed && !includeIdentity) return null;
@@ -20130,11 +20182,8 @@ var __async = (__this, __arguments, generator) => {
20130
20182
  */
20131
20183
  isSeriesHidden(seriesName) {
20132
20184
  var _a;
20133
- const targetElement = this.getSeriesByName(seriesName);
20134
- const el = (
20135
- /** @type {Element} */
20136
- targetElement
20137
- );
20185
+ const el = this.getSeriesByName(seriesName);
20186
+ if (!el) return { isHidden: false, realIndex: -1 };
20138
20187
  const realIndex = parseInt((_a = el.getAttribute("data:realIndex")) != null ? _a : "0", 10);
20139
20188
  const gl = this.w.globals;
20140
20189
  const isHidden = el.classList.contains("apexcharts-series-collapsed") || gl.collapsedSeriesIndices.includes(realIndex) || gl.ancillaryCollapsedSeriesIndices.includes(realIndex);
@@ -20284,9 +20333,9 @@ var __async = (__this, __arguments, generator) => {
20284
20333
  */
20285
20334
  toggleSeries(seriesName) {
20286
20335
  var _a;
20287
- const isSeriesHidden = this.isSeriesHidden(seriesName);
20288
- (_a = this._toggleDataSeries) == null ? void 0 : _a.call(this, isSeriesHidden.realIndex, isSeriesHidden.isHidden);
20289
- return isSeriesHidden.isHidden;
20336
+ const { isHidden, realIndex } = this.isSeriesHidden(seriesName);
20337
+ if (realIndex > -1) (_a = this._toggleDataSeries) == null ? void 0 : _a.call(this, realIndex, isHidden);
20338
+ return isHidden;
20290
20339
  }
20291
20340
  /**
20292
20341
  * @param {string} seriesName
@@ -20304,7 +20353,7 @@ var __async = (__this, __arguments, generator) => {
20304
20353
  hideSeries(seriesName) {
20305
20354
  var _a;
20306
20355
  const isSeriesHidden = this.isSeriesHidden(seriesName);
20307
- if (!isSeriesHidden.isHidden) {
20356
+ if (!isSeriesHidden.isHidden && isSeriesHidden.realIndex > -1) {
20308
20357
  (_a = this._toggleDataSeries) == null ? void 0 : _a.call(this, isSeriesHidden.realIndex, false);
20309
20358
  }
20310
20359
  }
@@ -20380,10 +20429,10 @@ var __async = (__this, __arguments, generator) => {
20380
20429
  * @param {any[]} series
20381
20430
  */
20382
20431
  emptyCollapsedSeries(series) {
20383
- const w = this.w;
20432
+ const gl = this.w.globals;
20384
20433
  if (!Array.isArray(series)) return series;
20385
20434
  for (let i2 = 0; i2 < series.length; i2++) {
20386
- if (w.globals.collapsedSeriesIndices.indexOf(i2) > -1) {
20435
+ if (gl.collapsedSeriesIndices.includes(i2) || gl.ancillaryCollapsedSeriesIndices.includes(i2)) {
20387
20436
  if (series[i2] && typeof series[i2] === "object") {
20388
20437
  series[i2].data = [];
20389
20438
  } else {
@@ -20589,9 +20638,11 @@ var __async = (__this, __arguments, generator) => {
20589
20638
  * @param {'highlight'|'reset'} action
20590
20639
  */
20591
20640
  highlightRangeInSeries(rangeIndex, action) {
20641
+ var _a, _b;
20592
20642
  const w = this.w;
20643
+ const t2 = w.config.chart.type === "treemap" ? "treemap" : "heatmap";
20593
20644
  const allHeatMapElements = w.dom.baseEl.getElementsByClassName(
20594
- "apexcharts-heatmap-rect"
20645
+ `apexcharts-${t2}-rect`
20595
20646
  );
20596
20647
  const toggleAllInactive = (op) => {
20597
20648
  for (let i2 = 0; i2 < allHeatMapElements.length; i2++) {
@@ -20608,14 +20659,23 @@ var __async = (__this, __arguments, generator) => {
20608
20659
  toggleAllInactive("remove");
20609
20660
  return;
20610
20661
  }
20611
- const ranges = w.config.plotOptions.heatmap.colorScale.ranges;
20662
+ const ranges = w.config.plotOptions[t2].colorScale.ranges;
20612
20663
  const range = ranges && ranges[rangeIndex];
20613
20664
  if (!range) return;
20614
20665
  toggleAllInactive("add");
20615
20666
  for (let i2 = 0; i2 < allHeatMapElements.length; i2++) {
20616
- const val = Number(allHeatMapElements[i2].getAttribute("val"));
20667
+ const el = allHeatMapElements[i2];
20668
+ const val = Number(
20669
+ (_b = el.getAttribute("val")) != null ? _b : (_a = w.seriesData.series[
20670
+ /** @type {any} */
20671
+ el.getAttribute("i")
20672
+ ]) == null ? void 0 : _a[
20673
+ /** @type {any} */
20674
+ el.getAttribute("j")
20675
+ ]
20676
+ );
20617
20677
  if (val >= range.from && val <= range.to) {
20618
- allHeatMapElements[i2].classList.remove(this.legendInactiveClass);
20678
+ el.classList.remove(this.legendInactiveClass);
20619
20679
  }
20620
20680
  }
20621
20681
  }
@@ -20629,10 +20689,7 @@ var __async = (__this, __arguments, generator) => {
20629
20689
  const activeSeriesIndex = w.config.series.map((s2, index) => {
20630
20690
  const checkChartType = () => {
20631
20691
  if (w.globals.comboCharts) {
20632
- return chartTypes.length === 0 || chartTypes.length && chartTypes.indexOf(
20633
- /** @type {Record<string,any>} */
20634
- w.config.series[index].type
20635
- ) > -1;
20692
+ return chartTypes.length === 0 || chartTypes.length && chartTypes.indexOf(s2.type || w.config.chart.type) > -1;
20636
20693
  }
20637
20694
  return true;
20638
20695
  };
@@ -20670,7 +20727,7 @@ var __async = (__this, __arguments, generator) => {
20670
20727
  let last = -1;
20671
20728
  w.config.series.forEach((s2, i2) => {
20672
20729
  if (w.labelData.seriesGroupIndex[i2] !== gi) return;
20673
- if (w.globals.comboCharts && chartTypes.length && chartTypes.indexOf(s2.type) === -1) {
20730
+ if (w.globals.comboCharts && chartTypes.length && chartTypes.indexOf(s2.type || w.config.chart.type) === -1) {
20674
20731
  return;
20675
20732
  }
20676
20733
  const hasData = s2.data && s2.data.length > 0 && w.globals.collapsedSeriesIndices.indexOf(i2) === -1;
@@ -20683,7 +20740,8 @@ var __async = (__this, __arguments, generator) => {
20683
20740
  const w = this.w;
20684
20741
  if (w.globals.comboCharts) {
20685
20742
  return this.w.config.series.map((s2, i2) => {
20686
- return s2.type === "bar" || s2.type === "column" ? i2 : -1;
20743
+ const t2 = s2.type || w.config.chart.type;
20744
+ return t2 === "bar" || t2 === "column" ? i2 : -1;
20687
20745
  }).filter((i2) => {
20688
20746
  return i2 !== -1;
20689
20747
  });
@@ -20738,6 +20796,11 @@ var __async = (__this, __arguments, generator) => {
20738
20796
  for (let j2 = 0; j2 < paths.length; j2++) {
20739
20797
  if (paths[j2].hasAttribute("pathTo")) {
20740
20798
  const d = (type === "line" || type === "area") && paths[j2].getAttribute("d") || paths[j2].getAttribute("pathTo");
20799
+ if (paths[j2].classList.contains("apexcharts-raincloud-box")) {
20800
+ const body = dArr.paths[dArr.paths.length - 1];
20801
+ if (body) (body.box || (body.box = [])).push(d);
20802
+ continue;
20803
+ }
20741
20804
  dArr.paths.push({
20742
20805
  d,
20743
20806
  key: paths[j2].getAttribute("data:pathKey"),
@@ -20761,7 +20824,8 @@ var __async = (__this, __arguments, generator) => {
20761
20824
  "rangeArea",
20762
20825
  "candlestick",
20763
20826
  "boxPlot",
20764
- "radar"
20827
+ "radar",
20828
+ "violin"
20765
20829
  ];
20766
20830
  chartTypes.forEach((type) => {
20767
20831
  const paths = getPaths(type);
@@ -21336,7 +21400,7 @@ var __async = (__this, __arguments, generator) => {
21336
21400
  applyColorTypes(colorTypes, defaultColors) {
21337
21401
  const w = this.w;
21338
21402
  colorTypes.forEach((c) => {
21339
- w.globals[c].colors = w.config[c].colors === void 0 ? this.isColorFn ? w.config.colors.slice() : defaultColors : w.config[c].colors.slice();
21403
+ w.globals[c].colors = w.config[c].colors === void 0 ? this.isColorFn && w.config.colors ? w.config.colors.slice() : defaultColors : w.config[c].colors.slice();
21340
21404
  this.pushExtraColors(
21341
21405
  /** @type {Record<string,any>} */
21342
21406
  w.globals[c].colors
@@ -22352,7 +22416,7 @@ var __async = (__this, __arguments, generator) => {
22352
22416
  text.setAttribute("class", "apexcharts-breadcrumb-label");
22353
22417
  text.textContent = String(label);
22354
22418
  btn.appendChild(text);
22355
- btn.addEventListener("click", () => opts.onNavigate(i2, crumb));
22419
+ btn.addEventListener("click", (e2) => opts.onNavigate(i2, crumb, e2));
22356
22420
  nav.appendChild(btn);
22357
22421
  });
22358
22422
  elWrap.appendChild(nav);
@@ -23289,6 +23353,7 @@ var __async = (__this, __arguments, generator) => {
23289
23353
  const { w, ctx } = this;
23290
23354
  const { config: cnf, globals: gl } = w;
23291
23355
  const { line, boxCandlestick, violin } = renderers;
23356
+ if (cnf.chart.type !== "unit") ctx._unitPrevDots = null;
23292
23357
  let elGraph = [];
23293
23358
  if (gl.comboCharts) {
23294
23359
  const coreUtils = new CoreUtils(this.w);
@@ -24007,26 +24072,33 @@ var __async = (__this, __arguments, generator) => {
24007
24072
  const list = dd && Array.isArray(dd.series) ? dd.series : [];
24008
24073
  return list.find((s2) => s2 && s2.id === id);
24009
24074
  }
24010
- function toNode(w, d, i2, paletteFromParent, parentKey, seenIds = null, opts = {}) {
24075
+ function segment(name2, seen) {
24076
+ var _a;
24077
+ const n2 = String(name2).replace(/\//g, "%2F");
24078
+ const o2 = ((_a = seen.get(n2)) != null ? _a : -1) + 1;
24079
+ seen.set(n2, o2);
24080
+ return `${o2}:${n2}`;
24081
+ }
24082
+ function toNode(w, d, i2, paletteFromParent, parentKey, seenIds = null, opts = {}, seen = /* @__PURE__ */ new Map()) {
24011
24083
  var _a, _b, _c;
24012
24084
  const isObj = d && typeof d === "object";
24013
24085
  const name2 = isObj ? (_b = (_a = d.x) != null ? _a : d.name) != null ? _b : "" : "";
24014
- const value = isObj ? Number((_c = d.y) != null ? _c : d.value) : Number(d);
24086
+ const raw = isObj ? (_c = d.y) != null ? _c : d.value : d;
24087
+ const value = raw == null || raw === "" ? NaN : Number(raw);
24015
24088
  const node = {
24016
24089
  name: String(name2),
24017
24090
  value: isNaN(value) ? null : value,
24018
24091
  color: isObj && d.color ? d.color : void 0,
24019
- // Identity across data updates: the path of names (indexed so same-named
24020
- // siblings stay distinct). Update animations morph matched keys in place.
24021
- _key: `${parentKey}/${i2}:${name2}`
24092
+ _key: `${parentKey}/${segment(name2, seen)}`
24022
24093
  };
24023
24094
  if (paletteFromParent && !node.color) {
24024
24095
  node.color = paletteFromParent[i2 % paletteFromParent.length];
24025
24096
  }
24026
24097
  if (opts.keepDatum) node._datum = d;
24098
+ const kids = /* @__PURE__ */ new Map();
24027
24099
  if (isObj && Array.isArray(d.children) && d.children.length) {
24028
24100
  node.children = d.children.map(
24029
- (c, j2) => toNode(w, c, j2, null, node._key, seenIds, opts)
24101
+ (c, j2) => toNode(w, c, j2, null, node._key, seenIds, opts, kids)
24030
24102
  );
24031
24103
  } else if (isObj && d.drilldown != null && opts.expandDrilldown !== false) {
24032
24104
  const visited = seenIds || /* @__PURE__ */ new Set();
@@ -24037,7 +24109,7 @@ var __async = (__this, __arguments, generator) => {
24037
24109
  nextSeen.add(d.drilldown);
24038
24110
  const palette = Array.isArray(dd.colors) ? dd.colors : null;
24039
24111
  node.children = dd.data.map(
24040
- (c, j2) => toNode(w, c, j2, palette, node._key, nextSeen, opts)
24112
+ (c, j2) => toNode(w, c, j2, palette, node._key, nextSeen, opts, kids)
24041
24113
  );
24042
24114
  }
24043
24115
  }
@@ -24050,10 +24122,12 @@ var __async = (__this, __arguments, generator) => {
24050
24122
  series || w.config.series
24051
24123
  );
24052
24124
  if (!Array.isArray(cfgSeries)) return [];
24125
+ const seen = /* @__PURE__ */ new Map();
24053
24126
  return cfgSeries.map((s2, i2) => {
24054
24127
  var _a, _b;
24055
24128
  const data = s2 && Array.isArray(s2.data) ? s2.data : [];
24056
- const key = `${i2}:${(_a = s2 == null ? void 0 : s2.name) != null ? _a : ""}`;
24129
+ const key = segment((_a = s2 == null ? void 0 : s2.name) != null ? _a : "", seen);
24130
+ const kids = /* @__PURE__ */ new Map();
24057
24131
  const root = {
24058
24132
  name: String((_b = s2 == null ? void 0 : s2.name) != null ? _b : ""),
24059
24133
  value: null,
@@ -24061,7 +24135,7 @@ var __async = (__this, __arguments, generator) => {
24061
24135
  _key: key,
24062
24136
  _seriesIndex: i2,
24063
24137
  children: data.map(
24064
- (d, j2) => toNode(w, d, j2, null, key, null, opts)
24138
+ (d, j2) => toNode(w, d, j2, null, key, null, opts, kids)
24065
24139
  )
24066
24140
  };
24067
24141
  return root;
@@ -24211,7 +24285,7 @@ var __async = (__this, __arguments, generator) => {
24211
24285
  var _a;
24212
24286
  if (!d || typeof d !== "object") return Utils$1.parseNumber(d) || 0;
24213
24287
  const v = (_a = d.y) != null ? _a : d.value;
24214
- if (v != null) return Utils$1.parseNumber(v) || 0;
24288
+ if (v != null && v !== "") return Utils$1.parseNumber(v) || 0;
24215
24289
  if (!Array.isArray(d.children)) return 0;
24216
24290
  return d.children.reduce(
24217
24291
  (s2, c) => s2 + Math.max(0, subtreeTotal(c)),
@@ -24937,13 +25011,18 @@ var __async = (__this, __arguments, generator) => {
24937
25011
  }
24938
25012
  });
24939
25013
  this.coreUtils.setSeriesYAxisMappings();
24940
- const buckets = [];
24941
- const groups = [
24942
- ...new Set(cnf.series.map((s2) => s2.group))
24943
- ];
24944
- this.w.labelData.seriesGroupIndex = cnf.series.map(
25014
+ const rev = this.w.globals.seriesYAxisReverseMap;
25015
+ const keys = cnf.series.map(
24945
25016
  (s2, i2) => {
24946
- const index = groups.indexOf(s2.group);
25017
+ var _a2;
25018
+ return (_a2 = s2.group) != null ? _a2 : "apexcharts-axis-" + rev[i2];
25019
+ }
25020
+ );
25021
+ const buckets = [];
25022
+ const groups = [...new Set(keys)];
25023
+ this.w.labelData.seriesGroupIndex = keys.map(
25024
+ (k2, i2) => {
25025
+ const index = groups.indexOf(k2);
24947
25026
  if (!buckets[index]) buckets[index] = [];
24948
25027
  buckets[index].push(this.w.seriesData.seriesNames[i2]);
24949
25028
  return index;
@@ -25226,12 +25305,12 @@ var __async = (__this, __arguments, generator) => {
25226
25305
  if (rootColors && x2 !== void 0) {
25227
25306
  rootColors[labels.length] = dataPoint.color;
25228
25307
  }
25229
- if (x2 !== void 0 && y !== void 0) {
25230
- labels.push(String(x2));
25231
- values.push(Utils$1.parseNumber(y));
25232
- } else if (x2 !== void 0 && Array.isArray(dataPoint.children)) {
25308
+ if (x2 !== void 0 && Array.isArray(dataPoint.children)) {
25233
25309
  labels.push(String(x2));
25234
25310
  values.push(subtreeTotal(dataPoint));
25311
+ } else if (x2 !== void 0 && y !== void 0) {
25312
+ labels.push(String(x2));
25313
+ values.push(Utils$1.parseNumber(y));
25235
25314
  } else {
25236
25315
  console.warn(
25237
25316
  "ApexCharts: Invalid data point format for pie chart. Expected {x, y} format:",
@@ -27168,6 +27247,13 @@ var __async = (__this, __arguments, generator) => {
27168
27247
  const markers = this.getElMarkers(capturedSeries);
27169
27248
  return markers.length > 0;
27170
27249
  }
27250
+ /**
27251
+ * Whether any visible series has a marker node, its points' or its hover
27252
+ * dot's.
27253
+ */
27254
+ hasVisibleMarkers() {
27255
+ return this.getAllMarkers(true).some(Boolean);
27256
+ }
27171
27257
  /**
27172
27258
  * @param {any} point
27173
27259
  * @param {number} size
@@ -27614,11 +27700,11 @@ var __async = (__this, __arguments, generator) => {
27614
27700
  */
27615
27701
  placeAroundCell(cell, plot, {
27616
27702
  el = null,
27617
- ttWidth = ((_a) => (_a = this.ttCtx.tooltipRect) == null ? void 0 : _a.ttWidth)() || 0,
27618
- ttHeight = ((_b) => (_b = this.ttCtx.tooltipRect) == null ? void 0 : _b.ttHeight)() || 0
27703
+ ttWidth = ((_b) => (_b = this.ttCtx.tooltipRect) == null ? void 0 : _b.ttWidth)() || 0,
27704
+ ttHeight = ((_c) => (_c = this.ttCtx.tooltipRect) == null ? void 0 : _c.ttHeight)() || 0
27619
27705
  } = {}) {
27620
- var _a2;
27621
- if (!((_a2 = el == null ? void 0 : el.closest) == null ? void 0 : _a2.call(el, '[clip-path*="heatmapHexMask"]'))) {
27706
+ var _a;
27707
+ if (!((_a = el == null ? void 0 : el.closest) == null ? void 0 : _a.call(el, '[clip-path*="heatmapHexMask"]'))) {
27622
27708
  cell = this._visiblePart(cell, plot);
27623
27709
  }
27624
27710
  return this._placeAround(placeAroundCell, cell, plot, {
@@ -27689,11 +27775,11 @@ var __async = (__this, __arguments, generator) => {
27689
27775
  * @param {{ ttWidth?: number, ttHeight?: number, side?: 'left'|'right'|null, beside?: boolean }} [opts]
27690
27776
  * @returns {import('./placement').CellPlacement}
27691
27777
  */
27692
- _placeAround(decide, mark, plot, _e = {}) {
27693
- var _f = _e, {
27694
- ttWidth = ((_c) => (_c = this.ttCtx.tooltipRect) == null ? void 0 : _c.ttWidth)() || 0,
27695
- ttHeight = ((_d) => (_d = this.ttCtx.tooltipRect) == null ? void 0 : _d.ttHeight)() || 0
27696
- } = _f, rest = __objRest(_f, [
27778
+ _placeAround(decide, mark, plot, _f = {}) {
27779
+ var _g = _f, {
27780
+ ttWidth = ((_d) => (_d = this.ttCtx.tooltipRect) == null ? void 0 : _d.ttWidth)() || 0,
27781
+ ttHeight = ((_e) => (_e = this.ttCtx.tooltipRect) == null ? void 0 : _e.ttHeight)() || 0
27782
+ } = _g, rest = __objRest(_g, [
27697
27783
  "ttWidth",
27698
27784
  "ttHeight"
27699
27785
  ]);
@@ -31877,16 +31963,22 @@ var __async = (__this, __arguments, generator) => {
31877
31963
  ttCtx.tooltipLabels.drawSeriesTexts(__spreadProps(__spreadValues({}, commonSeriesTextsParams), {
31878
31964
  shared: this.showOnIntersect ? false : this.tConfig.shared
31879
31965
  }));
31880
- if (hasMarkers || dynamicPoints) {
31966
+ const capturedPoints = hasMarkers || dynamicPoints;
31967
+ if (capturedPoints || w.globals.comboCharts && !canvasMode && this.tooltipUtil.hasVisibleMarkers()) {
31881
31968
  handlePoints();
31882
- } else if (this.tooltipUtil.hasBars()) {
31969
+ }
31970
+ if (this.tooltipUtil.hasBars()) {
31883
31971
  if (canvasMode) {
31884
- ttCtx.tooltipPosition.moveStickyTooltipOverBars(j2, capturedSeries);
31972
+ if (!capturedPoints) {
31973
+ ttCtx.tooltipPosition.moveStickyTooltipOverBars(j2, capturedSeries);
31974
+ }
31885
31975
  } else if ([...bars].some((b) => b.querySelector("path"))) {
31886
31976
  const graphics = new Graphics(this.w, this.ctx);
31887
31977
  const paths = w.dom.Paper.find(`.apexcharts-bar-area[j='${j2}']`);
31888
31978
  this.deactivateHoverFilter();
31889
- ttCtx.tooltipPosition.moveStickyTooltipOverBars(j2, capturedSeries);
31979
+ if (!capturedPoints) {
31980
+ ttCtx.tooltipPosition.moveStickyTooltipOverBars(j2, capturedSeries);
31981
+ }
31890
31982
  for (let b = 0; b < paths.length; b++) {
31891
31983
  graphics.pathMouseEnter(
31892
31984
  /** @type {any} */
@@ -32087,7 +32179,8 @@ var __async = (__this, __arguments, generator) => {
32087
32179
  this._activate(desired, this._instances[desired]);
32088
32180
  return this._activeKind;
32089
32181
  }
32090
- if (mode === desired) {
32182
+ if (mode === desired && !this._warned) {
32183
+ this._warned = 1;
32091
32184
  warnMissingFeature(
32092
32185
  `\`chart.renderer: '${desired}'\``,
32093
32186
  `renderer-${desired}`,
@@ -32096,11 +32189,17 @@ var __async = (__this, __arguments, generator) => {
32096
32189
  }
32097
32190
  );
32098
32191
  }
32099
- } else if (mode === "canvas" && hasCanvasUnsupportedFeature(this.w)) {
32192
+ } else if (mode === "canvas" && !this._warned && hasCanvasUnsupportedFeature(this.w)) {
32193
+ this._warned = 1;
32100
32194
  console.warn(
32101
32195
  `[apexcharts] renderer:"canvas" requested but this chart uses a feature the canvas renderer does not render yet (gradient/pattern/image fill or a state color-matrix filter); falling back to SVG.`
32102
32196
  );
32103
32197
  }
32198
+ const prev = this._instances[this._activeKind];
32199
+ if (prev) {
32200
+ prev.destroy();
32201
+ delete this._instances[this._activeKind];
32202
+ }
32104
32203
  this._activate("svg", this.svg);
32105
32204
  return this._activeKind;
32106
32205
  }
@@ -33351,7 +33450,7 @@ var __async = (__this, __arguments, generator) => {
33351
33450
  if (isUpdating) {
33352
33451
  this.ctx._zoomPanSelection = null;
33353
33452
  this.ctx._toolbar = null;
33354
- (_e = this.ctx._keyboardNavigation) == null ? void 0 : _e.destroy();
33453
+ (_e = this.ctx._keyboardNavigation) == null ? void 0 : _e.destroy(true);
33355
33454
  this.ctx._keyboardNavigation = null;
33356
33455
  } else {
33357
33456
  (_f = this.ctx.perspectives) == null ? void 0 : _f.teardown();
@@ -33640,7 +33739,7 @@ var __async = (__this, __arguments, generator) => {
33640
33739
  ros.delete(fn);
33641
33740
  }
33642
33741
  }
33643
- const apexCSS = '@keyframes opaque{0%{opacity:0}to{opacity:1}}.apexcharts-canvas{position:relative;direction:ltr!important;user-select:none;--apexcharts-focus-color: #008FFB}.apexcharts-canvas .apexcharts-theme-dark,.apexcharts-theme-dark.apexcharts-canvas{--apexcharts-focus-color: #FFD500}.apexcharts-canvas.apexcharts-high-contrast,.apexcharts-high-contrast.apexcharts-canvas{--apexcharts-focus-color: #FFFF00}.apexcharts-sr-status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@media(prefers-reduced-motion:reduce){.apexcharts-canvas:not(.apexcharts-ignore-reduced-motion) *,.apexcharts-canvas:not(.apexcharts-ignore-reduced-motion) *:before,.apexcharts-canvas:not(.apexcharts-ignore-reduced-motion) *:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}.apexcharts-canvas ::-webkit-scrollbar{-webkit-appearance:none;width:6px}.apexcharts-canvas ::-webkit-scrollbar-thumb{border-radius:4px;background-color:#00000080;box-shadow:0 0 1px #ffffff80;-webkit-box-shadow:0 0 1px rgba(255,255,255,.5)}.apexcharts-inner{position:relative}.apexcharts-text tspan{font-family:inherit}rect.legend-mouseover-inactive,.legend-mouseover-inactive rect,.legend-mouseover-inactive path,.legend-mouseover-inactive circle,.legend-mouseover-inactive line,.legend-mouseover-inactive text.apexcharts-yaxis-title-text,.legend-mouseover-inactive text.apexcharts-yaxis-label{transition:.15s ease all;opacity:.2}.apexcharts-crossfilter-dimmed{transition:opacity .25s ease;opacity:var(--apx-cf-dim, .2)}.apexcharts-cf-table{border-collapse:collapse;width:100%;font-size:13px}.apexcharts-cf-table caption{caption-side:bottom;text-align:right;padding:6px 2px;font-size:12px;opacity:.7}.apexcharts-cf-table th,.apexcharts-cf-table td{padding:6px 10px;text-align:left;border-bottom:1px solid rgba(0,0,0,.08)}.apexcharts-cf-table th{font-weight:600;border-bottom-width:2px}.apexcharts-cf-table tbody tr:hover{background:#6366f10f}.apexcharts-canvas{--apx-measure-up: #16a34a;--apx-measure-down: #dc2626;--apx-measure-neutral: #64748b;--apx-measure-guide: #94a3b8}.apexcharts-measure-capture{cursor:crosshair}.apexcharts-canvas{--apx-menu-bg: #ffffff;--apx-menu-fg: #1e293b;--apx-menu-border: #e2e8f0;--apx-menu-hover: #f1f5f9;--apx-menu-shadow: rgba(15, 23, 42, .18)}.apexcharts-context-menu{min-width:168px;padding:4px;border-radius:8px;background:var(--apx-menu-bg);border:1px solid var(--apx-menu-border);box-shadow:0 6px 22px var(--apx-menu-shadow);font-family:Helvetica,Arial,sans-serif;font-size:13px;z-index:20;user-select:none}.apexcharts-context-menu-item{display:block;width:100%;box-sizing:border-box;text-align:left;padding:7px 12px;border:0;border-radius:5px;background:transparent;color:var(--apx-menu-fg);font:inherit;cursor:pointer}.apexcharts-context-menu-item:hover,.apexcharts-context-menu-item--active{background:var(--apx-menu-hover)}.apexcharts-context-menu-item:focus{outline:none}.apexcharts-canvas{--apx-ink-card-bg: #ffffff;--apx-ink-card-fg: #1e293b;--apx-ink-card-border: #e2e8f0;--apx-ink-card-hover: #f1f5f9;--apx-ink-card-accent: #6366f1;--apx-ink-card-shadow: rgba(15, 23, 42, .18)}.apexcharts-ink-card{position:absolute;z-index:25;display:flex;flex-direction:column;gap:6px;padding:8px;border-radius:8px;background:var(--apx-ink-card-bg);border:1px solid var(--apx-ink-card-border);box-shadow:0 6px 22px var(--apx-ink-card-shadow);font-family:Helvetica,Arial,sans-serif;font-size:12px;color:var(--apx-ink-card-fg);user-select:none}.apexcharts-ink-card-row{display:flex;align-items:center;gap:4px}.apexcharts-ink-card input.apexcharts-ink-editor{flex:1 1 auto;width:150px;min-width:0;box-sizing:border-box;padding:4px 6px;font:inherit;color:inherit;background:transparent;border:1px solid var(--apx-ink-card-border);border-radius:5px}.apexcharts-ink-card input.apexcharts-ink-editor:focus{outline:none;border-color:var(--apx-ink-card-accent)}.apexcharts-ink-btn{flex:0 0 auto;width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;padding:0;border:0;border-radius:5px;background:transparent;color:inherit;font:inherit;font-size:12px;line-height:1;cursor:pointer}.apexcharts-ink-btn:hover,.apexcharts-ink-btn--active{background:var(--apx-ink-card-hover)}.apexcharts-ink-btn:focus-visible,.apexcharts-ink-swatch:focus-visible{outline:2px solid var(--apx-ink-card-accent);outline-offset:1px}.apexcharts-ink-btn--bold{font-weight:700}.apexcharts-ink-btn--delete:hover{color:#dc2626}.apexcharts-ink-swatch{flex:0 0 auto;width:16px;height:16px;padding:0;border:1px solid rgba(100,116,139,.45);border-radius:50%;cursor:pointer}.apexcharts-ink-swatch--active{box-shadow:0 0 0 2px var(--apx-ink-card-bg),0 0 0 4px var(--apx-ink-card-accent)}.apexcharts-ink-sep{flex:0 0 auto;width:1px;height:16px;margin:0 2px;background:var(--apx-ink-card-border)}.apexcharts-ink-cardlabel{flex:0 0 auto;font-size:10px;letter-spacing:.4px;text-transform:uppercase;opacity:.65;margin-right:2px}.apexcharts-ink-marker-size{flex:0 0 auto;min-width:16px;text-align:center;font-variant-numeric:tabular-nums}.apexcharts-legend-text{padding-left:15px;margin-left:-15px}.apexcharts-legend-series[role=button]:focus{outline:2px solid var(--apexcharts-focus-color, #008FFB);outline-offset:2px}.apexcharts-legend-series[role=button]:focus:not(:focus-visible){outline:none}.apexcharts-legend-series[role=button]:focus-visible{outline:2px solid var(--apexcharts-focus-color, #008FFB);outline-offset:2px}.apexcharts-series-collapsed{opacity:0}.apexcharts-series-collapsed.apexcharts-series-collapsing{opacity:1}.apexcharts-datalabels.apexcharts-series-collapsing{animation:apexcharts-datalabels-exit var(--apexcharts-dl-exit, .4s) ease-in forwards}@keyframes apexcharts-datalabels-exit{0%{opacity:1}to{opacity:0}}.apexcharts-canvas svg:focus:not(:focus-visible){outline:none}.apexcharts-bar-area.apexcharts-keyboard-focused,.apexcharts-candlestick-area.apexcharts-keyboard-focused,.apexcharts-boxPlot-area.apexcharts-keyboard-focused,.apexcharts-violin-area.apexcharts-keyboard-focused,.apexcharts-rangebar-area.apexcharts-keyboard-focused,.apexcharts-pie-area.apexcharts-keyboard-focused,.apexcharts-heatmap-rect.apexcharts-keyboard-focused,.apexcharts-treemap-rect.apexcharts-keyboard-focused,.apexcharts-keyboard-focus-ring{stroke:var(--apexcharts-focus-color, #008FFB);stroke-width:2;stroke-opacity:1}.apexcharts-keyboard-focus-ring{fill:none;pointer-events:none}.apexcharts-tooltip{--apx-tt-bg: #ffffff;--apx-tt-border: rgba(15, 23, 42, .12);--apx-tt-shadow-dir: 1;--apx-tt-shadow: 0 calc(var(--apx-tt-shadow-dir) * 1px) 2px rgba(15, 23, 42, .06), 0 calc(var(--apx-tt-shadow-dir) * 4px) 8px -2px rgba(15, 23, 42, .1), 0 calc(var(--apx-tt-shadow-dir) * 12px) 20px -8px rgba(15, 23, 42, .14);--apx-tt-arrow-bg: var(--apx-tt-bg);--apx-tt-color: #0f172a;--apx-tt-color-muted: rgba(15, 23, 42, .55);border-radius:8px;background:var(--apx-tt-bg);border:1px solid var(--apx-tt-border);box-shadow:var(--apx-tt-shadow);color:var(--apx-tt-color);cursor:default;font-size:13px;left:0;top:0;opacity:0;pointer-events:none;position:absolute;display:flex;flex-direction:column;padding:2px 0;white-space:nowrap;z-index:12;transition:opacity .12s ease}.apexcharts-tooltip.apexcharts-active{opacity:1;transition:opacity .12s ease}.apexcharts-tooltip.apexcharts-tooltip-interactive.apexcharts-active{pointer-events:auto}.apexcharts-tooltip.apexcharts-active[data-positioned=true]{transition:opacity .12s ease,left .16s ease-out,top .16s ease-out}.apexcharts-tooltip.apexcharts-theme-dark{--apx-tt-bg: #1c1c1f;--apx-tt-border: rgba(255, 255, 255, .16);--apx-tt-shadow: 0 calc(var(--apx-tt-shadow-dir) * 1px) 2px rgba(0, 0, 0, .24), 0 calc(var(--apx-tt-shadow-dir) * 4px) 8px -2px rgba(0, 0, 0, .3), 0 calc(var(--apx-tt-shadow-dir) * 12px) 20px -8px rgba(0, 0, 0, .38);--apx-tt-color: #f3f4f6;--apx-tt-color-muted: rgba(243, 244, 246, .55)}.apexcharts-tooltip *{font-family:inherit}.apexcharts-tooltip.apexcharts-annotation-tooltip{padding:6px 10px;max-width:240px;white-space:normal;line-height:1.4;pointer-events:none;z-index:13}.apexcharts-tooltip-title{padding:8px 12px 4px;font-size:12px;font-weight:600;letter-spacing:.01em;color:var(--apx-tt-color-muted);background:transparent;border-bottom:none;margin-bottom:0}.apexcharts-tooltip.apexcharts-theme-light .apexcharts-tooltip-title,.apexcharts-tooltip.apexcharts-theme-dark .apexcharts-tooltip-title{background:transparent;border-bottom:none}.apexcharts-tooltip.apexcharts-tooltip-fill-series{background:transparent;-webkit-backdrop-filter:none;backdrop-filter:none;border:none;padding:0;overflow:hidden;color:#fff}.apexcharts-tooltip.apexcharts-tooltip-fill-series .apexcharts-tooltip-title{background:#00000038;color:#fff;opacity:1;padding:6px 12px}.apexcharts-tooltip.apexcharts-tooltip-fill-series .apexcharts-tooltip-series-group{color:#fff}.apexcharts-tooltip-arrow{position:absolute;box-sizing:border-box;width:10px;height:10px;background:var(--apx-tt-arrow-bg);transform:rotate(45deg);pointer-events:none;top:calc(var(--apx-tt-arrow-y, calc(50% + 1px) ) - 6px)}.apexcharts-tooltip[data-placement=right] .apexcharts-tooltip-arrow{left:-6px;border-left:1px solid var(--apx-tt-border);border-bottom:1px solid var(--apx-tt-border)}.apexcharts-tooltip[data-placement=left] .apexcharts-tooltip-arrow{right:-6px;border-top:1px solid var(--apx-tt-border);border-right:1px solid var(--apx-tt-border)}.apexcharts-tooltip[data-placement=top] .apexcharts-tooltip-arrow,.apexcharts-tooltip[data-placement=bottom] .apexcharts-tooltip-arrow{top:auto;left:calc(var(--apx-tt-arrow-x, calc(50% + 1px) ) - 6px)}.apexcharts-tooltip[data-placement=top] .apexcharts-tooltip-arrow{bottom:-6px;border-right:1px solid var(--apx-tt-border);border-bottom:1px solid var(--apx-tt-border)}.apexcharts-tooltip[data-placement=bottom] .apexcharts-tooltip-arrow{top:-6px;border-top:1px solid var(--apx-tt-border);border-left:1px solid var(--apx-tt-border)}.apexcharts-tooltip[data-placement=bottom]{--apx-tt-shadow-dir: -1 }.apexcharts-tooltip-text-goals-value,.apexcharts-tooltip-text-y-value,.apexcharts-tooltip-text-z-value{display:inline-block;margin-left:5px;font-weight:600}.apexcharts-tooltip-text-goals-label:empty,.apexcharts-tooltip-text-goals-value:empty,.apexcharts-tooltip-text-y-label:empty,.apexcharts-tooltip-text-y-value:empty,.apexcharts-tooltip-text-z-value:empty,.apexcharts-tooltip-title:empty{display:none}.apexcharts-tooltip-text-goals-label,.apexcharts-tooltip-text-goals-value{padding:6px 0 5px}.apexcharts-tooltip-goals-group,.apexcharts-tooltip-text-goals-label,.apexcharts-tooltip-text-goals-value{display:flex}.apexcharts-tooltip-text-goals-label:not(:empty),.apexcharts-tooltip-text-goals-value:not(:empty){margin-top:-6px}.apexcharts-tooltip-marker{display:inline-flex;align-items:center;justify-content:center;position:relative;width:12px;height:12px;margin-right:6px;vertical-align:middle;color:inherit}.apexcharts-tooltip-marker svg{width:100%;height:100%;display:block}.apexcharts-tooltip-series-group{padding:4px 12px;display:none;gap:8px;text-align:left;justify-content:left;align-items:center}.apexcharts-tooltip-series-group.apexcharts-active .apexcharts-tooltip-marker{opacity:1}.apexcharts-tooltip-series-group.apexcharts-active:last-child,.apexcharts-tooltip-series-group:last-child{padding-bottom:8px}.apexcharts-tooltip-y-group{padding:6px 0 5px}.apexcharts-tooltip.apexcharts-tooltip-compact{padding:3px 8px;font-size:11px;line-height:1.35}.apexcharts-tooltip-compact .apexcharts-tooltip-title{padding:0;font-size:11px;white-space:nowrap}.apexcharts-tooltip-compact .apexcharts-tooltip-series-group,.apexcharts-tooltip-compact .apexcharts-tooltip-series-group.apexcharts-active:last-child,.apexcharts-tooltip-compact .apexcharts-tooltip-series-group:last-child{padding:0;gap:5px}.apexcharts-tooltip-compact .apexcharts-tooltip-y-group{padding:0}.apexcharts-tooltip-compact .apexcharts-tooltip-marker{width:8px;height:8px}.apexcharts-tooltip.apexcharts-tooltip-compact.apexcharts-tooltip-value-only{flex-direction:row;align-items:baseline;gap:6px}.apexcharts-tooltip-value-only .apexcharts-tooltip-marker,.apexcharts-tooltip-value-only .apexcharts-tooltip-text-y-label{display:none}.apexcharts-custom-tooltip,.apexcharts-tooltip-box{padding:4px 8px}.apexcharts-tooltip-boxPlot{display:flex;flex-direction:column-reverse}.apexcharts-tooltip-box>div{margin:4px 0}.apexcharts-tooltip-box span.value{font-weight:700}.apexcharts-tooltip-rangebar{padding:5px 8px}.apexcharts-tooltip-rangebar .category{font-weight:600;color:#777}.apexcharts-tooltip-rangebar .series-name{font-weight:700;display:block;margin-bottom:5px}.apexcharts-tooltip-stream{padding:5px 8px}.apexcharts-tooltip-stream .apexcharts-tooltip-title{background:transparent;border:0;padding:0 0 4px;margin:0;font-weight:700}.apexcharts-tooltip-stream-band{display:flex;align-items:center;gap:5px;line-height:1.6;opacity:.72}.apexcharts-tooltip-stream-band.apexcharts-active{opacity:1;font-weight:700}.apexcharts-tooltip-stream-band .series-name{flex:1 1 auto;margin-right:8px}.apexcharts-tooltip-stream-band .value{font-weight:700;margin-left:auto}.apexcharts-tooltip-stream-total{display:flex;align-items:center;margin-top:4px;padding-top:4px;border-top:1px solid var(--apx-tt-border, rgba(15, 23, 42, .12))}.apexcharts-tooltip-stream-total .series-name{flex:1 1 auto;font-weight:600}.apexcharts-tooltip-stream-total .value{font-weight:700;margin-left:auto}.apexcharts-streamgraph-label{pointer-events:none}.apexcharts-xaxistooltip,.apexcharts-yaxistooltip{--apx-axt-bg: #ffffff;--apx-axt-border: rgba(15, 23, 42, .08);--apx-axt-color: #0f172a;--apx-axt-shadow: 0 4px 12px -4px rgba(15, 23, 42, .18), 0 1px 3px -1px rgba(15, 23, 42, .12);opacity:0;pointer-events:none;color:var(--apx-axt-color);font-size:12px;font-weight:500;text-align:center;border-radius:6px;position:absolute;z-index:10;background:var(--apx-axt-bg);border:1px solid var(--apx-axt-border);box-shadow:var(--apx-axt-shadow)}.apexcharts-xaxistooltip.apexcharts-theme-dark,.apexcharts-yaxistooltip.apexcharts-theme-dark{--apx-axt-bg: #1c1c1f;--apx-axt-border: rgba(255, 255, 255, .1);--apx-axt-color: #f3f4f6;--apx-axt-shadow: 0 4px 12px -4px rgba(0, 0, 0, .55), 0 1px 3px -1px rgba(0, 0, 0, .45) }.apexcharts-xaxistooltip{padding:4px 8px;transition:.15s ease all}.apexcharts-xaxistooltip:after,.apexcharts-xaxistooltip:before{left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.apexcharts-xaxistooltip:after{border-color:transparent;border-width:5px;margin-left:-5px}.apexcharts-xaxistooltip:before{border-color:transparent;border-width:6px;margin-left:-6px}.apexcharts-xaxistooltip-bottom:after,.apexcharts-xaxistooltip-bottom:before{bottom:100%}.apexcharts-xaxistooltip-top:after,.apexcharts-xaxistooltip-top:before{top:100%}.apexcharts-xaxistooltip-bottom:after{border-bottom-color:var(--apx-axt-bg)}.apexcharts-xaxistooltip-bottom:before{border-bottom-color:var(--apx-axt-border)}.apexcharts-xaxistooltip-top:after{border-top-color:var(--apx-axt-bg)}.apexcharts-xaxistooltip-top:before{border-top-color:var(--apx-axt-border)}.apexcharts-xaxistooltip.apexcharts-active{opacity:1;transition:.15s ease all}.apexcharts-yaxistooltip{padding:3px 8px}.apexcharts-yaxistooltip:after,.apexcharts-yaxistooltip:before{top:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.apexcharts-yaxistooltip:after{border-color:transparent;border-width:5px;margin-top:-5px}.apexcharts-yaxistooltip:before{border-color:transparent;border-width:6px;margin-top:-6px}.apexcharts-yaxistooltip-left:after,.apexcharts-yaxistooltip-left:before{left:100%}.apexcharts-yaxistooltip-right:after,.apexcharts-yaxistooltip-right:before{right:100%}.apexcharts-yaxistooltip-left:after{border-left-color:var(--apx-axt-bg)}.apexcharts-yaxistooltip-left:before{border-left-color:var(--apx-axt-border)}.apexcharts-yaxistooltip-right:after{border-right-color:var(--apx-axt-bg)}.apexcharts-yaxistooltip-right:before{border-right-color:var(--apx-axt-border)}.apexcharts-yaxistooltip.apexcharts-active{opacity:1}.apexcharts-yaxistooltip-hidden{display:none}.apexcharts-xcrosshairs,.apexcharts-ycrosshairs{pointer-events:none;opacity:0;transition:.15s ease all}.apexcharts-xcrosshairs.apexcharts-active,.apexcharts-ycrosshairs.apexcharts-active{opacity:1;transition:.15s ease all}.apexcharts-ycrosshairs-hidden{opacity:0}.apexcharts-selection-rect{cursor:move}.svg_select_shape{stroke-width:1;stroke-dasharray:10 10;stroke:#000;stroke-opacity:.1;pointer-events:none;fill:none}.svg_select_handle{stroke-width:3;stroke:#000;fill:none}.svg_select_handle_r{cursor:e-resize}.svg_select_handle_l{cursor:w-resize}.apexcharts-svg.apexcharts-zoomable.hovering-zoom{cursor:crosshair}.apexcharts-svg.apexcharts-zoomable.hovering-pan{cursor:move}.apexcharts-menu-icon,.apexcharts-measure-icon,.apexcharts-pan-icon,.apexcharts-reset-icon,.apexcharts-selection-icon,.apexcharts-toolbar-custom-icon,.apexcharts-zoom-icon,.apexcharts-zoomin-icon,.apexcharts-zoomout-icon{cursor:pointer;width:26px;height:24px;line-height:24px;color:#6e8192;text-align:center;padding:0;margin:0;background:transparent;border:0;border-radius:5px;display:inline-flex;align-items:center;justify-content:center;transition:background-color .12s ease,color .12s ease}.apexcharts-menu-icon svg,.apexcharts-measure-icon svg,.apexcharts-pan-icon svg,.apexcharts-reset-icon svg,.apexcharts-selection-icon svg,.apexcharts-zoom-icon svg,.apexcharts-zoomin-icon svg,.apexcharts-zoomout-icon svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.apexcharts-theme-dark .apexcharts-menu-icon,.apexcharts-theme-dark .apexcharts-measure-icon,.apexcharts-theme-dark .apexcharts-pan-icon,.apexcharts-theme-dark .apexcharts-reset-icon,.apexcharts-theme-dark .apexcharts-selection-icon,.apexcharts-theme-dark .apexcharts-toolbar-custom-icon,.apexcharts-theme-dark .apexcharts-zoom-icon,.apexcharts-theme-dark .apexcharts-zoomin-icon,.apexcharts-theme-dark .apexcharts-zoomout-icon{color:#d4d6dc}.apexcharts-canvas .apexcharts-measure-icon.apexcharts-selected,.apexcharts-canvas .apexcharts-pan-icon.apexcharts-selected,.apexcharts-canvas .apexcharts-reset-zoom-icon.apexcharts-selected,.apexcharts-canvas .apexcharts-selection-icon.apexcharts-selected,.apexcharts-canvas .apexcharts-zoom-icon.apexcharts-selected{background:#008ffb1f;color:#008ffb}.apexcharts-theme-light .apexcharts-menu-icon:hover,.apexcharts-theme-light .apexcharts-measure-icon:not(.apexcharts-selected):hover,.apexcharts-theme-light .apexcharts-pan-icon:not(.apexcharts-selected):hover,.apexcharts-theme-light .apexcharts-reset-icon:hover,.apexcharts-theme-light .apexcharts-selection-icon:not(.apexcharts-selected):hover,.apexcharts-theme-light .apexcharts-zoom-icon:not(.apexcharts-selected):hover,.apexcharts-theme-light .apexcharts-zoomin-icon:hover,.apexcharts-theme-light .apexcharts-zoomout-icon:hover{background:#0f172a0f;color:#1f2937}.apexcharts-theme-dark .apexcharts-menu-icon:hover,.apexcharts-theme-dark .apexcharts-measure-icon:not(.apexcharts-selected):hover,.apexcharts-theme-dark .apexcharts-pan-icon:not(.apexcharts-selected):hover,.apexcharts-theme-dark .apexcharts-reset-icon:hover,.apexcharts-theme-dark .apexcharts-selection-icon:not(.apexcharts-selected):hover,.apexcharts-theme-dark .apexcharts-zoom-icon:not(.apexcharts-selected):hover,.apexcharts-theme-dark .apexcharts-zoomin-icon:hover,.apexcharts-theme-dark .apexcharts-zoomout-icon:hover{background:#ffffff14;color:#fff}.apexcharts-menu-icon,.apexcharts-selection-icon{position:relative}.apexcharts-toolbar{position:absolute;z-index:11;display:inline-flex;align-items:center;gap:1px;padding:3px;border-radius:8px;background:#ffffffd9;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.apexcharts-theme-dark .apexcharts-toolbar{background:#1c1c1fd1}.apexcharts-menu{background:#fffffff2;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);position:absolute;top:calc(100% + 4px);border:1px solid rgba(15,23,42,.08);border-radius:8px;padding:4px;right:0;opacity:0;min-width:120px;transition:opacity .15s ease,transform .15s ease;transform:translateY(-2px);pointer-events:none;box-shadow:0 4px 16px -4px #0f172a1f,0 2px 4px -1px #0f172a0f}.apexcharts-menu.apexcharts-menu-open{opacity:1;transform:translateY(0);pointer-events:all}.apexcharts-menu-item{padding:6px 9px;font-size:12px;border-radius:5px;cursor:pointer}.apexcharts-theme-light .apexcharts-menu-item:hover{background:#0f172a0f}.apexcharts-theme-dark .apexcharts-menu{background:#1c1c1feb;border-color:#ffffff14;color:#f3f4f6;box-shadow:0 4px 16px -4px #00000080,0 2px 4px -1px #0006}.apexcharts-theme-dark .apexcharts-menu-item:hover{background:#ffffff14}@media screen and (min-width:768px){.apexcharts-canvas:hover .apexcharts-toolbar{opacity:1}}.apexcharts-toolbar:focus-within{opacity:1}.apexcharts-menu-icon:focus-visible,.apexcharts-measure-icon:focus-visible,.apexcharts-pan-icon:focus-visible,.apexcharts-reset-icon:focus-visible,.apexcharts-selection-icon:focus-visible,.apexcharts-toolbar-custom-icon:focus-visible,.apexcharts-zoom-icon:focus-visible,.apexcharts-zoomin-icon:focus-visible,.apexcharts-zoomout-icon:focus-visible{outline:2px solid var(--apexcharts-focus-color, #008FFB);outline-offset:1px;border-radius:5px}.apexcharts-menu-item:focus-visible{outline:2px solid var(--apexcharts-focus-color, #008FFB);outline-offset:-2px;background:#eee}.apexcharts-canvas .apexcharts-element-hidden,.apexcharts-datalabel.apexcharts-element-hidden,.apexcharts-hide .apexcharts-series-points{opacity:0}.apexcharts-hidden-element-shown{opacity:1;transition:.25s ease all}.apexcharts-datalabel,.apexcharts-datalabel-label,.apexcharts-datalabel-value,.apexcharts-datalabels,.apexcharts-pie-label,.apexcharts-pie-name-label,.apexcharts-pie-name-label-group,.apexcharts-pie-label-connector,.apexcharts-unit-outer-label,.apexcharts-unit-outer-label-group,.apexcharts-unit-label-connector{cursor:default;pointer-events:none}.apexcharts-pie-label-connector,.apexcharts-unit-label-connector{fill:none}.apexcharts-pie-label-delay,.apexcharts-unit-label-delay{opacity:0;animation-name:opaque;animation-duration:.3s;animation-fill-mode:forwards;animation-timing-function:ease}.apexcharts-unit-label-delay{animation-duration:.5s}.apexcharts-radialbar-label{cursor:pointer}.apexcharts-annotation-rect,.apexcharts-area-series .apexcharts-area,.apexcharts-gridline,.apexcharts-line,.apexcharts-point-annotation-label,.apexcharts-radar-series path:not(.apexcharts-marker),.apexcharts-radar-series polygon,.apexcharts-toolbar svg,.apexcharts-tooltip .apexcharts-marker,.apexcharts-xaxis-annotation-label,.apexcharts-yaxis-annotation-label,.apexcharts-zoom-rect,.no-pointer-events{pointer-events:none}.apexcharts-tooltip-active .apexcharts-marker{transition:.15s ease all}.apexcharts-radar-series .apexcharts-yaxis,.apexcharts-bar-goals-markers,.apexcharts-bar-shadows,.apexcharts-rangebar-goals-markers{pointer-events:none}.apexcharts-drilldown-target{cursor:pointer}.apexcharts-breadcrumb{position:absolute;z-index:11;display:inline-flex;align-items:center;gap:2px;font-size:12px;font-family:inherit;padding:2px 4px}.apexcharts-breadcrumb-item{background:transparent;border:none;padding:2px 6px;border-radius:3px;font:inherit;color:inherit;cursor:pointer;line-height:1.2}.apexcharts-breadcrumb-item:hover:not(.apexcharts-breadcrumb-current){background:#00000014}.apexcharts-breadcrumb-arrow{margin-right:4px;font-weight:600;user-select:none}.apexcharts-breadcrumb-current{cursor:default;font-weight:600;opacity:.85}.apexcharts-breadcrumb-separator{opacity:.5;user-select:none}.apexcharts-theme-dark .apexcharts-breadcrumb-item:hover:not(.apexcharts-breadcrumb-current){background:#ffffff1f}.apexcharts-drilldown-loading{position:absolute;inset:0;z-index:12;display:flex;align-items:center;justify-content:center;gap:10px;font-size:13px;font-family:inherit;color:inherit;background:#ffffff9e;cursor:progress}.apexcharts-drilldown-loading-spinner{width:26px;height:26px;border-radius:50%;border:2.5px solid rgba(0,0,0,.16);border-top-color:#0000008c;animation:apexcharts-drilldown-spin .7s linear infinite}.apexcharts-drilldown-loading-text{opacity:.8}.apexcharts-theme-dark .apexcharts-drilldown-loading{background:#1e1e1e9e}.apexcharts-theme-dark .apexcharts-drilldown-loading-spinner{border-color:#ffffff38;border-top-color:#ffffffb3}@keyframes apexcharts-drilldown-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.apexcharts-canvas:not(.apexcharts-ignore-reduced-motion) .apexcharts-drilldown-loading-spinner{animation:apexcharts-drilldown-pulse 1.4s ease-in-out infinite!important}@keyframes apexcharts-drilldown-pulse{0%,to{opacity:.35}50%{opacity:1}}}.apexcharts-disable-transitions *{transition:none!important}.apexcharts-trellis{position:relative}.apexcharts-trellis-grid{display:grid}.apexcharts-trellis-cell{min-width:0;position:relative}.apexcharts-trellis-header{font-size:12px;font-weight:600;line-height:22px;height:22px;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--apx-fore, var(--apx-trellis-fore, #373d3f))}.apexcharts-trellis-title{font-size:14px;font-weight:700;padding:2px 0 6px;color:var(--apx-fore, var(--apx-trellis-fore, #373d3f))}.apexcharts-trellis-mute-y .apexcharts-yaxis,.apexcharts-trellis-mute-x .apexcharts-xaxis{opacity:0}.apexcharts-trellis-has-toolbar{padding-top:24px}.apexcharts-trellis-strip{font-size:12px;font-weight:600;color:var(--apx-fore, var(--apx-trellis-fore, #373d3f));overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.apexcharts-trellis-strip-column{text-align:center;line-height:22px;height:22px;align-self:end}.apexcharts-trellis-strip-row{align-self:center;max-width:140px;padding-right:6px}.apexcharts-trellis-cell-empty{position:relative}.apexcharts-trellis-empty-label{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:12px;color:var(--apx-fore, var(--apx-trellis-fore, #373d3f));opacity:.45;pointer-events:none}.apexcharts-trellis-cell-hidden>*{visibility:hidden}.apexcharts-trellis-gradient-legend{margin:10px auto 0}.apexcharts-trellis-panel.apexcharts-trellis-skeleton{background:var(--apx-fore, var(--apx-trellis-fore, #373d3f));opacity:.05;border-radius:4px}.apexcharts-trellis[data-tooltip-mode=panel] .apexcharts-trellis-cell:not(:hover) .apexcharts-tooltip,.apexcharts-trellis[data-tooltip-mode=panel] .apexcharts-trellis-cell:not(:hover) .apexcharts-xaxistooltip,.apexcharts-trellis[data-tooltip-mode=panel] .apexcharts-trellis-cell:not(:hover) .apexcharts-yaxistooltip{opacity:0!important}.apexcharts-trellis[data-tooltip-mode=grid] .apexcharts-trellis-cell .apexcharts-tooltip,.apexcharts-trellis[data-tooltip-mode=grid] .apexcharts-trellis-cell .apexcharts-xaxistooltip,.apexcharts-trellis[data-tooltip-mode=grid] .apexcharts-trellis-cell .apexcharts-yaxistooltip{opacity:0!important}.apexcharts-trellis-tooltip{position:absolute;top:0;left:0;z-index:14;pointer-events:none;opacity:0;transition:opacity .1s ease;background:var(--apx-bg, #fff);color:var(--apx-fore, var(--apx-trellis-fore, #373d3f));border:1px solid rgba(120,120,120,.25);border-radius:5px;box-shadow:2px 2px 6px -4px #0006;font-size:12px;min-width:140px;max-width:320px}.apexcharts-trellis-tooltip-active{opacity:1}.apexcharts-trellis-tooltip .apexcharts-tooltip-title{padding:5px 10px;font-weight:600;background:#78787814;border-bottom:1px solid rgba(120,120,120,.18);margin-bottom:2px}.apexcharts-trellis-tooltip-row{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:2px 10px;line-height:1.6}.apexcharts-trellis-tooltip-row-active{background:#7878781a;font-weight:600}.apexcharts-trellis-tooltip-key{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.apexcharts-trellis-tooltip-vals{display:flex;gap:10px;white-space:nowrap}.apexcharts-trellis-tooltip-val{display:inline-flex;align-items:center;gap:5px}.apexcharts-trellis-tooltip-marker{width:8px;height:8px;border-radius:50%;display:inline-block;flex:none}.apexcharts-trellis-cell-promoted{grid-column:1 / -1}.apexcharts-trellis-cell-parked{display:none}.apexcharts-trellis-cell-promoted.apexcharts-trellis-mute-y .apexcharts-yaxis,.apexcharts-trellis-cell-promoted.apexcharts-trellis-mute-x .apexcharts-xaxis{opacity:1}.apexcharts-trellis-header-clickable{cursor:pointer}.apexcharts-trellis-header-clickable:hover{text-decoration:underline;text-underline-offset:3px}.apexcharts-trellis-breadcrumb{display:flex;align-items:center;gap:6px;font-size:12px;padding:2px 0 6px;color:var(--apx-fore, var(--apx-trellis-fore, #373d3f))}.apexcharts-trellis-breadcrumb-back{border:none;background:none;padding:0;font-size:12px;cursor:pointer;color:var(--apx-accent, #008ffb)}.apexcharts-trellis-breadcrumb-back:hover{text-decoration:underline}.apexcharts-trellis-breadcrumb-sep{opacity:.5}.apexcharts-trellis-breadcrumb-current{font-weight:600}.apexcharts-trellis-menu{position:absolute;top:26px;right:0;display:none;flex-direction:column;min-width:132px;background:var(--apx-bg, #fff);border:1px solid rgba(120,120,120,.25);border-radius:5px;box-shadow:2px 2px 6px -4px #0006;padding:4px;z-index:15}.apexcharts-trellis-menu-open{display:flex}.apexcharts-trellis-menu-item{border:none;background:none;text-align:left;font-size:12px;padding:5px 8px;border-radius:3px;cursor:pointer;color:var(--apx-fore, var(--apx-trellis-fore, #373d3f))}.apexcharts-trellis-menu-item:hover{background:#7878781f}.apexcharts-trellis-toolbar{position:absolute;top:0;right:0;display:flex;gap:2px;z-index:12}.apexcharts-trellis-tool{border:0;background:transparent;padding:2px;cursor:pointer;border-radius:3px;color:#6e8192;line-height:0}.apexcharts-trellis-tool:hover{color:var(--apx-fore, var(--apx-trellis-fore, #373d3f))}.apexcharts-trellis-tool.apexcharts-selected{color:var(--apx-accent, #008ffb)}.apexcharts-trellis-legend{display:flex;flex-wrap:wrap;justify-content:center;gap:4px 14px;padding:8px 10px 2px}.apexcharts-trellis-legend-item{display:flex;align-items:center;gap:6px;cursor:pointer;line-height:1}.apexcharts-trellis-legend-item .apexcharts-legend-marker{width:12px;height:12px;border-radius:50%;display:inline-block}.apexcharts-trellis-legend-item .apexcharts-legend-text{font-size:12px;color:var(--apx-fore, var(--apx-trellis-fore, #373d3f))}.apexcharts-trellis-legend-item.apexcharts-inactive-legend{opacity:.45}@media print{.apexcharts-canvas.apexcharts-printing,.apexcharts-canvas.apexcharts-printing svg{max-width:100%!important}.apexcharts-canvas.apexcharts-printing svg{height:auto!important}.apexcharts-canvas.apexcharts-printing{height:auto!important}.apexcharts-toolbar{display:none!important}}';
33742
+ const apexCSS = '@keyframes opaque{0%{opacity:0}to{opacity:1}}.apexcharts-canvas{position:relative;direction:ltr!important;user-select:none;--apexcharts-focus-color: #008FFB}.apexcharts-canvas .apexcharts-theme-dark,.apexcharts-theme-dark.apexcharts-canvas{--apexcharts-focus-color: #FFD500}.apexcharts-canvas.apexcharts-high-contrast,.apexcharts-high-contrast.apexcharts-canvas{--apexcharts-focus-color: #FFFF00}.apexcharts-sr-status{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@media(prefers-reduced-motion:reduce){.apexcharts-canvas:not(.apexcharts-ignore-reduced-motion) *,.apexcharts-canvas:not(.apexcharts-ignore-reduced-motion) *:before,.apexcharts-canvas:not(.apexcharts-ignore-reduced-motion) *:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}.apexcharts-canvas ::-webkit-scrollbar{-webkit-appearance:none;width:6px}.apexcharts-canvas ::-webkit-scrollbar-thumb{border-radius:4px;background-color:#00000080;box-shadow:0 0 1px #ffffff80;-webkit-box-shadow:0 0 1px rgba(255,255,255,.5)}.apexcharts-inner{position:relative}.apexcharts-text tspan{font-family:inherit}rect.legend-mouseover-inactive,.legend-mouseover-inactive rect,.legend-mouseover-inactive path,.legend-mouseover-inactive circle,.legend-mouseover-inactive line,.legend-mouseover-inactive text.apexcharts-yaxis-title-text,.legend-mouseover-inactive text.apexcharts-yaxis-label{transition:.15s ease all;opacity:.2}.apexcharts-crossfilter-dimmed{transition:opacity .25s ease;opacity:var(--apx-cf-dim, .2)}.apexcharts-cf-table{border-collapse:collapse;width:100%;font-size:13px}.apexcharts-cf-table caption{caption-side:bottom;text-align:right;padding:6px 2px;font-size:12px;opacity:.7}.apexcharts-cf-table th,.apexcharts-cf-table td{padding:6px 10px;text-align:left;border-bottom:1px solid rgba(0,0,0,.08)}.apexcharts-cf-table th{font-weight:600;border-bottom-width:2px}.apexcharts-cf-table tbody tr:hover{background:#6366f10f}.apexcharts-canvas{--apx-measure-up: #16a34a;--apx-measure-down: #dc2626;--apx-measure-neutral: #64748b;--apx-measure-guide: #94a3b8}.apexcharts-measure-capture{cursor:crosshair}.apexcharts-canvas{--apx-menu-bg: #ffffff;--apx-menu-fg: #1e293b;--apx-menu-border: #e2e8f0;--apx-menu-hover: #f1f5f9;--apx-menu-shadow: rgba(15, 23, 42, .18)}.apexcharts-context-menu{min-width:168px;padding:4px;border-radius:8px;background:var(--apx-menu-bg);border:1px solid var(--apx-menu-border);box-shadow:0 6px 22px var(--apx-menu-shadow);font-family:Helvetica,Arial,sans-serif;font-size:13px;z-index:20;user-select:none}.apexcharts-context-menu-item{display:block;width:100%;box-sizing:border-box;text-align:left;padding:7px 12px;border:0;border-radius:5px;background:transparent;color:var(--apx-menu-fg);font:inherit;cursor:pointer}.apexcharts-context-menu-item:hover,.apexcharts-context-menu-item--active{background:var(--apx-menu-hover)}.apexcharts-context-menu-item:focus{outline:none}.apexcharts-canvas{--apx-ink-card-bg: #ffffff;--apx-ink-card-fg: #1e293b;--apx-ink-card-border: #e2e8f0;--apx-ink-card-hover: #f1f5f9;--apx-ink-card-accent: #6366f1;--apx-ink-card-shadow: rgba(15, 23, 42, .18)}.apexcharts-ink-card{position:absolute;z-index:25;display:flex;flex-direction:column;gap:6px;padding:8px;border-radius:8px;background:var(--apx-ink-card-bg);border:1px solid var(--apx-ink-card-border);box-shadow:0 6px 22px var(--apx-ink-card-shadow);font-family:Helvetica,Arial,sans-serif;font-size:12px;color:var(--apx-ink-card-fg);user-select:none}.apexcharts-ink-card-row{display:flex;align-items:center;gap:4px}.apexcharts-ink-card input.apexcharts-ink-editor{flex:1 1 auto;width:150px;min-width:0;box-sizing:border-box;padding:4px 6px;font:inherit;color:inherit;background:transparent;border:1px solid var(--apx-ink-card-border);border-radius:5px}.apexcharts-ink-card input.apexcharts-ink-editor:focus{outline:none;border-color:var(--apx-ink-card-accent)}.apexcharts-ink-btn{flex:0 0 auto;width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;padding:0;border:0;border-radius:5px;background:transparent;color:inherit;font:inherit;font-size:12px;line-height:1;cursor:pointer}.apexcharts-ink-btn:hover,.apexcharts-ink-btn--active{background:var(--apx-ink-card-hover)}.apexcharts-ink-btn:focus-visible,.apexcharts-ink-swatch:focus-visible{outline:2px solid var(--apx-ink-card-accent);outline-offset:1px}.apexcharts-ink-btn--bold{font-weight:700}.apexcharts-ink-btn--delete:hover{color:#dc2626}.apexcharts-ink-swatch{flex:0 0 auto;width:16px;height:16px;padding:0;border:1px solid rgba(100,116,139,.45);border-radius:50%;cursor:pointer}.apexcharts-ink-swatch--active{box-shadow:0 0 0 2px var(--apx-ink-card-bg),0 0 0 4px var(--apx-ink-card-accent)}.apexcharts-ink-sep{flex:0 0 auto;width:1px;height:16px;margin:0 2px;background:var(--apx-ink-card-border)}.apexcharts-ink-cardlabel{flex:0 0 auto;font-size:10px;letter-spacing:.4px;text-transform:uppercase;opacity:.65;margin-right:2px}.apexcharts-ink-marker-size{flex:0 0 auto;min-width:16px;text-align:center;font-variant-numeric:tabular-nums}.apexcharts-legend-text{padding-left:15px;margin-left:-15px}.apexcharts-legend-series[role=button]:focus{outline:2px solid var(--apexcharts-focus-color, #008FFB);outline-offset:2px}.apexcharts-legend-series[role=button]:focus:not(:focus-visible){outline:none}.apexcharts-legend-series[role=button]:focus-visible{outline:2px solid var(--apexcharts-focus-color, #008FFB);outline-offset:2px}.apexcharts-series-collapsed{opacity:0}.apexcharts-series-collapsed.apexcharts-series-collapsing{opacity:1}.apexcharts-datalabels.apexcharts-series-collapsing{animation:apexcharts-datalabels-exit var(--apexcharts-dl-exit, .4s) ease-in forwards}@keyframes apexcharts-datalabels-exit{0%{opacity:1}to{opacity:0}}.apexcharts-canvas svg:focus:not(:focus-visible){outline:none}.apexcharts-bar-area.apexcharts-keyboard-focused,.apexcharts-candlestick-area.apexcharts-keyboard-focused,.apexcharts-boxPlot-area.apexcharts-keyboard-focused,.apexcharts-violin-area.apexcharts-keyboard-focused,.apexcharts-rangebar-area.apexcharts-keyboard-focused,.apexcharts-pie-area.apexcharts-keyboard-focused,.apexcharts-heatmap-rect.apexcharts-keyboard-focused,.apexcharts-treemap-rect.apexcharts-keyboard-focused,.apexcharts-keyboard-focus-ring{stroke:var(--apexcharts-focus-color, #008FFB);stroke-width:2;stroke-opacity:1}.apexcharts-keyboard-focus-ring{fill:none;pointer-events:none}.apexcharts-tooltip{--apx-tt-bg: #ffffff;--apx-tt-border: rgba(15, 23, 42, .12);--apx-tt-shadow-dir: 1;--apx-tt-shadow: 0 calc(var(--apx-tt-shadow-dir) * 1px) 2px rgba(15, 23, 42, .06), 0 calc(var(--apx-tt-shadow-dir) * 4px) 8px -2px rgba(15, 23, 42, .1), 0 calc(var(--apx-tt-shadow-dir) * 12px) 20px -8px rgba(15, 23, 42, .14);--apx-tt-arrow-bg: var(--apx-tt-bg);--apx-tt-color: #0f172a;--apx-tt-color-muted: rgba(15, 23, 42, .55);border-radius:8px;background:var(--apx-tt-bg);border:1px solid var(--apx-tt-border);box-shadow:var(--apx-tt-shadow);color:var(--apx-tt-color);cursor:default;font-size:13px;left:0;top:0;opacity:0;pointer-events:none;position:absolute;display:flex;flex-direction:column;padding:2px 0;white-space:nowrap;z-index:12;transition:opacity .12s ease}.apexcharts-tooltip.apexcharts-active{opacity:1;transition:opacity .12s ease}.apexcharts-tooltip.apexcharts-tooltip-interactive.apexcharts-active{pointer-events:auto}.apexcharts-tooltip.apexcharts-active[data-positioned=true]{transition:opacity .12s ease,left .16s ease-out,top .16s ease-out}.apexcharts-tooltip.apexcharts-theme-dark{--apx-tt-bg: #1c1c1f;--apx-tt-border: rgba(255, 255, 255, .16);--apx-tt-shadow: 0 calc(var(--apx-tt-shadow-dir) * 1px) 2px rgba(0, 0, 0, .24), 0 calc(var(--apx-tt-shadow-dir) * 4px) 8px -2px rgba(0, 0, 0, .3), 0 calc(var(--apx-tt-shadow-dir) * 12px) 20px -8px rgba(0, 0, 0, .38);--apx-tt-color: #f3f4f6;--apx-tt-color-muted: rgba(243, 244, 246, .55)}.apexcharts-tooltip *{font-family:inherit}.apexcharts-tooltip.apexcharts-annotation-tooltip{padding:6px 10px;max-width:240px;white-space:normal;line-height:1.4;pointer-events:none;z-index:13}.apexcharts-tooltip-title{padding:8px 12px 4px;font-size:12px;font-weight:600;letter-spacing:.01em;color:var(--apx-tt-color-muted);background:transparent;border-bottom:none;margin-bottom:0}.apexcharts-tooltip.apexcharts-theme-light .apexcharts-tooltip-title,.apexcharts-tooltip.apexcharts-theme-dark .apexcharts-tooltip-title{background:transparent;border-bottom:none}.apexcharts-tooltip.apexcharts-tooltip-fill-series{background:transparent;-webkit-backdrop-filter:none;backdrop-filter:none;border:none;padding:0;overflow:hidden;color:#fff}.apexcharts-tooltip.apexcharts-tooltip-fill-series .apexcharts-tooltip-title{background:#00000038;color:#fff;opacity:1;padding:6px 12px}.apexcharts-tooltip.apexcharts-tooltip-fill-series .apexcharts-tooltip-series-group{color:#fff}.apexcharts-tooltip-arrow{position:absolute;box-sizing:border-box;width:10px;height:10px;background:var(--apx-tt-arrow-bg);transform:rotate(45deg);pointer-events:none;top:calc(var(--apx-tt-arrow-y, calc(50% + 1px) ) - 6px)}.apexcharts-tooltip[data-placement=right] .apexcharts-tooltip-arrow{left:-6px;border-left:1px solid var(--apx-tt-border);border-bottom:1px solid var(--apx-tt-border)}.apexcharts-tooltip[data-placement=left] .apexcharts-tooltip-arrow{right:-6px;border-top:1px solid var(--apx-tt-border);border-right:1px solid var(--apx-tt-border)}.apexcharts-tooltip[data-placement=top] .apexcharts-tooltip-arrow,.apexcharts-tooltip[data-placement=bottom] .apexcharts-tooltip-arrow{top:auto;left:calc(var(--apx-tt-arrow-x, calc(50% + 1px) ) - 6px)}.apexcharts-tooltip[data-placement=top] .apexcharts-tooltip-arrow{bottom:-6px;border-right:1px solid var(--apx-tt-border);border-bottom:1px solid var(--apx-tt-border)}.apexcharts-tooltip[data-placement=bottom] .apexcharts-tooltip-arrow{top:-6px;border-top:1px solid var(--apx-tt-border);border-left:1px solid var(--apx-tt-border)}.apexcharts-tooltip[data-placement=bottom]{--apx-tt-shadow-dir: -1 }.apexcharts-tooltip-text-goals-value,.apexcharts-tooltip-text-y-value,.apexcharts-tooltip-text-z-value{display:inline-block;margin-left:5px;font-weight:600}.apexcharts-tooltip-text-goals-label:empty,.apexcharts-tooltip-text-goals-value:empty,.apexcharts-tooltip-text-y-label:empty,.apexcharts-tooltip-text-y-value:empty,.apexcharts-tooltip-text-z-value:empty,.apexcharts-tooltip-title:empty{display:none}.apexcharts-tooltip-text-goals-label,.apexcharts-tooltip-text-goals-value{padding:6px 0 5px}.apexcharts-tooltip-goals-group,.apexcharts-tooltip-text-goals-label,.apexcharts-tooltip-text-goals-value{display:flex}.apexcharts-tooltip-text-goals-label:not(:empty),.apexcharts-tooltip-text-goals-value:not(:empty){margin-top:-6px}.apexcharts-tooltip-marker{display:inline-flex;align-items:center;justify-content:center;position:relative;width:12px;height:12px;margin-right:6px;vertical-align:middle;color:inherit}.apexcharts-tooltip-marker svg{width:100%;height:100%;display:block}.apexcharts-tooltip-series-group{padding:4px 12px;display:none;gap:8px;text-align:left;justify-content:left;align-items:center}.apexcharts-tooltip-series-group.apexcharts-active .apexcharts-tooltip-marker{opacity:1}.apexcharts-tooltip-series-group.apexcharts-active:last-child,.apexcharts-tooltip-series-group:last-child{padding-bottom:8px}.apexcharts-tooltip-y-group{padding:6px 0 5px}.apexcharts-tooltip.apexcharts-tooltip-compact{padding:3px 8px;font-size:11px;line-height:1.35}.apexcharts-tooltip-compact .apexcharts-tooltip-title{padding:0;font-size:11px;white-space:nowrap}.apexcharts-tooltip-compact .apexcharts-tooltip-series-group,.apexcharts-tooltip-compact .apexcharts-tooltip-series-group.apexcharts-active:last-child,.apexcharts-tooltip-compact .apexcharts-tooltip-series-group:last-child{padding:0;gap:5px}.apexcharts-tooltip-compact .apexcharts-tooltip-y-group{padding:0}.apexcharts-tooltip-compact .apexcharts-tooltip-marker{width:8px;height:8px}.apexcharts-tooltip.apexcharts-tooltip-compact.apexcharts-tooltip-value-only{flex-direction:row;align-items:baseline;gap:6px}.apexcharts-tooltip-value-only .apexcharts-tooltip-marker,.apexcharts-tooltip-value-only .apexcharts-tooltip-text-y-label{display:none}.apexcharts-custom-tooltip,.apexcharts-tooltip-box{padding:4px 8px}.apexcharts-tooltip-boxPlot{display:flex;flex-direction:column-reverse}.apexcharts-tooltip-box>div{margin:4px 0}.apexcharts-tooltip-box span.value{font-weight:700}.apexcharts-tooltip-rangebar{padding:5px 8px}.apexcharts-tooltip-rangebar .category{font-weight:600;color:#777}.apexcharts-tooltip-rangebar .series-name{font-weight:700;display:block;margin-bottom:5px}.apexcharts-tooltip-stream{padding:5px 8px}.apexcharts-tooltip-stream .apexcharts-tooltip-title{background:transparent;border:0;padding:0 0 4px;margin:0;font-weight:700}.apexcharts-tooltip-stream-band{display:flex;align-items:center;gap:5px;line-height:1.6;opacity:.72}.apexcharts-tooltip-stream-band.apexcharts-active{opacity:1;font-weight:700}.apexcharts-tooltip-stream-band .series-name{flex:1 1 auto;margin-right:8px}.apexcharts-tooltip-stream-band .value{font-weight:700;margin-left:auto}.apexcharts-tooltip-stream-total{display:flex;align-items:center;margin-top:4px;padding-top:4px;border-top:1px solid var(--apx-tt-border, rgba(15, 23, 42, .12))}.apexcharts-tooltip-stream-total .series-name{flex:1 1 auto;font-weight:600}.apexcharts-tooltip-stream-total .value{font-weight:700;margin-left:auto}.apexcharts-streamgraph-label{pointer-events:none}.apexcharts-xaxistooltip,.apexcharts-yaxistooltip{--apx-axt-bg: #ffffff;--apx-axt-border: rgba(15, 23, 42, .08);--apx-axt-color: #0f172a;--apx-axt-shadow: 0 4px 12px -4px rgba(15, 23, 42, .18), 0 1px 3px -1px rgba(15, 23, 42, .12);opacity:0;pointer-events:none;color:var(--apx-axt-color);font-size:12px;font-weight:500;text-align:center;border-radius:6px;position:absolute;z-index:10;background:var(--apx-axt-bg);border:1px solid var(--apx-axt-border);box-shadow:var(--apx-axt-shadow)}.apexcharts-xaxistooltip.apexcharts-theme-dark,.apexcharts-yaxistooltip.apexcharts-theme-dark{--apx-axt-bg: #1c1c1f;--apx-axt-border: rgba(255, 255, 255, .1);--apx-axt-color: #f3f4f6;--apx-axt-shadow: 0 4px 12px -4px rgba(0, 0, 0, .55), 0 1px 3px -1px rgba(0, 0, 0, .45) }.apexcharts-xaxistooltip{padding:4px 8px;transition:.15s ease all}.apexcharts-xaxistooltip:after,.apexcharts-xaxistooltip:before{left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.apexcharts-xaxistooltip:after{border-color:transparent;border-width:5px;margin-left:-5px}.apexcharts-xaxistooltip:before{border-color:transparent;border-width:6px;margin-left:-6px}.apexcharts-xaxistooltip-bottom:after,.apexcharts-xaxistooltip-bottom:before{bottom:100%}.apexcharts-xaxistooltip-top:after,.apexcharts-xaxistooltip-top:before{top:100%}.apexcharts-xaxistooltip-bottom:after{border-bottom-color:var(--apx-axt-bg)}.apexcharts-xaxistooltip-bottom:before{border-bottom-color:var(--apx-axt-border)}.apexcharts-xaxistooltip-top:after{border-top-color:var(--apx-axt-bg)}.apexcharts-xaxistooltip-top:before{border-top-color:var(--apx-axt-border)}.apexcharts-xaxistooltip.apexcharts-active{opacity:1;transition:.15s ease all}.apexcharts-yaxistooltip{padding:3px 8px}.apexcharts-yaxistooltip:after,.apexcharts-yaxistooltip:before{top:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.apexcharts-yaxistooltip:after{border-color:transparent;border-width:5px;margin-top:-5px}.apexcharts-yaxistooltip:before{border-color:transparent;border-width:6px;margin-top:-6px}.apexcharts-yaxistooltip-left:after,.apexcharts-yaxistooltip-left:before{left:100%}.apexcharts-yaxistooltip-right:after,.apexcharts-yaxistooltip-right:before{right:100%}.apexcharts-yaxistooltip-left:after{border-left-color:var(--apx-axt-bg)}.apexcharts-yaxistooltip-left:before{border-left-color:var(--apx-axt-border)}.apexcharts-yaxistooltip-right:after{border-right-color:var(--apx-axt-bg)}.apexcharts-yaxistooltip-right:before{border-right-color:var(--apx-axt-border)}.apexcharts-yaxistooltip.apexcharts-active{opacity:1}.apexcharts-yaxistooltip-hidden{display:none}.apexcharts-xcrosshairs,.apexcharts-ycrosshairs{pointer-events:none;opacity:0;transition:.15s ease all}.apexcharts-xcrosshairs.apexcharts-active,.apexcharts-ycrosshairs.apexcharts-active{opacity:1;transition:.15s ease all}.apexcharts-ycrosshairs-hidden{opacity:0}.apexcharts-selection-rect{cursor:move}.svg_select_shape{stroke-width:1;stroke-dasharray:10 10;stroke:#000;stroke-opacity:.1;pointer-events:none;fill:none}.svg_select_handle{stroke-width:3;stroke:#000;fill:none}.svg_select_handle_r{cursor:e-resize}.svg_select_handle_l{cursor:w-resize}.apexcharts-svg.apexcharts-zoomable.hovering-zoom{cursor:crosshair}.apexcharts-svg.apexcharts-zoomable.hovering-pan{cursor:move}.apexcharts-wheel-hint{position:absolute;inset:0;z-index:12;display:flex;align-items:center;justify-content:center;pointer-events:none;opacity:0;transition:opacity .2s ease}.apexcharts-wheel-hint-visible{opacity:1}.apexcharts-wheel-hint span{padding:6px 12px;border-radius:8px;font-size:13px;color:#fff;background:#1c1c1fd1}.apexcharts-theme-dark .apexcharts-wheel-hint span{color:#1c1c1f;background:#ffffffe6}@media(prefers-reduced-motion:reduce){.apexcharts-wheel-hint{transition:none}}.apexcharts-menu-icon,.apexcharts-measure-icon,.apexcharts-pan-icon,.apexcharts-reset-icon,.apexcharts-selection-icon,.apexcharts-toolbar-custom-icon,.apexcharts-zoom-icon,.apexcharts-zoomin-icon,.apexcharts-zoomout-icon{cursor:pointer;width:26px;height:24px;line-height:24px;color:#6e8192;text-align:center;padding:0;margin:0;background:transparent;border:0;border-radius:5px;display:inline-flex;align-items:center;justify-content:center;transition:background-color .12s ease,color .12s ease}.apexcharts-menu-icon svg,.apexcharts-measure-icon svg,.apexcharts-pan-icon svg,.apexcharts-reset-icon svg,.apexcharts-selection-icon svg,.apexcharts-zoom-icon svg,.apexcharts-zoomin-icon svg,.apexcharts-zoomout-icon svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}.apexcharts-theme-dark .apexcharts-menu-icon,.apexcharts-theme-dark .apexcharts-measure-icon,.apexcharts-theme-dark .apexcharts-pan-icon,.apexcharts-theme-dark .apexcharts-reset-icon,.apexcharts-theme-dark .apexcharts-selection-icon,.apexcharts-theme-dark .apexcharts-toolbar-custom-icon,.apexcharts-theme-dark .apexcharts-zoom-icon,.apexcharts-theme-dark .apexcharts-zoomin-icon,.apexcharts-theme-dark .apexcharts-zoomout-icon{color:#d4d6dc}.apexcharts-canvas .apexcharts-measure-icon.apexcharts-selected,.apexcharts-canvas .apexcharts-pan-icon.apexcharts-selected,.apexcharts-canvas .apexcharts-reset-zoom-icon.apexcharts-selected,.apexcharts-canvas .apexcharts-selection-icon.apexcharts-selected,.apexcharts-canvas .apexcharts-zoom-icon.apexcharts-selected{background:#008ffb1f;color:#008ffb}.apexcharts-theme-light .apexcharts-menu-icon:hover,.apexcharts-theme-light .apexcharts-measure-icon:not(.apexcharts-selected):hover,.apexcharts-theme-light .apexcharts-pan-icon:not(.apexcharts-selected):hover,.apexcharts-theme-light .apexcharts-reset-icon:hover,.apexcharts-theme-light .apexcharts-selection-icon:not(.apexcharts-selected):hover,.apexcharts-theme-light .apexcharts-zoom-icon:not(.apexcharts-selected):hover,.apexcharts-theme-light .apexcharts-zoomin-icon:hover,.apexcharts-theme-light .apexcharts-zoomout-icon:hover{background:#0f172a0f;color:#1f2937}.apexcharts-theme-dark .apexcharts-menu-icon:hover,.apexcharts-theme-dark .apexcharts-measure-icon:not(.apexcharts-selected):hover,.apexcharts-theme-dark .apexcharts-pan-icon:not(.apexcharts-selected):hover,.apexcharts-theme-dark .apexcharts-reset-icon:hover,.apexcharts-theme-dark .apexcharts-selection-icon:not(.apexcharts-selected):hover,.apexcharts-theme-dark .apexcharts-zoom-icon:not(.apexcharts-selected):hover,.apexcharts-theme-dark .apexcharts-zoomin-icon:hover,.apexcharts-theme-dark .apexcharts-zoomout-icon:hover{background:#ffffff14;color:#fff}.apexcharts-menu-icon,.apexcharts-selection-icon{position:relative}.apexcharts-toolbar{position:absolute;z-index:11;display:inline-flex;align-items:center;gap:1px;padding:3px;border-radius:8px;background:#ffffffd9;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}.apexcharts-theme-dark .apexcharts-toolbar{background:#1c1c1fd1}.apexcharts-menu{background:#fffffff2;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);position:absolute;top:calc(100% + 4px);border:1px solid rgba(15,23,42,.08);border-radius:8px;padding:4px;right:0;opacity:0;min-width:120px;transition:opacity .15s ease,transform .15s ease;transform:translateY(-2px);pointer-events:none;box-shadow:0 4px 16px -4px #0f172a1f,0 2px 4px -1px #0f172a0f}.apexcharts-menu.apexcharts-menu-open{opacity:1;transform:translateY(0);pointer-events:all}.apexcharts-menu-item{padding:6px 9px;font-size:12px;border-radius:5px;cursor:pointer}.apexcharts-theme-light .apexcharts-menu-item:hover{background:#0f172a0f}.apexcharts-theme-dark .apexcharts-menu{background:#1c1c1feb;border-color:#ffffff14;color:#f3f4f6;box-shadow:0 4px 16px -4px #00000080,0 2px 4px -1px #0006}.apexcharts-theme-dark .apexcharts-menu-item:hover{background:#ffffff14}@media screen and (min-width:768px){.apexcharts-canvas:hover .apexcharts-toolbar{opacity:1}}.apexcharts-toolbar:focus-within{opacity:1}.apexcharts-menu-icon:focus-visible,.apexcharts-measure-icon:focus-visible,.apexcharts-pan-icon:focus-visible,.apexcharts-reset-icon:focus-visible,.apexcharts-selection-icon:focus-visible,.apexcharts-toolbar-custom-icon:focus-visible,.apexcharts-zoom-icon:focus-visible,.apexcharts-zoomin-icon:focus-visible,.apexcharts-zoomout-icon:focus-visible{outline:2px solid var(--apexcharts-focus-color, #008FFB);outline-offset:1px;border-radius:5px}.apexcharts-menu-item:focus-visible{outline:2px solid var(--apexcharts-focus-color, #008FFB);outline-offset:-2px;background:#eee}.apexcharts-canvas .apexcharts-element-hidden,.apexcharts-datalabel.apexcharts-element-hidden,.apexcharts-hide .apexcharts-series-points{opacity:0}.apexcharts-hidden-element-shown{opacity:1;transition:.25s ease all}.apexcharts-datalabel,.apexcharts-datalabel-label,.apexcharts-datalabel-value,.apexcharts-datalabels,.apexcharts-pie-label,.apexcharts-pie-name-label,.apexcharts-pie-name-label-group,.apexcharts-pie-label-connector,.apexcharts-unit-outer-label,.apexcharts-unit-outer-label-group,.apexcharts-unit-label-connector{cursor:default;pointer-events:none}.apexcharts-pie-label-connector,.apexcharts-unit-label-connector{fill:none}.apexcharts-pie-label-delay,.apexcharts-unit-label-delay{opacity:0;animation-name:opaque;animation-duration:.3s;animation-fill-mode:forwards;animation-timing-function:ease}.apexcharts-unit-label-delay{animation-duration:.5s}.apexcharts-radialbar-label{cursor:pointer}.apexcharts-annotation-rect,.apexcharts-area-series .apexcharts-area,.apexcharts-gridline,.apexcharts-line,.apexcharts-point-annotation-label,.apexcharts-radar-series path:not(.apexcharts-marker),.apexcharts-radar-series polygon,.apexcharts-toolbar svg,.apexcharts-tooltip .apexcharts-marker,.apexcharts-xaxis-annotation-label,.apexcharts-yaxis-annotation-label,.apexcharts-zoom-rect,.no-pointer-events{pointer-events:none}.apexcharts-tooltip-active .apexcharts-marker{transition:.15s ease all}.apexcharts-radar-series .apexcharts-yaxis,.apexcharts-bar-goals-markers,.apexcharts-bar-shadows,.apexcharts-rangebar-goals-markers{pointer-events:none}.apexcharts-drilldown-target{cursor:pointer}.apexcharts-breadcrumb{position:absolute;z-index:11;display:inline-flex;align-items:center;gap:2px;font-size:12px;font-family:inherit;padding:2px 4px}.apexcharts-breadcrumb-item{background:transparent;border:none;padding:2px 6px;border-radius:3px;font:inherit;color:inherit;cursor:pointer;line-height:1.2}.apexcharts-breadcrumb-item:hover:not(.apexcharts-breadcrumb-current){background:#00000014}.apexcharts-breadcrumb-arrow{margin-right:4px;font-weight:600;user-select:none}.apexcharts-breadcrumb-current{cursor:default;font-weight:600;opacity:.85}.apexcharts-breadcrumb-separator{opacity:.5;user-select:none}.apexcharts-theme-dark .apexcharts-breadcrumb-item:hover:not(.apexcharts-breadcrumb-current){background:#ffffff1f}.apexcharts-drilldown-loading{position:absolute;inset:0;z-index:12;display:flex;align-items:center;justify-content:center;gap:10px;font-size:13px;font-family:inherit;color:inherit;background:#ffffff9e;cursor:progress}.apexcharts-drilldown-loading-spinner{width:26px;height:26px;border-radius:50%;border:2.5px solid rgba(0,0,0,.16);border-top-color:#0000008c;animation:apexcharts-drilldown-spin .7s linear infinite}.apexcharts-drilldown-loading-text{opacity:.8}.apexcharts-theme-dark .apexcharts-drilldown-loading{background:#1e1e1e9e}.apexcharts-theme-dark .apexcharts-drilldown-loading-spinner{border-color:#ffffff38;border-top-color:#ffffffb3}@keyframes apexcharts-drilldown-spin{to{transform:rotate(360deg)}}@media(prefers-reduced-motion:reduce){.apexcharts-canvas:not(.apexcharts-ignore-reduced-motion) .apexcharts-drilldown-loading-spinner{animation:apexcharts-drilldown-pulse 1.4s ease-in-out infinite!important}@keyframes apexcharts-drilldown-pulse{0%,to{opacity:.35}50%{opacity:1}}}.apexcharts-disable-transitions *{transition:none!important}.apexcharts-trellis{position:relative}.apexcharts-trellis-grid{display:grid}.apexcharts-trellis-cell{min-width:0;position:relative}.apexcharts-trellis-header{font-size:12px;font-weight:600;line-height:22px;height:22px;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--apx-fore, var(--apx-trellis-fore, #373d3f))}.apexcharts-trellis-title{font-size:14px;font-weight:700;padding:2px 0 6px;color:var(--apx-fore, var(--apx-trellis-fore, #373d3f))}.apexcharts-trellis-mute-y .apexcharts-yaxis,.apexcharts-trellis-mute-x .apexcharts-xaxis{opacity:0}.apexcharts-trellis-has-toolbar{padding-top:24px}.apexcharts-trellis-strip{font-size:12px;font-weight:600;color:var(--apx-fore, var(--apx-trellis-fore, #373d3f));overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.apexcharts-trellis-strip-column{text-align:center;line-height:22px;height:22px;align-self:end}.apexcharts-trellis-strip-row{align-self:center;max-width:140px;padding-right:6px}.apexcharts-trellis-cell-empty{position:relative}.apexcharts-trellis-empty-label{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:12px;color:var(--apx-fore, var(--apx-trellis-fore, #373d3f));opacity:.45;pointer-events:none}.apexcharts-trellis-cell-hidden>*{visibility:hidden}.apexcharts-trellis-gradient-legend{margin:10px auto 0}.apexcharts-trellis-panel.apexcharts-trellis-skeleton{background:var(--apx-fore, var(--apx-trellis-fore, #373d3f));opacity:.05;border-radius:4px}.apexcharts-trellis[data-tooltip-mode=panel] .apexcharts-trellis-cell:not(:hover) .apexcharts-tooltip,.apexcharts-trellis[data-tooltip-mode=panel] .apexcharts-trellis-cell:not(:hover) .apexcharts-xaxistooltip,.apexcharts-trellis[data-tooltip-mode=panel] .apexcharts-trellis-cell:not(:hover) .apexcharts-yaxistooltip{opacity:0!important}.apexcharts-trellis[data-tooltip-mode=grid] .apexcharts-trellis-cell .apexcharts-tooltip,.apexcharts-trellis[data-tooltip-mode=grid] .apexcharts-trellis-cell .apexcharts-xaxistooltip,.apexcharts-trellis[data-tooltip-mode=grid] .apexcharts-trellis-cell .apexcharts-yaxistooltip{opacity:0!important}.apexcharts-trellis-tooltip{position:absolute;top:0;left:0;z-index:14;pointer-events:none;opacity:0;transition:opacity .1s ease;background:var(--apx-bg, #fff);color:var(--apx-fore, var(--apx-trellis-fore, #373d3f));border:1px solid rgba(120,120,120,.25);border-radius:5px;box-shadow:2px 2px 6px -4px #0006;font-size:12px;min-width:140px;max-width:320px}.apexcharts-trellis-tooltip-active{opacity:1}.apexcharts-trellis-tooltip .apexcharts-tooltip-title{padding:5px 10px;font-weight:600;background:#78787814;border-bottom:1px solid rgba(120,120,120,.18);margin-bottom:2px}.apexcharts-trellis-tooltip-row{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:2px 10px;line-height:1.6}.apexcharts-trellis-tooltip-row-active{background:#7878781a;font-weight:600}.apexcharts-trellis-tooltip-key{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.apexcharts-trellis-tooltip-vals{display:flex;gap:10px;white-space:nowrap}.apexcharts-trellis-tooltip-val{display:inline-flex;align-items:center;gap:5px}.apexcharts-trellis-tooltip-marker{width:8px;height:8px;border-radius:50%;display:inline-block;flex:none}.apexcharts-trellis-cell-promoted{grid-column:1 / -1}.apexcharts-trellis-cell-parked{display:none}.apexcharts-trellis-cell-promoted.apexcharts-trellis-mute-y .apexcharts-yaxis,.apexcharts-trellis-cell-promoted.apexcharts-trellis-mute-x .apexcharts-xaxis{opacity:1}.apexcharts-trellis-header-clickable{cursor:pointer}.apexcharts-trellis-header-clickable:hover{text-decoration:underline;text-underline-offset:3px}.apexcharts-trellis-breadcrumb{display:flex;align-items:center;gap:6px;font-size:12px;padding:2px 0 6px;color:var(--apx-fore, var(--apx-trellis-fore, #373d3f))}.apexcharts-trellis-breadcrumb-back{border:none;background:none;padding:0;font-size:12px;cursor:pointer;color:var(--apx-accent, #008ffb)}.apexcharts-trellis-breadcrumb-back:hover{text-decoration:underline}.apexcharts-trellis-breadcrumb-sep{opacity:.5}.apexcharts-trellis-breadcrumb-current{font-weight:600}.apexcharts-trellis-menu{position:absolute;top:26px;right:0;display:none;flex-direction:column;min-width:132px;background:var(--apx-bg, #fff);border:1px solid rgba(120,120,120,.25);border-radius:5px;box-shadow:2px 2px 6px -4px #0006;padding:4px;z-index:15}.apexcharts-trellis-menu-open{display:flex}.apexcharts-trellis-menu-item{border:none;background:none;text-align:left;font-size:12px;padding:5px 8px;border-radius:3px;cursor:pointer;color:var(--apx-fore, var(--apx-trellis-fore, #373d3f))}.apexcharts-trellis-menu-item:hover{background:#7878781f}.apexcharts-trellis-toolbar{position:absolute;top:0;right:0;display:flex;gap:2px;z-index:12}.apexcharts-trellis-tool{border:0;background:transparent;padding:2px;cursor:pointer;border-radius:3px;color:#6e8192;line-height:0}.apexcharts-trellis-tool:hover{color:var(--apx-fore, var(--apx-trellis-fore, #373d3f))}.apexcharts-trellis-tool.apexcharts-selected{color:var(--apx-accent, #008ffb)}.apexcharts-trellis-legend{display:flex;flex-wrap:wrap;justify-content:center;gap:4px 14px;padding:8px 10px 2px}.apexcharts-trellis-legend-item{display:flex;align-items:center;gap:6px;cursor:pointer;line-height:1}.apexcharts-trellis-legend-item .apexcharts-legend-marker{width:12px;height:12px;border-radius:50%;display:inline-block}.apexcharts-trellis-legend-item .apexcharts-legend-text{font-size:12px;color:var(--apx-fore, var(--apx-trellis-fore, #373d3f))}.apexcharts-trellis-legend-item.apexcharts-inactive-legend{opacity:.45}@media print{.apexcharts-canvas.apexcharts-printing,.apexcharts-canvas.apexcharts-printing svg{max-width:100%!important}.apexcharts-canvas.apexcharts-printing svg{height:auto!important}.apexcharts-canvas.apexcharts-printing{height:auto!important}.apexcharts-toolbar{display:none!important}}';
33644
33743
  const e = globalThis.console;
33645
33744
  function t(t2, ...s2) {
33646
33745
  e.error(t2, ...s2);
@@ -34689,6 +34788,7 @@ var __async = (__this, __arguments, generator) => {
34689
34788
  if (w.config.chart.accessibility.enabled && w.config.chart.accessibility.keyboard.enabled && w.config.chart.accessibility.keyboard.navigation.enabled) {
34690
34789
  (_i = me.keyboardNavigation) == null ? void 0 : _i.init();
34691
34790
  }
34791
+ w.interact.keyNav = null;
34692
34792
  if (Environment.isBrowser() && w.globals.axisCharts && (w.axisFlags.isXNumeric || /** @type {Record<string,any>} */
34693
34793
  w.config.xaxis.convertedCatToNumeric || w.axisFlags.isRangeBar)) {
34694
34794
  if (w.config.chart.zoom.enabled || w.config.chart.selection && w.config.chart.selection.enabled || // @ts-ignore — chart.pan is an internal toolbar config property
@@ -35993,21 +36093,19 @@ var __async = (__this, __arguments, generator) => {
35993
36093
  * Returns the highest y value in the specified series.
35994
36094
  *
35995
36095
  * @param {number} [seriesIndex=0]
35996
- * @returns {number}
36096
+ * @returns {number | undefined}
35997
36097
  */
35998
36098
  getHighestValueInSeries(seriesIndex = 0) {
35999
- const range = new Range(this.w);
36000
- return range.getMinYMaxY(seriesIndex).highestY;
36099
+ return this.w.seriesData.series[seriesIndex] && new Range(this.w).getMinYMaxY(seriesIndex).highestY;
36001
36100
  }
36002
36101
  /**
36003
36102
  * Returns the lowest y value in the specified series.
36004
36103
  *
36005
36104
  * @param {number} [seriesIndex=0]
36006
- * @returns {number}
36105
+ * @returns {number | undefined}
36007
36106
  */
36008
36107
  getLowestValueInSeries(seriesIndex = 0) {
36009
- const range = new Range(this.w);
36010
- return range.getMinYMaxY(seriesIndex).lowestY;
36108
+ return this.w.seriesData.series[seriesIndex] && new Range(this.w).getMinYMaxY(seriesIndex).lowestY;
36011
36109
  }
36012
36110
  /**
36013
36111
  * Returns the sum of each series (the totals used for percentage calculations).
@@ -37434,6 +37532,7 @@ var __async = (__this, __arguments, generator) => {
37434
37532
  toggleDataSeries(seriesCnt, isHidden) {
37435
37533
  var _a, _b, _c;
37436
37534
  const w = this.w;
37535
+ if (!w.dom.baseEl) return;
37437
37536
  if (w.globals.axisCharts || w.config.chart.type === "radialBar") {
37438
37537
  w.globals.resized = true;
37439
37538
  let seriesEl = null;
@@ -37903,9 +38002,11 @@ var __async = (__this, __arguments, generator) => {
37903
38002
  this._min = 0;
37904
38003
  this._max = 0;
37905
38004
  this._geom = null;
38005
+ this._grad = null;
37906
38006
  this._bandHitEls = [];
37907
38007
  this._activeBandIndex = -1;
37908
38008
  this._targetEl = null;
38009
+ this.panelsW = null;
37909
38010
  this._onCellEnter = this._onCellEnter.bind(this);
37910
38011
  this._onCellLeave = this._onCellLeave.bind(this);
37911
38012
  this._onBandEnter = this._onBandEnter.bind(this);
@@ -38020,15 +38121,8 @@ var __async = (__this, __arguments, generator) => {
38020
38121
  linearGrad.setAttribute("x2", "1");
38021
38122
  linearGrad.setAttribute("y2", "0");
38022
38123
  }
38023
- const { min, max, stops, bands } = this._computeStops();
38024
- this._min = min;
38025
- this._max = max;
38026
- stops.forEach((s2) => {
38027
- const stopEl = BrowserAPIs.createElementNS(SVG_NS, "stop");
38028
- stopEl.setAttribute("offset", `${(s2.percent * 100).toFixed(2)}%`);
38029
- stopEl.setAttribute("stop-color", s2.color);
38030
- linearGrad.appendChild(stopEl);
38031
- });
38124
+ this._grad = linearGrad;
38125
+ const { min, max, bands } = this._paintStops();
38032
38126
  defs.appendChild(linearGrad);
38033
38127
  svg.appendChild(defs);
38034
38128
  const rect = BrowserAPIs.createElementNS(SVG_NS, "rect");
@@ -38237,6 +38331,7 @@ var __async = (__this, __arguments, generator) => {
38237
38331
  */
38238
38332
  repositionToPlot() {
38239
38333
  var _a, _b;
38334
+ if (this._grad) this._paintStops();
38240
38335
  if (!Environment.isBrowser()) return;
38241
38336
  if (this._targetEl) return;
38242
38337
  const w = this.w;
@@ -38371,14 +38466,25 @@ var __async = (__this, __arguments, generator) => {
38371
38466
  if (idx < 0 || idx === this._activeBandIndex) return;
38372
38467
  this._activeBandIndex = idx;
38373
38468
  (_d = (_c = (_b = this.ctx) == null ? void 0 : _b.events) == null ? void 0 : _c.fireEvent) == null ? void 0 : _d.call(_c, "legendHover", [this.ctx, idx, w]);
38374
- new Series(w).highlightRangeInSeries(idx, "highlight");
38469
+ this._highlightRange(idx, "highlight");
38375
38470
  }
38376
38471
  /** Leaving a band clears the highlight. */
38377
38472
  _onBandLeave() {
38378
38473
  if (this._activeBandIndex < 0) return;
38379
38474
  const idx = this._activeBandIndex;
38380
38475
  this._activeBandIndex = -1;
38381
- new Series(this.w).highlightRangeInSeries(idx, "reset");
38476
+ this._highlightRange(idx, "reset");
38477
+ }
38478
+ /**
38479
+ * A shared trellis strip sets `panelsW` so a band reaches every panel.
38480
+ * @param {number} idx
38481
+ * @param {'highlight'|'reset'} action
38482
+ */
38483
+ _highlightRange(idx, action) {
38484
+ var _a;
38485
+ (((_a = this.panelsW) == null ? void 0 : _a.call(this)) || [this.w]).forEach(
38486
+ (w) => new Series(w).highlightRangeInSeries(idx, action)
38487
+ );
38382
38488
  }
38383
38489
  _attachHoverListeners() {
38384
38490
  var _a, _b;
@@ -38400,10 +38506,10 @@ var __async = (__this, __arguments, generator) => {
38400
38506
  */
38401
38507
  _onCellEnter(...args) {
38402
38508
  var _a, _b, _c;
38403
- const w = this.w;
38404
38509
  if (!this.arrowEl) return;
38405
38510
  const opts = args[args.length - 1];
38406
38511
  if (!opts || typeof opts !== "object") return;
38512
+ const w = opts.w || this.w;
38407
38513
  const i2 = opts.seriesIndex;
38408
38514
  const j2 = opts.dataPointIndex;
38409
38515
  if (typeof i2 !== "number" || typeof j2 !== "number") return;
@@ -38515,6 +38621,21 @@ var __async = (__this, __arguments, generator) => {
38515
38621
  polygon.setAttribute("pointer-events", "none");
38516
38622
  return polygon;
38517
38623
  }
38624
+ /** (Re)write the strip's stops; returns `_computeStops()`. */
38625
+ _paintStops() {
38626
+ const r2 = this._computeStops();
38627
+ const grad = this._grad;
38628
+ this._min = r2.min;
38629
+ this._max = r2.max;
38630
+ grad.innerHTML = "";
38631
+ r2.stops.forEach((s2) => {
38632
+ const stopEl = BrowserAPIs.createElementNS(SVG_NS, "stop");
38633
+ stopEl.setAttribute("offset", `${(s2.percent * 100).toFixed(2)}%`);
38634
+ stopEl.setAttribute("stop-color", s2.color);
38635
+ grad.appendChild(stopEl);
38636
+ });
38637
+ return r2;
38638
+ }
38518
38639
  /**
38519
38640
  * Build gradient stops + return effective min/max.
38520
38641
  * - If `colorScale.ranges` is set, stops are placed at each range boundary
@@ -38556,7 +38677,8 @@ var __async = (__this, __arguments, generator) => {
38556
38677
  if (!Number.isFinite(dataMax)) dataMax = 0;
38557
38678
  let min = dataMin;
38558
38679
  let max = dataMax;
38559
- if (typeof cs.min !== "undefined" && typeof cs.max !== "undefined" && cs.max > cs.min) {
38680
+ const csWindow = typeof cs.min !== "undefined" && typeof cs.max !== "undefined" && cs.max > cs.min;
38681
+ if (csWindow) {
38560
38682
  min = cs.min;
38561
38683
  max = cs.max;
38562
38684
  } else {
@@ -38587,34 +38709,30 @@ var __async = (__this, __arguments, generator) => {
38587
38709
  } else {
38588
38710
  const baseColor = w.globals.colors[0] || "#008FFB";
38589
38711
  const utils = new Utils$1();
38590
- const plot = w.config.plotOptions[w.config.chart.type] || {};
38712
+ const type = w.config.chart.type;
38713
+ const plot = w.config.plotOptions[type] || {};
38591
38714
  const shadeIntensity = (_b = plot.shadeIntensity) != null ? _b : 0.5;
38592
- const hasNegs = (
38715
+ const g = (
38593
38716
  /** @type {any} */
38594
- w.globals.hasNegs
38717
+ w.globals
38595
38718
  );
38719
+ const hasNegs = g.hasNegs;
38720
+ const yExt = type === "heatmap" && !plot.distributed && !csWindow && g.maxY >= g.minY;
38721
+ const hi = yExt ? g.maxY : max;
38722
+ const total = Math.abs(hi) + Math.abs(yExt ? cs.min < g.minY ? cs.min : g.minY : min);
38723
+ const k2 = shadeIntensity * 1.25;
38596
38724
  const n2 = Math.max(2, cfg.stops || 16);
38597
38725
  for (let s2 = 0; s2 < n2; s2++) {
38598
38726
  const t2 = s2 / (n2 - 1);
38599
- const v = min + t2 * (max - min);
38600
- const total = Math.abs(max) + Math.abs(min);
38601
- const percent_v = total === 0 ? 0 : 100 * v / total;
38602
- let colorShadePercent;
38603
- if (hasNegs) {
38604
- if (plot.reverseNegativeShade) {
38605
- colorShadePercent = percent_v < 0 ? percent_v / 100 * (shadeIntensity * 1.25) : (1 - percent_v / 100) * (shadeIntensity * 1.25);
38606
- } else {
38607
- colorShadePercent = percent_v <= 0 ? 1 - (1 + percent_v / 100) * shadeIntensity : (1 - percent_v / 100) * shadeIntensity;
38608
- }
38609
- } else {
38610
- colorShadePercent = 1 - percent_v / 100;
38611
- }
38612
- if (colorShadePercent > 1) colorShadePercent = 1;
38613
- if (colorShadePercent < -1) colorShadePercent = -1;
38614
- const shaded = plot.enableShades ? utils.shadeColor(
38615
- w.config.theme.mode === "dark" ? colorShadePercent * -1 : colorShadePercent,
38616
- baseColor
38617
- ) : baseColor;
38727
+ const p = total === 0 ? 0 : Math.min(min + t2 * (max - min), hi) / total;
38728
+ const c = Math.max(
38729
+ -1,
38730
+ Math.min(
38731
+ 1,
38732
+ hasNegs ? plot.reverseNegativeShade ? (p < 0 ? p : 1 - p) * k2 : p <= 0 ? 1 - (1 + p) * shadeIntensity : (1 - p) * shadeIntensity : (1 - p) * (type === "treemap" ? k2 : 1)
38733
+ )
38734
+ );
38735
+ const shaded = plot.enableShades ? utils.shadeColor(w.config.theme.mode === "dark" ? -c : c, baseColor) : baseColor;
38618
38736
  stops.push({ percent: t2, color: shaded });
38619
38737
  }
38620
38738
  }
@@ -38644,9 +38762,12 @@ var __async = (__this, __arguments, generator) => {
38644
38762
  this.legendHelpers = new Helpers$3(this);
38645
38763
  }
38646
38764
  init() {
38765
+ var _a;
38647
38766
  const w = this.w;
38648
38767
  const gl = w.globals;
38649
38768
  const cnf = w.config;
38769
+ (_a = this.heatmapGradientLegend) == null ? void 0 : _a.destroy();
38770
+ this.heatmapGradientLegend = null;
38650
38771
  this.isBarsDistributed = cnf.chart.type === "bar" && cnf.plotOptions.bar.distributed && cnf.series.length === 1;
38651
38772
  const showLegendAlways = cnf.legend.showForSingleSeries && this.w.seriesData.series.length === 1 || this.isBarsDistributed || // Heatmap legends are colorScale-driven (discrete ranges or the
38652
38773
  // gradient strip), not series-driven, so they must render even for a
@@ -38664,10 +38785,6 @@ var __async = (__this, __arguments, generator) => {
38664
38785
  while (elLegendWrap.firstChild) {
38665
38786
  elLegendWrap.removeChild(elLegendWrap.firstChild);
38666
38787
  }
38667
- if (this.heatmapGradientLegend) {
38668
- this.heatmapGradientLegend.destroy();
38669
- this.heatmapGradientLegend = null;
38670
- }
38671
38788
  if (HeatmapGradientLegend.isEnabled(w)) {
38672
38789
  this.heatmapGradientLegend = new HeatmapGradientLegend(w, this.ctx);
38673
38790
  this.heatmapGradientLegend.draw();
@@ -38845,7 +38962,7 @@ var __async = (__this, __arguments, generator) => {
38845
38962
  }
38846
38963
  }
38847
38964
  const lg = legendGroups[w.labelData.seriesGroupIndex[i2]];
38848
- if (lg) elLegendWrap.appendChild(lg);
38965
+ if (lg && !lg.parentNode) elLegendWrap.appendChild(lg);
38849
38966
  (lg || elLegendWrap).appendChild(elLegend);
38850
38967
  elLegendWrap.classList.add(
38851
38968
  `apexcharts-align-${w.config.legend.horizontalAlign}`
@@ -38956,7 +39073,7 @@ var __async = (__this, __arguments, generator) => {
38956
39073
  );
38957
39074
  const hoverOverLegend = isLegendItem(target);
38958
39075
  if (w.config.chart.type !== "heatmap" && !this.isBarsDistributed) {
38959
- if (!target.classList.contains("apexcharts-inactive-legend") && hoverOverLegend) {
39076
+ if (hoverOverLegend && !target.closest(".apexcharts-inactive-legend")) {
38960
39077
  const series = new Series(this.ctx.w);
38961
39078
  series.toggleSeriesOnHover(e2, target);
38962
39079
  }
@@ -38990,7 +39107,8 @@ var __async = (__this, __arguments, generator) => {
38990
39107
  me.onLegendClick(e2);
38991
39108
  if (rel !== null && w.config.legend.onItemClick.toggleDataSeries) {
38992
39109
  requestAnimationFrame(() => {
38993
- const restored = w.dom.baseEl.querySelector(
39110
+ var _a;
39111
+ const restored = (_a = w.dom.baseEl) == null ? void 0 : _a.querySelector(
38994
39112
  `.apexcharts-legend-series[rel="${rel}"]`
38995
39113
  );
38996
39114
  if (restored) restored.focus();
@@ -40027,6 +40145,63 @@ var __async = (__this, __arguments, generator) => {
40027
40145
  const { zoom } = this.w.config.chart;
40028
40146
  return this._incidentalZoomEnabled(zoom && zoom.allowMouseWheelZoom);
40029
40147
  }
40148
+ /** An explicit `true` zooms on every wheel; 'auto' needs Ctrl/Cmd. */
40149
+ _wheelZoomGreedy() {
40150
+ return this.w.config.chart.zoom.allowMouseWheelZoom === true;
40151
+ }
40152
+ /**
40153
+ * Tell a viewer whose bare wheel just scrolled past the chart how to zoom it.
40154
+ * Shown over the chart while the scroll goes on and faded out shortly after
40155
+ * it stops. Only for a mostly vertical wheel: a sideways trackpad swipe is
40156
+ * not someone reaching for zoom.
40157
+ *
40158
+ * The node lives in elWrap and the timer on w.interact, since a re-render can
40159
+ * replace both this instance and the wrapper's contents while it is up.
40160
+ *
40161
+ * @param {any} e
40162
+ */
40163
+ _showWheelHint(e2) {
40164
+ const w = this.w;
40165
+ if (w.config.chart.zoom.wheelHint === false) return;
40166
+ if (Math.abs(e2.deltaY) <= Math.abs(e2.deltaX)) return;
40167
+ const wrap = w.dom.elWrap;
40168
+ if (!wrap) return;
40169
+ let el = wrap.querySelector(".apexcharts-wheel-hint");
40170
+ if (!el) {
40171
+ const win = BrowserAPIs.getWindow();
40172
+ const nav = win && win.navigator;
40173
+ const mac = !!nav && /Mac|iPhone|iPad/.test(nav.platform || nav.userAgent);
40174
+ const text = (w.globals.locale.toolbar.wheelZoomHint || "").replace(
40175
+ "{key}",
40176
+ mac ? "⌘" : "Ctrl"
40177
+ );
40178
+ el = BrowserAPIs.createElement("div");
40179
+ el.className = "apexcharts-wheel-hint";
40180
+ el.setAttribute("aria-hidden", "true");
40181
+ const label = BrowserAPIs.createElement("span");
40182
+ label.textContent = text;
40183
+ label.style.fontFamily = w.config.chart.fontFamily;
40184
+ el.appendChild(label);
40185
+ wrap.appendChild(el);
40186
+ void /** @type {HTMLElement} */
40187
+ el.offsetWidth;
40188
+ }
40189
+ el.classList.add("apexcharts-wheel-hint-visible");
40190
+ const it = w.interact;
40191
+ if (it.wheelHintTimer) clearTimeout(it.wheelHintTimer);
40192
+ it.wheelHintTimer = setTimeout(() => this._hideWheelHint(), 1200);
40193
+ }
40194
+ _hideWheelHint() {
40195
+ var _a;
40196
+ const w = this.w;
40197
+ const it = w.interact;
40198
+ if (it.wheelHintTimer) {
40199
+ clearTimeout(it.wheelHintTimer);
40200
+ it.wheelHintTimer = null;
40201
+ }
40202
+ const el = (_a = w.dom.elWrap) == null ? void 0 : _a.querySelector(".apexcharts-wheel-hint");
40203
+ if (el) el.classList.remove("apexcharts-wheel-hint-visible");
40204
+ }
40030
40205
  /**
40031
40206
  * Put keyboard focus on the chart, where the chart is focusable at all.
40032
40207
  *
@@ -40098,8 +40273,13 @@ var __async = (__this, __arguments, generator) => {
40098
40273
  * @param {any} e
40099
40274
  */
40100
40275
  mouseWheelEvent(e2) {
40101
- e2.preventDefault();
40102
40276
  const st = this._wheel();
40277
+ if (!this._wheelZoomGreedy() && !e2.ctrlKey && !e2.metaKey && st.endTimer == null) {
40278
+ this._showWheelHint(e2);
40279
+ return;
40280
+ }
40281
+ e2.preventDefault();
40282
+ this._hideWheelHint();
40103
40283
  let dy = e2.deltaY;
40104
40284
  if (e2.deltaMode === 1) dy *= 33;
40105
40285
  else if (e2.deltaMode === 2) dy *= 330;
@@ -40863,6 +41043,34 @@ var __async = (__this, __arguments, generator) => {
40863
41043
  w.config.chart.events.scrolled(this.ctx, args);
40864
41044
  this.ctx.events.fireEvent("scrolled", args);
40865
41045
  }
41046
+ /**
41047
+ * Pan a zoomed x-window by `fraction` of its width (keyboard Shift+Arrow),
41048
+ * clamped to the data as a drag pan is, and reported as one (`scrolled`).
41049
+ * @param {number} fraction
41050
+ */
41051
+ panBy(fraction) {
41052
+ const w = this.w;
41053
+ if (!w.interact.zoomed) return;
41054
+ const { min, max } = this._currentXWindow();
41055
+ let d = (max - min) * fraction;
41056
+ if (w.config.xaxis.convertedCatToNumeric) {
41057
+ d = d > 0 ? Math.ceil(d) : Math.floor(d);
41058
+ }
41059
+ if (w.axisFlags.isRangeBar) {
41060
+ const r2 = w.rangeData;
41061
+ let lo = Infinity;
41062
+ let hi = -Infinity;
41063
+ r2.seriesRangeStart.concat(r2.seriesRangeEnd).flat().forEach((y) => {
41064
+ if (y != null) {
41065
+ lo = Math.min(lo, y);
41066
+ hi = Math.max(hi, y);
41067
+ }
41068
+ });
41069
+ d = d > 0 ? Math.min(d, Math.max(0, hi - max)) : Math.max(d, Math.min(0, lo - min));
41070
+ if (!d) return;
41071
+ }
41072
+ if (this._applyXRange(min + d, max + d, false)) this._fireScrolled();
41073
+ }
40866
41074
  /** @param {number} x @param {number} t */
40867
41075
  _pushSample(x2, t2) {
40868
41076
  const s2 = this._m().samples;
@@ -42327,16 +42535,35 @@ var __async = (__this, __arguments, generator) => {
42327
42535
  });
42328
42536
  svgEl.addEventListener("keydown", this._onKeyDown, { passive: false });
42329
42537
  this.ctx.events.addEventListener("legendClick", this._onLegendClick);
42538
+ const kept = w.interact.keyNav;
42539
+ const doc = svgEl.ownerDocument;
42540
+ w.interact.keyNav = null;
42541
+ if (kept && (!doc.activeElement || doc.activeElement === doc.body)) {
42542
+ [this.seriesIndex, this.dataPointIndex, , this._tooltipDismissed] = kept;
42543
+ if (!kept[2]) this.notePointerFocus();
42544
+ svgEl.focus({ preventScroll: true });
42545
+ }
42330
42546
  }
42331
42547
  /**
42332
- * Removes all event listeners. Called from chart.destroy().
42548
+ * Removes all event listeners. Called from chart.destroy(), and with
42549
+ * `updating` when an update is about to replace the SVG.
42550
+ * @param {boolean} [updating]
42333
42551
  */
42334
- destroy() {
42552
+ destroy(updating) {
42553
+ var _a;
42335
42554
  const w = this.w;
42336
42555
  const svgEl = w.dom.Paper && w.dom.Paper.node;
42337
42556
  this.ctx.events.removeEventListener("legendClick", this._onLegendClick);
42338
42557
  clearTimeout(this._announceTimer);
42339
42558
  if (!svgEl) return;
42559
+ if (updating && ((_a = svgEl.getRootNode) == null ? void 0 : _a.call(svgEl).activeElement) === svgEl) {
42560
+ w.interact.keyNav = [
42561
+ this.seriesIndex,
42562
+ this.dataPointIndex,
42563
+ this.active,
42564
+ this._tooltipDismissed
42565
+ ];
42566
+ }
42340
42567
  svgEl.removeEventListener("focus", this._onFocus);
42341
42568
  svgEl.removeEventListener("blur", this._onBlur);
42342
42569
  svgEl.removeEventListener("keydown", this._onKeyDown);
@@ -42388,7 +42615,7 @@ var __async = (__this, __arguments, generator) => {
42388
42615
  this.active = true;
42389
42616
  this._clampCursor();
42390
42617
  this._snapToVisibleRange();
42391
- this._showCurrentPoint();
42618
+ if (!this._tooltipDismissed) this._showCurrentPoint();
42392
42619
  }
42393
42620
  _onBlur() {
42394
42621
  this.active = false;
@@ -42434,20 +42661,18 @@ var __async = (__this, __arguments, generator) => {
42434
42661
  break;
42435
42662
  case "Home":
42436
42663
  e2.preventDefault();
42437
- this.dataPointIndex = 0;
42438
- this._skipNullForward();
42664
+ this._seek(0, 1);
42439
42665
  this._showCurrentPoint();
42440
42666
  break;
42441
42667
  case "End":
42442
42668
  e2.preventDefault();
42443
- this.dataPointIndex = this._getDataPointCount(this.seriesIndex) - 1;
42444
- this._skipNullBackward();
42669
+ this._seek(this._getDataPointCount(this.seriesIndex) - 1, -1);
42445
42670
  this._showCurrentPoint();
42446
42671
  break;
42447
42672
  case "Enter":
42448
42673
  case " ":
42449
42674
  e2.preventDefault();
42450
- this._fireClick();
42675
+ this._fireClick(e2);
42451
42676
  break;
42452
42677
  case "+":
42453
42678
  case "=":
@@ -42495,22 +42720,15 @@ var __async = (__this, __arguments, generator) => {
42495
42720
  );
42496
42721
  }
42497
42722
  _canPan() {
42498
- return this._canZoom();
42723
+ return this._canZoom() && this.w.interact.zoomed;
42499
42724
  }
42500
42725
  /**
42501
- * Shift the visible x-range by ~10% in the given direction.
42726
+ * Shift the visible x-range by ~10% in the given direction, as a drag pan.
42502
42727
  * @param {number} direction +1 = right, -1 = left
42503
42728
  */
42504
42729
  _panBy(direction) {
42505
- const toolbar = this.ctx.toolbar;
42506
- if (!toolbar) return;
42507
- const r2 = toolbar._currentXRange();
42508
- const minX = Number(r2.minX);
42509
- const maxX = Number(r2.maxX);
42510
- if (!isFinite(minX) || !isFinite(maxX) || minX === maxX) return;
42511
- const span = maxX - minX;
42512
- const step = span * 0.1 * direction;
42513
- toolbar.zoomUpdateOptions(minX + step, maxX + step);
42730
+ var _a;
42731
+ (_a = this.ctx.zoomPanSelection) == null ? void 0 : _a.panBy(direction / 10);
42514
42732
  this._announce(direction > 0 ? "Panned right" : "Panned left");
42515
42733
  }
42516
42734
  // ─── Navigation ───────────────────────────────────────────────────────────
@@ -42525,8 +42743,8 @@ var __async = (__this, __arguments, generator) => {
42525
42743
  if (dSeries !== 0) {
42526
42744
  const ttCtx = this.w.globals.tooltip;
42527
42745
  const type = w.config.chart.type;
42528
- const perCell = type === "heatmap" || type === "treemap";
42529
- if (!perCell && ttCtx && ttCtx.tConfig && ttCtx.tConfig.shared) {
42746
+ const perCell = type === "heatmap" || type === "treemap" || type === "radialBar";
42747
+ if (!perCell && (ttCtx == null ? void 0 : ttCtx.ttItems) && ttCtx.tConfig.shared) {
42530
42748
  const j2 = this.dataPointIndex;
42531
42749
  const isActuallyShared = ttCtx.tooltipUtil && ttCtx.tooltipUtil.isXoverlap(j2) && ttCtx.tooltipUtil.isInitialSeriesSameLen();
42532
42750
  if (isActuallyShared) return;
@@ -42552,59 +42770,43 @@ var __async = (__this, __arguments, generator) => {
42552
42770
  }
42553
42771
  }
42554
42772
  if (dPoint !== 0) {
42555
- const dpCount = this._getDataPointCount(this.seriesIndex);
42556
- let di = this.dataPointIndex + dPoint;
42557
- if (di < 0) di = wrapAround ? dpCount - 1 : 0;
42558
- if (di >= dpCount) di = wrapAround ? 0 : dpCount - 1;
42559
- this.dataPointIndex = di;
42560
- if (dPoint > 0) {
42561
- this._skipNullForward();
42562
- } else {
42563
- this._skipNullBackward();
42564
- }
42773
+ this._seek(this.dataPointIndex + dPoint, dPoint);
42565
42774
  if (!this._isDataPointVisible(this.seriesIndex, this.dataPointIndex)) {
42566
42775
  this._snapToVisibleRangeInDirection(dPoint);
42567
42776
  }
42568
42777
  }
42569
42778
  this._showCurrentPoint();
42570
42779
  }
42571
- /** Advance dataPointIndex forward past any nulls */
42572
- _skipNullForward() {
42573
- const w = this.w;
42574
- const si = this.seriesIndex;
42575
- const dpCount = this._getDataPointCount(si);
42576
- let di = this.dataPointIndex;
42577
- let attempts = 0;
42578
- if (!Array.isArray(w.seriesData.series[si])) return;
42579
- while (attempts < dpCount && w.seriesData.series[si][di] === null) {
42580
- di = (di + 1) % dpCount;
42581
- attempts++;
42582
- }
42583
- this.dataPointIndex = di;
42584
- }
42585
- /** Retreat dataPointIndex backward past any nulls */
42586
- _skipNullBackward() {
42780
+ /**
42781
+ * Land on the first non-null point from `di` going `dir`. Past an edge it
42782
+ * wraps only with wrapAround; when no point lies ahead the cursor stays.
42783
+ * @param {number} di
42784
+ * @param {number} dir
42785
+ */
42786
+ _seek(di, dir) {
42587
42787
  const w = this.w;
42588
- const si = this.seriesIndex;
42589
- const dpCount = this._getDataPointCount(si);
42590
- let di = this.dataPointIndex;
42591
- let attempts = 0;
42592
- if (!Array.isArray(w.seriesData.series[si])) return;
42593
- while (attempts < dpCount && w.seriesData.series[si][di] === null) {
42594
- di = (di - 1 + dpCount) % dpCount;
42595
- attempts++;
42788
+ const row = w.seriesData.series[this.seriesIndex];
42789
+ const n2 = this._getDataPointCount(this.seriesIndex);
42790
+ for (let k2 = 0; k2 < n2; k2++, di += dir) {
42791
+ if (w.config.chart.accessibility.keyboard.navigation.wrapAround) {
42792
+ di = (di + n2) % n2;
42793
+ } else if (di < 0 || di >= n2) return;
42794
+ if (!Array.isArray(row) || row[di] !== null) {
42795
+ this.dataPointIndex = di;
42796
+ return;
42797
+ }
42596
42798
  }
42597
- this.dataPointIndex = di;
42598
42799
  }
42599
42800
  // ─── Display ──────────────────────────────────────────────────────────────
42600
42801
  _showCurrentPoint() {
42601
42802
  const { seriesIndex: i2, dataPointIndex: j2 } = this;
42602
42803
  const w = this.w;
42603
42804
  const ttCtx = w.globals.tooltip;
42604
- if (!ttCtx || !ttCtx.ttItems) return;
42805
+ this._tooltipDismissed = false;
42605
42806
  w.interact.capturedSeriesIndex = i2;
42606
42807
  w.interact.capturedDataPointIndex = j2;
42607
42808
  this._applyFocusClass(i2, j2);
42809
+ if (!(ttCtx == null ? void 0 : ttCtx.ttItems)) return this._announce(this._buildPointLabel(i2, j2));
42608
42810
  this._showTooltip(
42609
42811
  i2,
42610
42812
  j2,
@@ -42662,10 +42864,8 @@ var __async = (__this, __arguments, generator) => {
42662
42864
  if (w.config.chart.accessibility.enabled && w.config.chart.accessibility.announcements.enabled) {
42663
42865
  tooltipEl.removeAttribute("aria-hidden");
42664
42866
  }
42665
- if (type === "pie" || type === "donut" || type === "polarArea") {
42867
+ if (type === "pie" || type === "donut" || type === "polarArea" || type === "radialBar") {
42666
42868
  this._showTooltipNonAxis(i2, j2, ttCtx, tooltipEl);
42667
- } else if (type === "radialBar") {
42668
- this._showTooltipRadialBar(i2, j2, ttCtx, tooltipEl);
42669
42869
  } else if (type === "heatmap" || type === "treemap") {
42670
42870
  this._showTooltipHeatTree(i2, j2, ttCtx, tooltipEl, type);
42671
42871
  } else if (this._isBarLikeSeries(i2)) {
@@ -43020,24 +43220,23 @@ var __async = (__this, __arguments, generator) => {
43020
43220
  return true;
43021
43221
  }
43022
43222
  /**
43023
- * pie / donut / polarArea
43223
+ * pie / donut / polarArea (a slice per point, i is 0) and radialBar (a ring
43224
+ * per series, j is 0)
43024
43225
  * @param {number} i
43025
43226
  * @param {number} j
43026
43227
  * @param {import('../tooltip/Tooltip').default} ttCtx
43027
43228
  * @param {HTMLElement} tooltipEl
43028
43229
  */
43029
43230
  _showTooltipNonAxis(i2, j2, ttCtx, tooltipEl) {
43030
- const w = this.w;
43031
43231
  ttCtx.tooltipLabels.drawSeriesTexts({
43032
43232
  ttItems: ttCtx.ttItems,
43033
- i: j2,
43233
+ i: i2 + j2,
43034
43234
  shared: false
43035
43235
  });
43036
43236
  const tooltipBound = tooltipEl.getBoundingClientRect();
43037
43237
  const ttWidth = tooltipBound.width || ttCtx.tooltipRect.ttWidth || 0;
43038
43238
  const ttHeight = tooltipBound.height || ttCtx.tooltipRect.ttHeight || 0;
43039
- const sliceEl = w.dom.baseEl.querySelector(`.apexcharts-pie-area[j='${j2}']`);
43040
- const anchor = ttCtx.getSliceAnchor(sliceEl);
43239
+ const anchor = ttCtx.getSliceAnchor(this._getFocusableElement(i2, j2));
43041
43240
  if (anchor) {
43042
43241
  const pos = ttCtx.tooltipPosition.placeOverAnchor(
43043
43242
  anchor.x,
@@ -43050,56 +43249,6 @@ var __async = (__this, __arguments, generator) => {
43050
43249
  tooltipEl.style.top = pos.y + "px";
43051
43250
  }
43052
43251
  }
43053
- /**
43054
- * radialBar — one ring per series, single value each
43055
- * @param {number} i
43056
- * @param {any} _j
43057
- * @param {import('../tooltip/Tooltip').default} ttCtx
43058
- * @param {HTMLElement} tooltipEl
43059
- */
43060
- _showTooltipRadialBar(i2, _j, ttCtx, tooltipEl) {
43061
- var _a;
43062
- const w = this.w;
43063
- ttCtx.tooltipLabels.drawSeriesTexts({
43064
- ttItems: ttCtx.ttItems,
43065
- i: i2,
43066
- shared: false
43067
- });
43068
- const { ttWidth = 0, ttHeight = 0 } = ttCtx.getCachedDimensions();
43069
- const arcEl = w.dom.baseEl.querySelector(
43070
- `.apexcharts-radialbar-series[data\\:realIndex='${i2}'] path`
43071
- );
43072
- if (arcEl) {
43073
- const angle = parseFloat((_a = arcEl.getAttribute("data:angle")) != null ? _a : "") || 0;
43074
- const initialAngle = w.config.plotOptions.radialBar.startAngle || 0;
43075
- const midAngle = initialAngle + angle / 2;
43076
- const centerX = w.layout.gridWidth / 2;
43077
- const centerY = w.layout.gridHeight / 2;
43078
- const radialSize = w.globals.radialSize || Math.min(w.layout.gridWidth, w.layout.gridHeight) / 2;
43079
- const seriesCount = w.seriesData.series.length;
43080
- const trackSize = radialSize / Math.max(seriesCount, 1);
43081
- const outerRadius = radialSize - i2 * trackSize;
43082
- const innerRadius = outerRadius - trackSize;
43083
- const ringRadius = (outerRadius + innerRadius) / 2;
43084
- const centroid = Utils$1.polarToCartesian(
43085
- centerX,
43086
- centerY,
43087
- ringRadius,
43088
- midAngle
43089
- );
43090
- const x2 = centroid.x + (w.layout.translateX || 0);
43091
- const y = centroid.y + (w.layout.translateY || 0);
43092
- const pos = ttCtx.tooltipPosition.placeOverAnchor(
43093
- x2,
43094
- y,
43095
- ttWidth,
43096
- ttHeight,
43097
- 10
43098
- );
43099
- tooltipEl.style.left = pos.x + "px";
43100
- tooltipEl.style.top = pos.y + "px";
43101
- }
43102
- }
43103
43252
  /**
43104
43253
  * heatmap / treemap — position tooltip using element bounding rect
43105
43254
  * @param {number} i
@@ -43359,9 +43508,7 @@ var __async = (__this, __arguments, generator) => {
43359
43508
  const mark = this._canvasMark(i2, j2);
43360
43509
  if (!mark) return this._drawCanvasMarkerFocusRing(i2, j2);
43361
43510
  const w = this.w;
43362
- const host = Array.from(
43363
- w.dom.baseEl.querySelectorAll(".apexcharts-series")
43364
- ).find((g) => g.getAttribute("data:realIndex") === String(i2));
43511
+ const host = this._seriesGroup(i2);
43365
43512
  if (!host) return null;
43366
43513
  const ring = new Graphics(w, this.ctx).drawPath({
43367
43514
  d: mark.d,
@@ -43385,9 +43532,7 @@ var __async = (__this, __arguments, generator) => {
43385
43532
  const marker = this._canvasMarker(i2, j2);
43386
43533
  if (!marker) return null;
43387
43534
  const w = this.w;
43388
- const host = Array.from(
43389
- w.dom.baseEl.querySelectorAll(".apexcharts-series")
43390
- ).find((g) => g.getAttribute("data:realIndex") === String(i2));
43535
+ const host = this._seriesGroup(i2);
43391
43536
  if (!host) return null;
43392
43537
  const ring = new Graphics(w, this.ctx).drawPath({
43393
43538
  d: marker.d,
@@ -43481,6 +43626,7 @@ var __async = (__this, __arguments, generator) => {
43481
43626
  * @param {number} j
43482
43627
  */
43483
43628
  _getFocusableElement(i2, j2) {
43629
+ var _a, _b;
43484
43630
  const w = this.w;
43485
43631
  const type = w.config.chart.type;
43486
43632
  const baseEl = w.dom.baseEl;
@@ -43498,32 +43644,47 @@ var __async = (__this, __arguments, generator) => {
43498
43644
  );
43499
43645
  }
43500
43646
  if (type === "radialBar") {
43501
- return baseEl.querySelector(
43502
- `.apexcharts-radialbar-series[data\\:realIndex='${i2}'] path`
43503
- );
43647
+ return baseEl.querySelector(`.apexcharts-radialbar-slice-${i2}`);
43504
43648
  }
43505
43649
  if (this._isBarLikeSeries(i2)) {
43506
43650
  if (this._canvasMark(i2, j2)) return null;
43507
- return baseEl.querySelector(
43508
- `.apexcharts-series[data\\:realIndex='${i2}'] path[j='${j2}']`
43509
- );
43651
+ return (_a = this._seriesGroup(i2)) == null ? void 0 : _a.querySelector(`path[j='${j2}']`);
43510
43652
  }
43511
- const marker = baseEl.querySelector(
43512
- `.apexcharts-series[data\\:realIndex='${i2}'] .apexcharts-marker[rel='${j2}']`
43513
- );
43514
- return marker || null;
43653
+ return (_b = this._seriesGroup(i2)) == null ? void 0 : _b.querySelector(`.apexcharts-marker[rel='${j2}']`);
43654
+ }
43655
+ /**
43656
+ * The series' own group, by realIndex (`rel` counts within a type's groups,
43657
+ * which a combo has several of). Matched in script: not every selector
43658
+ * engine takes the escaped `data\:realIndex` attribute.
43659
+ * @param {number} i
43660
+ * @returns {Element | undefined}
43661
+ */
43662
+ _seriesGroup(i2) {
43663
+ return Array.from(
43664
+ this.w.dom.baseEl.querySelectorAll(".apexcharts-series")
43665
+ ).find((g) => g.getAttribute("data:realIndex") === String(i2));
43515
43666
  }
43516
43667
  // ─── Click / Enter ────────────────────────────────────────────────────────
43517
- _fireClick() {
43518
- const w = this.w;
43519
- const ttCtx = w.globals.tooltip;
43520
- if (!ttCtx) return;
43521
- const syntheticEvent = {
43522
- type: "mouseup",
43523
- clientX: 0,
43524
- clientY: 0
43525
- };
43526
- ttCtx.markerClick(syntheticEvent, this.seriesIndex, this.dataPointIndex);
43668
+ /**
43669
+ * What a click on the focused mark does: its mousedown selects it
43670
+ * (dataPointSelection), its mouseup slides a pie slice out and fires
43671
+ * markerClick.
43672
+ * @param {KeyboardEvent} e
43673
+ */
43674
+ _fireClick(e2) {
43675
+ var _a, _b;
43676
+ const el = (
43677
+ /** @type {any} */
43678
+ (_a = this._focusedEl) == null ? void 0 : _a.instance
43679
+ );
43680
+ const pie = this.ctx.pie;
43681
+ if (el) new Graphics(this.w, this.ctx).pathMouseDown(el, e2);
43682
+ if (pie && pie.getExpandOffset() > 0) pie.pieClicked(this.dataPointIndex);
43683
+ (_b = this.w.globals.tooltip) == null ? void 0 : _b.markerClick(
43684
+ e2,
43685
+ this.seriesIndex,
43686
+ this.dataPointIndex
43687
+ );
43527
43688
  }
43528
43689
  // ─── Helpers ──────────────────────────────────────────────────────────────
43529
43690
  _isNavEnabled() {
@@ -43547,8 +43708,8 @@ var __async = (__this, __arguments, generator) => {
43547
43708
  if (type === "pie" || type === "donut" || type === "polarArea") {
43548
43709
  return w.seriesData.series.length;
43549
43710
  }
43550
- const series = w.seriesData.series;
43551
- return series[si] && Array.isArray(series[si]) ? series[si].length : 0;
43711
+ const s2 = w.seriesData.series[si];
43712
+ return Array.isArray(s2) ? s2.length : 1;
43552
43713
  }
43553
43714
  _clampCursor() {
43554
43715
  const seriesCount = this._getSeriesCount();
@@ -47730,7 +47891,8 @@ var __async = (__this, __arguments, generator) => {
47730
47891
  barXPosition,
47731
47892
  barYPosition,
47732
47893
  visibleSeries,
47733
- hl
47894
+ hl,
47895
+ noLabel
47734
47896
  } = opts;
47735
47897
  const w = this.w;
47736
47898
  const graphics = new Graphics(this.barCtx.w);
@@ -47844,7 +48006,7 @@ var __async = (__this, __arguments, generator) => {
47844
48006
  dataLabelsPos.dataLabelsX = (box.levelStart + box.levelEnd) / 2 + offX;
47845
48007
  }
47846
48008
  }
47847
- dataLabels = this.drawCalculatedDataLabels({
48009
+ dataLabels = noLabel ? null : this.drawCalculatedDataLabels({
47848
48010
  x: dataLabelsPos.dataLabelsX,
47849
48011
  y: dataLabelsPos.dataLabelsY,
47850
48012
  neg: params.neg,
@@ -47930,8 +48092,8 @@ var __async = (__this, __arguments, generator) => {
47930
48092
  return ctx && byGroups && byGroups[ctx.groupIndex] ? byGroups[ctx.groupIndex][j2] : this.barCtx.stackedSeriesTotals[j2];
47931
48093
  }
47932
48094
  /**
47933
- * The running stack at this column's x (BarStacked `tops`, columns only) on
47934
- * a numeric axis, where columns stack by x rather than by index.
48095
+ * The running stack at this bar's x (BarStacked `tops`) on a numeric axis,
48096
+ * where bars stack by x rather than by index.
47935
48097
  * @param {number} realIndex @param {number} j
47936
48098
  */
47937
48099
  xStackTop(realIndex, j2) {
@@ -47940,6 +48102,21 @@ var __async = (__this, __arguments, generator) => {
47940
48102
  return w.axisFlags.isXNumeric && /** @type {any} */
47941
48103
  ((_b = (_a = this.barCtx.stacks) == null ? void 0 : _a[w.labelData.seriesGroupIndex[realIndex]]) == null ? void 0 : _b.tops.get(w.seriesData.seriesX[realIndex][j2]));
47942
48104
  }
48105
+ /**
48106
+ * The stacked total's text box, measured in the total's own font.
48107
+ * @param {number} realIndex @param {number} j
48108
+ */
48109
+ totalRects(realIndex, j2) {
48110
+ const s2 = this.barCtx.barOptions.dataLabels.total.style;
48111
+ return new Graphics(this.w).getTextRects(
48112
+ this.getStackedTotalDataLabel({ realIndex, j: j2 }),
48113
+ s2.fontSize,
48114
+ s2.fontFamily,
48115
+ void 0,
48116
+ true,
48117
+ s2.fontWeight
48118
+ );
48119
+ }
47943
48120
  /** @param {{realIndex: any, j: any}} opts */
47944
48121
  getStackedTotalDataLabel({ realIndex, j: j2 }) {
47945
48122
  const w = this.w;
@@ -47960,7 +48137,6 @@ var __async = (__this, __arguments, generator) => {
47960
48137
  var _a;
47961
48138
  const w = this.w;
47962
48139
  let {
47963
- i: i2,
47964
48140
  j: j2,
47965
48141
  realIndex,
47966
48142
  y,
@@ -47970,7 +48146,6 @@ var __async = (__this, __arguments, generator) => {
47970
48146
  textRects,
47971
48147
  dataLabelsX,
47972
48148
  dataLabelsY,
47973
- dataLabelsConfig,
47974
48149
  barDataLabelsConfig,
47975
48150
  barTotalDataLabelsConfig,
47976
48151
  strokeWidth,
@@ -47984,7 +48159,7 @@ var __async = (__this, __arguments, generator) => {
47984
48159
  barHeight = Math.abs(barHeight);
47985
48160
  const vertical = w.config.plotOptions.bar.dataLabels.orientation === "vertical";
47986
48161
  const { zeroEncounters } = this.barCtx.barHelpers.getZeroValueEncounters({
47987
- i: i2,
48162
+ i: realIndex,
47988
48163
  j: j2
47989
48164
  });
47990
48165
  bcx = bcx - strokeWidth / 2;
@@ -48005,7 +48180,7 @@ var __async = (__this, __arguments, generator) => {
48005
48180
  const offsetDLX = 2;
48006
48181
  dataLabelsX = dataLabelsX + textRects.height / 2 - strokeWidth / 2 - offsetDLX;
48007
48182
  }
48008
- const valIsNegative = (_a = opts.neg) != null ? _a : w.seriesData.series[i2][j2] < 0;
48183
+ const valIsNegative = (_a = opts.neg) != null ? _a : w.seriesData.series[realIndex][j2] < 0;
48009
48184
  let newY = y;
48010
48185
  if (this.barCtx.isReversed) {
48011
48186
  newY = y + (valIsNegative ? barHeight : -barHeight);
@@ -48079,16 +48254,11 @@ var __async = (__this, __arguments, generator) => {
48079
48254
  });
48080
48255
  if (this.hlt) lowestPrevY = this.hlt.edge;
48081
48256
  if (this.drawsStackedTotal(realIndex) && barTotalDataLabelsConfig.enabled) {
48082
- const ADDITIONAL_OFFY = 18;
48083
- const graphics = new Graphics(this.barCtx.w);
48084
- const totalLabeltextRects = graphics.getTextRects(
48085
- this.getStackedTotalDataLabel({ realIndex, j: j2 }),
48086
- dataLabelsConfig.fontSize
48087
- );
48257
+ const h = this.totalRects(realIndex, j2).height;
48088
48258
  if (valIsNegative) {
48089
- totalDataLabelsY = lowestPrevY - totalLabeltextRects.height / 2 - offY - barTotalDataLabelsConfig.offsetY + ADDITIONAL_OFFY;
48259
+ totalDataLabelsY = lowestPrevY + h * 0.77 - offY - barTotalDataLabelsConfig.offsetY;
48090
48260
  } else {
48091
- totalDataLabelsY = lowestPrevY + totalLabeltextRects.height + offY + barTotalDataLabelsConfig.offsetY - ADDITIONAL_OFFY;
48261
+ totalDataLabelsY = lowestPrevY - h * 0.3 + offY + barTotalDataLabelsConfig.offsetY;
48092
48262
  }
48093
48263
  const xDivision = dataPointsDividedWidth;
48094
48264
  totalDataLabelsX = totalDataLabelsBcx + (w.axisFlags.isXNumeric ? -barWidth / 2 : barWidth / 2 - xDivision) + barTotalDataLabelsConfig.offsetX;
@@ -48118,7 +48288,6 @@ var __async = (__this, __arguments, generator) => {
48118
48288
  const w = this.w;
48119
48289
  let {
48120
48290
  x: x2,
48121
- i: i2,
48122
48291
  j: j2,
48123
48292
  realIndex,
48124
48293
  bcy,
@@ -48135,7 +48304,7 @@ var __async = (__this, __arguments, generator) => {
48135
48304
  } = opts;
48136
48305
  const dataPointsDividedHeight = w.layout.gridHeight / w.globals.dataPoints;
48137
48306
  const { zeroEncounters } = this.barCtx.barHelpers.getZeroValueEncounters({
48138
- i: i2,
48307
+ i: realIndex,
48139
48308
  j: j2
48140
48309
  });
48141
48310
  barWidth = Math.abs(barWidth);
@@ -48152,7 +48321,7 @@ var __async = (__this, __arguments, generator) => {
48152
48321
  let totalDataLabelsX;
48153
48322
  let totalDataLabelsY;
48154
48323
  let totalDataLabelsAnchor = "start";
48155
- const valIsNegative = (_b = opts.neg) != null ? _b : w.seriesData.series[i2][j2] < 0;
48324
+ const valIsNegative = (_b = opts.neg) != null ? _b : w.seriesData.series[realIndex][j2] < 0;
48156
48325
  let newX = x2;
48157
48326
  if (this.barCtx.isReversed) {
48158
48327
  newX = x2 + (valIsNegative ? -barWidth : barWidth);
@@ -48187,10 +48356,14 @@ var __async = (__this, __arguments, generator) => {
48187
48356
  }
48188
48357
  let lowestPrevX = newX;
48189
48358
  const totalGroupCtx = this.getTotalGroupContext(realIndex);
48190
- const stacks = (
48359
+ const top = this.xStackTop(realIndex, j2);
48360
+ const stacks = top ? [] : (
48191
48361
  /** @type {any} */
48192
48362
  this.barCtx.stacks || []
48193
48363
  );
48364
+ if (top) {
48365
+ lowestPrevX = valIsNegative ? Math.min(newX, top[4]) : Math.max(newX, top[5]);
48366
+ }
48194
48367
  stacks.forEach((g, gi) => {
48195
48368
  if (totalGroupCtx && gi !== totalGroupCtx.groupIndex) return;
48196
48369
  g.prevX.forEach((arr) => {
@@ -48203,11 +48376,7 @@ var __async = (__this, __arguments, generator) => {
48203
48376
  });
48204
48377
  if (this.hlt) lowestPrevX = this.hlt.edge;
48205
48378
  if (this.drawsStackedTotal(realIndex) && barTotalDataLabelsConfig.enabled) {
48206
- const graphics = new Graphics(this.barCtx.w);
48207
- const totalLabeltextRects = graphics.getTextRects(
48208
- this.getStackedTotalDataLabel({ realIndex, j: j2 }),
48209
- dataLabelsConfig.fontSize
48210
- );
48379
+ const totalLabeltextRects = this.totalRects(realIndex, j2);
48211
48380
  if (valIsNegative) {
48212
48381
  totalDataLabelsX = lowestPrevX - strokeWidth - offX - barTotalDataLabelsConfig.offsetX;
48213
48382
  totalDataLabelsAnchor = "end";
@@ -48276,8 +48445,9 @@ var __async = (__this, __arguments, generator) => {
48276
48445
  let elDataLabelsWrap = null;
48277
48446
  const isSeriesCollapsed = w.globals.collapsedSeriesIndices.indexOf(i2) > -1;
48278
48447
  const isSeriesCollapsing = (w.globals.collapsingSeriesIndices || []).indexOf(i2) > -1;
48448
+ const dlKey = `${i2}::${this.barCtx._keys(i2)[j2]}`;
48279
48449
  if (isSeriesCollapsing) {
48280
- const prev = (_a = w.globals.prevDataLabels) == null ? void 0 : _a.get(`${i2}::${datumKey(w, i2, j2)}`);
48450
+ const prev = (_a = w.globals.prevDataLabels) == null ? void 0 : _a.get(dlKey);
48281
48451
  if (prev && isFinite(prev.val)) {
48282
48452
  val = prev.val;
48283
48453
  text = void 0;
@@ -48290,10 +48460,7 @@ var __async = (__this, __arguments, generator) => {
48290
48460
  });
48291
48461
  const dlCfg = w.config.dataLabels;
48292
48462
  if (((_b = dlCfg.animate) == null ? void 0 : _b.enabled) || ((_c = dlCfg.countUp) == null ? void 0 : _c.enabled)) {
48293
- elDataLabelsWrap.node.setAttribute(
48294
- "data:dlKey",
48295
- `${i2}::${datumKey(w, i2, j2)}`
48296
- );
48463
+ elDataLabelsWrap.node.setAttribute("data:dlKey", dlKey);
48297
48464
  elDataLabelsWrap.node.setAttribute("data:dlJ", String(j2));
48298
48465
  if (typeof val === "number" && isFinite(val)) {
48299
48466
  elDataLabelsWrap.node.setAttribute("data:dlVal", String(val));
@@ -48311,29 +48478,12 @@ var __async = (__this, __arguments, generator) => {
48311
48478
  if (!val && w.config.plotOptions.bar.hideZeroBarsWhenGrouped) {
48312
48479
  text = "";
48313
48480
  }
48314
- const valIsNegative = neg != null ? neg : w.seriesData.series[i2][j2] < 0;
48315
- const position = w.config.plotOptions.bar.dataLabels.position;
48481
+ let anchor = dataLabelsConfig.textAnchor;
48316
48482
  if (w.config.plotOptions.bar.dataLabels.orientation === "vertical") {
48317
- if (position === "top") {
48318
- if (valIsNegative) dataLabelsConfig.textAnchor = "end";
48319
- else dataLabelsConfig.textAnchor = "start";
48320
- }
48321
- if (position === "center") {
48322
- dataLabelsConfig.textAnchor = "middle";
48323
- }
48324
- if (position === "bottom") {
48325
- if (valIsNegative) dataLabelsConfig.textAnchor = "end";
48326
- else dataLabelsConfig.textAnchor = "start";
48327
- }
48483
+ anchor = w.config.plotOptions.bar.dataLabels.position === "center" ? "middle" : (neg != null ? neg : w.seriesData.series[i2][j2] < 0) ? "end" : "start";
48328
48484
  }
48329
- if (this.barCtx.isRangeBar && this.barCtx.barOptions.dataLabels.hideOverflowingLabels) {
48330
- const txRect = graphics.getTextRects(
48331
- text,
48332
- parseFloat(dataLabelsConfig.style.fontSize).toString()
48333
- );
48334
- if (barWidth < txRect.width) {
48335
- text = "";
48336
- }
48485
+ if (this.barCtx.isRangeBar && this.barCtx.barOptions.dataLabels.hideOverflowingLabels && barWidth < textRects.width) {
48486
+ text = "";
48337
48487
  }
48338
48488
  if (w.config.chart.stacked && this.barCtx.barOptions.dataLabels.hideOverflowingLabels && // A collapsing series is measured against its NEW extent, which is
48339
48489
  // already zero, so this would blank a label whose bar is still at full
@@ -48349,14 +48499,14 @@ var __async = (__this, __arguments, generator) => {
48349
48499
  }
48350
48500
  }
48351
48501
  }
48352
- const modifiedDataLabelsConfig = __spreadValues({}, dataLabelsConfig);
48353
- if (this.barCtx.isHorizontal) {
48354
- if (val < 0) {
48355
- if (dataLabelsConfig.textAnchor === "start") {
48356
- modifiedDataLabelsConfig.textAnchor = "end";
48357
- } else if (dataLabelsConfig.textAnchor === "end") {
48358
- modifiedDataLabelsConfig.textAnchor = "start";
48359
- }
48502
+ const modifiedDataLabelsConfig = __spreadProps(__spreadValues({}, dataLabelsConfig), {
48503
+ textAnchor: anchor
48504
+ });
48505
+ if (this.barCtx.isHorizontal && val < 0) {
48506
+ if (anchor === "start") {
48507
+ modifiedDataLabelsConfig.textAnchor = "end";
48508
+ } else if (anchor === "end") {
48509
+ modifiedDataLabelsConfig.textAnchor = "start";
48360
48510
  }
48361
48511
  }
48362
48512
  dataLabels.plotDataLabelsText({
@@ -48408,7 +48558,7 @@ var __async = (__this, __arguments, generator) => {
48408
48558
  const { groupIndex } = this.barCtx.barHelpers.getGroupIndex(realIndex);
48409
48559
  totalDataLabelText.node.setAttribute(
48410
48560
  "data:dlTotalKey",
48411
- `${groupIndex}::${datumKey(this.w, realIndex, j2)}`
48561
+ `${groupIndex}::${this.barCtx._keys(realIndex)[j2]}`
48412
48562
  );
48413
48563
  totalDataLabelText.node.setAttribute(
48414
48564
  "data:dlTotalSeries",
@@ -48438,9 +48588,11 @@ var __async = (__this, __arguments, generator) => {
48438
48588
  }
48439
48589
  /**
48440
48590
  * @param {any[]} series
48591
+ * @param {any} [seriesIndex] a combo's real indices of `series`
48441
48592
  */
48442
- initVariables(series) {
48593
+ initVariables(series, seriesIndex) {
48443
48594
  const w = this.w;
48595
+ this.seriesIndex = seriesIndex;
48444
48596
  this.barCtx.series = series;
48445
48597
  this.barCtx.totalItems = 0;
48446
48598
  this.barCtx.seriesLen = 0;
@@ -48461,6 +48613,8 @@ var __async = (__this, __arguments, generator) => {
48461
48613
  this.barCtx.visibleItems = w.globals.dataPoints;
48462
48614
  }
48463
48615
  }
48616
+ const labels = w.labelData.labels;
48617
+ this.rows = w.globals.isBarHorizontal && w.axisFlags.isXNumeric && !this.barCtx.isRangeBar && w.seriesData.seriesX.some((s2) => s2 == null ? void 0 : s2.some((x2, j2) => x2 !== labels[j2])) ? new Map(labels.map((x2, r2) => [x2, r2])) : null;
48464
48618
  this.arrBorderRadius = this.createBorderRadiusArr(w.seriesData.series);
48465
48619
  if (Utils$1.isSafari()) {
48466
48620
  this.arrBorderRadius = this.arrBorderRadius.map(
@@ -48525,15 +48679,19 @@ var __async = (__this, __arguments, generator) => {
48525
48679
  * Collapsed series count too, exactly as they did for `minXDiff`. Skipping
48526
48680
  * them would widen every bar the moment someone hid the tightest-spaced
48527
48681
  * series from the legend, so bar geometry would depend on legend state.
48682
+ * In a combo only this renderer's own series count: a line's x values say
48683
+ * nothing about how wide a column may be.
48528
48684
  *
48529
48685
  * @returns {number}
48530
48686
  */
48531
48687
  _unionMinXGap() {
48532
48688
  const w = this.w;
48533
48689
  const seriesX = w.seriesData.seriesX || [];
48690
+ const own = this.seriesIndex;
48534
48691
  const arrays = [];
48535
48692
  for (let i2 = 0; i2 < seriesX.length; i2++) {
48536
48693
  const xs = seriesX[i2];
48694
+ if (own && own.indexOf(i2) < 0) continue;
48537
48695
  if (Array.isArray(xs) && xs.length > 0) {
48538
48696
  arrays.push(
48539
48697
  xs.some((v, n2) => v < xs[n2 - 1]) ? xs.filter((v) => v === +v).sort((a2, b) => a2 - b) : xs
@@ -48574,6 +48732,15 @@ var __async = (__this, __arguments, generator) => {
48574
48732
  }
48575
48733
  return isFinite(min) ? min : 0;
48576
48734
  }
48735
+ /**
48736
+ * The band a horizontal bar is drawn in: its x's band when the series do
48737
+ * not line up by index (see initVariables), else its index.
48738
+ * @param {number} realIndex @param {number} j
48739
+ */
48740
+ barRow(realIndex, j2) {
48741
+ var _a, _b, _c;
48742
+ return (_c = (_b = this.rows) == null ? void 0 : _b.get((_a = this.w.seriesData.seriesX[realIndex]) == null ? void 0 : _a[j2])) != null ? _c : j2;
48743
+ }
48577
48744
  /**
48578
48745
  * @param {number} realIndex
48579
48746
  */
@@ -48696,7 +48863,7 @@ var __async = (__this, __arguments, generator) => {
48696
48863
  });
48697
48864
  }
48698
48865
  const connectorFill = this.getDumbbellConnectorFill(i2, j2);
48699
- const datumFill = connectorFill || ((_a = w.config.series[i2].data[j2]) == null ? void 0 : _a.fill);
48866
+ const datumFill = connectorFill || ((_a = w.config.series[realIndex].data[j2]) == null ? void 0 : _a.fill);
48700
48867
  const connector = this.barCtx.barOptions.isDumbbell ? w.config.plotOptions.bar.dumbbell.connector : null;
48701
48868
  let connectorOpacity;
48702
48869
  if (connector && connector.color) {
@@ -48849,11 +49016,10 @@ var __async = (__this, __arguments, generator) => {
48849
49016
  * @returns {string[][]}
48850
49017
  */
48851
49018
  createBorderRadiusArr(series) {
48852
- var _a;
48853
49019
  const w = this.w;
48854
49020
  const alwaysApplyRadius = !this.w.config.chart.stacked || w.config.plotOptions.bar.borderRadius <= 0;
48855
49021
  const numSeries = series.length;
48856
- const numColumns = ((_a = series[0]) == null ? void 0 : _a.length) | 0;
49022
+ const numColumns = Math.max(0, ...series.map((s2) => (s2 == null ? void 0 : s2.length) | 0));
48857
49023
  const output = Array.from(
48858
49024
  { length: numSeries },
48859
49025
  () => Array(numColumns).fill(alwaysApplyRadius ? "top" : "none")
@@ -49009,7 +49175,7 @@ var __async = (__this, __arguments, generator) => {
49009
49175
  j: j2,
49010
49176
  w
49011
49177
  }) {
49012
- var _a, _b;
49178
+ var _a, _b, _c;
49013
49179
  const r2 = this.barRect({
49014
49180
  a: barXPosition,
49015
49181
  len: barWidth,
@@ -49040,7 +49206,7 @@ var __async = (__this, __arguments, generator) => {
49040
49206
  const _ctx = this.barCtx.groupCtx;
49041
49207
  _ctx.yArrj.push(y2 - strokeCenter * direction);
49042
49208
  _ctx.yArrjF.push(Math.abs(y1 - y2 + r2.strokeWidth * direction));
49043
- _ctx.yArrjVal.push(this.barCtx.series[i2][j2]);
49209
+ _ctx.yArrjVal.push((_c = this.barCtx.series[i2][j2]) != null ? _c : null);
49044
49210
  }
49045
49211
  return {
49046
49212
  pathTo,
@@ -49230,7 +49396,7 @@ var __async = (__this, __arguments, generator) => {
49230
49396
  j: j2,
49231
49397
  w
49232
49398
  }) {
49233
- var _a, _b;
49399
+ var _a, _b, _c;
49234
49400
  const graphics = new Graphics(this.barCtx.w);
49235
49401
  const r2 = this.barRect({
49236
49402
  a: barYPosition,
@@ -49266,7 +49432,7 @@ var __async = (__this, __arguments, generator) => {
49266
49432
  const _ctx = this.barCtx.groupCtx;
49267
49433
  _ctx.xArrj.push(x2 + strokeCenter * direction);
49268
49434
  _ctx.xArrjF.push(Math.abs(x1 - x2 - r2.strokeWidth * direction));
49269
- _ctx.xArrjVal.push(this.barCtx.series[i2][j2]);
49435
+ _ctx.xArrjVal.push((_c = this.barCtx.series[i2][j2]) != null ? _c : null);
49270
49436
  }
49271
49437
  return {
49272
49438
  pathTo,
@@ -49311,6 +49477,9 @@ var __async = (__this, __arguments, generator) => {
49311
49477
  const w = this.w;
49312
49478
  const goals = [];
49313
49479
  const pushGoal = (value, attrs) => {
49480
+ if (!w.globals.invalidLogScale) {
49481
+ value = new CoreUtils(w).getLogValAtSeriesIndex(value, i2);
49482
+ }
49314
49483
  goals.push({
49315
49484
  [type]: type === "x" ? this.getXForValue(value, zeroW, false) : this.getYForValue(value, zeroH, translationsIndex, false),
49316
49485
  attrs
@@ -49565,11 +49734,11 @@ var __async = (__this, __arguments, generator) => {
49565
49734
  let zeroEncounters = 0;
49566
49735
  const seriesIndices = w.config.plotOptions.bar.horizontal ? w.seriesData.series.map((_, _i) => _i) : ((_a = w.globals.columnSeries) == null ? void 0 : _a.i.map((_i) => _i)) || [];
49567
49736
  seriesIndices.forEach((_si) => {
49568
- const val = w.globals.seriesPercent[_si][j2];
49737
+ const val = w.seriesData.series[_si][j2];
49569
49738
  if (val) {
49570
49739
  nonZeroColumns++;
49571
49740
  }
49572
- if (_si < i2 && val === 0) {
49741
+ if (_si < i2 && !val) {
49573
49742
  zeroEncounters++;
49574
49743
  }
49575
49744
  });
@@ -49672,15 +49841,17 @@ var __async = (__this, __arguments, generator) => {
49672
49841
  /**
49673
49842
  * Point the per-series axis state at this series' y axis. Every bar-family
49674
49843
  * renderer calls it before initialPositions, which reads the baseline by
49675
- * this.translationsIndex.
49844
+ * this.translationsIndex and flips it for a reversed axis.
49676
49845
  * @param {number} realIndex
49677
49846
  * @return {number} translationsIndex
49678
49847
  */
49679
49848
  setSeriesAxis(realIndex) {
49849
+ var _a;
49680
49850
  if (this.yRatio.length > 1) {
49681
49851
  this.yaxisIndex = this.w.globals.seriesYAxisReverseMap[realIndex];
49682
49852
  this.translationsIndex = realIndex;
49683
49853
  }
49854
+ this.isReversed = (_a = this.w.config.yaxis[this.yaxisIndex]) == null ? void 0 : _a.reversed;
49684
49855
  return this.translationsIndex;
49685
49856
  }
49686
49857
  /** primary draw method which is called on bar object
@@ -49697,7 +49868,7 @@ var __async = (__this, __arguments, generator) => {
49697
49868
  series = coreUtils.getLogSeries(series);
49698
49869
  this.series = series;
49699
49870
  this.yRatio = coreUtils.getLogYRatios(this.yRatio);
49700
- this.barHelpers.initVariables(series);
49871
+ this.barHelpers.initVariables(series, seriesIndex);
49701
49872
  const ret = graphics.group({
49702
49873
  class: "apexcharts-bar-series apexcharts-plot-series"
49703
49874
  });
@@ -49729,7 +49900,6 @@ var __async = (__this, __arguments, generator) => {
49729
49900
  this.visibleI = this.visibleI + 1;
49730
49901
  }
49731
49902
  const translationsIndex = this.setSeriesAxis(realIndex);
49732
- this.isReversed = w.config.yaxis[this.yaxisIndex] && w.config.yaxis[this.yaxisIndex].reversed;
49733
49903
  if (this.isPyramid) {
49734
49904
  this.pyramidLayout = this.barHelpers.computePyramidLayout(series[i2]);
49735
49905
  }
@@ -49807,7 +49977,9 @@ var __async = (__this, __arguments, generator) => {
49807
49977
  elSeries
49808
49978
  };
49809
49979
  if (this.isHorizontal) {
49810
- paths = this.drawBarPaths(__spreadProps(__spreadValues({}, pathsParams), {
49980
+ paths = this.drawBarPaths(__spreadProps(__spreadValues(__spreadValues({}, pathsParams), this.barHelpers.rows && {
49981
+ y: initY + this.barHelpers.barRow(realIndex, j2) * yDivision
49982
+ }), {
49811
49983
  barHeight,
49812
49984
  zeroW,
49813
49985
  yDivision
@@ -49889,6 +50061,7 @@ var __async = (__this, __arguments, generator) => {
49889
50061
  series,
49890
50062
  barHeight: Math.abs(paths.barHeight ? paths.barHeight : barHeight),
49891
50063
  barWidth: Math.abs(paths.barWidth ? paths.barWidth : barWidth),
50064
+ barXPosition: paths.barXPosition,
49892
50065
  elDataLabelsWrap,
49893
50066
  elGoalsMarkers,
49894
50067
  elBarShadows,
@@ -49899,15 +50072,11 @@ var __async = (__this, __arguments, generator) => {
49899
50072
  w.globals.seriesXvalues[realIndex] = xArrj;
49900
50073
  w.globals.seriesYvalues[realIndex] = yArrj;
49901
50074
  if (w.globals.previousPaths.length > 0) {
49902
- const newKeys = [];
49903
- for (let j2 = 0; j2 < series[i2].length; j2++) {
49904
- newKeys.push(datumKey(w, realIndex, j2));
49905
- }
49906
50075
  renderBarExitGhosts({
49907
50076
  w,
49908
50077
  elSeries,
49909
50078
  record: this._prevRecord(realIndex),
49910
- newKeys,
50079
+ newKeys: this._keys(realIndex),
49911
50080
  isHorizontal: this.isHorizontal,
49912
50081
  speed: w.config.chart.animations.dynamicAnimation.speed
49913
50082
  });
@@ -49916,7 +50085,7 @@ var __async = (__this, __arguments, generator) => {
49916
50085
  }
49917
50086
  return ret;
49918
50087
  }
49919
- /** @param {{ hl?: any, realIndex?: any, pathFill?: any, lineFill?: any, j?: any, i?: any, columnGroupIndex?: any, pathFrom?: any, pathTo?: any, strokeWidth?: any, elSeries?: any, x?: any, y?: any, y1?: any, y2?: any, series?: any, barHeight?: any, barWidth?: any, barXPosition?: any, barYPosition?: any, elDataLabelsWrap?: any, elGoalsMarkers?: any, elBarShadows?: any, visibleSeries?: any, type?: any, classes?: any, fadeReveal?: boolean }} opts */
50088
+ /** @param {{ hl?: any, realIndex?: any, pathFill?: any, lineFill?: any, j?: any, i?: any, columnGroupIndex?: any, pathFrom?: any, pathTo?: any, strokeWidth?: any, elSeries?: any, x?: any, y?: any, y1?: any, y2?: any, series?: any, barHeight?: any, barWidth?: any, barXPosition?: any, barYPosition?: any, elDataLabelsWrap?: any, elGoalsMarkers?: any, elBarShadows?: any, visibleSeries?: any, type?: any, classes?: any, fadeReveal?: boolean, noLabel?: boolean }} opts */
49920
50089
  renderSeries({
49921
50090
  hl,
49922
50091
  realIndex,
@@ -49948,7 +50117,9 @@ var __async = (__this, __arguments, generator) => {
49948
50117
  visibleSeries,
49949
50118
  type,
49950
50119
  classes,
49951
- fadeReveal = false
50120
+ fadeReveal = false,
50121
+ noLabel
50122
+ // a datum's extra paths (box halves, box lane) label nothing
49952
50123
  }) {
49953
50124
  var _a, _b, _c, _d, _e, _f, _g;
49954
50125
  const w = this.w;
@@ -50022,7 +50193,8 @@ var __async = (__this, __arguments, generator) => {
50022
50193
  barXPosition,
50023
50194
  barYPosition,
50024
50195
  visibleSeries,
50025
- hl: hl == null ? void 0 : hl.label
50196
+ hl: hl == null ? void 0 : hl.label,
50197
+ noLabel
50026
50198
  })
50027
50199
  );
50028
50200
  if (delayMs > 0) {
@@ -50038,19 +50210,18 @@ var __async = (__this, __arguments, generator) => {
50038
50210
  }
50039
50211
  let leaving = false;
50040
50212
  if (!w.globals.isBarHorizontal) {
50041
- if (dataLabelsObj.dataLabelsPos.dataLabelsX + Math.max(barWidth, w.globals.barPadForNumericAxis) < 0 || dataLabelsObj.dataLabelsPos.dataLabelsX - Math.max(barWidth, w.globals.barPadForNumericAxis) > w.layout.gridWidth) {
50213
+ const cx = barXPosition === void 0 ? dataLabelsObj.dataLabelsPos.dataLabelsX : barXPosition + barWidth / 2;
50214
+ const pad = Math.max(barWidth, w.globals.barPadForNumericAxis);
50215
+ if (cx + pad < 0 || cx - pad > w.layout.gridWidth) {
50042
50216
  if (this._wasOnScreen(realIndex, j2)) leaving = true;
50043
50217
  else skipDrawing = true;
50044
50218
  }
50045
50219
  }
50046
- if (
50047
- /** @type {Record<string,any>} */
50048
- w.config.series[i2].data[j2] && /** @type {Record<string,any>} */
50049
- w.config.series[i2].data[j2].strokeColor
50050
- ) {
50051
- lineFill = /** @type {Record<string,any>} */
50052
- w.config.series[i2].data[j2].strokeColor;
50053
- }
50220
+ const datum = (
50221
+ /** @type {any} */
50222
+ w.config.series[realIndex].data[j2]
50223
+ );
50224
+ if (datum && datum.strokeColor) lineFill = datum.strokeColor;
50054
50225
  const fill = pathFill;
50055
50226
  if (this.isNullValue && w.globals.collapsingSeriesIndices.indexOf(realIndex) === -1) {
50056
50227
  pathFill = "none";
@@ -50073,7 +50244,7 @@ var __async = (__this, __arguments, generator) => {
50073
50244
  pathTo,
50074
50245
  stroke: lineFill,
50075
50246
  strokeWidth,
50076
- strokeLineCap: w.config.stroke.lineCap,
50247
+ strokeLinecap: w.config.stroke.lineCap,
50077
50248
  fill: pathFill,
50078
50249
  pathToInterp,
50079
50250
  animationDelay: delay,
@@ -50125,12 +50296,12 @@ var __async = (__this, __arguments, generator) => {
50125
50296
  cy: dataLabelsObj.dataLabelsPos.bcy,
50126
50297
  cx: dataLabelsObj.dataLabelsPos.bcx,
50127
50298
  j: j2,
50128
- val: w.seriesData.series[i2][j2],
50299
+ val: w.seriesData.series[realIndex][j2],
50129
50300
  barHeight,
50130
50301
  barWidth,
50131
50302
  // Datum identity for the next update's keyed join (see
50132
50303
  // LengthTransition): survivors match by key, not array position.
50133
- "data:pathKey": datumKey(w, realIndex, j2)
50304
+ "data:pathKey": this._keys(realIndex)[j2]
50134
50305
  });
50135
50306
  hl == null ? void 0 : hl.paint(renderedPath, {
50136
50307
  delay,
@@ -50206,7 +50377,10 @@ var __async = (__this, __arguments, generator) => {
50206
50377
  const j2 = indexes.j;
50207
50378
  let barYPosition;
50208
50379
  if (w.config.plotOptions.bar.hideZeroBarsWhenGrouped) {
50209
- const { nonZeroColumns, zeroEncounters } = this.barHelpers.getZeroValueEncounters({ i: i2, j: j2 });
50380
+ const { nonZeroColumns, zeroEncounters } = this.barHelpers.getZeroValueEncounters({
50381
+ i: indexes.realIndex,
50382
+ j: j2
50383
+ });
50210
50384
  if (nonZeroColumns > 0) {
50211
50385
  barHeight = this.seriesLen * barHeight / nonZeroColumns;
50212
50386
  }
@@ -50345,7 +50519,7 @@ var __async = (__this, __arguments, generator) => {
50345
50519
  barXPosition = xForNumericX.barXPosition;
50346
50520
  } else {
50347
50521
  if (w.config.plotOptions.bar.hideZeroBarsWhenGrouped) {
50348
- const { nonZeroColumns, zeroEncounters } = this.barHelpers.getZeroValueEncounters({ i: i2, j: j2 });
50522
+ const { nonZeroColumns, zeroEncounters } = this.barHelpers.getZeroValueEncounters({ i: realIndex, j: j2 });
50349
50523
  if (nonZeroColumns > 0) {
50350
50524
  barWidth = this.seriesLen * barWidth / nonZeroColumns;
50351
50525
  }
@@ -50409,15 +50583,16 @@ var __async = (__this, __arguments, generator) => {
50409
50583
  /** @param {{x: any, barWidth: any, realIndex: any, j: any}} opts */
50410
50584
  getBarXForNumericXAxis({ x: x2, barWidth, realIndex, j: j2 }) {
50411
50585
  const w = this.w;
50586
+ const overlay = isHistogramOverlay(w);
50412
50587
  let sxI = realIndex;
50413
50588
  if (!w.seriesData.seriesX[realIndex].length) {
50414
50589
  sxI = w.globals.maxValsInArrayIndex;
50415
50590
  }
50416
50591
  if (Utils$1.isNumber(w.seriesData.seriesX[sxI][j2])) {
50417
- x2 = AxisMapping.dataXToPx(w, w.seriesData.seriesX[sxI][j2]) - barWidth * this.seriesLen / 2;
50592
+ x2 = AxisMapping.dataXToPx(w, w.seriesData.seriesX[sxI][j2]) - barWidth * (overlay ? 1 : this.seriesLen) / 2;
50418
50593
  }
50419
50594
  return {
50420
- barXPosition: x2 + (isHistogramOverlay(w) ? 0 : barWidth * this.visibleI),
50595
+ barXPosition: x2 + (overlay ? 0 : barWidth * this.visibleI),
50421
50596
  x: x2
50422
50597
  };
50423
50598
  }
@@ -50438,7 +50613,20 @@ var __async = (__this, __arguments, generator) => {
50438
50613
  _wasOnScreen(realIndex, j2) {
50439
50614
  if (!lengthTransitionEnabled(this.w)) return false;
50440
50615
  const keyed = this._prevKeyedPaths(realIndex);
50441
- return !!keyed && keyed.has(datumKey(this.w, realIndex, j2));
50616
+ return !!keyed && keyed.has(this._keys(realIndex)[j2]);
50617
+ }
50618
+ /**
50619
+ * This render's datum keys for a series (see seriesKeys), as stamped on
50620
+ * each bar and looked up in the previous render's.
50621
+ * @param {number} realIndex
50622
+ * @returns {string[]}
50623
+ */
50624
+ _keys(realIndex) {
50625
+ const c = (
50626
+ /** @type {any} */
50627
+ this._keyCache || (this._keyCache = {})
50628
+ );
50629
+ return c[realIndex] || (c[realIndex] = seriesKeys(this.w, realIndex));
50442
50630
  }
50443
50631
  /**
50444
50632
  * The captured previous-render record for a series (last match wins, same
@@ -50494,7 +50682,7 @@ var __async = (__this, __arguments, generator) => {
50494
50682
  * @returns {boolean}
50495
50683
  */
50496
50684
  isLengthTransition(realIndex) {
50497
- var _a, _b;
50685
+ var _a, _b, _c, _d, _e, _f;
50498
50686
  if (!this._ltCache) this._ltCache = {};
50499
50687
  if (this._ltCache[realIndex] !== void 0) return this._ltCache[realIndex];
50500
50688
  const w = this.w;
@@ -50502,20 +50690,14 @@ var __async = (__this, __arguments, generator) => {
50502
50690
  if (lengthTransitionEnabled(w) && w.globals.previousPaths.length > 0) {
50503
50691
  const record = this._prevRecord(realIndex);
50504
50692
  const dataLen = (_b = (_a = w.seriesData.series[realIndex]) == null ? void 0 : _a.length) != null ? _b : 0;
50693
+ const keyed = record && this._prevKeyedPaths(realIndex);
50505
50694
  if (!record) {
50506
50695
  result = dataLen > 0;
50507
- } else if (record.paths.length !== dataLen) {
50508
- result = true;
50696
+ } else if (keyed) {
50697
+ const now = new Set(this._keys(realIndex));
50698
+ result = ((_f = (_e = (_d = (_c = w.globals.prevStreamFrame) == null ? void 0 : _c.seriesY) == null ? void 0 : _d[realIndex]) == null ? void 0 : _e.length) != null ? _f : dataLen) !== dataLen || [...keyed.keys()].some((k2) => !now.has(k2));
50509
50699
  } else {
50510
- const keyed = this._prevKeyedPaths(realIndex);
50511
- if (keyed) {
50512
- for (let j2 = 0; j2 < dataLen; j2++) {
50513
- if (!keyed.has(datumKey(w, realIndex, j2))) {
50514
- result = true;
50515
- break;
50516
- }
50517
- }
50518
- }
50700
+ result = record.paths.length !== dataLen;
50519
50701
  }
50520
50702
  }
50521
50703
  this._ltCache[realIndex] = result;
@@ -50575,7 +50757,7 @@ var __async = (__this, __arguments, generator) => {
50575
50757
  let isNewDatum = false;
50576
50758
  const keyed = this._prevKeyedPaths(realIndex);
50577
50759
  if (keyed) {
50578
- const prev = keyed.get(datumKey(w, realIndex, j2));
50760
+ const prev = keyed.get(this._keys(realIndex)[j2]);
50579
50761
  if (prev) {
50580
50762
  oldD = prev.d;
50581
50763
  } else {
@@ -50718,11 +50900,10 @@ var __async = (__this, __arguments, generator) => {
50718
50900
  * @returns {boolean | null} null when there is no previous record to consult
50719
50901
  */
50720
50902
  getPreviousFlip(realIndex, j2) {
50721
- const w = this.w;
50722
50903
  const record = this._prevRecord(realIndex);
50723
50904
  if (!record) return null;
50724
50905
  const keyed = this._prevKeyedPaths(realIndex);
50725
- const prev = keyed ? keyed.get(datumKey(w, realIndex, j2)) : record.paths[j2];
50906
+ const prev = keyed ? keyed.get(this._keys(realIndex)[j2]) : record.paths[j2];
50726
50907
  return prev ? !!prev.flip : null;
50727
50908
  }
50728
50909
  /**
@@ -50749,7 +50930,7 @@ var __async = (__this, __arguments, generator) => {
50749
50930
  const coreUtils = new CoreUtils(this.w);
50750
50931
  series = coreUtils.getLogSeries(series);
50751
50932
  this.yRatio = coreUtils.getLogYRatios(this.yRatio);
50752
- this.barHelpers.initVariables(series);
50933
+ this.barHelpers.initVariables(series, seriesIndex);
50753
50934
  if (w.config.chart.stackType === "100%") {
50754
50935
  series = w.globals.comboCharts ? (
50755
50936
  /** @type {any} */
@@ -50780,7 +50961,6 @@ var __async = (__this, __arguments, generator) => {
50780
50961
  const xArrValues = [];
50781
50962
  const yArrValues = [];
50782
50963
  const translationsIndex = this.setSeriesAxis(realIndex);
50783
- this.isReversed = w.config.yaxis[this.yaxisIndex] && w.config.yaxis[this.yaxisIndex].reversed;
50784
50964
  let elSeries = this.graphics.group({
50785
50965
  class: `apexcharts-series`,
50786
50966
  seriesName: Utils$1.escapeString(w.seriesData.seriesNames[realIndex]),
@@ -50850,7 +51030,9 @@ var __async = (__this, __arguments, generator) => {
50850
51030
  null
50851
51031
  );
50852
51032
  if (this.isHorizontal) {
50853
- paths = this.drawStackedBarPaths(__spreadProps(__spreadValues({}, commonPathOpts), {
51033
+ paths = this.drawStackedBarPaths(__spreadProps(__spreadValues(__spreadValues({}, commonPathOpts), this.barHelpers.rows && {
51034
+ y: initPositions.y + this.barHelpers.barRow(realIndex, j2) * yDivision
51035
+ }), {
50854
51036
  zeroW,
50855
51037
  barHeight,
50856
51038
  yDivision
@@ -50924,6 +51106,7 @@ var __async = (__this, __arguments, generator) => {
50924
51106
  series,
50925
51107
  barHeight,
50926
51108
  barWidth,
51109
+ barXPosition: paths.barXPosition,
50927
51110
  elDataLabelsWrap,
50928
51111
  elGoalsMarkers,
50929
51112
  type: "bar",
@@ -50941,7 +51124,7 @@ var __async = (__this, __arguments, generator) => {
50941
51124
  this.groupCtx.prevXVal.push(this.groupCtx.xArrjVal);
50942
51125
  ret.add(elSeries);
50943
51126
  }
50944
- if (heldMirrors) this.settleHeldMirrors();
51127
+ if (heldMirrors) this.settleHeldMirrors(ret);
50945
51128
  return ret;
50946
51129
  }
50947
51130
  /**
@@ -50962,15 +51145,21 @@ var __async = (__this, __arguments, generator) => {
50962
51145
  * 'bottom' → 'top', where the endpoint really is rounded at the other end;
50963
51146
  * everywhere else the mirror is an exact identity on the settled shape, so
50964
51147
  * removing it changes nothing on screen.
51148
+ *
51149
+ * The marks are collected now, not when the timer fires: a query then also
51150
+ * stripped the mirrors a LATER update was still holding mid-tween.
51151
+ * @param {any} [ret] this draw's series group (default: the whole chart)
50965
51152
  */
50966
- settleHeldMirrors() {
51153
+ settleHeldMirrors(ret) {
50967
51154
  const w = this.w;
50968
51155
  if (!Environment.isBrowser()) return;
50969
51156
  const anim = w.config.chart.animations;
50970
51157
  const hold = (anim.dynamicAnimation.speed || 0) + (anim.speed || 0) + 100;
51158
+ const held = (ret ? ret.node : w.dom.baseEl).querySelectorAll(
51159
+ ".apexcharts-flip-held"
51160
+ );
50971
51161
  setTimeout(() => {
50972
- if (w.globals.isDestroyed || !Utils$1.elementExists(w.dom.baseEl)) return;
50973
- w.dom.baseEl.querySelectorAll(".apexcharts-flip-held").forEach((el) => {
51162
+ held.forEach((el) => {
50974
51163
  el.classList.remove(
50975
51164
  "apexcharts-flip-held",
50976
51165
  "apexcharts-flip-y",
@@ -51046,7 +51235,7 @@ var __async = (__this, __arguments, generator) => {
51046
51235
  yDivision,
51047
51236
  elSeries
51048
51237
  }) {
51049
- var _a, _b, _c, _d, _e;
51238
+ var _a, _b;
51050
51239
  const w = this.w;
51051
51240
  const barYPosition = y + columnGroupIndex * barHeight;
51052
51241
  let barXPosition;
@@ -51054,36 +51243,21 @@ var __async = (__this, __arguments, generator) => {
51054
51243
  const j2 = indexes.j;
51055
51244
  const realIndex = indexes.realIndex;
51056
51245
  const translationsIndex = indexes.translationsIndex;
51057
- let prevBarW = 0;
51058
- for (let k2 = 0; k2 < this.groupCtx.prevXF.length; k2++) {
51059
- prevBarW = prevBarW + this.groupCtx.prevXF[k2][j2];
51060
- }
51061
- const gsi = this.groupCtx.prevX.length;
51062
- if (gsi > 0) {
51063
- let bXP = zeroW;
51064
- if (this.groupCtx.prevXVal[gsi - 1][j2] < 0) {
51065
- bXP = /** @type {any} */
51066
- ((_a = this.series[i2]) == null ? void 0 : _a[j2]) >= 0 ? this.groupCtx.prevX[gsi - 1][j2] + prevBarW - (this.isReversed ? prevBarW : 0) * 2 : this.groupCtx.prevX[gsi - 1][j2];
51067
- } else if (this.groupCtx.prevXVal[gsi - 1][j2] >= 0) {
51068
- bXP = /** @type {any} */
51069
- ((_b = this.series[i2]) == null ? void 0 : _b[j2]) >= 0 ? this.groupCtx.prevX[gsi - 1][j2] : this.groupCtx.prevX[gsi - 1][j2] - prevBarW + (this.isReversed ? prevBarW : 0) * 2;
51070
- }
51071
- barXPosition = bXP;
51072
- } else {
51073
- barXPosition = zeroW;
51074
- }
51075
- if (
51246
+ const v = (
51076
51247
  /** @type {any} */
51077
- ((_c = this.series[i2]) == null ? void 0 : _c[j2]) === null
51078
- ) {
51079
- x2 = barXPosition;
51248
+ (_b = (_a = this.series[i2]) == null ? void 0 : _a[j2]) != null ? _b : null
51249
+ );
51250
+ const g = this.groupCtx;
51251
+ const key = w.axisFlags.isXNumeric ? w.seriesData.seriesX[realIndex][j2] : j2;
51252
+ const top = g.tops.get(key);
51253
+ if (top) {
51254
+ const [prevX, prevVal, prevBarW] = top;
51255
+ const flip = (this.isReversed ? prevBarW : 0) * 2;
51256
+ barXPosition = prevVal < 0 ? v >= 0 ? prevX + prevBarW - flip : prevX : v >= 0 ? prevX : prevX - prevBarW + flip;
51080
51257
  } else {
51081
- x2 = barXPosition + /** @type {any} */
51082
- ((_d = this.series[i2]) == null ? void 0 : _d[j2]) / this.invertedYRatio - (this.isReversed ? (
51083
- /** @type {any} */
51084
- ((_e = this.series[i2]) == null ? void 0 : _e[j2]) / this.invertedYRatio
51085
- ) : 0) * 2;
51258
+ barXPosition = zeroW;
51086
51259
  }
51260
+ x2 = barXPosition + v / this.invertedYRatio * (this.isReversed ? -1 : 1);
51087
51261
  const paths = this.barHelpers.getBarpaths({
51088
51262
  barYPosition,
51089
51263
  barHeight,
@@ -51097,6 +51271,7 @@ var __async = (__this, __arguments, generator) => {
51097
51271
  j: j2,
51098
51272
  w
51099
51273
  });
51274
+ this._setTop(key, top, g.xArrj[j2], g.xArrjVal[j2], g.xArrjF[j2], realIndex, j2);
51100
51275
  this.barHelpers.barBackground({
51101
51276
  j: j2,
51102
51277
  i: i2,
@@ -51134,13 +51309,17 @@ var __async = (__this, __arguments, generator) => {
51134
51309
  columnGroupIndex,
51135
51310
  elSeries
51136
51311
  }) {
51137
- var _a, _b, _c, _d, _e, _f;
51312
+ var _a, _b, _c;
51138
51313
  const w = this.w;
51139
51314
  const i2 = indexes.i;
51140
51315
  const j2 = indexes.j;
51141
51316
  const bc = indexes.bc;
51142
51317
  const realIndex = indexes.realIndex;
51143
51318
  const translationsIndex = indexes.translationsIndex;
51319
+ const v = (
51320
+ /** @type {any} */
51321
+ (_b = (_a = this.series[i2]) == null ? void 0 : _a[j2]) != null ? _b : null
51322
+ );
51144
51323
  if (w.axisFlags.isXNumeric) {
51145
51324
  let seriesVal = w.seriesData.seriesX[realIndex][j2];
51146
51325
  if (!seriesVal) seriesVal = 0;
@@ -51155,11 +51334,9 @@ var __async = (__this, __arguments, generator) => {
51155
51334
  const [prevYValue, prevVal, prevBarH] = top;
51156
51335
  let bYP;
51157
51336
  if (prevVal < 0) {
51158
- bYP = /** @type {any} */
51159
- ((_a = this.series[i2]) == null ? void 0 : _a[j2]) >= 0 ? prevYValue - prevBarH + (this.isReversed ? prevBarH : 0) * 2 : prevYValue;
51337
+ bYP = v >= 0 ? prevYValue - prevBarH + (this.isReversed ? prevBarH : 0) * 2 : prevYValue;
51160
51338
  } else if (prevVal >= 0) {
51161
- bYP = /** @type {any} */
51162
- ((_b = this.series[i2]) == null ? void 0 : _b[j2]) >= 0 ? prevYValue : prevYValue + prevBarH - (this.isReversed ? prevBarH : 0) * 2;
51339
+ bYP = v >= 0 ? prevYValue : prevYValue + prevBarH - (this.isReversed ? prevBarH : 0) * 2;
51163
51340
  }
51164
51341
  if (typeof bYP === "undefined") bYP = w.layout.gridHeight;
51165
51342
  if (((_c = g.prevYF[0]) == null ? void 0 : _c.every((val) => val === 0)) && g.prevYF.slice(1).every(
@@ -51172,25 +51349,16 @@ var __async = (__this, __arguments, generator) => {
51172
51349
  } else {
51173
51350
  barYPosition = zeroH;
51174
51351
  }
51175
- if (
51176
- /** @type {any} */
51177
- (_d = this.series[i2]) == null ? void 0 : _d[j2]
51178
- ) {
51179
- y = barYPosition - /** @type {any} */
51180
- ((_e = this.series[i2]) == null ? void 0 : _e[j2]) / this.yRatio[translationsIndex] + (this.isReversed ? (
51181
- /** @type {any} */
51182
- ((_f = this.series[i2]) == null ? void 0 : _f[j2]) / this.yRatio[translationsIndex]
51183
- ) : 0) * 2;
51184
- } else {
51185
- y = barYPosition;
51186
- }
51352
+ y = barYPosition - v / this.yRatio[translationsIndex] * (this.isReversed ? -1 : 1);
51187
51353
  const paths = this.barHelpers.getColumnPaths({
51188
51354
  barXPosition,
51189
51355
  barWidth,
51190
51356
  y1: barYPosition,
51191
51357
  y2: y,
51192
51358
  yRatio: this.yRatio[translationsIndex],
51193
- strokeWidth: this.strokeWidth,
51359
+ // the series' width even for an empty segment, so a hidden layer keeps
51360
+ // its place, but no inset at all when no stroke is drawn
51361
+ strokeWidth: w.config.stroke.show ? this.strokeWidth : 0,
51194
51362
  isReversed: this.isReversed,
51195
51363
  series: this.series,
51196
51364
  realIndex: indexes.realIndex,
@@ -51198,17 +51366,7 @@ var __async = (__this, __arguments, generator) => {
51198
51366
  j: j2,
51199
51367
  w
51200
51368
  });
51201
- const t2 = g.yArrj[j2];
51202
- if (!isNaN(t2)) {
51203
- g.tops.set(key, [
51204
- t2,
51205
- g.yArrjVal[j2],
51206
- (top ? top[2] : 0) + g.yArrjF[j2],
51207
- (top ? top[3] : 0) + (w.seriesData.series[realIndex][j2] || 0),
51208
- top ? Math.min(top[0], top[4]) : 1 / 0,
51209
- top ? Math.max(top[0], top[5]) : -1 / 0
51210
- ]);
51211
- }
51369
+ this._setTop(key, top, g.yArrj[j2], g.yArrjVal[j2], g.yArrjF[j2], realIndex, j2);
51212
51370
  this.barHelpers.barBackground({
51213
51371
  bc,
51214
51372
  j: j2,
@@ -51227,17 +51385,47 @@ var __async = (__this, __arguments, generator) => {
51227
51385
  zeroH,
51228
51386
  realIndex,
51229
51387
  j2,
51230
- 0
51388
+ translationsIndex
51231
51389
  ),
51232
51390
  barXPosition,
51233
51391
  x: w.axisFlags.isXNumeric ? x2 : x2 + xDivision,
51234
51392
  y
51235
51393
  };
51236
51394
  }
51395
+ /**
51396
+ * Record the segment just drawn as the top of its stack. Per key it holds
51397
+ * the top and value of the last segment drawn there, the summed lengths and
51398
+ * raw values of every segment so far (the total label's value), and the
51399
+ * extreme tops below that segment (the total label's position).
51400
+ * @param {any} key @param {any} top @param {number} t @param {any} val
51401
+ * @param {number} len @param {number} realIndex @param {number} j
51402
+ */
51403
+ _setTop(key, top, t2, val, len, realIndex, j2) {
51404
+ if (isNaN(t2)) return;
51405
+ this.groupCtx.tops.set(key, [
51406
+ t2,
51407
+ val,
51408
+ (top ? top[2] : 0) + len,
51409
+ (top ? top[3] : 0) + (this.w.seriesData.series[realIndex][j2] || 0),
51410
+ top ? Math.min(top[0], top[4]) : 1 / 0,
51411
+ top ? Math.max(top[0], top[5]) : -1 / 0
51412
+ ]);
51413
+ }
51414
+ }
51415
+ function jitterExtent(pool, w) {
51416
+ let lo = Infinity;
51417
+ let hi = -Infinity;
51418
+ pool.slice(0, w.seriesData.series.length).flat(2).forEach((v) => {
51419
+ if (v === +v) {
51420
+ if (v < lo) lo = v;
51421
+ if (v > hi) hi = v;
51422
+ }
51423
+ });
51424
+ return [lo, hi];
51237
51425
  }
51238
51426
  function buildJitterGroups({
51239
- w,
51240
51427
  points,
51428
+ extent,
51241
51429
  seedA,
51242
51430
  seedB,
51243
51431
  center,
@@ -51248,6 +51436,7 @@ var __async = (__this, __arguments, generator) => {
51248
51436
  clampAt,
51249
51437
  sideSign
51250
51438
  }) {
51439
+ var _a, _b;
51251
51440
  const opts = options2;
51252
51441
  if (!opts || opts.show === false) return [];
51253
51442
  if (!points || !points.length) return [];
@@ -51261,8 +51450,8 @@ var __async = (__this, __arguments, generator) => {
51261
51450
  const scale = opts.colorScale;
51262
51451
  const useScale = scale && Array.isArray(scale.colors) && scale.colors.length > 0;
51263
51452
  const steps = useScale ? Math.max(2, scale.steps || 24) : 1;
51264
- const sMin = useScale && scale.min != null ? scale.min : w.globals.minY;
51265
- const sMax = useScale && scale.max != null ? scale.max : w.globals.maxY;
51453
+ const sMin = (_a = scale == null ? void 0 : scale.min) != null ? _a : extent[0];
51454
+ const sMax = (_b = scale == null ? void 0 : scale.max) != null ? _b : extent[1];
51266
51455
  const span = sMax - sMin || 1;
51267
51456
  const buckets = useScale ? new Array(steps).fill("") : [""];
51268
51457
  for (let k2 = 0; k2 < points.length; k2 += stride) {
@@ -51348,7 +51537,7 @@ var __async = (__this, __arguments, generator) => {
51348
51537
  elSeries.add(elPointsWrap);
51349
51538
  }
51350
51539
  function darkenColor(color, amount) {
51351
- const rgb = Utils$1.parseHex(color);
51540
+ const rgb = Utils$1.parseColor(color) || Utils$1.parseColor(Utils$1.resolveColor(color));
51352
51541
  if (!rgb) return color;
51353
51542
  const f = Math.max(0, 1 - amount);
51354
51543
  return `rgb(${Math.round(rgb[0] * f)},${Math.round(rgb[1] * f)},${Math.round(rgb[2] * f)})`;
@@ -51413,7 +51602,7 @@ var __async = (__this, __arguments, generator) => {
51413
51602
  if (!keyed || keyed.size === 0 || !row || row.length === 0) return false;
51414
51603
  let survivors = 0;
51415
51604
  for (let j2 = 0; j2 < row.length; j2++) {
51416
- if (keyed.has(datumKey(this.w, realIndex, j2))) survivors++;
51605
+ if (keyed.has(this._keys(realIndex)[j2])) survivors++;
51417
51606
  }
51418
51607
  return survivors / keyed.size < 0.5;
51419
51608
  }
@@ -51442,7 +51631,7 @@ var __async = (__this, __arguments, generator) => {
51442
51631
  }
51443
51632
  this._prevHalves[realIndex] = map;
51444
51633
  }
51445
- const halves = map && map.get(datumKey(this.w, realIndex, j2));
51634
+ const halves = map && map.get(this._keys(realIndex)[j2]);
51446
51635
  return halves && halves.length === 2 ? halves[pi] : null;
51447
51636
  }
51448
51637
  /**
@@ -51452,7 +51641,7 @@ var __async = (__this, __arguments, generator) => {
51452
51641
  */
51453
51642
  // @ts-ignore -- BoxCandleStick.draw has an extra ctype param compared to Bar.draw
51454
51643
  draw(series, ctype, seriesIndex) {
51455
- var _a;
51644
+ var _a, _b;
51456
51645
  const w = this.w;
51457
51646
  const graphics = new Graphics(this.w);
51458
51647
  const type = w.globals.comboCharts ? ctype : w.config.chart.type;
@@ -51460,16 +51649,17 @@ var __async = (__this, __arguments, generator) => {
51460
51649
  this.candlestickOptions = this.w.config.plotOptions.candlestick;
51461
51650
  this.boxOptions = this.w.config.plotOptions.boxPlot;
51462
51651
  this.isHorizontal = w.config.plotOptions.bar.horizontal;
51463
- this.isOHLC = this.candlestickOptions && this.candlestickOptions.type === "ohlc";
51464
51652
  this.coreUtils = new CoreUtils(this.w);
51465
51653
  series = this.coreUtils.getLogSeries(series);
51466
51654
  this.series = series;
51467
51655
  this.yRatio = this.coreUtils.getLogYRatios(this.yRatio);
51468
- this.barHelpers.initVariables(series);
51656
+ this.barHelpers.initVariables(series, seriesIndex);
51469
51657
  const ret = graphics.group({
51470
51658
  class: `apexcharts-${type}-series apexcharts-plot-series`
51471
51659
  });
51472
51660
  this.isBoxPlot = type === "boxPlot";
51661
+ this.isOHLC = !this.isBoxPlot && ((_a = this.candlestickOptions) == null ? void 0 : _a.type) === "ohlc";
51662
+ const jx = jitterExtent(w.candleData.seriesBoxPoints, w);
51473
51663
  for (let i2 = 0; i2 < series.length; i2++) {
51474
51664
  let x2;
51475
51665
  let y;
@@ -51595,6 +51785,7 @@ var __async = (__this, __arguments, generator) => {
51595
51785
  i: i2,
51596
51786
  pathFrom: (_a2 = this._prevBoxHalf(realIndex, j2, pi)) != null ? _a2 : paths.pathFrom,
51597
51787
  fadeReveal,
51788
+ noLabel: pi > 0,
51598
51789
  pathTo,
51599
51790
  strokeWidth,
51600
51791
  elSeries,
@@ -51616,7 +51807,7 @@ var __async = (__this, __arguments, generator) => {
51616
51807
  }
51617
51808
  );
51618
51809
  if (boxPointsOpts && boxPointsOpts.show !== false) {
51619
- const pts = (_a = w.candleData.seriesBoxPoints[realIndex]) == null ? void 0 : _a[j2];
51810
+ const pts = (_b = w.candleData.seriesBoxPoints[realIndex]) == null ? void 0 : _b[j2];
51620
51811
  if (pts && pts.length) {
51621
51812
  const logVal = (v) => (
51622
51813
  /** @type {any} */
@@ -51627,14 +51818,14 @@ var __async = (__this, __arguments, generator) => {
51627
51818
  );
51628
51819
  let center, halfExtent, alongFn;
51629
51820
  if (this.isHorizontal) {
51630
- const yRatio = this.invertedYRatio;
51821
+ const yRatio = this.invertedYRatio * (this.isReversed ? -1 : 1);
51631
51822
  const bh = barHeight != null ? barHeight : 0;
51632
51823
  const z = zeroW != null ? zeroW : 0;
51633
51824
  center = paths.barYPosition + bh / 2;
51634
51825
  halfExtent = bh / 2;
51635
51826
  alongFn = (v) => z + logVal(v) / yRatio;
51636
51827
  } else {
51637
- const yRatio = this.yRatio[translationsIndex];
51828
+ const yRatio = this.yRatio[translationsIndex] * (this.isReversed ? -1 : 1);
51638
51829
  const bw = barWidth != null ? barWidth : 0;
51639
51830
  const z = zeroH != null ? zeroH : 0;
51640
51831
  center = paths.barXPosition + bw / 2;
@@ -51642,8 +51833,8 @@ var __async = (__this, __arguments, generator) => {
51642
51833
  alongFn = (v) => z - logVal(v) / yRatio;
51643
51834
  }
51644
51835
  const groups = buildJitterGroups({
51645
- w,
51646
51836
  points: pts,
51837
+ extent: jx,
51647
51838
  seedA: realIndex,
51648
51839
  seedB: j2,
51649
51840
  center,
@@ -51672,15 +51863,13 @@ var __async = (__this, __arguments, generator) => {
51672
51863
  w.globals.seriesXvalues[realIndex] = xArrj;
51673
51864
  w.globals.seriesYvalues[realIndex] = yArrj;
51674
51865
  if (w.globals.previousPaths.length > 0 && !fadeReveal) {
51675
- const newKeys = [];
51676
- for (let j2 = 0; j2 < series[i2].length; j2++) {
51677
- newKeys.push(datumKey(w, realIndex, j2));
51678
- }
51679
51866
  renderBarExitGhosts({
51680
51867
  w,
51681
51868
  elSeries,
51682
51869
  record: this._prevRecord(realIndex),
51683
- newKeys,
51870
+ newKeys: this._keys(realIndex).filter(
51871
+ (_, j2) => series[i2][j2] != null
51872
+ ),
51684
51873
  isHorizontal: this.isHorizontal,
51685
51874
  speed: w.config.chart.animations.dynamicAnimation.speed
51686
51875
  });
@@ -51699,7 +51888,7 @@ var __async = (__this, __arguments, generator) => {
51699
51888
  strokeWidth,
51700
51889
  cullBounds = null
51701
51890
  }) {
51702
- var _a, _b, _c, _d;
51891
+ var _a, _b, _c;
51703
51892
  const w = this.w;
51704
51893
  const graphics = new Graphics(this.w);
51705
51894
  const i2 = indexes.i;
@@ -51710,7 +51899,7 @@ var __async = (__this, __arguments, generator) => {
51710
51899
  const getColor = (color2) => Array.isArray(color2) ? color2[realIndex] : color2;
51711
51900
  const colorPos = getColor(candleColors.upward);
51712
51901
  const colorNeg = getColor(candleColors.downward);
51713
- const yRatio = this.yRatio[indexes.translationsIndex];
51902
+ const yRatio = this.yRatio[indexes.translationsIndex] * (this.isReversed ? -1 : 1);
51714
51903
  const ohlc = this.getOHLCValue(realIndex, j2);
51715
51904
  let l1 = zeroH;
51716
51905
  let l2 = zeroH;
@@ -51727,9 +51916,11 @@ var __async = (__this, __arguments, generator) => {
51727
51916
  x2 = pos.x;
51728
51917
  barXPosition = pos.barXPosition;
51729
51918
  }
51730
- if (typeof /** @type {any} */
51731
- ((_a = this.series[i2]) == null ? void 0 : _a[j2]) === "undefined" || /** @type {any} */
51732
- ((_b = this.series[i2]) == null ? void 0 : _b[j2]) === null) {
51919
+ const hole = (
51920
+ /** @type {any} */
51921
+ ((_a = this.series[i2]) == null ? void 0 : _a[j2]) == null
51922
+ );
51923
+ if (hole) {
51733
51924
  y1 = zeroH;
51734
51925
  y2 = zeroH;
51735
51926
  } else {
@@ -51739,7 +51930,7 @@ var __async = (__this, __arguments, generator) => {
51739
51930
  l2 = zeroH - ohlc.l / yRatio;
51740
51931
  m = zeroH - ohlc.m / yRatio;
51741
51932
  }
51742
- if (cullBounds && (barXPosition + barWidth < cullBounds.lo || barXPosition > cullBounds.hi) && !this._wasOnScreen(realIndex, j2)) {
51933
+ if (hole || cullBounds && (barXPosition + barWidth < cullBounds.lo || barXPosition > cullBounds.hi) && !this._wasOnScreen(realIndex, j2)) {
51743
51934
  return {
51744
51935
  pathTo: null,
51745
51936
  pathFrom: null,
@@ -51769,7 +51960,7 @@ var __async = (__this, __arguments, generator) => {
51769
51960
  ];
51770
51961
  }
51771
51962
  let pathFrom = null;
51772
- const morphFrom = (_d = (_c = this.ctx) == null ? void 0 : _c.morphTypeChange) == null ? void 0 : _d.getInitialPathFor(realIndex, j2);
51963
+ const morphFrom = (_c = (_b = this.ctx) == null ? void 0 : _b.morphTypeChange) == null ? void 0 : _c.getInitialPathFor(realIndex, j2);
51773
51964
  if (morphFrom) {
51774
51965
  pathFrom = morphFrom;
51775
51966
  } else if (w.globals.previousPaths.length > 0) {
@@ -51808,7 +51999,7 @@ var __async = (__this, __arguments, generator) => {
51808
51999
  zeroW,
51809
52000
  strokeWidth
51810
52001
  }) {
51811
- var _a, _b, _c, _d;
52002
+ var _a, _b, _c;
51812
52003
  const w = this.w;
51813
52004
  const graphics = new Graphics(this.w);
51814
52005
  const i2 = indexes.i;
@@ -51817,7 +52008,7 @@ var __async = (__this, __arguments, generator) => {
51817
52008
  const { colors: candleColors } = w.config.plotOptions.candlestick;
51818
52009
  const { colors: boxColors } = this.boxOptions;
51819
52010
  const getColor = (color2) => Array.isArray(color2) ? color2[realIndex] : color2;
51820
- const yRatio = this.invertedYRatio;
52011
+ const yRatio = this.invertedYRatio * (this.isReversed ? -1 : 1);
51821
52012
  const ohlc = this.getOHLCValue(realIndex, j2);
51822
52013
  let color = ohlc.o < ohlc.c ? [getColor(candleColors.upward)] : [getColor(candleColors.downward)];
51823
52014
  if (this.isBoxPlot) {
@@ -51829,9 +52020,11 @@ var __async = (__this, __arguments, generator) => {
51829
52020
  let x2 = Math.max(ohlc.o, ohlc.c);
51830
52021
  let m = ohlc.m;
51831
52022
  const barYPosition = y + barHeight * this.visibleI;
51832
- if (typeof /** @type {any} */
51833
- ((_a = this.series[i2]) == null ? void 0 : _a[j2]) === "undefined" || /** @type {any} */
51834
- ((_b = this.series[i2]) == null ? void 0 : _b[j2]) === null) {
52023
+ const hole = (
52024
+ /** @type {any} */
52025
+ ((_a = this.series[i2]) == null ? void 0 : _a[j2]) == null
52026
+ );
52027
+ if (hole) {
51835
52028
  x1 = zeroW;
51836
52029
  x2 = zeroW;
51837
52030
  } else {
@@ -51846,7 +52039,7 @@ var __async = (__this, __arguments, generator) => {
51846
52039
  graphics.move(m, barYPosition) + graphics.line(m, barYPosition + barHeight) + graphics.line(x2, barYPosition + barHeight) + graphics.line(x2, barYPosition + barHeight / 2) + graphics.line(l2, barYPosition + barHeight / 2) + graphics.line(l2, barYPosition + barHeight - barHeight / 4) + graphics.line(l2, barYPosition + barHeight / 4) + graphics.line(l2, barYPosition + barHeight / 2) + graphics.line(x2, barYPosition + barHeight / 2) + graphics.line(x2, barYPosition) + graphics.line(m, barYPosition) + "z"
51847
52040
  ];
51848
52041
  let pathFrom = null;
51849
- const morphFrom = (_d = (_c = this.ctx) == null ? void 0 : _c.morphTypeChange) == null ? void 0 : _d.getInitialPathFor(realIndex, j2);
52042
+ const morphFrom = (_c = (_b = this.ctx) == null ? void 0 : _b.morphTypeChange) == null ? void 0 : _c.getInitialPathFor(realIndex, j2);
51850
52043
  if (morphFrom) {
51851
52044
  pathFrom = morphFrom;
51852
52045
  } else if (w.globals.previousPaths.length > 0) {
@@ -51871,7 +52064,8 @@ var __async = (__this, __arguments, generator) => {
51871
52064
  0
51872
52065
  ),
51873
52066
  barYPosition,
51874
- color
52067
+ color,
52068
+ culled: hole
51875
52069
  };
51876
52070
  }
51877
52071
  /**
@@ -52048,13 +52242,9 @@ var __async = (__this, __arguments, generator) => {
52048
52242
  elDataLabelsWrap = graphics.group({
52049
52243
  class: "apexcharts-data-labels"
52050
52244
  });
52051
- const offX = resolveDataLabelOffset(dataLabelsConfig.offsetX, w, i2, j2);
52052
- const offY = resolveDataLabelOffset(dataLabelsConfig.offsetY, w, i2, j2);
52053
- const dataLabelsX = x2 + offX;
52054
- const dataLabelsY = y + parseFloat(dataLabelsConfig.style.fontSize) / 3 + offY;
52055
52245
  dataLabels.plotDataLabelsText({
52056
- x: dataLabelsX,
52057
- y: dataLabelsY,
52246
+ x: x2,
52247
+ y: y + parseFloat(dataLabelsConfig.style.fontSize) / 3,
52058
52248
  text,
52059
52249
  i: i2,
52060
52250
  j: j2,
@@ -52518,18 +52708,16 @@ var __async = (__this, __arguments, generator) => {
52518
52708
  this.lineCtx = lineCtx;
52519
52709
  }
52520
52710
  /**
52521
- * @param {number} i
52711
+ * @param {number} i index into `series`, the rows this draw call renders
52522
52712
  * @param {any[]} series
52713
+ * @param {number} realIndex index into the config / fill options
52523
52714
  */
52524
- sameValueSeriesFix(i2, series) {
52715
+ sameValueSeriesFix(i2, series, realIndex) {
52525
52716
  const w = this.w;
52526
- if (w.config.fill.type === "gradient" || w.config.fill.type[i2] === "gradient") {
52527
- const coreUtils = new CoreUtils(this.lineCtx.w);
52528
- if (coreUtils.seriesHaveSameValues(i2)) {
52529
- const gSeries = series[i2].slice();
52530
- gSeries[gSeries.length - 1] = gSeries[gSeries.length - 1] + 1e-6;
52531
- series[i2] = gSeries;
52532
- }
52717
+ const s2 = series[i2];
52718
+ if ((w.config.fill.type === "gradient" || w.config.fill.type[realIndex] === "gradient") && s2.every((v) => v === s2[0])) {
52719
+ series[i2] = s2.slice();
52720
+ series[i2][s2.length - 1] += 1e-6;
52533
52721
  }
52534
52722
  return series;
52535
52723
  }
@@ -52818,13 +53006,27 @@ var __async = (__this, __arguments, generator) => {
52818
53006
  this.yRatio = coreUtils.getLogYRatios(this.yRatio);
52819
53007
  this.prevSeriesY = [];
52820
53008
  this.prevSeriesYByX = /* @__PURE__ */ new Map();
53009
+ this._stackXs = null;
53010
+ if (w.config.chart.stacked && w.axisFlags.isXNumeric) {
53011
+ const xs = series.map(
53012
+ (_, i2) => w.globals.comboCharts ? (
53013
+ /** @type {any} */
53014
+ seriesIndex[i2]
53015
+ ) : i2
53016
+ ).filter((ri) => !this._hidden(ri)).map((ri) => w.seriesData.seriesX[ri] || []);
53017
+ if (xs.some(
53018
+ (a2) => a2.length !== xs[0].length || a2.some((v, k2) => v !== xs[0][k2])
53019
+ )) {
53020
+ this._stackXs = [...new Set(xs.flat())].sort((a2, b) => a2 - b);
53021
+ }
53022
+ }
52821
53023
  const allSeries = [];
52822
53024
  for (let i2 = 0; i2 < series.length; i2++) {
52823
- series = this.lineHelpers.sameValueSeriesFix(i2, series);
52824
53025
  const realIndex = w.globals.comboCharts ? (
52825
53026
  /** @type {any} */
52826
53027
  seriesIndex[i2]
52827
53028
  ) : i2;
53029
+ series = this.lineHelpers.sameValueSeriesFix(i2, series, realIndex);
52828
53030
  const translationsIndex = this.yRatio.length > 1 ? realIndex : 0;
52829
53031
  const flat = this._collapsedBaselineRow(series, i2, realIndex);
52830
53032
  this._shapeOnly = !!flat;
@@ -53008,9 +53210,7 @@ var __async = (__this, __arguments, generator) => {
53008
53210
  const gl = w.globals;
53009
53211
  if (w.config.chart.stacked || this.pointsChart) return null;
53010
53212
  if (!Array.isArray(series[i2]) || series[i2].length !== 0) return null;
53011
- if (gl.collapsedSeriesIndices.indexOf(realIndex) === -1 && gl.ancillaryCollapsedSeriesIndices.indexOf(realIndex) === -1) {
53012
- return null;
53013
- }
53213
+ if (!this._hidden(realIndex)) return null;
53014
53214
  const n2 = w.axisFlags.isXNumeric ? (w.seriesData.seriesX[realIndex] || []).length : gl.dataPoints;
53015
53215
  if (!n2) return null;
53016
53216
  const lo = Utils$1.isNumber(gl.minYArr[realIndex]) ? gl.minYArr[realIndex] : gl.minY;
@@ -53139,6 +53339,11 @@ var __async = (__this, __arguments, generator) => {
53139
53339
  if (key === void 0 || key === null) return void 0;
53140
53340
  return this.prevSeriesYByX.get(key);
53141
53341
  }
53342
+ /** @param {number} ri */
53343
+ _hidden(ri) {
53344
+ const g = this.w.globals;
53345
+ return g.collapsedSeriesIndices.indexOf(ri) > -1 || g.ancillaryCollapsedSeriesIndices.indexOf(ri) > -1;
53346
+ }
53142
53347
  /**
53143
53348
  * Fold a drawn series into the running stack top, so the next series can find
53144
53349
  * its baseline by x (#4886).
@@ -53154,19 +53359,18 @@ var __async = (__this, __arguments, generator) => {
53154
53359
  * correct if that representation ever changes.
53155
53360
  * @param {number} realIndex
53156
53361
  * @param {any[]} yArrj
53362
+ * @param {any[]} [row] the drawn row, if not the series' own (a part)
53157
53363
  */
53158
- _recordStackTops(realIndex, yArrj) {
53364
+ _recordStackTops(realIndex, yArrj, row = this.w.seriesData.series[realIndex]) {
53159
53365
  const w = this.w;
53160
53366
  if (!w.config.chart.stacked) return;
53161
53367
  if (!Array.isArray(yArrj)) return;
53162
- if (w.globals.collapsedSeriesIndices.indexOf(realIndex) !== -1 || w.globals.ancillaryCollapsedSeriesIndices.indexOf(realIndex) !== -1) {
53163
- return;
53164
- }
53368
+ if (this._hidden(realIndex)) return;
53165
53369
  for (let j2 = 0; j2 < yArrj.length; j2++) {
53166
53370
  const key = this._stackKey(realIndex, j2);
53167
53371
  if (key === void 0 || key === null) continue;
53168
53372
  const y = yArrj[j2];
53169
- if (!Utils$1.isNumber(y)) continue;
53373
+ if (!Utils$1.isNumber(y) || (row == null ? void 0 : row[j2]) == null) continue;
53170
53374
  this.prevSeriesYByX.set(key, y);
53171
53375
  }
53172
53376
  }
@@ -53199,7 +53403,8 @@ var __async = (__this, __arguments, generator) => {
53199
53403
  w.globals.seriesYvalues[realIndex] = paths.yArrj;
53200
53404
  const forecast = w.config.forecastDataPoints;
53201
53405
  if (forecast.count > 0 && type !== "rangeArea") {
53202
- const forecastCutoff = w.globals.seriesXvalues[realIndex][w.globals.seriesXvalues[realIndex].length - forecast.count - 1];
53406
+ const ci = paths.xArrj.length - forecast.count - 1;
53407
+ const forecastCutoff = w.axisFlags.isXNumeric ? (w.seriesData.seriesX[realIndex][ci] - w.globals.minX) / this.xRatio : w.globals.padHorizontal + this.categoryAxisCorrection + ci * this.xDivision;
53203
53408
  const elForecastMask = graphics.drawRect(
53204
53409
  forecastCutoff,
53205
53410
  0,
@@ -53286,7 +53491,7 @@ var __async = (__this, __arguments, generator) => {
53286
53491
  scrollMorph: !!streamScroll,
53287
53492
  stroke: "none",
53288
53493
  strokeWidth: 0,
53289
- strokeLineCap: null,
53494
+ strokeLinecap: null,
53290
53495
  fill: pathFill
53291
53496
  }));
53292
53497
  this.elSeries.add(renderedPath);
@@ -53328,7 +53533,7 @@ var __async = (__this, __arguments, generator) => {
53328
53533
  scrollMorph: !!streamScroll,
53329
53534
  stroke: lineFill,
53330
53535
  strokeWidth: this.strokeWidth,
53331
- strokeLineCap: w.config.stroke.lineCap,
53536
+ strokeLinecap: w.config.stroke.lineCap,
53332
53537
  fill: type === "rangeArea" ? pathFill : "none"
53333
53538
  });
53334
53539
  const renderedPath = emit.renderPaths(linePathCommonOpts);
@@ -53382,7 +53587,7 @@ var __async = (__this, __arguments, generator) => {
53382
53587
  isRangeStart,
53383
53588
  seriesRangeEnd
53384
53589
  }) {
53385
- var _a, _b;
53590
+ var _a, _b, _c;
53386
53591
  const w = this.w;
53387
53592
  const graphics = new Graphics(this.w);
53388
53593
  const yRatio = this.yRatio;
@@ -53434,15 +53639,30 @@ var __async = (__this, __arguments, generator) => {
53434
53639
  });
53435
53640
  if (fast) return fast;
53436
53641
  }
53642
+ const ks = stackSeries ? this._stackXs : null;
53643
+ let kp = 0;
53644
+ const midsAt = [];
53437
53645
  for (let j2 = 0; j2 < iterations; j2++) {
53438
53646
  if (series[i2].length === 0) break;
53439
53647
  const isNull = typeof series[i2][j2 + 1] === "undefined" || series[i2][j2 + 1] === null;
53440
53648
  if (w.axisFlags.isXNumeric) {
53441
- let sX = w.seriesData.seriesX[realIndex][j2 + 1];
53442
- if (typeof w.seriesData.seriesX[realIndex][j2 + 1] === "undefined") {
53443
- sX = w.seriesData.seriesX[realIndex][iterations - 1];
53649
+ const sxs = w.seriesData.seriesX[realIndex];
53650
+ let sX = sxs[j2 + 1];
53651
+ if (typeof sX === "undefined") {
53652
+ sX = sxs[iterations - 1];
53444
53653
  }
53445
53654
  x2 = (sX - w.globals.minX) / this.xRatio;
53655
+ if (ks) {
53656
+ const m = [];
53657
+ while (ks[kp] <= sxs[j2]) kp++;
53658
+ while (ks[kp] < sX) {
53659
+ m.push([
53660
+ (ks[kp] - w.globals.minX) / this.xRatio,
53661
+ (_c = this.prevSeriesYByX.get(ks[kp++])) != null ? _c : this.zeroY
53662
+ ]);
53663
+ }
53664
+ if (m.length) midsAt[j2 + 1] = m;
53665
+ }
53446
53666
  } else {
53447
53667
  x2 = x2 + this.xDivision;
53448
53668
  }
@@ -53452,9 +53672,7 @@ var __async = (__this, __arguments, generator) => {
53452
53672
  var _a2;
53453
53673
  for (let pii = pi; pii >= 0; pii--) {
53454
53674
  const ri = (_a2 = seriesIndex == null ? void 0 : seriesIndex[pii]) != null ? _a2 : pii;
53455
- if (w.globals.collapsedSeriesIndices.indexOf(ri) === -1 && w.globals.ancillaryCollapsedSeriesIndices.indexOf(ri) === -1) {
53456
- return pii;
53457
- }
53675
+ if (!this._hidden(ri)) return pii;
53458
53676
  }
53459
53677
  return -1;
53460
53678
  };
@@ -53510,6 +53728,7 @@ var __async = (__this, __arguments, generator) => {
53510
53728
  j: j2,
53511
53729
  x: x2,
53512
53730
  y,
53731
+ midsAt,
53513
53732
  y2,
53514
53733
  xArrj,
53515
53734
  yArrj,
@@ -53750,7 +53969,7 @@ var __async = (__this, __arguments, generator) => {
53750
53969
  numericXY: nxs ? { xs: nxs, ys: nys, areaCloseY: bottomY } : void 0
53751
53970
  };
53752
53971
  }
53753
- /** @param {{type: any, series: any, i: any, j: any, x: any, y: any, xArrj: any, yArrj: any, y2: any, y2Arrj: any, pX: any, pY: any, pathState: any, segmentStartX: any, linePath: any, areaPath: any, linePaths: any, areaPaths: any, curve: any, isRangeStart: any}} opts */
53972
+ /** @param {{type: any, series: any, i: any, j: any, x: any, y: any, midsAt: any[][], xArrj: any, yArrj: any, y2: any, y2Arrj: any, pX: any, pY: any, pathState: any, segmentStartX: any, linePath: any, areaPath: any, linePaths: any, areaPaths: any, curve: any, isRangeStart: any}} opts */
53754
53973
  _createPaths({
53755
53974
  type,
53756
53975
  series,
@@ -53758,6 +53977,7 @@ var __async = (__this, __arguments, generator) => {
53758
53977
  j: j2,
53759
53978
  x: x2,
53760
53979
  y,
53980
+ midsAt,
53761
53981
  xArrj,
53762
53982
  yArrj,
53763
53983
  y2,
@@ -53777,6 +53997,8 @@ var __async = (__this, __arguments, generator) => {
53777
53997
  const areaBottomY = this.areaBottomY;
53778
53998
  const rangeArea = type === "rangeArea";
53779
53999
  const isLowerRangeAreaPath = type === "rangeArea" && isRangeStart;
54000
+ const mids = midsAt[j2 + 1];
54001
+ const via = (f) => mids ? [...mids, [x2, y]].map(([bx, by], k2, a2) => f(...k2 ? a2[k2 - 1] : [pX, pY], bx, by)).join("") : f(pX, pY, x2, y);
53780
54002
  switch (curve) {
53781
54003
  case "monotoneCubic": {
53782
54004
  const yAj = isRangeStart ? yArrj : y2Arrj;
@@ -53822,8 +54044,19 @@ var __async = (__this, __arguments, generator) => {
53822
54044
  }
53823
54045
  // falls through
53824
54046
  case 2: {
53825
- const _xAj = isRangeStart ? xArrj : xArrj.slice().reverse();
53826
- const _yAj = isRangeStart ? yAj : yAj.slice().reverse();
54047
+ let _xAj = isRangeStart ? xArrj : xArrj.slice().reverse();
54048
+ let _yAj = isRangeStart ? yAj : yAj.slice().reverse();
54049
+ if (midsAt.length && !rangeArea) {
54050
+ const P = [];
54051
+ _xAj.forEach((v, k2) => {
54052
+ if (_yAj[k2] !== null && _yAj[k2 - 1] != null && midsAt[k2]) {
54053
+ P.push(...midsAt[k2]);
54054
+ }
54055
+ P.push([v, _yAj[k2]]);
54056
+ });
54057
+ _xAj = P.map((p) => p[0]);
54058
+ _yAj = P.map((p) => p[1]);
54059
+ }
53827
54060
  const smoothInputs = getSmoothInputs(_xAj, _yAj);
53828
54061
  const points = smoothInputs.length > 1 ? spline.points(smoothInputs) : smoothInputs;
53829
54062
  let smoothInputsLower = [];
@@ -53882,7 +54115,10 @@ var __async = (__this, __arguments, generator) => {
53882
54115
  break;
53883
54116
  }
53884
54117
  case "smooth": {
53885
- const length = (x2 - pX) * 0.35;
54118
+ const toPoint = (ax, ay, bx, by) => {
54119
+ const l2 = (bx - ax) * 0.35;
54120
+ return graphics.curve(ax + l2, ay, bx - l2, by, bx, by);
54121
+ };
53886
54122
  if (series[i2][j2] === null) {
53887
54123
  pathState = 0;
53888
54124
  } else {
@@ -53902,7 +54138,7 @@ var __async = (__this, __arguments, generator) => {
53902
54138
  }
53903
54139
  pathState = 1;
53904
54140
  if (j2 < series[i2].length - 2) {
53905
- const p = graphics.curve(pX + length, pY, x2 - length, y, x2, y);
54141
+ const p = via(toPoint);
53906
54142
  linePath += p;
53907
54143
  areaPath += p;
53908
54144
  break;
@@ -53920,7 +54156,7 @@ var __async = (__this, __arguments, generator) => {
53920
54156
  areaPaths.push(areaPath);
53921
54157
  pathState = -1;
53922
54158
  } else {
53923
- const p = graphics.curve(pX + length, pY, x2 - length, y, x2, y);
54159
+ const p = via(toPoint);
53924
54160
  linePath += p;
53925
54161
  areaPath += p;
53926
54162
  if (j2 >= series[i2].length - 2) {
@@ -53941,9 +54177,9 @@ var __async = (__this, __arguments, generator) => {
53941
54177
  break;
53942
54178
  }
53943
54179
  default: {
53944
- const pathToPoint = (curve2, x3, y3) => {
54180
+ const pathToPoint = (_ax, _ay, x3, y3) => {
53945
54181
  let path = "";
53946
- switch (curve2) {
54182
+ switch (curve) {
53947
54183
  case "stepline":
53948
54184
  path = graphics.line(x3, null, "H") + graphics.line(null, y3, "V");
53949
54185
  break;
@@ -53975,7 +54211,7 @@ var __async = (__this, __arguments, generator) => {
53975
54211
  }
53976
54212
  pathState = 1;
53977
54213
  if (j2 < series[i2].length - 2) {
53978
- const p = pathToPoint(curve, x2, y);
54214
+ const p = via(pathToPoint);
53979
54215
  linePath += p;
53980
54216
  areaPath += p;
53981
54217
  break;
@@ -53993,7 +54229,7 @@ var __async = (__this, __arguments, generator) => {
53993
54229
  areaPaths.push(areaPath);
53994
54230
  pathState = -1;
53995
54231
  } else {
53996
- const p = pathToPoint(curve, x2, y);
54232
+ const p = via(pathToPoint);
53997
54233
  linePath += p;
53998
54234
  areaPath += p;
53999
54235
  if (j2 >= series[i2].length - 2) {
@@ -55852,7 +56088,7 @@ var __async = (__this, __arguments, generator) => {
55852
56088
  }
55853
56089
  s2.forEach((dv, j2) => {
55854
56090
  const range = Math.abs(this.maxValue - this.minValue);
55855
- dv = dv - this.minValue;
56091
+ dv = Math.max(0, dv - this.minValue);
55856
56092
  if (this.isLog) {
55857
56093
  dv = this.coreUtils.getLogVal(this.logBase, dv, 0);
55858
56094
  }
@@ -55889,7 +56125,7 @@ var __async = (__this, __arguments, generator) => {
55889
56125
  shouldClipToGrid: false,
55890
56126
  bindEventsOnPaths: false,
55891
56127
  stroke: w.globals.stroke.colors[i2],
55892
- strokeLineCap: w.config.stroke.lineCap
56128
+ strokeLinecap: w.config.stroke.lineCap
55893
56129
  };
55894
56130
  let pathFrom = null;
55895
56131
  if (w.globals.previousPaths.length > 0) {
@@ -56066,6 +56302,7 @@ var __async = (__this, __arguments, generator) => {
56066
56302
  drawXAxisTexts() {
56067
56303
  const w = this.w;
56068
56304
  const xaxisLabelsConfig = w.config.xaxis.labels;
56305
+ const lc = xaxisLabelsConfig.style.colors;
56069
56306
  const elXAxisWrap = this.graphics.group({
56070
56307
  class: "apexcharts-xaxis"
56071
56308
  });
@@ -56089,7 +56326,7 @@ var __async = (__this, __arguments, generator) => {
56089
56326
  j: i2,
56090
56327
  parent: elXAxisWrap,
56091
56328
  className: "apexcharts-xaxis-label",
56092
- color: Array.isArray(xaxisLabelsConfig.style.colors) && xaxisLabelsConfig.style.colors[i2] ? xaxisLabelsConfig.style.colors[i2] : "#a8a8a8",
56329
+ color: (Array.isArray(lc) ? lc[i2] : lc) || "#a8a8a8",
56093
56330
  dataLabelsConfig: __spreadValues({
56094
56331
  textAnchor: textPos.textAnchor,
56095
56332
  dropShadow: { enabled: false }
@@ -57074,14 +57311,14 @@ var __async = (__this, __arguments, generator) => {
57074
57311
  * @param {number} seriesIndex
57075
57312
  */
57076
57313
  draw(series, seriesIndex) {
57077
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
57314
+ var _a, _b, _c, _d, _e, _f;
57078
57315
  const w = this.w;
57079
57316
  const graphics = new Graphics(this.w);
57080
57317
  this.rangeBarOptions = this.w.config.plotOptions.rangeBar;
57081
57318
  this.series = series;
57082
57319
  this.seriesRangeStart = w.rangeData.seriesRangeStart;
57083
57320
  this.seriesRangeEnd = w.rangeData.seriesRangeEnd;
57084
- this.barHelpers.initVariables(series);
57321
+ this.barHelpers.initVariables(series, seriesIndex);
57085
57322
  const ret = graphics.group({
57086
57323
  class: "apexcharts-rangebar-series apexcharts-plot-series"
57087
57324
  });
@@ -57103,6 +57340,9 @@ var __async = (__this, __arguments, generator) => {
57103
57340
  this.visibleI = this.visibleI + 1;
57104
57341
  }
57105
57342
  const translationsIndex = this.setSeriesAxis(realIndex);
57343
+ if (this.isHorizontal && w.labelData.timescaleLabels.length) {
57344
+ this.isReversed = false;
57345
+ }
57106
57346
  const initPositions = this.barHelpers.initialPositions(realIndex);
57107
57347
  const {
57108
57348
  y: initY,
@@ -57112,10 +57352,8 @@ var __async = (__this, __arguments, generator) => {
57112
57352
  zeroH
57113
57353
  // zeroH is the baseline where 0 meets y axis
57114
57354
  } = initPositions;
57115
- let barWidth = (_a = initPositions.barWidth) != null ? _a : 0;
57116
- let barHeight = (_b = initPositions.barHeight) != null ? _b : 0;
57117
- const yDivision = (_c = initPositions.yDivision) != null ? _c : 0;
57118
- const xDivision = (_d = initPositions.xDivision) != null ? _d : 0;
57355
+ const yDivision = (_a = initPositions.yDivision) != null ? _a : 0;
57356
+ const xDivision = (_b = initPositions.xDivision) != null ? _b : 0;
57119
57357
  y = initY;
57120
57358
  x2 = initX;
57121
57359
  const elDataLabelsWrap = graphics.group({
@@ -57125,10 +57363,16 @@ var __async = (__this, __arguments, generator) => {
57125
57363
  const elGoalsMarkers = graphics.group({
57126
57364
  class: "apexcharts-rangebar-goals-markers"
57127
57365
  });
57366
+ const data = (
57367
+ /** @type {any} */
57368
+ w.config.series[realIndex].data
57369
+ );
57128
57370
  for (let j2 = 0; j2 < w.globals.dataPoints; j2++) {
57129
57371
  const strokeWidth = this.barHelpers.getStrokeWidth(i2, j2, realIndex);
57130
- const y1 = this.seriesRangeStart[i2][j2];
57131
- const y2 = this.seriesRangeEnd[i2][j2];
57372
+ let barWidth = (_c = initPositions.barWidth) != null ? _c : 0;
57373
+ let barHeight = (_d = initPositions.barHeight) != null ? _d : 0;
57374
+ const y1 = this.seriesRangeStart[realIndex][j2];
57375
+ const y2 = this.seriesRangeEnd[realIndex][j2];
57132
57376
  let paths = (
57133
57377
  /** @type {any} */
57134
57378
  null
@@ -57140,20 +57384,16 @@ var __async = (__this, __arguments, generator) => {
57140
57384
  if (w.config.plotOptions.bar.rangeBarGroupRows) {
57141
57385
  seriesLen = 1;
57142
57386
  }
57143
- if (typeof /** @type {Record<string,any>} */
57144
- ((_e = w.config.series[i2].data) == null ? void 0 : _e[j2]) === "undefined") {
57387
+ if (typeof (data == null ? void 0 : data[j2]) === "undefined") {
57145
57388
  break;
57146
57389
  }
57147
57390
  if (this.isHorizontal) {
57148
57391
  barYPosition = y + barHeight * /** @type {any} */
57149
57392
  this.visibleI;
57150
57393
  const srty = (yDivision - barHeight * seriesLen) / 2;
57151
- if (
57152
- /** @type {Record<string,any>} */
57153
- (_g = (_f = w.config.series[i2].data) == null ? void 0 : _f[j2]) == null ? void 0 : _g.x
57154
- ) {
57394
+ if (((_e = data[j2]) == null ? void 0 : _e.x) != null) {
57155
57395
  const positions = this.detectOverlappingBars({
57156
- i: i2,
57396
+ i: realIndex,
57157
57397
  j: j2,
57158
57398
  barYPosition,
57159
57399
  srty,
@@ -57176,17 +57416,14 @@ var __async = (__this, __arguments, generator) => {
57176
57416
  barWidth = paths.barWidth;
57177
57417
  } else {
57178
57418
  if (w.axisFlags.isXNumeric) {
57179
- x2 = (w.seriesData.seriesX[i2][j2] - w.globals.minX) / this.xRatio - barWidth / 2;
57419
+ x2 = (w.seriesData.seriesX[realIndex][j2] - w.globals.minX) / this.xRatio - barWidth / 2;
57180
57420
  }
57181
57421
  barXPosition = x2 + barWidth * /** @type {any} */
57182
57422
  this.visibleI;
57183
57423
  const srtx = (xDivision - barWidth * seriesLen) / 2;
57184
- if (
57185
- /** @type {Record<string,any>} */
57186
- (_i = (_h = w.config.series[i2].data) == null ? void 0 : _h[j2]) == null ? void 0 : _i.x
57187
- ) {
57424
+ if (((_f = data[j2]) == null ? void 0 : _f.x) != null) {
57188
57425
  const positions = this.detectOverlappingBars({
57189
- i: i2,
57426
+ i: realIndex,
57190
57427
  j: j2,
57191
57428
  barXPosition,
57192
57429
  srtx,
@@ -57205,9 +57442,10 @@ var __async = (__this, __arguments, generator) => {
57205
57442
  xDivision
57206
57443
  }, params));
57207
57444
  barHeight = paths.barHeight;
57445
+ barXPosition = paths.barXPosition;
57208
57446
  }
57209
57447
  const barGoalLine = this.barHelpers.drawGoalLine({
57210
- barXPosition: paths.barXPosition,
57448
+ barXPosition,
57211
57449
  barYPosition,
57212
57450
  goalX: paths.goalX,
57213
57451
  goalY: paths.goalY,
@@ -57252,19 +57490,11 @@ var __async = (__this, __arguments, generator) => {
57252
57490
  });
57253
57491
  }
57254
57492
  if (w.globals.previousPaths.length > 0) {
57255
- const data = (
57256
- /** @type {Record<string,any>} */
57257
- w.config.series[i2].data || []
57258
- );
57259
- const newKeys = [];
57260
- for (let j2 = 0; j2 < data.length; j2++) {
57261
- newKeys.push(datumKey(w, realIndex, j2));
57262
- }
57263
57493
  renderBarExitGhosts({
57264
57494
  w,
57265
57495
  elSeries,
57266
57496
  record: this._prevRecord(realIndex),
57267
- newKeys,
57497
+ newKeys: this._keys(realIndex),
57268
57498
  isHorizontal: this.isHorizontal,
57269
57499
  speed: w.config.chart.animations.dynamicAnimation.speed
57270
57500
  });
@@ -57316,11 +57546,11 @@ var __async = (__this, __arguments, generator) => {
57316
57546
  );
57317
57547
  if (overlaps.indexOf(rangeName) > -1) {
57318
57548
  barHeight = initPositions.barHeight / overlaps.length;
57319
- barYPosition = barHeight * this.visibleI + yDivision * (100 - parseInt(this.barOptions.barHeight, 10)) / 100 / 2 + barHeight * (this.visibleI + overlaps.indexOf(rangeName)) + yDivision * rowIndex;
57549
+ barYPosition += barHeight * overlaps.indexOf(rangeName);
57320
57550
  }
57321
57551
  }
57322
57552
  } else {
57323
- if (rowIndex > -1 && !w.labelData.timescaleLabels.length) {
57553
+ if (rowIndex > -1 && !w.axisFlags.isXNumeric) {
57324
57554
  if (w.config.plotOptions.bar.rangeBarGroupRows) {
57325
57555
  barXPosition = srtx + xDivision * rowIndex;
57326
57556
  } else {
@@ -57334,7 +57564,7 @@ var __async = (__this, __arguments, generator) => {
57334
57564
  );
57335
57565
  if (overlaps.indexOf(rangeName) > -1) {
57336
57566
  barWidth = initPositions.barWidth / overlaps.length;
57337
- barXPosition = barWidth * this.visibleI + xDivision * (100 - parseInt(this.barOptions.barWidth, 10)) / 100 / 2 + barWidth * (this.visibleI + overlaps.indexOf(rangeName)) + xDivision * rowIndex;
57567
+ barXPosition += barWidth * overlaps.indexOf(rangeName);
57338
57568
  }
57339
57569
  }
57340
57570
  }
@@ -57357,7 +57587,7 @@ var __async = (__this, __arguments, generator) => {
57357
57587
  var _a, _b;
57358
57588
  const w = this.w;
57359
57589
  const { i: i2, j: j2, realIndex, translationsIndex } = indexes;
57360
- const yRatio = this.yRatio[translationsIndex];
57590
+ const yRatio = this.yRatio[translationsIndex] * (this.isReversed ? -1 : 1);
57361
57591
  const range = this.getRangeValue(realIndex, j2);
57362
57592
  let y1 = Math.min(range.start, range.end);
57363
57593
  let y2 = Math.max(range.start, range.end);
@@ -57365,7 +57595,7 @@ var __async = (__this, __arguments, generator) => {
57365
57595
  ((_a = this.series[i2]) == null ? void 0 : _a[j2]) === "undefined" || /** @type {any} */
57366
57596
  ((_b = this.series[i2]) == null ? void 0 : _b[j2]) === null);
57367
57597
  if (!hasValue) {
57368
- y1 = zeroH;
57598
+ y1 = y2 = zeroH;
57369
57599
  } else {
57370
57600
  y1 = zeroH - y1 / yRatio;
57371
57601
  y2 = zeroH - y2 / yRatio;
@@ -57426,6 +57656,30 @@ var __async = (__this, __arguments, generator) => {
57426
57656
  barXPosition
57427
57657
  };
57428
57658
  }
57659
+ /**
57660
+ * Timeline datums key by their own row, not by the j-th label: a row can
57661
+ * hold several bars, so labels[j] names some other datum's row.
57662
+ * @param {number} realIndex
57663
+ * @returns {string[]}
57664
+ */
57665
+ _keys(realIndex) {
57666
+ const c = (
57667
+ /** @type {any} */
57668
+ this._keyCache || (this._keyCache = {})
57669
+ );
57670
+ const data = (
57671
+ /** @type {any} */
57672
+ this.w.config.series[realIndex].data
57673
+ );
57674
+ return c[realIndex] || (c[realIndex] = uniquifyKeys(
57675
+ (data || []).map(
57676
+ (d, j2) => {
57677
+ var _a;
57678
+ return "c:" + ((_a = d == null ? void 0 : d.x) != null ? _a : j2);
57679
+ }
57680
+ )
57681
+ ));
57682
+ }
57429
57683
  /**
57430
57684
  * @param {number} val
57431
57685
  */
@@ -57452,8 +57706,9 @@ var __async = (__this, __arguments, generator) => {
57452
57706
  }) {
57453
57707
  const w = this.w;
57454
57708
  const { realIndex, j: j2 } = indexes;
57455
- const x1 = this.preventBarOverflow(zeroW + y1 / this.invertedYRatio);
57456
- const x2 = this.preventBarOverflow(zeroW + y2 / this.invertedYRatio);
57709
+ const ratio = this.invertedYRatio * (this.isReversed ? -1 : 1);
57710
+ const x1 = this.preventBarOverflow(zeroW + y1 / ratio);
57711
+ const x2 = this.preventBarOverflow(zeroW + y2 / ratio);
57457
57712
  const range = this.getRangeValue(realIndex, j2);
57458
57713
  const barWidth = Math.abs(x2 - x1);
57459
57714
  const paths = this.barHelpers.getBarpaths({
@@ -57786,7 +58041,7 @@ var __async = (__this, __arguments, generator) => {
57786
58041
  if (w.config.chart.dropShadow.enabled) {
57787
58042
  const shadow = w.config.chart.dropShadow;
57788
58043
  const filters = new Filters(this.w);
57789
- filters.dropShadow(ret, shadow, i2);
58044
+ filters.dropShadow(elSeries, shadow, i2);
57790
58045
  }
57791
58046
  const elDataLabelWrap = graphics.group({
57792
58047
  class: "apexcharts-data-labels"
@@ -57880,6 +58135,7 @@ var __async = (__this, __arguments, generator) => {
57880
58135
  });
57881
58136
  elRect.node.classList.add("apexcharts-treemap-rect");
57882
58137
  elRect.node.setAttribute("data:key", morphKey(leaf._key));
58138
+ let tileTween = null;
57883
58139
  let fromRect = {
57884
58140
  x: x1 + (x2 - x1) / 2,
57885
58141
  y: y1 + (y2 - y1) / 2,
@@ -57905,7 +58161,7 @@ var __async = (__this, __arguments, generator) => {
57905
58161
  if (w.globals.resized) {
57906
58162
  w.globals.animationEnded = true;
57907
58163
  } else {
57908
- this.animateTreemap(
58164
+ tileTween = this.animateTreemap(
57909
58165
  elRect,
57910
58166
  fromRect,
57911
58167
  toRect,
@@ -57916,7 +58172,6 @@ var __async = (__this, __arguments, generator) => {
57916
58172
  );
57917
58173
  }
57918
58174
  }
57919
- let tileTween = null;
57920
58175
  let labelFrom = null;
57921
58176
  let prevLook = null;
57922
58177
  if (w.globals.dataChanged) {
@@ -58298,7 +58553,7 @@ var __async = (__this, __arguments, generator) => {
58298
58553
  const elGroup = graphics.group({
58299
58554
  class: "apexcharts-treemap-parent",
58300
58555
  "data:depth": depth,
58301
- "data:name": Utils$1.escapeString(node.name)
58556
+ "data:name": node.name
58302
58557
  });
58303
58558
  const key = morphKey(node._key);
58304
58559
  const morphFrom = this._morphKeyed() ? this.ctx.morphTypeChange.getInitialPathForKey(key) : null;
@@ -58407,7 +58662,7 @@ var __async = (__this, __arguments, generator) => {
58407
58662
  if (typeof header.formatter === "function") {
58408
58663
  text = String(
58409
58664
  header.formatter(node.name, {
58410
- value: node.value,
58665
+ value: node._area,
58411
58666
  depth,
58412
58667
  seriesIndex: i2,
58413
58668
  node,
@@ -58415,7 +58670,7 @@ var __async = (__this, __arguments, generator) => {
58415
58670
  })
58416
58671
  );
58417
58672
  } else if (header.showValue) {
58418
- text = `${text} ${this._formatValue(node.value)}`;
58673
+ text = `${text} ${this._formatValue(node._area, node._si)}`;
58419
58674
  }
58420
58675
  headerText = text;
58421
58676
  const offsetX = Number(header.offsetX) || 0;
@@ -58426,7 +58681,9 @@ var __async = (__this, __arguments, generator) => {
58426
58681
  const clipped = graphics.getTextBasedOnMaxWidth({
58427
58682
  text,
58428
58683
  maxWidth,
58429
- fontSize
58684
+ fontSize,
58685
+ fontFamily: chrome.headerFontFamily,
58686
+ fontWeight: chrome.headerFontWeight
58430
58687
  });
58431
58688
  if (clipped) {
58432
58689
  let tx = x1 + pad + offsetX;
@@ -58501,7 +58758,7 @@ var __async = (__this, __arguments, generator) => {
58501
58758
  const total = this._drawnTotal();
58502
58759
  const pct = total > 0 ? (node._area / total * 100).toFixed(1) : "0";
58503
58760
  const n2 = this._countLeaves(node);
58504
- const lead = visibleText && String(visibleText).trim() ? String(visibleText).replace(/\s+/g, " ").trim() : `${node.name}, ${this._formatValue(node._area)}`;
58761
+ const lead = visibleText && String(visibleText).trim() ? String(visibleText).replace(/\s+/g, " ").trim() : `${node.name}, ${this._formatValue(node._area, node._si)}`;
58505
58762
  return `${lead}, ${n2} ${n2 === 1 ? "item" : "items"}, ${pct}% of total`;
58506
58763
  }
58507
58764
  /**
@@ -58520,15 +58777,18 @@ var __async = (__this, __arguments, generator) => {
58520
58777
  * @param {string} [visibleText] the header's rendered text, unclipped
58521
58778
  */
58522
58779
  _makeParentAccessible(el, node, chrome, elRect, visibleText) {
58780
+ const a11y = this.w.config.chart.accessibility;
58523
58781
  if (!el || !el.setAttribute) return;
58524
- if (!this._zoomEnabled()) return;
58782
+ if (!a11y.enabled || !a11y.keyboard.enabled || !this._zoomEnabled()) return;
58783
+ const open = this.w.globals.treemapFocusKey === node._key;
58784
+ el.tmKey = node._key;
58525
58785
  el.setAttribute("role", "button");
58526
58786
  el.setAttribute("tabindex", "0");
58527
58787
  el.setAttribute(
58528
58788
  "aria-label",
58529
- `${this._parentLabel(node, visibleText)}. Zoom in`
58789
+ `${this._parentLabel(node, visibleText)}. Zoom ${open ? "out" : "in"}`
58530
58790
  );
58531
- el.setAttribute("aria-expanded", "false");
58791
+ el.setAttribute("aria-expanded", open);
58532
58792
  if (!Environment.isBrowser() || !el.addEventListener) return;
58533
58793
  el.addEventListener("focus", () => {
58534
58794
  elRect.node.setAttribute("stroke", chrome.hoverColor);
@@ -58595,15 +58855,17 @@ var __async = (__this, __arguments, generator) => {
58595
58855
  * @returns {boolean}
58596
58856
  */
58597
58857
  _zoomEnabled() {
58858
+ var _a;
58598
58859
  const w = this.w;
58599
58860
  const z = w.config.plotOptions.treemap.zoom;
58600
58861
  if (!z || !z.enabled || !this.showParents) return false;
58601
58862
  const dd = w.config.drilldown;
58602
- if (this.ctx.drilldown && dd && dd.enabled && Array.isArray(dd.series) && dd.series.length) {
58603
- if (!this._warnedZoomConflict) {
58604
- this._warnedZoomConflict = true;
58863
+ const d = this.ctx.drilldown;
58864
+ if (d && dd && dd.enabled && (((_a = dd.series) == null ? void 0 : _a.length) || dd.onDrillDown)) {
58865
+ if (!d.zoomWarned) {
58866
+ d.zoomWarned = true;
58605
58867
  console.warn(
58606
- "ApexCharts treemap: `plotOptions.treemap.zoom` and the drilldown feature both navigate the hierarchy, so zoom is ignored here. Drop `drilldown.series` to zoom a nested treemap instead."
58868
+ "ApexCharts treemap: zoom is ignored while drilldown is active (plotOptions.treemap.zoom vs drilldown series or onDrillDown)."
58607
58869
  );
58608
58870
  }
58609
58871
  return false;
@@ -58613,8 +58875,8 @@ var __async = (__this, __arguments, generator) => {
58613
58875
  /**
58614
58876
  * The focused branch for this render, looked up by the key stashed on the
58615
58877
  * last click. Keys are rebuilt identically from the same data, so the focus
58616
- * survives a re-render; a key that no longer resolves (the data changed under
58617
- * it) simply falls back to the whole tree.
58878
+ * survives a re-render; a key that no longer resolves, or a branch left with
58879
+ * nothing to draw (the data changed under it), falls back to the whole tree.
58618
58880
  * @param {any[]} drawn
58619
58881
  * @returns {any}
58620
58882
  */
@@ -58631,7 +58893,11 @@ var __async = (__this, __arguments, generator) => {
58631
58893
  if (node.children) node.children.forEach(walk);
58632
58894
  };
58633
58895
  drawn.forEach(walk);
58634
- return found && found.children && found.children.length ? found : null;
58896
+ if (found && found.children && found.children.length && this._subtreeArea(found) > 0) {
58897
+ return found;
58898
+ }
58899
+ this.w.globals.treemapFocusKey = null;
58900
+ return null;
58635
58901
  }
58636
58902
  /**
58637
58903
  * @param {any} node
@@ -58644,28 +58910,7 @@ var __async = (__this, __arguments, generator) => {
58644
58910
  const w = this.w;
58645
58911
  if (!node || !node.children || !node.children.length) return;
58646
58912
  const next = w.globals.treemapFocusKey === node._key ? null : node._key;
58647
- const done = this._refocus(next);
58648
- if (!restoreFocus || !done || typeof done.then !== "function") return;
58649
- done.then(() => {
58650
- if (!Environment.isBrowser()) return;
58651
- const crumb = (
58652
- /** @type {any} */
58653
- w.dom.baseEl.querySelector(
58654
- ".apexcharts-breadcrumb .apexcharts-breadcrumb-item"
58655
- )
58656
- );
58657
- if (crumb && crumb.focus) {
58658
- crumb.focus();
58659
- return;
58660
- }
58661
- const header = (
58662
- /** @type {any} */
58663
- w.dom.baseEl.querySelector(
58664
- ".apexcharts-treemap-parent-header[tabindex]"
58665
- )
58666
- );
58667
- if (header && header.focus) header.focus();
58668
- });
58913
+ this._refocus(next, restoreFocus);
58669
58914
  }
58670
58915
  /**
58671
58916
  * Re-render focused on another branch (null: the whole tree).
@@ -58676,22 +58921,34 @@ var __async = (__this, __arguments, generator) => {
58676
58921
  * left, which replayed the mount animation (every tile growing from
58677
58922
  * nothing) or snapped, while the containers, headers and labels jumped.
58678
58923
  * @param {string | null} next
58679
- * @returns {any} the update's promise
58924
+ * @param {boolean} [restoreFocus] see _zoomTo
58680
58925
  */
58681
- _refocus(next) {
58682
- var _a;
58926
+ _refocus(next, restoreFocus) {
58683
58927
  const w = this.w;
58684
58928
  const gl = w.globals;
58929
+ const from = gl.treemapFocusKey;
58685
58930
  const anim = w.config.chart.animations;
58686
58931
  const animate = !!(anim.enabled && anim.dynamicAnimation.enabled);
58687
- gl.treemapZoom = animate && Environment.isBrowser() ? { from: (_a = gl.treemapFocusKey) != null ? _a : null, to: next } : null;
58932
+ gl.treemapZoom = animate && Environment.isBrowser() ? { from: from != null ? from : null, to: next } : null;
58688
58933
  gl.treemapFocusKey = next;
58689
58934
  this._hideParentTooltip();
58690
58935
  gl.shouldAnimate = animate;
58691
58936
  gl.resized = true;
58692
58937
  gl.dataChanged = true;
58693
58938
  if (gl.treemapZoom) this.ctx.series.getPreviousPaths();
58694
- return this.ctx.update();
58939
+ const done = this.ctx.update();
58940
+ if (restoreFocus) {
58941
+ done.then(() => {
58942
+ const b = w.dom.baseEl;
58943
+ const heads = (
58944
+ /** @type {any[]} */
58945
+ Array.from(
58946
+ b.querySelectorAll(".apexcharts-treemap-parent-header[tabindex]")
58947
+ )
58948
+ );
58949
+ (b.querySelector(".apexcharts-breadcrumb-item") || heads.find((h) => h.tmKey === from) || heads[0] || b).focus();
58950
+ });
58951
+ }
58695
58952
  }
58696
58953
  /**
58697
58954
  * A zoom reframes one tree, so it moves like a camera: one map takes the
@@ -59003,8 +59260,9 @@ var __async = (__this, __arguments, generator) => {
59003
59260
  crumbs: [{ label: "All", data: null }].concat(
59004
59261
  chain.map((n2) => ({ label: n2.name, data: n2 }))
59005
59262
  ),
59006
- onNavigate: (_i, crumb) => {
59007
- this._refocus(crumb.data ? crumb.data._key : null);
59263
+ // A keyboard click (detail 0) keeps focus in the chart.
59264
+ onNavigate: (_i, crumb, e2) => {
59265
+ this._refocus(crumb.data ? crumb.data._key : null, !e2.detail);
59008
59266
  }
59009
59267
  });
59010
59268
  if (!nav) return;
@@ -59053,7 +59311,7 @@ var __async = (__this, __arguments, generator) => {
59053
59311
  const t2 = this._tip();
59054
59312
  if (!t2) return;
59055
59313
  const total = this._drawnTotal();
59056
- const parentVal = node._parent ? node._parent._area : total;
59314
+ const parentVal = node._parent ? this._subtreeArea(node._parent) : total;
59057
59315
  const pctTotal = total > 0 ? (node._area / total * 100).toFixed(1) : "0.0";
59058
59316
  const pctParent = parentVal > 0 ? (node._area / parentVal * 100).toFixed(1) : pctTotal;
59059
59317
  const cfg = this.w.config.plotOptions.treemap.parents;
@@ -59074,10 +59332,9 @@ var __async = (__this, __arguments, generator) => {
59074
59332
  } else {
59075
59333
  const marker = this._parentChrome(node.depth || 0).headerBg;
59076
59334
  const groupBg = w.config.tooltip.fillSeriesColor ? `background-color:${marker};` : "";
59077
- html = `<div class="apexcharts-tooltip-series-group apexcharts-active" style="display:flex;${groupBg}"><div class="apexcharts-tooltip-text"><div class="apexcharts-tooltip-y-group"><span class="apexcharts-tooltip-text-y-label">${Utils$1.escapeString(
59078
- node.name
59079
- )}: </span><span class="apexcharts-tooltip-text-y-value">${this._formatValue(
59080
- node._area
59335
+ html = `<div class="apexcharts-tooltip-series-group apexcharts-active" style="display:flex;${groupBg}"><div class="apexcharts-tooltip-text"><div class="apexcharts-tooltip-y-group"><span class="apexcharts-tooltip-text-y-label">${String(node.name).replace(/&/g, "&amp;").replace(/</g, "&lt;")}: </span><span class="apexcharts-tooltip-text-y-value">${this._formatValue(
59336
+ node._area,
59337
+ node._si
59081
59338
  )}</span></div><div class="apexcharts-tooltip-y-group"><span class="apexcharts-tooltip-text-y-label">${leafCount} items, </span><span class="apexcharts-tooltip-text-y-value">${pctParent}% of parent, ${pctTotal}% of total</span></div></div></div>`;
59082
59339
  }
59083
59340
  t2.innerHTML = html;
@@ -59173,17 +59430,21 @@ var __async = (__this, __arguments, generator) => {
59173
59430
  }
59174
59431
  /**
59175
59432
  * Format an aggregate the way the chart formats its own y values, so a
59176
- * parent's total reads like the tiles it contains.
59433
+ * parent's total reads like the tiles it contains. A branch is no data
59434
+ * point, so dataPointIndex is -1.
59177
59435
  * @param {number} v
59436
+ * @param {number} [si] the branch's series index
59178
59437
  * @returns {string}
59179
59438
  */
59180
- _formatValue(v) {
59439
+ _formatValue(v, si) {
59181
59440
  var _a, _b, _c, _d, _e;
59182
59441
  const w = this.w;
59183
59442
  const fmt = ((_b = (_a = w.config.tooltip) == null ? void 0 : _a.y) == null ? void 0 : _b.formatter) || ((_e = (_d = (_c = w.config.yaxis) == null ? void 0 : _c[0]) == null ? void 0 : _d.labels) == null ? void 0 : _e.formatter);
59184
59443
  if (typeof fmt === "function") {
59185
59444
  try {
59186
- return String(fmt(v, { seriesIndex: 0, dataPointIndex: 0, w }));
59445
+ return String(
59446
+ fmt(v, { seriesIndex: si || 0, dataPointIndex: -1, w })
59447
+ );
59187
59448
  } catch (_) {
59188
59449
  }
59189
59450
  }
@@ -59264,7 +59525,7 @@ var __async = (__this, __arguments, generator) => {
59264
59525
  */
59265
59526
  rotateToFitLabel(elText, fontSize, text, x1, y1, x2, y2) {
59266
59527
  const graphics = new Graphics(this.w);
59267
- const textRect = graphics.getTextRects(text, String(fontSize));
59528
+ const textRect = this._labelRect(graphics, text, fontSize);
59268
59529
  if (textRect.width + this.w.config.stroke.width + 5 > x2 - x1 && textRect.width <= y2 - y1) {
59269
59530
  const labelRotatingCenter = graphics.rotateAroundCenter(elText.node);
59270
59531
  elText.node.setAttribute(
@@ -59273,6 +59534,24 @@ var __async = (__this, __arguments, generator) => {
59273
59534
  );
59274
59535
  }
59275
59536
  }
59537
+ /**
59538
+ * A tile label's box, measured at the family and weight it is drawn at
59539
+ * (bold is wider than the default regular).
59540
+ * @param {Graphics} graphics
59541
+ * @param {string} text
59542
+ * @param {string | number} fontSize
59543
+ */
59544
+ _labelRect(graphics, text, fontSize) {
59545
+ const st = this.w.config.dataLabels.style;
59546
+ return graphics.getTextRects(
59547
+ text,
59548
+ String(fontSize),
59549
+ st.fontFamily,
59550
+ "",
59551
+ true,
59552
+ st.fontWeight
59553
+ );
59554
+ }
59276
59555
  // This is an alternative label formatting method that uses a
59277
59556
  // consistent font size, and trims the edge of long labels
59278
59557
  /**
@@ -59285,13 +59564,13 @@ var __async = (__this, __arguments, generator) => {
59285
59564
  */
59286
59565
  truncateLabels(text, fontSize, x1, y1, x2, y2) {
59287
59566
  const graphics = new Graphics(this.w);
59288
- const textRect = graphics.getTextRects(text, String(fontSize));
59567
+ const textRect = this._labelRect(graphics, text, fontSize);
59289
59568
  const labelMaxWidth = textRect.width + this.w.config.stroke.width + 5 > x2 - x1 && y2 - y1 > x2 - x1 ? y2 - y1 : x2 - x1;
59290
- const truncatedText = graphics.getTextBasedOnMaxWidth({
59569
+ const truncatedText = graphics.getTextBasedOnMaxWidth(__spreadProps(__spreadValues({}, this.w.config.dataLabels.style), {
59291
59570
  text,
59292
59571
  maxWidth: labelMaxWidth,
59293
59572
  fontSize
59294
- });
59573
+ }));
59295
59574
  if (text.length !== truncatedText.length && labelMaxWidth / fontSize < 5) {
59296
59575
  return "";
59297
59576
  } else {