apexcharts 7.5.0 → 7.6.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 (185) hide show
  1. package/dist/apexcharts.common.js +2 -2
  2. package/dist/apexcharts.core.js +295 -39
  3. package/dist/apexcharts.core.min.js +2 -2
  4. package/dist/apexcharts.css +25 -46
  5. package/dist/apexcharts.esm.js +266 -203
  6. package/dist/apexcharts.js +561 -242
  7. package/dist/apexcharts.min.js +2 -2
  8. package/dist/apexcharts.ssr.common.js +2 -2
  9. package/dist/apexcharts.ssr.esm.js +561 -242
  10. package/dist/area.common.js +1 -1
  11. package/dist/area.esm.js +1 -1
  12. package/dist/bar.common.js +1 -1
  13. package/dist/bar.esm.js +1 -1
  14. package/dist/bar.js +1 -1
  15. package/dist/boxPlot.common.js +1 -1
  16. package/dist/boxPlot.esm.js +1 -1
  17. package/dist/bubble.common.js +1 -1
  18. package/dist/bubble.esm.js +1 -1
  19. package/dist/candlestick.common.js +1 -1
  20. package/dist/candlestick.esm.js +1 -1
  21. package/dist/candlestick.js +1 -1
  22. package/dist/column.common.js +1 -1
  23. package/dist/column.esm.js +1 -1
  24. package/dist/core.common.js +2 -2
  25. package/dist/core.esm.js +295 -39
  26. package/dist/donut.common.js +2 -2
  27. package/dist/donut.esm.js +3 -1
  28. package/dist/dumbbell.common.js +1 -1
  29. package/dist/dumbbell.esm.js +1 -1
  30. package/dist/features/all.common.js +2 -2
  31. package/dist/features/all.esm.js +17 -4
  32. package/dist/features/annotations.common.js +1 -1
  33. package/dist/features/annotations.esm.js +1 -1
  34. package/dist/features/annotations.js +1 -1
  35. package/dist/features/context-menu.common.js +1 -1
  36. package/dist/features/context-menu.esm.js +1 -1
  37. package/dist/features/context-menu.js +1 -1
  38. package/dist/features/drilldown.common.js +1 -1
  39. package/dist/features/drilldown.esm.js +1 -1
  40. package/dist/features/drilldown.js +1 -1
  41. package/dist/features/dumbbell.common.js +1 -1
  42. package/dist/features/dumbbell.esm.js +1 -1
  43. package/dist/features/dumbbell.js +1 -1
  44. package/dist/features/exports.common.js +1 -1
  45. package/dist/features/exports.esm.js +1 -1
  46. package/dist/features/exports.js +1 -1
  47. package/dist/features/facet.common.js +1 -1
  48. package/dist/features/facet.esm.js +1 -1
  49. package/dist/features/facet.js +1 -1
  50. package/dist/features/history.common.js +1 -1
  51. package/dist/features/history.esm.js +1 -1
  52. package/dist/features/history.js +1 -1
  53. package/dist/features/ink.common.js +1 -1
  54. package/dist/features/ink.esm.js +1 -1
  55. package/dist/features/ink.js +1 -1
  56. package/dist/features/keyboard.common.js +1 -1
  57. package/dist/features/keyboard.esm.js +1 -1
  58. package/dist/features/keyboard.js +1 -1
  59. package/dist/features/legend.common.js +2 -2
  60. package/dist/features/legend.esm.js +2 -2
  61. package/dist/features/legend.js +2 -2
  62. package/dist/features/link.common.js +1 -1
  63. package/dist/features/link.esm.js +1 -1
  64. package/dist/features/link.js +1 -1
  65. package/dist/features/marks.common.js +1 -1
  66. package/dist/features/marks.esm.js +1 -1
  67. package/dist/features/marks.js +1 -1
  68. package/dist/features/measure.common.js +1 -1
  69. package/dist/features/measure.esm.js +1 -1
  70. package/dist/features/measure.js +1 -1
  71. package/dist/features/morph.common.js +1 -1
  72. package/dist/features/morph.esm.js +1 -1
  73. package/dist/features/morph.js +1 -1
  74. package/dist/features/perspectives.common.js +1 -1
  75. package/dist/features/perspectives.esm.js +1 -1
  76. package/dist/features/perspectives.js +1 -1
  77. package/dist/features/raincloud.common.js +1 -1
  78. package/dist/features/raincloud.esm.js +1 -1
  79. package/dist/features/raincloud.js +1 -1
  80. package/dist/features/renderer-canvas.common.js +1 -1
  81. package/dist/features/renderer-canvas.esm.js +1 -1
  82. package/dist/features/renderer-canvas.js +1 -1
  83. package/dist/features/stats.common.js +1 -1
  84. package/dist/features/stats.esm.js +1 -1
  85. package/dist/features/stats.js +1 -1
  86. package/dist/features/storyboard.common.js +1 -1
  87. package/dist/features/storyboard.esm.js +1 -1
  88. package/dist/features/storyboard.js +1 -1
  89. package/dist/features/streamgraph.common.js +1 -1
  90. package/dist/features/streamgraph.esm.js +1 -1
  91. package/dist/features/streamgraph.js +1 -1
  92. package/dist/features/toolbar.common.js +1 -1
  93. package/dist/features/toolbar.esm.js +1 -1
  94. package/dist/features/toolbar.js +1 -1
  95. package/dist/features/trellis.common.js +1 -1
  96. package/dist/features/trellis.esm.js +1 -1
  97. package/dist/features/trellis.js +1 -1
  98. package/dist/features/waterfall.common.js +1 -1
  99. package/dist/features/waterfall.esm.js +1 -1
  100. package/dist/features/waterfall.js +1 -1
  101. package/dist/features/weave.common.js +2 -2
  102. package/dist/features/weave.esm.js +16 -3
  103. package/dist/features/weave.js +2 -2
  104. package/dist/heatmap.common.js +1 -1
  105. package/dist/heatmap.esm.js +1 -1
  106. package/dist/heatmap.js +1 -1
  107. package/dist/histogram.common.js +1 -1
  108. package/dist/histogram.esm.js +1 -1
  109. package/dist/icicle.common.js +5 -0
  110. package/dist/icicle.esm.js +1086 -0
  111. package/dist/icicle.js +5 -0
  112. package/dist/line.common.js +1 -1
  113. package/dist/line.esm.js +1 -1
  114. package/dist/line.js +1 -1
  115. package/dist/pictograms.common.js +1 -1
  116. package/dist/pictograms.esm.js +1 -1
  117. package/dist/pictograms.js +1 -1
  118. package/dist/pie.common.js +2 -2
  119. package/dist/pie.esm.js +3 -1
  120. package/dist/pie.js +2 -2
  121. package/dist/polarArea.common.js +2 -2
  122. package/dist/polarArea.esm.js +3 -1
  123. package/dist/radar.common.js +1 -1
  124. package/dist/radar.esm.js +1 -1
  125. package/dist/radar.js +1 -1
  126. package/dist/radialBar.common.js +2 -2
  127. package/dist/radialBar.esm.js +3 -1
  128. package/dist/radialBar.js +2 -2
  129. package/dist/raincloud.common.js +1 -1
  130. package/dist/raincloud.esm.js +1 -1
  131. package/dist/rangeArea.common.js +1 -1
  132. package/dist/rangeArea.esm.js +1 -1
  133. package/dist/rangeBar.common.js +1 -1
  134. package/dist/rangeBar.esm.js +1 -1
  135. package/dist/scatter.common.js +1 -1
  136. package/dist/scatter.esm.js +1 -1
  137. package/dist/streamgraph.common.js +1 -1
  138. package/dist/streamgraph.esm.js +1 -1
  139. package/dist/sunburst.common.js +2 -2
  140. package/dist/sunburst.esm.js +248 -200
  141. package/dist/sunburst.js +2 -2
  142. package/dist/treemap.common.js +1 -1
  143. package/dist/treemap.esm.js +1 -1
  144. package/dist/treemap.js +1 -1
  145. package/dist/unit-shapes.common.js +1 -1
  146. package/dist/unit-shapes.esm.js +1 -1
  147. package/dist/unit-shapes.js +1 -1
  148. package/dist/unit.common.js +1 -1
  149. package/dist/unit.esm.js +1 -1
  150. package/dist/unit.js +1 -1
  151. package/dist/violin.common.js +1 -1
  152. package/dist/violin.esm.js +1 -1
  153. package/dist/violin.js +1 -1
  154. package/dist/waterfall.common.js +1 -1
  155. package/dist/waterfall.esm.js +1 -1
  156. package/package.json +6 -1
  157. package/src/apexcharts.js +69 -4
  158. package/src/assets/apexcharts.css +25 -46
  159. package/src/charts/Icicle.js +861 -0
  160. package/src/charts/Pie.js +15 -0
  161. package/src/charts/Sunburst.js +58 -243
  162. package/src/charts/common/partition/NodeTooltip.js +118 -0
  163. package/src/charts/common/partition/Partition.js +276 -0
  164. package/src/charts/common/partition/Tint.js +67 -0
  165. package/src/entries/icicle.js +22 -0
  166. package/src/modules/Animations.js +40 -1
  167. package/src/modules/Core.js +21 -1
  168. package/src/modules/CoreUtils.js +25 -1
  169. package/src/modules/Data.js +33 -0
  170. package/src/modules/Range.js +2 -1
  171. package/src/modules/dimensions/Dimensions.js +13 -1
  172. package/src/modules/legend/Helpers.js +2 -1
  173. package/src/modules/settings/Config.js +2 -1
  174. package/src/modules/settings/Defaults.js +88 -15
  175. package/src/modules/settings/Globals.js +5 -0
  176. package/src/modules/settings/Options.js +92 -3
  177. package/src/modules/settings/TypeAliases.js +16 -0
  178. package/src/modules/tooltip/Intersect.js +5 -5
  179. package/src/modules/tooltip/Position.js +4 -3
  180. package/src/modules/tooltip/Tooltip.js +40 -1
  181. package/src/modules/tooltip/Utils.js +14 -0
  182. package/src/modules/weave/PluginAPI.js +12 -1
  183. package/src/modules/weave/WeaveHost.js +14 -1
  184. package/src/types/internal.d.ts +7 -0
  185. package/types/apexcharts.d.ts +223 -2
@@ -42,7 +42,7 @@ var __async = (__this, __arguments, generator) => {
42
42
  });
43
43
  };
44
44
  /*!
45
- * ApexCharts v7.5.0
45
+ * ApexCharts v7.6.0
46
46
  * (c) 2018-2026 ApexCharts
47
47
  */
48
48
 
@@ -2475,9 +2475,12 @@ var __async = (__this, __arguments, generator) => {
2475
2475
  enabled: true,
2476
2476
  speed: 600
2477
2477
  },
2478
- // Honor the OS-level prefers-reduced-motion setting. When true (default)
2479
- // and the user has the accessibility preference enabled, all initial-mount
2480
- // animations are skipped and the chart renders instantly.
2478
+ // Honor the OS-level prefers-reduced-motion setting. When true
2479
+ // (default) and the preference is on, applyAnimationPolicy forces off
2480
+ // BOTH `enabled` and `dynamicAnimation.enabled`, so neither the
2481
+ // initial mount nor a data update animates. Setting it false also
2482
+ // puts `apexcharts-ignore-reduced-motion` on the canvas, which is how
2483
+ // the stylesheet's reduced-motion rules know to stand down too.
2481
2484
  respectReducedMotion: true,
2482
2485
  // Above this many data points, per-element morph + stagger (which
2483
2486
  // spins up one JS-driven animation timeline per path — three chained
@@ -4149,6 +4152,89 @@ var __async = (__this, __arguments, generator) => {
4149
4152
  connectorColors: "#e8e8e8"
4150
4153
  }
4151
4154
  },
4155
+ icicle: {
4156
+ // Icicle (cartesian partition). One band per hierarchy level, each
4157
+ // child cell nested inside its parent's extent along the value axis.
4158
+ // Opt-in: `import ApexCharts from 'apexcharts/icicle'`.
4159
+ //
4160
+ // Which way the tree grows from the root. 'down' (default) puts the
4161
+ // root band on top; 'up' puts it at the bottom and is the flame-graph
4162
+ // orientation; 'right'/'left' grow sideways.
4163
+ direction: "down",
4164
+ // Thickness of one depth band. 'equal' divides the depth axis by the
4165
+ // deepest visible level; a number is px; a '%' string is a share of
4166
+ // the depth axis. A fixed size keeps its thickness through a zoom.
4167
+ levelSize: "equal",
4168
+ // How many levels to draw, counting the focused one. 'auto' (default)
4169
+ // draws the whole tree: labels already hide themselves once a band is
4170
+ // thinner than a line of text, so a deep tree degrades to an honest
4171
+ // dense shape rather than to nonsense. Set a number for very deep
4172
+ // trees (a call stack, say) to keep the top levels readable; branches
4173
+ // cut that way are marked, and clicking one zooms in to reveal them.
4174
+ maxDepth: "auto",
4175
+ // Gap between adjacent cells and corner rounding, both px, same
4176
+ // semantics as plotOptions.pie.spacing / .borderRadius.
4177
+ spacing: 1,
4178
+ borderRadius: 0,
4179
+ // How a branch that bottoms out before the deepest level is drawn.
4180
+ // 'stop' (default) ends the leaf at its own band and leaves the
4181
+ // deeper bands empty, so the white space below a branch shows how
4182
+ // deep it goes: that stepped silhouette is what makes an icicle
4183
+ // readable as a hierarchy. 'extend' stretches the leaf to the far
4184
+ // edge instead, which fills the plot and reads like a treemap.
4185
+ leaf: "stop",
4186
+ // Partition of a parent's extent among its children: 'normalize'
4187
+ // splits by each child's share of its siblings (safe for any data);
4188
+ // 'strict' expects children to sum to the parent's value.
4189
+ partition: "normalize",
4190
+ // Sibling order within a parent. 'none' keeps data order, 'value' is
4191
+ // descending by size, 'name' is alphabetical — the flame-graph
4192
+ // convention, which holds a frame in the same place across profiles
4193
+ // so two runs can be compared by eye.
4194
+ sort: "none",
4195
+ // Each depth level is tinted this much lighter than its parent
4196
+ // (0 = keep the parent colour, 1 = white). A per-node `color` wins.
4197
+ // Default 0: a branch carries ONE hue at every depth and the gaps do
4198
+ // the separating, which is what lets the eye follow a branch down.
4199
+ // Per-depth shading instead reads as nested boxes, i.e. a treemap.
4200
+ tint: 0,
4201
+ // Click a cell to zoom into that branch (a breadcrumb walks back).
4202
+ // Set false to disable.
4203
+ zoomOnClick: true,
4204
+ // What a zoom actually changes, the partition equivalent of
4205
+ // chart.zoom.type. 'value' (default) rescales the VALUE axis only:
4206
+ // the branch stretches to fill the width and every level stays
4207
+ // exactly where it was, so the reader keeps their bearings and the
4208
+ // ancestors stay on screen as context. 'both' also re-bands the DEPTH
4209
+ // axis, promoting the branch to the top level so its subtree fills
4210
+ // the whole plot, which uses the space better and moves everything.
4211
+ // Not named 'x'/'y': `direction` swaps which screen axis is which.
4212
+ zoomType: "value",
4213
+ dataLabels: {
4214
+ show: true,
4215
+ // Hide the label on any cell shorter than this (px) along the
4216
+ // reading direction, so narrow cells do not overflow.
4217
+ minSizeToShow: 30,
4218
+ // 'left' | 'center' | 'right', along the reading direction. Centred
4219
+ // by default so a band reads as one unit; a flame graph usually
4220
+ // wants 'left', because a reader scans the left edge of the stack.
4221
+ align: "center",
4222
+ // 'auto' (default) turns the label a quarter turn on a cell taller
4223
+ // than it is wide, which is where a flat label would be clipped by
4224
+ // the band while the value axis has room to spare. 'always' turns
4225
+ // every label for a uniform look, but note that a turned label
4226
+ // reads across the BAND THICKNESS, so it suits short names and
4227
+ // costs labels on wide shallow bands. 'never' keeps them all flat.
4228
+ rotate: "auto",
4229
+ showValue: false,
4230
+ style: {
4231
+ fontSize: "12px",
4232
+ fontFamily: void 0,
4233
+ fontWeight: 400,
4234
+ colors: void 0
4235
+ }
4236
+ }
4237
+ },
4152
4238
  sunburst: {
4153
4239
  // Sunburst / nested pie-donut (hierarchical radial). Rings go from the
4154
4240
  // centre hole outward, one per hierarchy level; each child arc is
@@ -4599,6 +4685,9 @@ var __async = (__this, __arguments, generator) => {
4599
4685
  intersect: false,
4600
4686
  // when enabled, tooltip will only show when user directly hovers over point
4601
4687
  inverseOrder: false,
4688
+ // Keeps custom tooltip content clickable; when enabled, it overrides
4689
+ // followCursor because a cursor-trailing tooltip cannot be entered.
4690
+ interactive: false,
4602
4691
  arrow: true,
4603
4692
  // One tight line instead of a card: the x label sits inline before
4604
4693
  // the value, the marker goes, the padding and font shrink. For panels
@@ -4822,6 +4911,7 @@ var __async = (__this, __arguments, generator) => {
4822
4911
  };
4823
4912
  }
4824
4913
  }
4914
+ const RESERVED_TYPES = ["icicle"];
4825
4915
  const TYPE_ALIASES = {
4826
4916
  funnel: "bar",
4827
4917
  pyramid: "bar",
@@ -5083,6 +5173,7 @@ var __async = (__this, __arguments, generator) => {
5083
5173
  "treemap",
5084
5174
  "unit",
5085
5175
  "sunburst",
5176
+ "icicle",
5086
5177
  "pie",
5087
5178
  "polarArea",
5088
5179
  "donut",
@@ -6238,24 +6329,28 @@ var __async = (__this, __arguments, generator) => {
6238
6329
  */
6239
6330
  stacked100(opts) {
6240
6331
  opts.dataLabels = opts.dataLabels || {};
6241
- opts.dataLabels.formatter = opts.dataLabels.formatter || void 0;
6242
- const existingDataLabelFormatter = opts.dataLabels.formatter;
6243
6332
  opts.yaxis.forEach((yaxe, index) => {
6244
6333
  opts.yaxis[index].min = 0;
6245
6334
  opts.yaxis[index].max = 100;
6246
6335
  });
6247
- const isBar = opts.chart.type === "bar";
6248
- if (isBar) {
6249
- opts.dataLabels.formatter = existingDataLabelFormatter || /**
6250
- * @param {any} val
6251
- */
6252
- function(val) {
6253
- if (typeof val === "number") {
6254
- return val ? val.toFixed(0) + "%" : val;
6255
- }
6256
- return val;
6257
- };
6258
- }
6336
+ if (opts.dataLabels.formatter) return opts;
6337
+ const percent = (val) => {
6338
+ if (typeof val === "number") {
6339
+ return val ? val.toFixed(0) + "%" : val;
6340
+ }
6341
+ return val;
6342
+ };
6343
+ const plain = (val) => val !== null ? val : "";
6344
+ const chartType = opts.chart.type;
6345
+ const isBarSeries = (s2) => s2.type ? s2.type === "bar" || s2.type === "column" : chartType === "bar" || chartType === "column";
6346
+ const hasBars = (opts.series || []).some(isBarSeries);
6347
+ opts.dataLabels.formatter = (val, ctx) => {
6348
+ var _a, _b, _c;
6349
+ const barIndices = (_c = (_b = (_a = ctx == null ? void 0 : ctx.w) == null ? void 0 : _a.globals) == null ? void 0 : _b.columnSeries) == null ? void 0 : _c.i;
6350
+ const isBarLabel = barIndices ? barIndices.includes(ctx == null ? void 0 : ctx.seriesIndex) : hasBars;
6351
+ if (isBarLabel) return percent(val);
6352
+ return plain(val);
6353
+ };
6259
6354
  return opts;
6260
6355
  }
6261
6356
  stackedBars() {
@@ -6496,6 +6591,42 @@ var __async = (__this, __arguments, generator) => {
6496
6591
  }
6497
6592
  };
6498
6593
  }
6594
+ icicle() {
6595
+ return {
6596
+ chart: {
6597
+ toolbar: {
6598
+ show: false
6599
+ }
6600
+ },
6601
+ dataLabels: {
6602
+ style: {
6603
+ colors: ["#fff"]
6604
+ }
6605
+ },
6606
+ stroke: {
6607
+ colors: ["#fff"]
6608
+ },
6609
+ fill: {
6610
+ opacity: 1
6611
+ },
6612
+ // Off by default: every cell carries its own label, so a legend repeats
6613
+ // what the chart already says. It also only lines up with the colours
6614
+ // when the tree has several roots, because the palette is applied to the
6615
+ // shallowest level that branches. A multi-root icicle can turn it on.
6616
+ legend: {
6617
+ show: false,
6618
+ position: "bottom"
6619
+ },
6620
+ grid: {
6621
+ padding: {
6622
+ left: 0,
6623
+ right: 0,
6624
+ top: 0,
6625
+ bottom: 0
6626
+ }
6627
+ }
6628
+ };
6629
+ }
6499
6630
  sunburst() {
6500
6631
  return {
6501
6632
  chart: {
@@ -7009,7 +7140,7 @@ var __async = (__this, __arguments, generator) => {
7009
7140
  var _a, _b, _c, _d, _e;
7010
7141
  const defaults = new Defaults(opts);
7011
7142
  const isBarHorizontal = (chartType === "bar" || chartType === "boxPlot" || chartType === "violin") && ((_b = (_a = opts.plotOptions) == null ? void 0 : _a.bar) == null ? void 0 : _b.horizontal);
7012
- const unsupportedZoom = chartType === "pie" || chartType === "polarArea" || chartType === "donut" || chartType === "radar" || chartType === "radialBar" || chartType === "heatmap" || chartType === "unit" || chartType === "sunburst";
7143
+ const unsupportedZoom = chartType === "pie" || chartType === "polarArea" || chartType === "donut" || chartType === "radar" || chartType === "radialBar" || chartType === "heatmap" || chartType === "unit" || chartType === "sunburst" || chartType === "icicle";
7013
7144
  const notNumericXAxis = opts.xaxis.type !== "datetime" && opts.xaxis.type !== "numeric";
7014
7145
  const isScatterJitter = (chartType === "scatter" || chartType === "bubble") && ((_e = (_d = (_c = opts.plotOptions) == null ? void 0 : _c.scatter) == null ? void 0 : _d.jitter) == null ? void 0 : _e.enabled);
7015
7146
  const tickPlacement = opts.xaxis.tickPlacement ? opts.xaxis.tickPlacement : chartDefaults.xaxis && chartDefaults.xaxis.tickPlacement;
@@ -7616,6 +7747,11 @@ var __async = (__this, __arguments, generator) => {
7616
7747
  // running total (used by pie/radial)
7617
7748
  // ── Animation control ─────────────────────────────────────────────────────
7618
7749
  shouldAnimate: true,
7750
+ // Set by Animations.applyAnimationPolicy while prefers-reduced-motion is
7751
+ // forcing animations off, holding the config values it overwrote so the
7752
+ // same function can put them back if the OS preference is lifted. Null
7753
+ // whenever the policy is not engaged.
7754
+ reducedMotionLatch: null,
7619
7755
  previousPaths: [],
7620
7756
  // paths from previous render — source for enter animation
7621
7757
  // polarArea's last-drawn sector angles. Its angles are count-based, not
@@ -8505,11 +8641,18 @@ var __async = (__this, __arguments, generator) => {
8505
8641
  **/
8506
8642
  getPercentSeries() {
8507
8643
  const w = this.w;
8644
+ const chartType = w.config.chart.type;
8645
+ const isBarSeries = (s2) => s2.type ? s2.type === "bar" || s2.type === "column" : chartType === "bar" || chartType === "column";
8646
+ const hasBars = w.config.series.some(isBarSeries);
8647
+ const excluded = hasBars ? w.config.series.map(
8648
+ (s2, i2) => isBarSeries(s2) ? -1 : i2
8649
+ ).filter((i2) => i2 !== -1) : [];
8650
+ const stackedTotals = excluded.length ? this.getStackedSeriesTotals(excluded) : w.seriesData.stackedSeriesTotals;
8508
8651
  w.globals.seriesPercent = w.seriesData.series.map((ser) => {
8509
8652
  const seriesPercent = [];
8510
8653
  if (Array.isArray(ser)) {
8511
8654
  for (let j2 = 0; j2 < ser.length; j2++) {
8512
- const total = w.seriesData.stackedSeriesTotals[j2];
8655
+ const total = stackedTotals[j2];
8513
8656
  let percent = 0;
8514
8657
  if (total) {
8515
8658
  percent = 100 * ser[j2] / total;
@@ -9743,9 +9886,30 @@ var __async = (__this, __arguments, generator) => {
9743
9886
  function applyAnimationPolicy(w) {
9744
9887
  const anim = w.config.chart.animations;
9745
9888
  if (!anim) return;
9889
+ const dyn = anim.dynamicAnimation;
9890
+ const gl = w.globals;
9746
9891
  if (anim.respectReducedMotion !== false && prefersReducedMotion()) {
9892
+ if (!gl.reducedMotionLatch) {
9893
+ gl.reducedMotionLatch = {
9894
+ enabled: anim.enabled,
9895
+ dynamicEnabled: dyn ? dyn.enabled : void 0
9896
+ };
9897
+ } else {
9898
+ if (anim.enabled !== false) {
9899
+ gl.reducedMotionLatch.enabled = anim.enabled;
9900
+ }
9901
+ if (dyn && dyn.enabled !== false) {
9902
+ gl.reducedMotionLatch.dynamicEnabled = dyn.enabled;
9903
+ }
9904
+ }
9747
9905
  anim.enabled = false;
9748
- if (anim.dynamicAnimation) anim.dynamicAnimation.enabled = false;
9906
+ if (dyn) dyn.enabled = false;
9907
+ } else if (gl.reducedMotionLatch) {
9908
+ anim.enabled = gl.reducedMotionLatch.enabled;
9909
+ if (dyn && gl.reducedMotionLatch.dynamicEnabled !== void 0) {
9910
+ dyn.enabled = gl.reducedMotionLatch.dynamicEnabled;
9911
+ }
9912
+ gl.reducedMotionLatch = null;
9749
9913
  }
9750
9914
  setDefaultEasing(resolveEasing(anim.easing));
9751
9915
  }
@@ -15493,7 +15657,7 @@ var __async = (__this, __arguments, generator) => {
15493
15657
  if (cnf.chart.stacked) {
15494
15658
  this._setStackedMinMax();
15495
15659
  }
15496
- if (cnf.chart.type === "line" || cnf.chart.type === "area" || cnf.chart.type === "scatter" || cnf.chart.type === "candlestick" || cnf.chart.type === "boxPlot" || cnf.chart.type === "violin" || cnf.chart.type === "rangeBar" && !gl.isBarHorizontal) {
15660
+ if (cnf.chart.type === "line" || cnf.chart.type === "area" || cnf.chart.type === "rangeArea" || cnf.chart.type === "scatter" || cnf.chart.type === "candlestick" || cnf.chart.type === "boxPlot" || cnf.chart.type === "violin" || cnf.chart.type === "rangeBar" && !gl.isBarHorizontal) {
15497
15661
  if (gl.minY === Number.MIN_VALUE && lowestYInAllSeries !== -Number.MAX_VALUE && lowestYInAllSeries !== gl.maxY) {
15498
15662
  gl.minY = lowestYInAllSeries;
15499
15663
  }
@@ -19534,7 +19698,7 @@ var __async = (__this, __arguments, generator) => {
19534
19698
  * around its presence would reflow every tile on each zoom.
19535
19699
  */
19536
19700
  gridPadForBreadcrumb() {
19537
- var _a, _b, _c, _d, _e, _f;
19701
+ var _a, _b, _c, _d, _e, _f, _g, _h;
19538
19702
  const w = this.w;
19539
19703
  const isTreemap = w.config.chart.type === "treemap";
19540
19704
  if (isTreemap) {
@@ -19545,11 +19709,17 @@ var __async = (__this, __arguments, generator) => {
19545
19709
  return;
19546
19710
  }
19547
19711
  }
19712
+ if (w.config.chart.type === "icicle") {
19713
+ if (((_d = (_c = w.config.plotOptions) == null ? void 0 : _c.icicle) == null ? void 0 : _d.zoomOnClick) === false) return;
19714
+ if (breadcrumbConfig(w).show === false) return;
19715
+ this.gridPad.top += BREADCRUMB_HEIGHT + 4;
19716
+ return;
19717
+ }
19548
19718
  if (!w.globals.axisCharts) return;
19549
19719
  if (!this.ctx.drilldown) return;
19550
19720
  if (!w.config.drilldown || !w.config.drilldown.enabled) return;
19551
19721
  if (breadcrumbConfig(w).show === false) return;
19552
- const labelFs = parseFloat(String((_f = (_e = (_d = (_c = w.config.yaxis) == null ? void 0 : _c[0]) == null ? void 0 : _d.labels) == null ? void 0 : _e.style) == null ? void 0 : _f.fontSize)) || 11;
19722
+ const labelFs = parseFloat(String((_h = (_g = (_f = (_e = w.config.yaxis) == null ? void 0 : _e[0]) == null ? void 0 : _f.labels) == null ? void 0 : _g.style) == null ? void 0 : _h.fontSize)) || 11;
19553
19723
  const yLabelOverhang = isTreemap ? 0 : Math.ceil(labelFs * LINE_HEIGHT_RATIO / 2);
19554
19724
  const needed = BREADCRUMB_HEIGHT_FULL + 1 + yLabelOverhang;
19555
19725
  const alreadyFree = isTreemap ? 0 : this.titleBlockPad || 0;
@@ -19666,7 +19836,7 @@ var __async = (__this, __arguments, generator) => {
19666
19836
  if (w.config.legend.show && !w.config.legend.floating) {
19667
19837
  xPad = 20;
19668
19838
  }
19669
- if (cnf.chart.type === "unit") {
19839
+ if (cnf.chart.type === "unit" || cnf.chart.type === "icicle") {
19670
19840
  const legendVisible = cnf.legend.show && !cnf.legend.floating;
19671
19841
  const pos = cnf.legend.position;
19672
19842
  let top = 0;
@@ -20109,6 +20279,7 @@ var __async = (__this, __arguments, generator) => {
20109
20279
  this.el = el;
20110
20280
  }
20111
20281
  setupElements() {
20282
+ var _a;
20112
20283
  const { globals: gl, config: cnf } = this.w;
20113
20284
  const ct = cnf.chart.type;
20114
20285
  const xyChartsArrTypes = [
@@ -20139,9 +20310,10 @@ var __async = (__this, __arguments, generator) => {
20139
20310
  "http://www.w3.org/1999/xhtml",
20140
20311
  "div"
20141
20312
  );
20313
+ const ignoreReducedMotion = ((_a = cnf.chart.animations) == null ? void 0 : _a.respectReducedMotion) === false;
20142
20314
  Graphics.setAttrs(this.w.dom.elWrap, {
20143
20315
  id: gl.chartClass.substring(1),
20144
- class: `apexcharts-canvas ${gl.chartClass.substring(1)}`
20316
+ class: `apexcharts-canvas ${gl.chartClass.substring(1)}` + (ignoreReducedMotion ? " apexcharts-ignore-reduced-motion" : "")
20145
20317
  });
20146
20318
  this.el.appendChild(this.w.dom.elWrap);
20147
20319
  const SVG2 = (
@@ -20260,7 +20432,8 @@ var __async = (__this, __arguments, generator) => {
20260
20432
  "radialBar",
20261
20433
  "radar",
20262
20434
  "unit",
20263
- "sunburst"
20435
+ "sunburst",
20436
+ "icicle"
20264
20437
  ].includes(seriesType)) {
20265
20438
  nonComboType = seriesType;
20266
20439
  } else if (isCustom(seriesType)) {
@@ -20566,6 +20739,11 @@ var __async = (__this, __arguments, generator) => {
20566
20739
  elGraph = sunburst.draw(this.w.seriesData.series);
20567
20740
  break;
20568
20741
  }
20742
+ case "icicle": {
20743
+ const icicle = new (getChartClass("icicle"))(ctx.w, ctx);
20744
+ elGraph = icicle.draw(this.w.seriesData.series);
20745
+ break;
20746
+ }
20569
20747
  case "pie":
20570
20748
  case "donut":
20571
20749
  case "polarArea":
@@ -21173,6 +21351,15 @@ var __async = (__this, __arguments, generator) => {
21173
21351
  return { roots, leafSeries, maxDepth };
21174
21352
  }
21175
21353
  const RAW_SAMPLE_FEATURES = { histogram: "stats", raincloud: "raincloud" };
21354
+ function subtreeTotal(d) {
21355
+ if (!d || typeof d !== "object") return Utils$1.parseNumber(d) || 0;
21356
+ if (d.y !== void 0) return Utils$1.parseNumber(d.y) || 0;
21357
+ if (!Array.isArray(d.children)) return 0;
21358
+ return d.children.reduce(
21359
+ (s2, c) => s2 + subtreeTotal(c),
21360
+ 0
21361
+ );
21362
+ }
21176
21363
  class Data {
21177
21364
  /**
21178
21365
  * @param {import('../types/internal').ChartStateW} w
@@ -22070,6 +22257,9 @@ var __async = (__this, __arguments, generator) => {
22070
22257
  if (dataPoint.x !== void 0 && dataPoint.y !== void 0) {
22071
22258
  labels.push(String(dataPoint.x));
22072
22259
  values.push(Utils$1.parseNumber(dataPoint.y));
22260
+ } else if (dataPoint.x !== void 0 && Array.isArray(dataPoint.children)) {
22261
+ labels.push(String(dataPoint.x));
22262
+ values.push(subtreeTotal(dataPoint));
22073
22263
  } else {
22074
22264
  console.warn(
22075
22265
  "ApexCharts: Invalid data point format for pie chart. Expected {x, y} format:",
@@ -23383,6 +23573,19 @@ var __async = (__this, __arguments, generator) => {
23383
23573
  }
23384
23574
  }
23385
23575
  class Utils {
23576
+ /**
23577
+ * Interactive custom tooltip content must remain reachable, so it takes
23578
+ * precedence over cursor-following placement without changing the user's
23579
+ * configured `followCursor` value.
23580
+ *
23581
+ * Kept independent of a Tooltip instance because Position and Intersect are
23582
+ * also used with lightweight contexts that only provide `w`.
23583
+ *
23584
+ * @param {import('../../types/internal').ChartStateW} w
23585
+ */
23586
+ static isFollowCursor(w) {
23587
+ return w.config.tooltip.followCursor && !w.config.tooltip.interactive;
23588
+ }
23386
23589
  /**
23387
23590
  * @param {import('./Tooltip').default} tooltipContext
23388
23591
  */
@@ -24576,7 +24779,7 @@ var __async = (__this, __arguments, generator) => {
24576
24779
  if (x < -20) {
24577
24780
  x = -20;
24578
24781
  }
24579
- if (w.config.tooltip.followCursor) {
24782
+ if (Utils.isFollowCursor(w)) {
24580
24783
  const elGrid = ttCtx.getElGrid();
24581
24784
  if (!elGrid) return null;
24582
24785
  const seriesBound = elGrid.getBoundingClientRect();
@@ -24872,7 +25075,7 @@ var __async = (__this, __arguments, generator) => {
24872
25075
  }
24873
25076
  }
24874
25077
  if (!w.globals.isBarHorizontal) {
24875
- if (w.config.tooltip.followCursor) {
25078
+ if (Utils.isFollowCursor(w)) {
24876
25079
  bcy = ttCtx.e.clientY - seriesBound.top - ttCtx.tooltipRect.ttHeight / 2;
24877
25080
  } else {
24878
25081
  if (bcy + ttCtx.tooltipRect.ttHeight + 15 > w.layout.gridHeight) {
@@ -24886,7 +25089,7 @@ var __async = (__this, __arguments, generator) => {
24886
25089
  this.moveXCrosshairs(bcx);
24887
25090
  }
24888
25091
  if (!ttCtx.fixedTooltip) {
24889
- if (w.globals.isBarHorizontal && !w.config.tooltip.followCursor) {
25092
+ if (w.globals.isBarHorizontal && !Utils.isFollowCursor(w)) {
24890
25093
  const placed = this.placeHorizontalSharedTooltip(j2);
24891
25094
  if (placed) return;
24892
25095
  }
@@ -25275,7 +25478,7 @@ var __async = (__this, __arguments, generator) => {
25275
25478
  w.interact.capturedDataPointIndex = j2;
25276
25479
  ttCtx.tooltipPosition.moveXCrosshairs(cx + width / 2);
25277
25480
  const tooltipEl = ttCtx.getElTooltip();
25278
- if (type === "heatmap" && w.config.tooltip.arrow && !w.config.tooltip.followCursor && tooltipEl) {
25481
+ if (type === "heatmap" && w.config.tooltip.arrow && !Utils.isFollowCursor(w) && tooltipEl) {
25279
25482
  const elGridRect2 = opt.elGrid.getBoundingClientRect();
25280
25483
  const elWrapRect = w.dom.elWrap.getBoundingClientRect();
25281
25484
  const gridOffsetXInElWrap = elGridRect2.left - elWrapRect.left;
@@ -25330,7 +25533,7 @@ var __async = (__this, __arguments, generator) => {
25330
25533
  if (x > w.layout.gridWidth / 2) {
25331
25534
  x = cx - ttCtx.tooltipRect.ttWidth / 2 + width;
25332
25535
  }
25333
- if (ttCtx.w.config.tooltip.followCursor) {
25536
+ if (Utils.isFollowCursor(w)) {
25334
25537
  const seriesBound = w.dom.elWrap.getBoundingClientRect();
25335
25538
  x = ((_c = w.interact.clientX) != null ? _c : 0) - seriesBound.left - (x > w.layout.gridWidth / 2 ? ttCtx.tooltipRect.ttWidth : 0);
25336
25539
  y = ((_d = w.interact.clientY) != null ? _d : 0) - seriesBound.top - (y > w.layout.gridHeight / 2 ? ttCtx.tooltipRect.ttHeight : 0);
@@ -25393,7 +25596,7 @@ var __async = (__this, __arguments, generator) => {
25393
25596
  y = cy;
25394
25597
  }
25395
25598
  }
25396
- if (ttCtx.w.config.tooltip.followCursor) {
25599
+ if (Utils.isFollowCursor(w)) {
25397
25600
  const elGrid = ttCtx.getElGrid();
25398
25601
  if (!elGrid) return { x, y };
25399
25602
  const seriesBound = elGrid.getBoundingClientRect();
@@ -25449,7 +25652,7 @@ var __async = (__this, __arguments, generator) => {
25449
25652
  } else if (x < 0) {
25450
25653
  x = 0;
25451
25654
  }
25452
- if (ttCtx.w.config.tooltip.followCursor) {
25655
+ if (Utils.isFollowCursor(w)) {
25453
25656
  const elGrid = ttCtx.getElGrid();
25454
25657
  if (!elGrid) return;
25455
25658
  }
@@ -25616,7 +25819,7 @@ var __async = (__this, __arguments, generator) => {
25616
25819
  shared: ttCtx.showOnIntersect ? false : w.config.tooltip.shared,
25617
25820
  e: e2
25618
25821
  });
25619
- if (w.config.tooltip.followCursor) {
25822
+ if (Utils.isFollowCursor(w)) {
25620
25823
  if (w.globals.isBarHorizontal) {
25621
25824
  x = clientX - seriesBound.left + 15;
25622
25825
  y = handleYForBars();
@@ -25820,6 +26023,7 @@ var __async = (__this, __arguments, generator) => {
25820
26023
  }
25821
26024
  }
25822
26025
  }
26026
+ const INTERACTIVE_TOOLTIP_HIDE_DELAY = 150;
25823
26027
  class Tooltip {
25824
26028
  /**
25825
26029
  * @param {import('../../types/internal').ChartStateW} w
@@ -25865,6 +26069,7 @@ var __async = (__this, __arguments, generator) => {
25865
26069
  this.ttItems = null;
25866
26070
  this.seriesBound = null;
25867
26071
  this.seriesHoverTimeout = void 0;
26072
+ this.interactiveHideTimeout = void 0;
25868
26073
  this.clientX = 0;
25869
26074
  this.clientY = 0;
25870
26075
  this.barSeriesHeight = 0;
@@ -25969,6 +26174,28 @@ var __async = (__this, __arguments, generator) => {
25969
26174
  "div"
25970
26175
  );
25971
26176
  tooltipEl.classList.add("apexcharts-tooltip");
26177
+ if (this.tConfig.interactive) {
26178
+ tooltipEl.classList.add("apexcharts-tooltip-interactive");
26179
+ tooltipEl.addEventListener(
26180
+ "mouseenter",
26181
+ () => clearTimeout(this.interactiveHideTimeout),
26182
+ { passive: true }
26183
+ );
26184
+ tooltipEl.addEventListener(
26185
+ "mouseleave",
26186
+ () => {
26187
+ clearTimeout(this.interactiveHideTimeout);
26188
+ this.handleMouseOut({ tooltipEl });
26189
+ if (w.config.chart.group) {
26190
+ this.ctx.getGroupedCharts().forEach((ch) => {
26191
+ const el = this.getElTooltip(ch);
26192
+ if (el) ch.w.globals.tooltip.handleMouseOut({ tooltipEl: el });
26193
+ });
26194
+ }
26195
+ },
26196
+ { passive: true }
26197
+ );
26198
+ }
25972
26199
  if (w.config.tooltip.cssClass) {
25973
26200
  tooltipEl.classList.add(w.config.tooltip.cssClass);
25974
26201
  }
@@ -25989,7 +26216,7 @@ var __async = (__this, __arguments, generator) => {
25989
26216
  );
25990
26217
  }
25991
26218
  const isSharedMulti = this.tConfig.shared && w.config.series.length > 1 && !w.globals.isBarHorizontal && w.config.chart.type !== "heatmap";
25992
- const shouldDrawArrow = this.tConfig.arrow && !this.tConfig.followCursor && !this.tConfig.fixed.enabled && !isSharedMulti && !this.tConfig.fillSeriesColor && w.globals.axisCharts;
26219
+ const shouldDrawArrow = this.tConfig.arrow && !Utils.isFollowCursor(this.w) && !this.tConfig.fixed.enabled && !isSharedMulti && !this.tConfig.fillSeriesColor && w.globals.axisCharts;
25993
26220
  if (shouldDrawArrow) {
25994
26221
  const arrowEl = BrowserAPIs.createElementNS(
25995
26222
  "http://www.w3.org/1999/xhtml",
@@ -26259,6 +26486,16 @@ var __async = (__this, __arguments, generator) => {
26259
26486
  */
26260
26487
  /** @param {Record<string, any>} opt @param {any} e */
26261
26488
  onSeriesHover(opt, e2) {
26489
+ if (this.tConfig.interactive) {
26490
+ clearTimeout(this.interactiveHideTimeout);
26491
+ if (e2.type === "mouseout") {
26492
+ clearTimeout(this.seriesHoverTimeout);
26493
+ this.interactiveHideTimeout = setTimeout(() => {
26494
+ if (!this.w.globals.isDestroyed) this.seriesHover(opt, e2);
26495
+ }, INTERACTIVE_TOOLTIP_HIDE_DELAY);
26496
+ return;
26497
+ }
26498
+ }
26262
26499
  Utils.hoverTarget(e2);
26263
26500
  const targetDelay = 20;
26264
26501
  const timeSinceLastUpdate = Date.now() - this.lastHoverTime;
@@ -28620,7 +28857,7 @@ var __async = (__this, __arguments, generator) => {
28620
28857
  ros.delete(fn);
28621
28858
  }
28622
28859
  }
28623
- const apexCSS = "@keyframes opaque {\n 0% {\n opacity: 0\n }\n\n to {\n opacity: 1\n }\n}\n\n@keyframes resizeanim {\n\n 0%,\n to {\n opacity: 0\n }\n}\n\n.apexcharts-canvas {\n position: relative;\n direction: ltr !important;\n user-select: none;\n /* Focus indicator colour. Themes override below. */\n --apexcharts-focus-color: #008FFB;\n}\n\n/* Dark theme & high-contrast: brighter focus colour for sufficient contrast. */\n.apexcharts-canvas .apexcharts-theme-dark,\n.apexcharts-theme-dark.apexcharts-canvas {\n --apexcharts-focus-color: #FFD500;\n}\n.apexcharts-canvas.apexcharts-high-contrast,\n.apexcharts-high-contrast.apexcharts-canvas {\n --apexcharts-focus-color: #FFFF00;\n}\n\n/* Visually-hidden aria-live status region (WCAG 4.1.3 Status Messages). */\n.apexcharts-sr-status {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n/* Respect OS-level reduced-motion preference (WCAG 2.3.3). */\n@media (prefers-reduced-motion: reduce) {\n .apexcharts-canvas *,\n .apexcharts-canvas *::before,\n .apexcharts-canvas *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n }\n}\n\n.apexcharts-canvas ::-webkit-scrollbar {\n -webkit-appearance: none;\n width: 6px\n}\n\n.apexcharts-canvas ::-webkit-scrollbar-thumb {\n border-radius: 4px;\n background-color: rgba(0, 0, 0, .5);\n box-shadow: 0 0 1px rgba(255, 255, 255, .5);\n -webkit-box-shadow: 0 0 1px rgba(255, 255, 255, .5)\n}\n\n.apexcharts-inner {\n position: relative\n}\n\n.apexcharts-text tspan {\n font-family: inherit\n}\n\nrect.legend-mouseover-inactive,\n.legend-mouseover-inactive rect,\n.legend-mouseover-inactive path,\n.legend-mouseover-inactive circle,\n.legend-mouseover-inactive line,\n.legend-mouseover-inactive text.apexcharts-yaxis-title-text,\n.legend-mouseover-inactive text.apexcharts-yaxis-label {\n transition: .15s ease all;\n opacity: .2\n}\n\n/* Linked Views (#4): per-mark crossfilter dim. Applied to individual data\n marks (not whole series) whose x is outside the brushed range. Opacity is\n overridable per chart via the --apx-cf-dim custom property. */\n.apexcharts-crossfilter-dimmed {\n transition: opacity .25s ease;\n opacity: var(--apx-cf-dim, .2)\n}\n\n/* Linked Views (#4): default styling for the built-in crossfilter data table\n (cf.dataTable). Deliberately light so host styles can override. */\n.apexcharts-cf-table {\n border-collapse: collapse;\n width: 100%;\n font-size: 13px;\n}\n.apexcharts-cf-table caption {\n caption-side: bottom;\n text-align: right;\n padding: 6px 2px;\n font-size: 12px;\n opacity: .7\n}\n.apexcharts-cf-table th,\n.apexcharts-cf-table td {\n padding: 6px 10px;\n text-align: left;\n border-bottom: 1px solid rgba(0, 0, 0, .08)\n}\n.apexcharts-cf-table th {\n font-weight: 600;\n border-bottom-width: 2px\n}\n.apexcharts-cf-table tbody tr:hover {\n background: rgba(99, 102, 241, .06)\n}\n\n/* Measure ruler (#18): measure / delta ruler.\n Theme via these classes or the --apx-measure-* custom properties below\n (config `chart.measure.colors` overrides both). The ruler group also carries\n a direction class: apexcharts-measure-up | -down | -flat.\n Element classes:\n .apexcharts-measure-band shaded span band\n .apexcharts-measure-vline vertical guide lines\n .apexcharts-measure-line free-mode diagonal line\n .apexcharts-measure-label-bg readout box .apexcharts-measure-label text\n Colors are applied as SVG presentation attributes, so any rule you write on\n these classes overrides them. */\n.apexcharts-canvas {\n --apx-measure-up: #16a34a;\n --apx-measure-down: #dc2626;\n --apx-measure-neutral: #64748b;\n --apx-measure-guide: #94a3b8;\n}\n.apexcharts-measure-capture {\n cursor: crosshair;\n}\n\n/* Radial Actions (#chrome): right-click context menu. Theme via these classes\n or the --apx-menu-* custom properties. */\n.apexcharts-canvas {\n --apx-menu-bg: #ffffff;\n --apx-menu-fg: #1e293b;\n --apx-menu-border: #e2e8f0;\n --apx-menu-hover: #f1f5f9;\n --apx-menu-shadow: rgba(15, 23, 42, 0.18);\n}\n.apexcharts-context-menu {\n min-width: 168px;\n padding: 4px;\n border-radius: 8px;\n background: var(--apx-menu-bg);\n border: 1px solid var(--apx-menu-border);\n box-shadow: 0 6px 22px var(--apx-menu-shadow);\n font-family: Helvetica, Arial, sans-serif;\n font-size: 13px;\n z-index: 20;\n user-select: none;\n}\n.apexcharts-context-menu-item {\n display: block;\n width: 100%;\n box-sizing: border-box;\n text-align: left;\n padding: 7px 12px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: var(--apx-menu-fg);\n font: inherit;\n cursor: pointer;\n}\n.apexcharts-context-menu-item:hover,\n.apexcharts-context-menu-item--active {\n background: var(--apx-menu-hover);\n}\n.apexcharts-context-menu-item:focus {\n outline: none;\n}\n\n/* Ink Layer (#7): the floating note editor card, opened by clicking an\n ink-managed annotation. Theme via these classes or the --apx-ink-* vars. */\n.apexcharts-canvas {\n --apx-ink-card-bg: #ffffff;\n --apx-ink-card-fg: #1e293b;\n --apx-ink-card-border: #e2e8f0;\n --apx-ink-card-hover: #f1f5f9;\n --apx-ink-card-accent: #6366f1;\n --apx-ink-card-shadow: rgba(15, 23, 42, 0.18);\n}\n.apexcharts-ink-card {\n position: absolute;\n z-index: 25;\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 8px;\n border-radius: 8px;\n background: var(--apx-ink-card-bg);\n border: 1px solid var(--apx-ink-card-border);\n box-shadow: 0 6px 22px var(--apx-ink-card-shadow);\n font-family: Helvetica, Arial, sans-serif;\n font-size: 12px;\n color: var(--apx-ink-card-fg);\n user-select: none;\n}\n.apexcharts-ink-card-row {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.apexcharts-ink-card input.apexcharts-ink-editor {\n flex: 1 1 auto;\n width: 150px;\n min-width: 0;\n box-sizing: border-box;\n padding: 4px 6px;\n font: inherit;\n color: inherit;\n background: transparent;\n border: 1px solid var(--apx-ink-card-border);\n border-radius: 5px;\n}\n.apexcharts-ink-card input.apexcharts-ink-editor:focus {\n outline: none;\n border-color: var(--apx-ink-card-accent);\n}\n.apexcharts-ink-btn {\n flex: 0 0 auto;\n width: 24px;\n height: 24px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: inherit;\n font: inherit;\n font-size: 12px;\n line-height: 1;\n cursor: pointer;\n}\n.apexcharts-ink-btn:hover,\n.apexcharts-ink-btn--active {\n background: var(--apx-ink-card-hover);\n}\n.apexcharts-ink-btn:focus-visible,\n.apexcharts-ink-swatch:focus-visible {\n outline: 2px solid var(--apx-ink-card-accent);\n outline-offset: 1px;\n}\n.apexcharts-ink-btn--bold {\n font-weight: 700;\n}\n.apexcharts-ink-btn--delete:hover {\n color: #dc2626;\n}\n.apexcharts-ink-swatch {\n flex: 0 0 auto;\n width: 16px;\n height: 16px;\n padding: 0;\n border: 1px solid rgba(100, 116, 139, 0.45);\n border-radius: 50%;\n cursor: pointer;\n}\n.apexcharts-ink-swatch--active {\n box-shadow:\n 0 0 0 2px var(--apx-ink-card-bg),\n 0 0 0 4px var(--apx-ink-card-accent);\n}\n.apexcharts-ink-sep {\n flex: 0 0 auto;\n width: 1px;\n height: 16px;\n margin: 0 2px;\n background: var(--apx-ink-card-border);\n}\n.apexcharts-ink-cardlabel {\n flex: 0 0 auto;\n font-size: 10px;\n letter-spacing: 0.4px;\n text-transform: uppercase;\n opacity: 0.65;\n margin-right: 2px;\n}\n.apexcharts-ink-marker-size {\n flex: 0 0 auto;\n min-width: 16px;\n text-align: center;\n font-variant-numeric: tabular-nums;\n}\n\n.apexcharts-legend-text {\n padding-left: 15px;\n margin-left: -15px;\n}\n\n.apexcharts-legend-series[role=\"button\"]:focus {\n outline: 2px solid var(--apexcharts-focus-color, #008FFB);\n outline-offset: 2px;\n}\n\n.apexcharts-legend-series[role=\"button\"]:focus:not(:focus-visible) {\n outline: none;\n}\n\n.apexcharts-legend-series[role=\"button\"]:focus-visible {\n outline: 2px solid var(--apexcharts-focus-color, #008FFB);\n outline-offset: 2px;\n}\n\n.apexcharts-series-collapsed {\n opacity: 0\n}\n\n/* A series still playing its exit tween stays painted so it can visibly shrink\n away, hiding it on the first frame leaves a hole in a stacked chart for the\n length of the animation. Dropped once the tween lands. */\n.apexcharts-series-collapsed.apexcharts-series-collapsing {\n opacity: 1\n}\n\n/* Its labels ride the shrinking marks, but a mark runs out of room for its text\n well before it reaches zero, so fade them across the exit instead of holding\n them crisp over a sliver. Duration is set inline from dynamicAnimation.speed. */\n.apexcharts-datalabels.apexcharts-series-collapsing {\n animation: apexcharts-datalabels-exit var(--apexcharts-dl-exit, 400ms) ease-in\n forwards;\n}\n\n@keyframes apexcharts-datalabels-exit {\n from {\n opacity: 1\n }\n to {\n opacity: 0\n }\n}\n\n.apexcharts-canvas svg:focus:not(:focus-visible) {\n outline: none;\n}\n\n/* Keyboard navigation focus indicator on SVG data elements.\n SVG elements don't support CSS outline, so we use stroke. */\n.apexcharts-bar-area.apexcharts-keyboard-focused,\n.apexcharts-candlestick-area.apexcharts-keyboard-focused,\n.apexcharts-boxPlot-area.apexcharts-keyboard-focused,\n.apexcharts-rangebar-area.apexcharts-keyboard-focused,\n.apexcharts-pie-area.apexcharts-keyboard-focused,\n.apexcharts-heatmap-rect.apexcharts-keyboard-focused,\n.apexcharts-treemap-rect.apexcharts-keyboard-focused {\n stroke: var(--apexcharts-focus-color, #008FFB);\n stroke-width: 2;\n stroke-opacity: 1;\n}\n\n.apexcharts-tooltip {\n --apx-tt-bg: #ffffff;\n /* Shared by the body and the arrow's two outward facets, so the\n * hairline reads as one continuous outline around the whole shape.\n * Keep it strong enough to survive on its own: the shadow below is\n * elevation, not edge definition. */\n --apx-tt-border: rgba(15, 23, 42, 0.12);\n /* Elevation, in three layers: a tight contact shadow that anchors the\n * bottom edge, a directional key shadow for the lift, and a wide\n * ambient one that grounds the whole box. Each is weaker and more\n * diffuse than the last.\n *\n * A tooltip is unusual in that it floats over *data*, so reach costs\n * more than it does on a page: every pixel the shadow travels tints a\n * bar or a line the reader is trying to compare. These numbers are\n * tuned to keep the near-edge contrast that reads as elevation while\n * dropping the long low haze that only muddies the plot.\n *\n * Note there is deliberately no `0 0 0 1px` ring layer. That used to\n * stand in for edge definition back when --apx-tt-border was barely\n * visible; now that the border is a real hairline (and the arrow\n * shares it) a ring only double-draws the outline, and being spread\n * rather than offset it leaked ink upward too, flattening the lift.\n *\n * `--apx-tt-shadow-dir` flips the whole stack's Y in one place — see\n * the `[data-placement=\"bottom\"]` rule further down. */\n --apx-tt-shadow-dir: 1;\n --apx-tt-shadow: 0 calc(var(--apx-tt-shadow-dir) * 1px) 2px rgba(15, 23, 42, 0.06), 0 calc(var(--apx-tt-shadow-dir) * 4px) 8px -2px rgba(15, 23, 42, 0.10), 0 calc(var(--apx-tt-shadow-dir) * 12px) 20px -8px rgba(15, 23, 42, 0.14);\n --apx-tt-arrow-bg: var(--apx-tt-bg);\n --apx-tt-color: #0f172a;\n --apx-tt-color-muted: rgba(15, 23, 42, 0.55);\n border-radius: 8px;\n background: var(--apx-tt-bg);\n border: 1px solid var(--apx-tt-border);\n box-shadow: var(--apx-tt-shadow);\n color: var(--apx-tt-color);\n cursor: default;\n font-size: 13px;\n left: 0;\n top: 0;\n opacity: 0;\n pointer-events: none;\n position: absolute;\n display: flex;\n flex-direction: column;\n padding: 2px 0;\n white-space: nowrap;\n z-index: 12;\n transition: opacity .12s ease\n}\n\n/* While the tooltip is visible, smoothly animate position changes\n * between data points. Kept short (160 ms) and ease-out so it stays\n * responsive — too long would feel laggy when sweeping across many\n * points fast. The position transition is only attached after the\n * first paint (Position.applyTooltipPosition flips `data-positioned`\n * once the tooltip has been placed) so the *first* show doesn't slide\n * the tooltip in from the previously-stale (0,0) coordinates. */\n.apexcharts-tooltip.apexcharts-active {\n opacity: 1;\n transition: opacity .12s ease\n}\n.apexcharts-tooltip.apexcharts-active[data-positioned=\"true\"] {\n transition: opacity .12s ease, left .16s ease-out, top .16s ease-out\n}\n\n.apexcharts-tooltip.apexcharts-theme-light {\n /* defaults already set above; class kept for backward-compat selectors */\n}\n\n.apexcharts-tooltip.apexcharts-theme-dark {\n --apx-tt-bg: #1c1c1f;\n --apx-tt-border: rgba(255, 255, 255, 0.16);\n /* Dark needs more alpha than light to register at all, but not as much\n * as it used to: the light rim above now carries the edge, so the\n * shadow is free to be pure elevation instead of doubling as an\n * outline. Same geometry as light, heavier ink. */\n --apx-tt-shadow: 0 calc(var(--apx-tt-shadow-dir) * 1px) 2px rgba(0, 0, 0, 0.24), 0 calc(var(--apx-tt-shadow-dir) * 4px) 8px -2px rgba(0, 0, 0, 0.30), 0 calc(var(--apx-tt-shadow-dir) * 12px) 20px -8px rgba(0, 0, 0, 0.38);\n --apx-tt-color: #f3f4f6;\n --apx-tt-color-muted: rgba(243, 244, 246, 0.55);\n}\n\n.apexcharts-tooltip * {\n font-family: inherit\n}\n\n/* Point-annotation hover tooltip (apexcharts/apexcharts.js#2424). Reuses the\n * glass body/border/shadow from `.apexcharts-tooltip` but holds free-form\n * content, so it needs its own padding, wrapping and a sane max width. */\n.apexcharts-tooltip.apexcharts-annotation-tooltip {\n padding: 6px 10px;\n max-width: 240px;\n white-space: normal;\n line-height: 1.4;\n pointer-events: none;\n z-index: 13\n}\n\n.apexcharts-tooltip-title {\n padding: 8px 12px 4px;\n font-size: 12px;\n font-weight: 600;\n letter-spacing: 0.01em;\n color: var(--apx-tt-color-muted);\n background: transparent;\n border-bottom: none;\n margin-bottom: 0\n}\n\n.apexcharts-tooltip.apexcharts-theme-light .apexcharts-tooltip-title,\n.apexcharts-tooltip.apexcharts-theme-dark .apexcharts-tooltip-title {\n background: transparent;\n border-bottom: none\n}\n\n/* `fillSeriesColor`: each series-group already paints itself with the\n * series colour. Drop the glass body entirely (transparent bg, no\n * border, no backdrop-filter, no padding) and clip the coloured\n * series-group(s) to the tooltip's rounded corners so they fill the\n * shell edge-to-edge. Text inside the coloured group is forced to\n * white for contrast. */\n.apexcharts-tooltip.apexcharts-tooltip-fill-series {\n background: transparent;\n -webkit-backdrop-filter: none;\n backdrop-filter: none;\n border: none;\n padding: 0;\n overflow: hidden;\n color: #fff\n}\n\n.apexcharts-tooltip.apexcharts-tooltip-fill-series .apexcharts-tooltip-title {\n background: rgba(0, 0, 0, 0.22);\n color: #fff;\n opacity: 1;\n padding: 6px 12px\n}\n\n.apexcharts-tooltip.apexcharts-tooltip-fill-series .apexcharts-tooltip-series-group {\n color: #fff\n}\n\n/* Arrow connector — a 45°-rotated square straddling the body's edge, so\n * the body's 1px border runs continuously out across the arrow and back.\n * The two facets that face away from the tooltip carry the border; the\n * two that face into it carry none, and the square's opaque fill covers\n * the segment of the body's own border it sits on, hiding the seam.\n *\n * This is why it's a rotated square and not a triangle: `clip-path`\n * erases `border` and `box-shadow` along with everything outside the\n * polygon, which left `filter: drop-shadow` as the only way to suggest\n * an edge — and a drop-shadow can only ever blur one, never draw a\n * hairline. Nothing here needs a filter.\n *\n * Geometry: a square of side S rotated 45° reaches S/√2 from its centre\n * to each corner, so S = 10px gives the ~7px tip overhang that\n * ARROW_TIP_OVERHANG assumes (tooltip/constants.js) over a ~14px base.\n * The offsets park the square's *centre* 1px outside the padding box\n * (-6px = -1px border - 10px/2), i.e. exactly on the body's border line,\n * so the two borders meet end to end instead of overlapping or gapping.\n * `box-sizing` must be border-box or the bordered sides would grow the\n * square asymmetrically and knock its centre off that line. */\n.apexcharts-tooltip-arrow {\n position: absolute;\n box-sizing: border-box;\n width: 10px;\n height: 10px;\n background: var(--apx-tt-arrow-bg);\n transform: rotate(45deg);\n pointer-events: none;\n top: calc(var(--apx-tt-arrow-y, 50%) - 5px)\n}\n\n/* Which two sides face outward depends on the placement. Under\n * `rotate(45deg)` the square's bottom-left corner swings to the left,\n * top-right to the right, top-left to the top and bottom-right to the\n * bottom — so the pair of borders below is always the two sharing the\n * corner that ends up as the tip. */\n.apexcharts-tooltip[data-placement=\"right\"] .apexcharts-tooltip-arrow {\n left: -6px;\n border-left: 1px solid var(--apx-tt-border);\n border-bottom: 1px solid var(--apx-tt-border)\n}\n\n.apexcharts-tooltip[data-placement=\"left\"] .apexcharts-tooltip-arrow {\n right: -6px;\n border-top: 1px solid var(--apx-tt-border);\n border-right: 1px solid var(--apx-tt-border)\n}\n\n/* Vertical arrow variants: tooltip is above/below the data point and the\n * arrow points down/up. The base rule above uses `--apx-tt-arrow-y` for\n * left/right placement; for top/bottom we centre on `--apx-tt-arrow-x`\n * instead (set by applyTooltipPosition). */\n.apexcharts-tooltip[data-placement=\"top\"] .apexcharts-tooltip-arrow,\n.apexcharts-tooltip[data-placement=\"bottom\"] .apexcharts-tooltip-arrow {\n top: auto;\n left: calc(var(--apx-tt-arrow-x, 50%) - 5px)\n}\n\n.apexcharts-tooltip[data-placement=\"top\"] .apexcharts-tooltip-arrow {\n bottom: -6px;\n border-right: 1px solid var(--apx-tt-border);\n border-bottom: 1px solid var(--apx-tt-border)\n}\n\n.apexcharts-tooltip[data-placement=\"bottom\"] .apexcharts-tooltip-arrow {\n top: -6px;\n border-top: 1px solid var(--apx-tt-border);\n border-left: 1px solid var(--apx-tt-border)\n}\n\n/* When the tooltip is flipped below the data point, the default\n * downward-biased shadow leaves its top edge undefined. Negating the\n * direction casts the whole elevation upward instead, so the shadow\n * falls between the tooltip and the mark above it. One multiplier flips\n * all three layers together; the arrow needs no counterpart, since its\n * border doesn't depend on light direction. */\n.apexcharts-tooltip[data-placement=\"bottom\"] {\n --apx-tt-shadow-dir: -1\n}\n\n.apexcharts-tooltip-text-goals-value,\n.apexcharts-tooltip-text-y-value,\n.apexcharts-tooltip-text-z-value {\n display: inline-block;\n margin-left: 5px;\n font-weight: 600\n}\n\n.apexcharts-tooltip-text-goals-label:empty,\n.apexcharts-tooltip-text-goals-value:empty,\n.apexcharts-tooltip-text-y-label:empty,\n.apexcharts-tooltip-text-y-value:empty,\n.apexcharts-tooltip-text-z-value:empty,\n.apexcharts-tooltip-title:empty {\n display: none\n}\n\n.apexcharts-tooltip-text-goals-label,\n.apexcharts-tooltip-text-goals-value {\n padding: 6px 0 5px\n}\n\n.apexcharts-tooltip-goals-group,\n.apexcharts-tooltip-text-goals-label,\n.apexcharts-tooltip-text-goals-value {\n display: flex\n}\n\n.apexcharts-tooltip-text-goals-label:not(:empty),\n.apexcharts-tooltip-text-goals-value:not(:empty) {\n margin-top: -6px\n}\n\n.apexcharts-tooltip-marker {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n position: relative;\n width: 12px;\n height: 12px;\n margin-right: 6px;\n vertical-align: middle;\n color: inherit;\n}\n\n.apexcharts-tooltip-marker svg {\n width: 100%;\n height: 100%;\n display: block;\n}\n\n.apexcharts-tooltip-series-group {\n padding: 4px 12px;\n display: none;\n gap: 8px;\n text-align: left;\n justify-content: left;\n align-items: center\n}\n\n.apexcharts-tooltip-series-group.apexcharts-active .apexcharts-tooltip-marker {\n opacity: 1\n}\n\n.apexcharts-tooltip-series-group.apexcharts-active:last-child,\n.apexcharts-tooltip-series-group:last-child {\n padding-bottom: 8px\n}\n\n.apexcharts-tooltip-y-group {\n padding: 6px 0 5px\n}\n\n/* `tooltip.compact`: a tight box instead of a card, for panels a normal card\n would cover (small multiples, sparklines, tiles). Only the box shrinks, so\n the arrow and every anchor rule still apply. Rows stay stacked when there\n are several series (the names are what tells them apart); a one-series\n chart collapses to a single line, see `-value-only` below. */\n.apexcharts-tooltip.apexcharts-tooltip-compact {\n padding: 3px 8px;\n font-size: 11px;\n line-height: 1.35\n}\n\n.apexcharts-tooltip-compact .apexcharts-tooltip-title {\n padding: 0;\n font-size: 11px;\n white-space: nowrap\n}\n\n.apexcharts-tooltip-compact .apexcharts-tooltip-series-group,\n.apexcharts-tooltip-compact .apexcharts-tooltip-series-group.apexcharts-active:last-child,\n.apexcharts-tooltip-compact .apexcharts-tooltip-series-group:last-child {\n padding: 0;\n gap: 5px\n}\n\n.apexcharts-tooltip-compact .apexcharts-tooltip-y-group {\n padding: 0\n}\n\n.apexcharts-tooltip-compact .apexcharts-tooltip-marker {\n width: 8px;\n height: 8px\n}\n\n/* A one-series panel: the series name repeats what the panel header already\n says, so the value stands alone and the x label becomes its prefix on one\n line (\"Aug 2024 6.59\"). */\n.apexcharts-tooltip.apexcharts-tooltip-compact.apexcharts-tooltip-value-only {\n /* The tooltip body is a flex COLUMN by default (title row, then series\n rows); one series needs no column, so the same box turns into one line. */\n flex-direction: row;\n align-items: baseline;\n gap: 6px\n}\n\n.apexcharts-tooltip-value-only .apexcharts-tooltip-marker {\n display: none\n}\n\n.apexcharts-tooltip-value-only .apexcharts-tooltip-text-y-label {\n display: none\n}\n\n.apexcharts-custom-tooltip,\n.apexcharts-tooltip-box {\n padding: 4px 8px\n}\n\n.apexcharts-tooltip-boxPlot {\n display: flex;\n flex-direction: column-reverse\n}\n\n.apexcharts-tooltip-box>div {\n margin: 4px 0\n}\n\n.apexcharts-tooltip-box span.value {\n font-weight: 700\n}\n\n.apexcharts-tooltip-rangebar {\n padding: 5px 8px\n}\n\n.apexcharts-tooltip-rangebar .category {\n font-weight: 600;\n color: #777\n}\n\n.apexcharts-tooltip-rangebar .series-name {\n font-weight: 700;\n display: block;\n margin-bottom: 5px\n}\n\n/* Streamgraph: every band read out at one column, top-down in stacking order.\n * A row per band rather than the shared tooltip's list, because a streamgraph's\n * `[lo, hi]` are stacking offsets and the values the reader gave live on\n * w.streamgraphData. */\n.apexcharts-tooltip-stream {\n padding: 5px 8px\n}\n\n.apexcharts-tooltip-stream .apexcharts-tooltip-title {\n background: transparent;\n border: 0;\n padding: 0 0 4px;\n margin: 0;\n font-weight: 700\n}\n\n.apexcharts-tooltip-stream-band {\n display: flex;\n align-items: center;\n gap: 5px;\n line-height: 1.6;\n opacity: .72\n}\n\n.apexcharts-tooltip-stream-band.apexcharts-active {\n opacity: 1;\n font-weight: 700\n}\n\n.apexcharts-tooltip-stream-band .series-name {\n flex: 1 1 auto;\n margin-right: 8px\n}\n\n.apexcharts-tooltip-stream-band .value {\n font-weight: 700;\n margin-left: auto\n}\n\n.apexcharts-tooltip-stream-total {\n display: flex;\n align-items: center;\n margin-top: 4px;\n padding-top: 4px;\n border-top: 1px solid var(--apx-tt-border, rgba(15, 23, 42, .12))\n}\n\n.apexcharts-tooltip-stream-total .series-name {\n flex: 1 1 auto;\n font-weight: 600\n}\n\n.apexcharts-tooltip-stream-total .value {\n font-weight: 700;\n margin-left: auto\n}\n\n/* The band labels themselves. Pointer events off so a name never blocks a\n * hover on the band it sits on. */\n.apexcharts-streamgraph-label {\n pointer-events: none\n}\n\n/* X/Y axis tooltips — small popovers that label the crosshair on the\n * axes. Restyled to match the modern data-tooltip palette: solid white\n * body with a subtle border + soft drop-shadow, smaller font, rounded\n * corners. The arrows still use the CSS border-triangle technique\n * (cheap, crisp at small sizes); their colours flow from CSS variables\n * so light/dark themes only need one override per axis. */\n.apexcharts-xaxistooltip,\n.apexcharts-yaxistooltip {\n --apx-axt-bg: #ffffff;\n --apx-axt-border: rgba(15, 23, 42, 0.08);\n --apx-axt-color: #0f172a;\n --apx-axt-shadow: 0 4px 12px -4px rgba(15, 23, 42, 0.18), 0 1px 3px -1px rgba(15, 23, 42, 0.12);\n opacity: 0;\n pointer-events: none;\n color: var(--apx-axt-color);\n font-size: 12px;\n font-weight: 500;\n text-align: center;\n border-radius: 6px;\n position: absolute;\n z-index: 10;\n background: var(--apx-axt-bg);\n border: 1px solid var(--apx-axt-border);\n box-shadow: var(--apx-axt-shadow)\n}\n\n.apexcharts-xaxistooltip.apexcharts-theme-dark,\n.apexcharts-yaxistooltip.apexcharts-theme-dark {\n --apx-axt-bg: #1c1c1f;\n --apx-axt-border: rgba(255, 255, 255, 0.1);\n --apx-axt-color: #f3f4f6;\n --apx-axt-shadow: 0 4px 12px -4px rgba(0, 0, 0, 0.55), 0 1px 3px -1px rgba(0, 0, 0, 0.45)\n}\n\n.apexcharts-xaxistooltip {\n padding: 4px 8px;\n transition: .15s ease all\n}\n\n.apexcharts-xaxistooltip:after,\n.apexcharts-xaxistooltip:before {\n left: 50%;\n border: solid transparent;\n content: \" \";\n height: 0;\n width: 0;\n position: absolute;\n pointer-events: none\n}\n\n/* :before paints the 1px border outline of the triangle (slightly larger\n * than :after); :after sits inside and paints the fill — leaves a 1px\n * ring of :before visible at the edges. */\n.apexcharts-xaxistooltip:after {\n border-color: transparent;\n border-width: 5px;\n margin-left: -5px\n}\n\n.apexcharts-xaxistooltip:before {\n border-color: transparent;\n border-width: 6px;\n margin-left: -6px\n}\n\n.apexcharts-xaxistooltip-bottom:after,\n.apexcharts-xaxistooltip-bottom:before {\n bottom: 100%\n}\n\n.apexcharts-xaxistooltip-top:after,\n.apexcharts-xaxistooltip-top:before {\n top: 100%\n}\n\n.apexcharts-xaxistooltip-bottom:after {\n border-bottom-color: var(--apx-axt-bg)\n}\n\n.apexcharts-xaxistooltip-bottom:before {\n border-bottom-color: var(--apx-axt-border)\n}\n\n.apexcharts-xaxistooltip-top:after {\n border-top-color: var(--apx-axt-bg)\n}\n\n.apexcharts-xaxistooltip-top:before {\n border-top-color: var(--apx-axt-border)\n}\n\n.apexcharts-xaxistooltip.apexcharts-active {\n opacity: 1;\n transition: .15s ease all\n}\n\n.apexcharts-yaxistooltip {\n padding: 3px 8px\n}\n\n.apexcharts-yaxistooltip:after,\n.apexcharts-yaxistooltip:before {\n top: 50%;\n border: solid transparent;\n content: \" \";\n height: 0;\n width: 0;\n position: absolute;\n pointer-events: none\n}\n\n.apexcharts-yaxistooltip:after {\n border-color: transparent;\n border-width: 5px;\n margin-top: -5px\n}\n\n.apexcharts-yaxistooltip:before {\n border-color: transparent;\n border-width: 6px;\n margin-top: -6px\n}\n\n.apexcharts-yaxistooltip-left:after,\n.apexcharts-yaxistooltip-left:before {\n left: 100%\n}\n\n.apexcharts-yaxistooltip-right:after,\n.apexcharts-yaxistooltip-right:before {\n right: 100%\n}\n\n.apexcharts-yaxistooltip-left:after {\n border-left-color: var(--apx-axt-bg)\n}\n\n.apexcharts-yaxistooltip-left:before {\n border-left-color: var(--apx-axt-border)\n}\n\n.apexcharts-yaxistooltip-right:after {\n border-right-color: var(--apx-axt-bg)\n}\n\n.apexcharts-yaxistooltip-right:before {\n border-right-color: var(--apx-axt-border)\n}\n\n.apexcharts-yaxistooltip.apexcharts-active {\n opacity: 1\n}\n\n.apexcharts-yaxistooltip-hidden {\n display: none\n}\n\n.apexcharts-xcrosshairs,\n.apexcharts-ycrosshairs {\n pointer-events: none;\n opacity: 0;\n transition: .15s ease all\n}\n\n.apexcharts-xcrosshairs.apexcharts-active,\n.apexcharts-ycrosshairs.apexcharts-active {\n opacity: 1;\n transition: .15s ease all\n}\n\n.apexcharts-ycrosshairs-hidden {\n opacity: 0\n}\n\n.apexcharts-selection-rect {\n cursor: move\n}\n\n.svg_select_shape {\n stroke-width: 1;\n stroke-dasharray: 10 10;\n stroke: black;\n stroke-opacity: 0.1;\n pointer-events: none;\n fill: none;\n}\n\n.svg_select_handle {\n stroke-width: 3;\n stroke: black;\n fill: none;\n}\n\n.svg_select_handle_r {\n cursor: e-resize;\n}\n\n.svg_select_handle_l {\n cursor: w-resize;\n}\n\n.apexcharts-svg.apexcharts-zoomable.hovering-zoom {\n cursor: crosshair\n}\n\n.apexcharts-svg.apexcharts-zoomable.hovering-pan {\n cursor: move\n}\n\n.apexcharts-menu-icon,\n.apexcharts-measure-icon,\n.apexcharts-pan-icon,\n.apexcharts-reset-icon,\n.apexcharts-selection-icon,\n.apexcharts-toolbar-custom-icon,\n.apexcharts-zoom-icon,\n.apexcharts-zoomin-icon,\n.apexcharts-zoomout-icon {\n cursor: pointer;\n /* WCAG 2.5.8 Target Size (Minimum): 24×24 CSS px hit target. */\n width: 26px;\n height: 24px;\n line-height: 24px;\n color: #6e8192;\n text-align: center;\n /* Reset native <button> chrome — these are styled via SVG icons. */\n padding: 0;\n margin: 0;\n background: transparent;\n border: 0;\n border-radius: 5px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transition: background-color .12s ease, color .12s ease;\n}\n\n.apexcharts-menu-icon svg,\n.apexcharts-measure-icon svg,\n.apexcharts-pan-icon svg,\n.apexcharts-reset-icon svg,\n.apexcharts-selection-icon svg,\n.apexcharts-zoom-icon svg,\n.apexcharts-zoomin-icon svg,\n.apexcharts-zoomout-icon svg {\n width: 18px;\n height: 18px;\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n stroke-linejoin: round\n}\n\n.apexcharts-theme-dark .apexcharts-menu-icon,\n.apexcharts-theme-dark .apexcharts-measure-icon,\n.apexcharts-theme-dark .apexcharts-pan-icon,\n.apexcharts-theme-dark .apexcharts-reset-icon,\n.apexcharts-theme-dark .apexcharts-selection-icon,\n.apexcharts-theme-dark .apexcharts-toolbar-custom-icon,\n.apexcharts-theme-dark .apexcharts-zoom-icon,\n.apexcharts-theme-dark .apexcharts-zoomin-icon,\n.apexcharts-theme-dark .apexcharts-zoomout-icon {\n color: #d4d6dc\n}\n\n.apexcharts-canvas .apexcharts-measure-icon.apexcharts-selected,\n.apexcharts-canvas .apexcharts-pan-icon.apexcharts-selected,\n.apexcharts-canvas .apexcharts-reset-zoom-icon.apexcharts-selected,\n.apexcharts-canvas .apexcharts-selection-icon.apexcharts-selected,\n.apexcharts-canvas .apexcharts-zoom-icon.apexcharts-selected {\n background: rgba(0, 143, 251, 0.12);\n color: #008ffb\n}\n\n.apexcharts-theme-light .apexcharts-menu-icon:hover,\n.apexcharts-theme-light .apexcharts-measure-icon:not(.apexcharts-selected):hover,\n.apexcharts-theme-light .apexcharts-pan-icon:not(.apexcharts-selected):hover,\n.apexcharts-theme-light .apexcharts-reset-icon:hover,\n.apexcharts-theme-light .apexcharts-selection-icon:not(.apexcharts-selected):hover,\n.apexcharts-theme-light .apexcharts-zoom-icon:not(.apexcharts-selected):hover,\n.apexcharts-theme-light .apexcharts-zoomin-icon:hover,\n.apexcharts-theme-light .apexcharts-zoomout-icon:hover {\n background: rgba(15, 23, 42, 0.06);\n color: #1f2937\n}\n\n.apexcharts-theme-dark .apexcharts-menu-icon:hover,\n.apexcharts-theme-dark .apexcharts-measure-icon:not(.apexcharts-selected):hover,\n.apexcharts-theme-dark .apexcharts-pan-icon:not(.apexcharts-selected):hover,\n.apexcharts-theme-dark .apexcharts-reset-icon:hover,\n.apexcharts-theme-dark .apexcharts-selection-icon:not(.apexcharts-selected):hover,\n.apexcharts-theme-dark .apexcharts-zoom-icon:not(.apexcharts-selected):hover,\n.apexcharts-theme-dark .apexcharts-zoomin-icon:hover,\n.apexcharts-theme-dark .apexcharts-zoomout-icon:hover {\n background: rgba(255, 255, 255, 0.08);\n color: #fff\n}\n\n.apexcharts-menu-icon,\n.apexcharts-selection-icon {\n position: relative\n}\n\n.apexcharts-toolbar {\n position: absolute;\n z-index: 11;\n display: inline-flex;\n align-items: center;\n gap: 1px;\n padding: 3px;\n border-radius: 8px;\n background: rgba(255, 255, 255, 0.85);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n}\n\n.apexcharts-theme-dark .apexcharts-toolbar {\n background: rgba(28, 28, 31, 0.82);\n}\n\n.apexcharts-menu {\n background: rgba(255, 255, 255, 0.95);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n position: absolute;\n top: calc(100% + 4px);\n border: 1px solid rgba(15, 23, 42, 0.08);\n border-radius: 8px;\n padding: 4px;\n right: 0;\n opacity: 0;\n min-width: 120px;\n transition: opacity .15s ease, transform .15s ease;\n transform: translateY(-2px);\n pointer-events: none;\n box-shadow: 0 4px 16px -4px rgba(15, 23, 42, 0.12), 0 2px 4px -1px rgba(15, 23, 42, 0.06)\n}\n\n.apexcharts-menu.apexcharts-menu-open {\n opacity: 1;\n transform: translateY(0);\n pointer-events: all\n}\n\n.apexcharts-menu-item {\n padding: 6px 9px;\n font-size: 12px;\n border-radius: 5px;\n cursor: pointer\n}\n\n.apexcharts-theme-light .apexcharts-menu-item:hover {\n background: rgba(15, 23, 42, 0.06)\n}\n\n.apexcharts-theme-dark .apexcharts-menu {\n background: rgba(28, 28, 31, 0.92);\n border-color: rgba(255, 255, 255, 0.08);\n color: #f3f4f6;\n box-shadow: 0 4px 16px -4px rgba(0, 0, 0, 0.5), 0 2px 4px -1px rgba(0, 0, 0, 0.4)\n}\n\n.apexcharts-theme-dark .apexcharts-menu-item:hover {\n background: rgba(255, 255, 255, 0.08)\n}\n\n@media screen and (min-width:768px) {\n .apexcharts-canvas:hover .apexcharts-toolbar {\n opacity: 1\n }\n}\n\n/* Toolbar keyboard accessibility: show toolbar when any button inside it is focused */\n.apexcharts-toolbar:focus-within {\n opacity: 1\n}\n\n/* Focus indicator for toolbar icon buttons */\n.apexcharts-menu-icon:focus-visible,\n.apexcharts-measure-icon:focus-visible,\n.apexcharts-pan-icon:focus-visible,\n.apexcharts-reset-icon:focus-visible,\n.apexcharts-selection-icon:focus-visible,\n.apexcharts-toolbar-custom-icon:focus-visible,\n.apexcharts-zoom-icon:focus-visible,\n.apexcharts-zoomin-icon:focus-visible,\n.apexcharts-zoomout-icon:focus-visible {\n outline: 2px solid var(--apexcharts-focus-color, #008FFB);\n outline-offset: 1px;\n border-radius: 5px\n}\n\n/* Focus indicator for hamburger menu items */\n.apexcharts-menu-item:focus-visible {\n outline: 2px solid var(--apexcharts-focus-color, #008FFB);\n outline-offset: -2px;\n background: #eee\n}\n\n.apexcharts-canvas .apexcharts-element-hidden,\n.apexcharts-datalabel.apexcharts-element-hidden,\n.apexcharts-hide .apexcharts-series-points {\n opacity: 0;\n}\n\n.apexcharts-hidden-element-shown {\n opacity: 1;\n transition: 0.25s ease all;\n}\n\n.apexcharts-datalabel,\n.apexcharts-datalabel-label,\n.apexcharts-datalabel-value,\n.apexcharts-datalabels,\n.apexcharts-pie-label,\n.apexcharts-pie-name-label,\n.apexcharts-pie-name-label-group,\n.apexcharts-pie-label-connector,\n.apexcharts-unit-outer-label,\n.apexcharts-unit-outer-label-group,\n.apexcharts-unit-label-connector {\n cursor: default;\n pointer-events: none\n}\n\n.apexcharts-pie-label-connector,\n.apexcharts-unit-label-connector {\n fill: none\n}\n\n.apexcharts-pie-label-delay,\n.apexcharts-unit-label-delay {\n opacity: 0;\n animation-name: opaque;\n animation-duration: .3s;\n animation-fill-mode: forwards;\n animation-timing-function: ease\n}\n\n/* Slower than the pie's, on purpose: these come in while the dots are still\n easing into place, so a longer fade reads as arriving WITH the crowd. */\n.apexcharts-unit-label-delay {\n animation-duration: .5s\n}\n\n.apexcharts-radialbar-label {\n cursor: pointer;\n}\n\n.apexcharts-annotation-rect,\n.apexcharts-area-series .apexcharts-area,\n.apexcharts-gridline,\n.apexcharts-line,\n.apexcharts-point-annotation-label,\n.apexcharts-radar-series path:not(.apexcharts-marker),\n.apexcharts-radar-series polygon,\n.apexcharts-toolbar svg,\n.apexcharts-tooltip .apexcharts-marker,\n.apexcharts-xaxis-annotation-label,\n.apexcharts-yaxis-annotation-label,\n.apexcharts-zoom-rect,\n.no-pointer-events {\n pointer-events: none\n}\n\n.apexcharts-tooltip-active .apexcharts-marker {\n transition: .15s ease all\n}\n\n.apexcharts-radar-series .apexcharts-yaxis {\n pointer-events: none;\n}\n\n.resize-triggers {\n animation: 1ms resizeanim;\n visibility: hidden;\n opacity: 0;\n height: 100%;\n width: 100%;\n overflow: hidden\n}\n\n.contract-trigger:before,\n.resize-triggers,\n.resize-triggers>div {\n content: \" \";\n display: block;\n position: absolute;\n top: 0;\n left: 0\n}\n\n.resize-triggers>div {\n height: 100%;\n width: 100%;\n background: #eee;\n overflow: auto\n}\n\n.contract-trigger:before {\n overflow: hidden;\n width: 200%;\n height: 200%\n}\n\n.apexcharts-bar-goals-markers {\n pointer-events: none\n}\n\n.apexcharts-bar-shadows {\n pointer-events: none\n}\n\n.apexcharts-rangebar-goals-markers {\n pointer-events: none\n}\n\n.apexcharts-drilldown-target {\n cursor: pointer\n}\n\n.apexcharts-breadcrumb {\n position: absolute;\n z-index: 11;\n display: inline-flex;\n align-items: center;\n gap: 2px;\n font-size: 12px;\n font-family: inherit;\n padding: 2px 4px\n}\n\n.apexcharts-breadcrumb-item {\n background: transparent;\n border: none;\n padding: 2px 6px;\n border-radius: 3px;\n font: inherit;\n color: inherit;\n cursor: pointer;\n line-height: 1.2\n}\n\n.apexcharts-breadcrumb-item:hover:not(.apexcharts-breadcrumb-current) {\n background: rgba(0, 0, 0, 0.08)\n}\n\n.apexcharts-breadcrumb-arrow {\n margin-right: 4px;\n font-weight: 600;\n user-select: none\n}\n\n.apexcharts-breadcrumb-current {\n cursor: default;\n font-weight: 600;\n opacity: 0.85\n}\n\n.apexcharts-breadcrumb-separator {\n opacity: 0.5;\n user-select: none\n}\n\n.apexcharts-theme-dark .apexcharts-breadcrumb-item:hover:not(.apexcharts-breadcrumb-current) {\n background: rgba(255, 255, 255, 0.12)\n}\n\n.apexcharts-drilldown-loading {\n position: absolute;\n inset: 0;\n z-index: 12;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n font-size: 13px;\n font-family: inherit;\n color: inherit;\n background: rgba(255, 255, 255, 0.62);\n /* The chart underneath stays interactive-looking but must not take clicks\n while a level is resolving, or a second drill can start mid-fetch. */\n cursor: progress\n}\n\n.apexcharts-drilldown-loading-spinner {\n width: 26px;\n height: 26px;\n border-radius: 50%;\n border: 2.5px solid rgba(0, 0, 0, 0.16);\n border-top-color: rgba(0, 0, 0, 0.55);\n animation: apexcharts-drilldown-spin 0.7s linear infinite\n}\n\n.apexcharts-drilldown-loading-text {\n opacity: 0.8\n}\n\n.apexcharts-theme-dark .apexcharts-drilldown-loading {\n background: rgba(30, 30, 30, 0.62)\n}\n\n.apexcharts-theme-dark .apexcharts-drilldown-loading-spinner {\n border-color: rgba(255, 255, 255, 0.22);\n border-top-color: rgba(255, 255, 255, 0.7)\n}\n\n@keyframes apexcharts-drilldown-spin {\n to {\n transform: rotate(360deg)\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .apexcharts-drilldown-loading-spinner {\n animation: apexcharts-drilldown-pulse 1.4s ease-in-out infinite\n }\n\n @keyframes apexcharts-drilldown-pulse {\n 0%, 100% {\n opacity: 0.35\n }\n\n 50% {\n opacity: 1\n }\n }\n}\n\n.apexcharts-disable-transitions * {\n transition: none !important;\n}\n/* ── Trellis (#22): small multiples ─────────────────────────────────────── */\n.apexcharts-trellis {\n position: relative;\n}\n.apexcharts-trellis-grid {\n display: grid;\n}\n.apexcharts-trellis-cell {\n min-width: 0;\n position: relative;\n}\n.apexcharts-trellis-header {\n font-size: 12px;\n font-weight: 600;\n line-height: 22px;\n height: 22px;\n text-align: center;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--apx-fore, #373d3f);\n}\n.apexcharts-trellis-title {\n font-size: 14px;\n font-weight: 700;\n padding: 2px 0 6px;\n color: var(--apx-fore, #373d3f);\n}\n/* Edge-label policy: a muted cell hides its axis-label INK, never the label\n SPACE — every panel keeps the identical plot rectangle, and flipping the\n policy on a resize is a class toggle, not a re-render. */\n.apexcharts-trellis-mute-y .apexcharts-yaxis {\n opacity: 0;\n}\n.apexcharts-trellis-mute-x .apexcharts-xaxis {\n opacity: 0;\n}\n/* The shared toolbar floats at the top-right, so a grid that has one starts\n below it: from four columns on, the last cell's header (or a 2-D column\n strip label) would otherwise run under the buttons. One band for the whole\n grid, not per panel. */\n.apexcharts-trellis-has-toolbar {\n padding-top: 24px;\n}\n/* 2-D faceting (P4): column labels once across the top, row labels once\n down the left. The row strip column is auto-sized; panel columns stay\n equal fractions, so panel alignment is independent of the strip width. */\n.apexcharts-trellis-strip {\n font-size: 12px;\n font-weight: 600;\n color: var(--apx-fore, #373d3f);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.apexcharts-trellis-strip-column {\n text-align: center;\n line-height: 22px;\n height: 22px;\n align-self: end;\n}\n.apexcharts-trellis-strip-row {\n align-self: center;\n max-width: 140px;\n padding-right: 6px;\n}\n/* Empty (row, column) combinations. 'placeholder' keeps a REAL panel with a\n quiet label; 'skip' shows the tinted skeleton; 'hide' shows nothing while\n keeping the grid slot. */\n.apexcharts-trellis-cell-empty {\n position: relative;\n}\n.apexcharts-trellis-empty-label {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n color: var(--apx-fore, #373d3f);\n opacity: 0.45;\n pointer-events: none;\n}\n.apexcharts-trellis-cell-hidden > * {\n visibility: hidden;\n}\n/* P5: one shared gradient strip is a heatmap grid's legend. The slot is\n content-sized inline (the strip svg's own box); centering is its own. */\n.apexcharts-trellis-gradient-legend {\n margin: 10px auto 0;\n}\n/* Virtualization (P2): an unmounted panel's mount div reserves the exact\n panel height (inline min-height) so page height and scroll position never\n shift; the skeleton itself is a quiet tinted block. Deliberately not\n animated: a shimmering grid of 200 placeholders is noise. */\n.apexcharts-trellis-panel.apexcharts-trellis-skeleton {\n background: var(--apx-fore, #373d3f);\n opacity: 0.05;\n border-radius: 4px;\n}\n/* tooltip: 'panel' — the group still syncs every panel's crosshair, but only\n the hovered cell shows its tooltip cards. */\n.apexcharts-trellis[data-tooltip-mode='panel'] .apexcharts-trellis-cell:not(:hover) .apexcharts-tooltip,\n.apexcharts-trellis[data-tooltip-mode='panel'] .apexcharts-trellis-cell:not(:hover) .apexcharts-xaxistooltip,\n.apexcharts-trellis[data-tooltip-mode='panel'] .apexcharts-trellis-cell:not(:hover) .apexcharts-yaxistooltip {\n opacity: 0 !important;\n}\n/* tooltip: 'grid' (P3) — ALL per-panel tooltip ink is hidden (the group\n still computes it; the trellis card reads it) and one trellis-owned card\n follows the cursor with one row per panel. */\n.apexcharts-trellis[data-tooltip-mode='grid'] .apexcharts-trellis-cell .apexcharts-tooltip,\n.apexcharts-trellis[data-tooltip-mode='grid'] .apexcharts-trellis-cell .apexcharts-xaxistooltip,\n.apexcharts-trellis[data-tooltip-mode='grid'] .apexcharts-trellis-cell .apexcharts-yaxistooltip {\n opacity: 0 !important;\n}\n.apexcharts-trellis-tooltip {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 14;\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.1s ease;\n background: var(--apx-bg, #fff);\n color: var(--apx-fore, #373d3f);\n border: 1px solid rgba(120, 120, 120, 0.25);\n border-radius: 5px;\n box-shadow: 2px 2px 6px -4px rgba(0, 0, 0, 0.4);\n font-size: 12px;\n min-width: 140px;\n max-width: 320px;\n}\n.apexcharts-trellis-tooltip-active {\n opacity: 1;\n}\n.apexcharts-trellis-tooltip .apexcharts-tooltip-title {\n padding: 5px 10px;\n font-weight: 600;\n background: rgba(120, 120, 120, 0.08);\n border-bottom: 1px solid rgba(120, 120, 120, 0.18);\n margin-bottom: 2px;\n}\n.apexcharts-trellis-tooltip-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 14px;\n padding: 2px 10px;\n line-height: 1.6;\n}\n.apexcharts-trellis-tooltip-row-active {\n background: rgba(120, 120, 120, 0.1);\n font-weight: 600;\n}\n.apexcharts-trellis-tooltip-key {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.apexcharts-trellis-tooltip-vals {\n display: flex;\n gap: 10px;\n white-space: nowrap;\n}\n.apexcharts-trellis-tooltip-val {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n}\n.apexcharts-trellis-tooltip-marker {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n display: inline-block;\n flex: none;\n}\n/* Panel promotion (P3): the promoted cell spans the grid; the rest park.\n The promoted panel is the only visible one, so both its axes unmute. */\n.apexcharts-trellis-cell-promoted {\n grid-column: 1 / -1;\n}\n.apexcharts-trellis-cell-parked {\n display: none;\n}\n.apexcharts-trellis-cell-promoted.apexcharts-trellis-mute-y .apexcharts-yaxis,\n.apexcharts-trellis-cell-promoted.apexcharts-trellis-mute-x .apexcharts-xaxis {\n opacity: 1;\n}\n.apexcharts-trellis-header-clickable {\n cursor: pointer;\n}\n.apexcharts-trellis-header-clickable:hover {\n text-decoration: underline;\n text-underline-offset: 3px;\n}\n.apexcharts-trellis-breadcrumb {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n padding: 2px 0 6px;\n color: var(--apx-fore, #373d3f);\n}\n.apexcharts-trellis-breadcrumb-back {\n border: none;\n background: none;\n padding: 0;\n font-size: 12px;\n cursor: pointer;\n color: var(--apx-accent, #008ffb);\n}\n.apexcharts-trellis-breadcrumb-back:hover {\n text-decoration: underline;\n}\n.apexcharts-trellis-breadcrumb-sep {\n opacity: 0.5;\n}\n.apexcharts-trellis-breadcrumb-current {\n font-weight: 600;\n}\n/* The toolbar download menu (P3). */\n.apexcharts-trellis-menu {\n position: absolute;\n top: 26px;\n right: 0;\n display: none;\n flex-direction: column;\n min-width: 132px;\n background: var(--apx-bg, #fff);\n border: 1px solid rgba(120, 120, 120, 0.25);\n border-radius: 5px;\n box-shadow: 2px 2px 6px -4px rgba(0, 0, 0, 0.4);\n padding: 4px;\n z-index: 15;\n}\n.apexcharts-trellis-menu-open {\n display: flex;\n}\n.apexcharts-trellis-menu-item {\n border: none;\n background: none;\n text-align: left;\n font-size: 12px;\n padding: 5px 8px;\n border-radius: 3px;\n cursor: pointer;\n color: var(--apx-fore, #373d3f);\n}\n.apexcharts-trellis-menu-item:hover {\n background: rgba(120, 120, 120, 0.12);\n}\n.apexcharts-trellis-toolbar {\n position: absolute;\n top: 0;\n right: 0;\n display: flex;\n gap: 2px;\n z-index: 12;\n}\n.apexcharts-trellis-tool {\n border: 0;\n background: transparent;\n padding: 2px;\n cursor: pointer;\n border-radius: 3px;\n color: #6e8192;\n line-height: 0;\n}\n.apexcharts-trellis-tool:hover {\n color: var(--apx-fore, #373d3f);\n}\n.apexcharts-trellis-tool.apexcharts-selected {\n color: var(--apx-accent, #008ffb);\n}\n.apexcharts-trellis-legend {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 4px 14px;\n padding: 8px 10px 2px;\n}\n.apexcharts-trellis-legend-item {\n display: flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n line-height: 1;\n}\n.apexcharts-trellis-legend-item .apexcharts-legend-marker {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n display: inline-block;\n}\n.apexcharts-trellis-legend-item .apexcharts-legend-text {\n font-size: 12px;\n color: var(--apx-fore, #373d3f);\n}\n.apexcharts-trellis-legend-item.apexcharts-inactive-legend {\n opacity: 0.45;\n}\n\n/* Printing (#3352). The sheet is narrower than the screen and nothing reports\n its width to the page, so a chart laid out for the screen would be cropped at\n the edge of the paper. The chart lays itself out again for print (see\n chart.print in the options); this caps whatever is left over so it shrinks to\n fit rather than being cut. Shrink only: a chart narrower than the page keeps\n the size it was drawn at. */\n@media print {\n /* Scoped to the class the chart adds while it is laid out for the sheet: this\n pair of rules is only safe once an identity viewBox is in place, since\n without one a capped width crops the drawing instead of scaling it. A chart\n with chart.print.enabled:false gets neither, and prints as it always did. */\n .apexcharts-canvas.apexcharts-printing,\n .apexcharts-canvas.apexcharts-printing svg {\n max-width: 100% !important;\n }\n\n .apexcharts-canvas.apexcharts-printing svg {\n height: auto !important;\n }\n\n /* A scaled-down SVG is shorter than the box drawn for it, and the wrapper\n carries the pre-scale height inline, so without this a chart shrunk to fit a\n narrow column prints above a white gap the size of what it gave up. The\n host element's own inline min-height is cleared by _beforePrint. */\n .apexcharts-canvas.apexcharts-printing {\n height: auto !important;\n }\n\n .apexcharts-toolbar {\n display: none !important;\n }\n}\n";
28860
+ const apexCSS = "@keyframes opaque {\n 0% {\n opacity: 0\n }\n\n to {\n opacity: 1\n }\n}\n\n.apexcharts-canvas {\n position: relative;\n direction: ltr !important;\n user-select: none;\n /* Focus indicator colour. Themes override below. */\n --apexcharts-focus-color: #008FFB;\n}\n\n/* Dark theme & high-contrast: brighter focus colour for sufficient contrast. */\n.apexcharts-canvas .apexcharts-theme-dark,\n.apexcharts-theme-dark.apexcharts-canvas {\n --apexcharts-focus-color: #FFD500;\n}\n.apexcharts-canvas.apexcharts-high-contrast,\n.apexcharts-high-contrast.apexcharts-canvas {\n --apexcharts-focus-color: #FFFF00;\n}\n\n/* Visually-hidden aria-live status region (WCAG 4.1.3 Status Messages). */\n.apexcharts-sr-status {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n/* Respect OS-level reduced-motion preference (WCAG 2.3.3).\n *\n * Scoped with :not() so chart.animations.respectReducedMotion:false opts a\n * chart out of the CSS policy as well as the JS one (Core.setupElements puts\n * the class on the canvas). Without the scope the flag only half worked: it\n * turned the JS tweens back on but could not reach a stylesheet, so everything\n * CSS-driven, the pie slice-offset slide, the drilldown spinner, the tooltip\n * and crosshair fades, stayed frozen with no way out short of out-specifying\n * an !important rule from the page. */\n@media (prefers-reduced-motion: reduce) {\n .apexcharts-canvas:not(.apexcharts-ignore-reduced-motion) *,\n .apexcharts-canvas:not(.apexcharts-ignore-reduced-motion) *::before,\n .apexcharts-canvas:not(.apexcharts-ignore-reduced-motion) *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n }\n}\n\n.apexcharts-canvas ::-webkit-scrollbar {\n -webkit-appearance: none;\n width: 6px\n}\n\n.apexcharts-canvas ::-webkit-scrollbar-thumb {\n border-radius: 4px;\n background-color: rgba(0, 0, 0, .5);\n box-shadow: 0 0 1px rgba(255, 255, 255, .5);\n -webkit-box-shadow: 0 0 1px rgba(255, 255, 255, .5)\n}\n\n.apexcharts-inner {\n position: relative\n}\n\n.apexcharts-text tspan {\n font-family: inherit\n}\n\nrect.legend-mouseover-inactive,\n.legend-mouseover-inactive rect,\n.legend-mouseover-inactive path,\n.legend-mouseover-inactive circle,\n.legend-mouseover-inactive line,\n.legend-mouseover-inactive text.apexcharts-yaxis-title-text,\n.legend-mouseover-inactive text.apexcharts-yaxis-label {\n transition: .15s ease all;\n opacity: .2\n}\n\n/* Linked Views (#4): per-mark crossfilter dim. Applied to individual data\n marks (not whole series) whose x is outside the brushed range. Opacity is\n overridable per chart via the --apx-cf-dim custom property. */\n.apexcharts-crossfilter-dimmed {\n transition: opacity .25s ease;\n opacity: var(--apx-cf-dim, .2)\n}\n\n/* Linked Views (#4): default styling for the built-in crossfilter data table\n (cf.dataTable). Deliberately light so host styles can override. */\n.apexcharts-cf-table {\n border-collapse: collapse;\n width: 100%;\n font-size: 13px;\n}\n.apexcharts-cf-table caption {\n caption-side: bottom;\n text-align: right;\n padding: 6px 2px;\n font-size: 12px;\n opacity: .7\n}\n.apexcharts-cf-table th,\n.apexcharts-cf-table td {\n padding: 6px 10px;\n text-align: left;\n border-bottom: 1px solid rgba(0, 0, 0, .08)\n}\n.apexcharts-cf-table th {\n font-weight: 600;\n border-bottom-width: 2px\n}\n.apexcharts-cf-table tbody tr:hover {\n background: rgba(99, 102, 241, .06)\n}\n\n/* Measure ruler (#18): measure / delta ruler.\n Theme via these classes or the --apx-measure-* custom properties below\n (config `chart.measure.colors` overrides both). The ruler group also carries\n a direction class: apexcharts-measure-up | -down | -flat.\n Element classes:\n .apexcharts-measure-band shaded span band\n .apexcharts-measure-vline vertical guide lines\n .apexcharts-measure-line free-mode diagonal line\n .apexcharts-measure-label-bg readout box .apexcharts-measure-label text\n Colors are applied as SVG presentation attributes, so any rule you write on\n these classes overrides them. */\n.apexcharts-canvas {\n --apx-measure-up: #16a34a;\n --apx-measure-down: #dc2626;\n --apx-measure-neutral: #64748b;\n --apx-measure-guide: #94a3b8;\n}\n.apexcharts-measure-capture {\n cursor: crosshair;\n}\n\n/* Radial Actions (#chrome): right-click context menu. Theme via these classes\n or the --apx-menu-* custom properties. */\n.apexcharts-canvas {\n --apx-menu-bg: #ffffff;\n --apx-menu-fg: #1e293b;\n --apx-menu-border: #e2e8f0;\n --apx-menu-hover: #f1f5f9;\n --apx-menu-shadow: rgba(15, 23, 42, 0.18);\n}\n.apexcharts-context-menu {\n min-width: 168px;\n padding: 4px;\n border-radius: 8px;\n background: var(--apx-menu-bg);\n border: 1px solid var(--apx-menu-border);\n box-shadow: 0 6px 22px var(--apx-menu-shadow);\n font-family: Helvetica, Arial, sans-serif;\n font-size: 13px;\n z-index: 20;\n user-select: none;\n}\n.apexcharts-context-menu-item {\n display: block;\n width: 100%;\n box-sizing: border-box;\n text-align: left;\n padding: 7px 12px;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: var(--apx-menu-fg);\n font: inherit;\n cursor: pointer;\n}\n.apexcharts-context-menu-item:hover,\n.apexcharts-context-menu-item--active {\n background: var(--apx-menu-hover);\n}\n.apexcharts-context-menu-item:focus {\n outline: none;\n}\n\n/* Ink Layer (#7): the floating note editor card, opened by clicking an\n ink-managed annotation. Theme via these classes or the --apx-ink-* vars. */\n.apexcharts-canvas {\n --apx-ink-card-bg: #ffffff;\n --apx-ink-card-fg: #1e293b;\n --apx-ink-card-border: #e2e8f0;\n --apx-ink-card-hover: #f1f5f9;\n --apx-ink-card-accent: #6366f1;\n --apx-ink-card-shadow: rgba(15, 23, 42, 0.18);\n}\n.apexcharts-ink-card {\n position: absolute;\n z-index: 25;\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 8px;\n border-radius: 8px;\n background: var(--apx-ink-card-bg);\n border: 1px solid var(--apx-ink-card-border);\n box-shadow: 0 6px 22px var(--apx-ink-card-shadow);\n font-family: Helvetica, Arial, sans-serif;\n font-size: 12px;\n color: var(--apx-ink-card-fg);\n user-select: none;\n}\n.apexcharts-ink-card-row {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.apexcharts-ink-card input.apexcharts-ink-editor {\n flex: 1 1 auto;\n width: 150px;\n min-width: 0;\n box-sizing: border-box;\n padding: 4px 6px;\n font: inherit;\n color: inherit;\n background: transparent;\n border: 1px solid var(--apx-ink-card-border);\n border-radius: 5px;\n}\n.apexcharts-ink-card input.apexcharts-ink-editor:focus {\n outline: none;\n border-color: var(--apx-ink-card-accent);\n}\n.apexcharts-ink-btn {\n flex: 0 0 auto;\n width: 24px;\n height: 24px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n border: 0;\n border-radius: 5px;\n background: transparent;\n color: inherit;\n font: inherit;\n font-size: 12px;\n line-height: 1;\n cursor: pointer;\n}\n.apexcharts-ink-btn:hover,\n.apexcharts-ink-btn--active {\n background: var(--apx-ink-card-hover);\n}\n.apexcharts-ink-btn:focus-visible,\n.apexcharts-ink-swatch:focus-visible {\n outline: 2px solid var(--apx-ink-card-accent);\n outline-offset: 1px;\n}\n.apexcharts-ink-btn--bold {\n font-weight: 700;\n}\n.apexcharts-ink-btn--delete:hover {\n color: #dc2626;\n}\n.apexcharts-ink-swatch {\n flex: 0 0 auto;\n width: 16px;\n height: 16px;\n padding: 0;\n border: 1px solid rgba(100, 116, 139, 0.45);\n border-radius: 50%;\n cursor: pointer;\n}\n.apexcharts-ink-swatch--active {\n box-shadow:\n 0 0 0 2px var(--apx-ink-card-bg),\n 0 0 0 4px var(--apx-ink-card-accent);\n}\n.apexcharts-ink-sep {\n flex: 0 0 auto;\n width: 1px;\n height: 16px;\n margin: 0 2px;\n background: var(--apx-ink-card-border);\n}\n.apexcharts-ink-cardlabel {\n flex: 0 0 auto;\n font-size: 10px;\n letter-spacing: 0.4px;\n text-transform: uppercase;\n opacity: 0.65;\n margin-right: 2px;\n}\n.apexcharts-ink-marker-size {\n flex: 0 0 auto;\n min-width: 16px;\n text-align: center;\n font-variant-numeric: tabular-nums;\n}\n\n.apexcharts-legend-text {\n padding-left: 15px;\n margin-left: -15px;\n}\n\n.apexcharts-legend-series[role=\"button\"]:focus {\n outline: 2px solid var(--apexcharts-focus-color, #008FFB);\n outline-offset: 2px;\n}\n\n.apexcharts-legend-series[role=\"button\"]:focus:not(:focus-visible) {\n outline: none;\n}\n\n.apexcharts-legend-series[role=\"button\"]:focus-visible {\n outline: 2px solid var(--apexcharts-focus-color, #008FFB);\n outline-offset: 2px;\n}\n\n.apexcharts-series-collapsed {\n opacity: 0\n}\n\n/* A series still playing its exit tween stays painted so it can visibly shrink\n away, hiding it on the first frame leaves a hole in a stacked chart for the\n length of the animation. Dropped once the tween lands. */\n.apexcharts-series-collapsed.apexcharts-series-collapsing {\n opacity: 1\n}\n\n/* Its labels ride the shrinking marks, but a mark runs out of room for its text\n well before it reaches zero, so fade them across the exit instead of holding\n them crisp over a sliver. Duration is set inline from dynamicAnimation.speed. */\n.apexcharts-datalabels.apexcharts-series-collapsing {\n animation: apexcharts-datalabels-exit var(--apexcharts-dl-exit, 400ms) ease-in\n forwards;\n}\n\n@keyframes apexcharts-datalabels-exit {\n from {\n opacity: 1\n }\n to {\n opacity: 0\n }\n}\n\n.apexcharts-canvas svg:focus:not(:focus-visible) {\n outline: none;\n}\n\n/* Keyboard navigation focus indicator on SVG data elements.\n SVG elements don't support CSS outline, so we use stroke. */\n.apexcharts-bar-area.apexcharts-keyboard-focused,\n.apexcharts-candlestick-area.apexcharts-keyboard-focused,\n.apexcharts-boxPlot-area.apexcharts-keyboard-focused,\n.apexcharts-rangebar-area.apexcharts-keyboard-focused,\n.apexcharts-pie-area.apexcharts-keyboard-focused,\n.apexcharts-heatmap-rect.apexcharts-keyboard-focused,\n.apexcharts-treemap-rect.apexcharts-keyboard-focused {\n stroke: var(--apexcharts-focus-color, #008FFB);\n stroke-width: 2;\n stroke-opacity: 1;\n}\n\n.apexcharts-tooltip {\n --apx-tt-bg: #ffffff;\n /* Shared by the body and the arrow's two outward facets, so the\n * hairline reads as one continuous outline around the whole shape.\n * Keep it strong enough to survive on its own: the shadow below is\n * elevation, not edge definition. */\n --apx-tt-border: rgba(15, 23, 42, 0.12);\n /* Elevation, in three layers: a tight contact shadow that anchors the\n * bottom edge, a directional key shadow for the lift, and a wide\n * ambient one that grounds the whole box. Each is weaker and more\n * diffuse than the last.\n *\n * A tooltip is unusual in that it floats over *data*, so reach costs\n * more than it does on a page: every pixel the shadow travels tints a\n * bar or a line the reader is trying to compare. These numbers are\n * tuned to keep the near-edge contrast that reads as elevation while\n * dropping the long low haze that only muddies the plot.\n *\n * Note there is deliberately no `0 0 0 1px` ring layer. That used to\n * stand in for edge definition back when --apx-tt-border was barely\n * visible; now that the border is a real hairline (and the arrow\n * shares it) a ring only double-draws the outline, and being spread\n * rather than offset it leaked ink upward too, flattening the lift.\n *\n * `--apx-tt-shadow-dir` flips the whole stack's Y in one place — see\n * the `[data-placement=\"bottom\"]` rule further down. */\n --apx-tt-shadow-dir: 1;\n --apx-tt-shadow: 0 calc(var(--apx-tt-shadow-dir) * 1px) 2px rgba(15, 23, 42, 0.06), 0 calc(var(--apx-tt-shadow-dir) * 4px) 8px -2px rgba(15, 23, 42, 0.10), 0 calc(var(--apx-tt-shadow-dir) * 12px) 20px -8px rgba(15, 23, 42, 0.14);\n --apx-tt-arrow-bg: var(--apx-tt-bg);\n --apx-tt-color: #0f172a;\n --apx-tt-color-muted: rgba(15, 23, 42, 0.55);\n border-radius: 8px;\n background: var(--apx-tt-bg);\n border: 1px solid var(--apx-tt-border);\n box-shadow: var(--apx-tt-shadow);\n color: var(--apx-tt-color);\n cursor: default;\n font-size: 13px;\n left: 0;\n top: 0;\n opacity: 0;\n pointer-events: none;\n position: absolute;\n display: flex;\n flex-direction: column;\n padding: 2px 0;\n white-space: nowrap;\n z-index: 12;\n transition: opacity .12s ease\n}\n\n/* While the tooltip is visible, smoothly animate position changes\n * between data points. Kept short (160 ms) and ease-out so it stays\n * responsive — too long would feel laggy when sweeping across many\n * points fast. The position transition is only attached after the\n * first paint (Position.applyTooltipPosition flips `data-positioned`\n * once the tooltip has been placed) so the *first* show doesn't slide\n * the tooltip in from the previously-stale (0,0) coordinates. */\n.apexcharts-tooltip.apexcharts-active {\n opacity: 1;\n transition: opacity .12s ease\n}\n.apexcharts-tooltip.apexcharts-tooltip-interactive {\n pointer-events: auto;\n}\n.apexcharts-tooltip.apexcharts-active[data-positioned=\"true\"] {\n transition: opacity .12s ease, left .16s ease-out, top .16s ease-out\n}\n\n.apexcharts-tooltip.apexcharts-theme-light {\n /* defaults already set above; class kept for backward-compat selectors */\n}\n\n.apexcharts-tooltip.apexcharts-theme-dark {\n --apx-tt-bg: #1c1c1f;\n --apx-tt-border: rgba(255, 255, 255, 0.16);\n /* Dark needs more alpha than light to register at all, but not as much\n * as it used to: the light rim above now carries the edge, so the\n * shadow is free to be pure elevation instead of doubling as an\n * outline. Same geometry as light, heavier ink. */\n --apx-tt-shadow: 0 calc(var(--apx-tt-shadow-dir) * 1px) 2px rgba(0, 0, 0, 0.24), 0 calc(var(--apx-tt-shadow-dir) * 4px) 8px -2px rgba(0, 0, 0, 0.30), 0 calc(var(--apx-tt-shadow-dir) * 12px) 20px -8px rgba(0, 0, 0, 0.38);\n --apx-tt-color: #f3f4f6;\n --apx-tt-color-muted: rgba(243, 244, 246, 0.55);\n}\n\n.apexcharts-tooltip * {\n font-family: inherit\n}\n\n/* Point-annotation hover tooltip (apexcharts/apexcharts.js#2424). Reuses the\n * glass body/border/shadow from `.apexcharts-tooltip` but holds free-form\n * content, so it needs its own padding, wrapping and a sane max width. */\n.apexcharts-tooltip.apexcharts-annotation-tooltip {\n padding: 6px 10px;\n max-width: 240px;\n white-space: normal;\n line-height: 1.4;\n pointer-events: none;\n z-index: 13\n}\n\n.apexcharts-tooltip-title {\n padding: 8px 12px 4px;\n font-size: 12px;\n font-weight: 600;\n letter-spacing: 0.01em;\n color: var(--apx-tt-color-muted);\n background: transparent;\n border-bottom: none;\n margin-bottom: 0\n}\n\n.apexcharts-tooltip.apexcharts-theme-light .apexcharts-tooltip-title,\n.apexcharts-tooltip.apexcharts-theme-dark .apexcharts-tooltip-title {\n background: transparent;\n border-bottom: none\n}\n\n/* `fillSeriesColor`: each series-group already paints itself with the\n * series colour. Drop the glass body entirely (transparent bg, no\n * border, no backdrop-filter, no padding) and clip the coloured\n * series-group(s) to the tooltip's rounded corners so they fill the\n * shell edge-to-edge. Text inside the coloured group is forced to\n * white for contrast. */\n.apexcharts-tooltip.apexcharts-tooltip-fill-series {\n background: transparent;\n -webkit-backdrop-filter: none;\n backdrop-filter: none;\n border: none;\n padding: 0;\n overflow: hidden;\n color: #fff\n}\n\n.apexcharts-tooltip.apexcharts-tooltip-fill-series .apexcharts-tooltip-title {\n background: rgba(0, 0, 0, 0.22);\n color: #fff;\n opacity: 1;\n padding: 6px 12px\n}\n\n.apexcharts-tooltip.apexcharts-tooltip-fill-series .apexcharts-tooltip-series-group {\n color: #fff\n}\n\n/* Arrow connector — a 45°-rotated square straddling the body's edge, so\n * the body's 1px border runs continuously out across the arrow and back.\n * The two facets that face away from the tooltip carry the border; the\n * two that face into it carry none, and the square's opaque fill covers\n * the segment of the body's own border it sits on, hiding the seam.\n *\n * This is why it's a rotated square and not a triangle: `clip-path`\n * erases `border` and `box-shadow` along with everything outside the\n * polygon, which left `filter: drop-shadow` as the only way to suggest\n * an edge — and a drop-shadow can only ever blur one, never draw a\n * hairline. Nothing here needs a filter.\n *\n * Geometry: a square of side S rotated 45° reaches S/√2 from its centre\n * to each corner, so S = 10px gives the ~7px tip overhang that\n * ARROW_TIP_OVERHANG assumes (tooltip/constants.js) over a ~14px base.\n * The offsets park the square's *centre* 1px outside the padding box\n * (-6px = -1px border - 10px/2), i.e. exactly on the body's border line,\n * so the two borders meet end to end instead of overlapping or gapping.\n * `box-sizing` must be border-box or the bordered sides would grow the\n * square asymmetrically and knock its centre off that line. */\n.apexcharts-tooltip-arrow {\n position: absolute;\n box-sizing: border-box;\n width: 10px;\n height: 10px;\n background: var(--apx-tt-arrow-bg);\n transform: rotate(45deg);\n pointer-events: none;\n top: calc(var(--apx-tt-arrow-y, 50%) - 5px)\n}\n\n/* Which two sides face outward depends on the placement. Under\n * `rotate(45deg)` the square's bottom-left corner swings to the left,\n * top-right to the right, top-left to the top and bottom-right to the\n * bottom — so the pair of borders below is always the two sharing the\n * corner that ends up as the tip. */\n.apexcharts-tooltip[data-placement=\"right\"] .apexcharts-tooltip-arrow {\n left: -6px;\n border-left: 1px solid var(--apx-tt-border);\n border-bottom: 1px solid var(--apx-tt-border)\n}\n\n.apexcharts-tooltip[data-placement=\"left\"] .apexcharts-tooltip-arrow {\n right: -6px;\n border-top: 1px solid var(--apx-tt-border);\n border-right: 1px solid var(--apx-tt-border)\n}\n\n/* Vertical arrow variants: tooltip is above/below the data point and the\n * arrow points down/up. The base rule above uses `--apx-tt-arrow-y` for\n * left/right placement; for top/bottom we centre on `--apx-tt-arrow-x`\n * instead (set by applyTooltipPosition). */\n.apexcharts-tooltip[data-placement=\"top\"] .apexcharts-tooltip-arrow,\n.apexcharts-tooltip[data-placement=\"bottom\"] .apexcharts-tooltip-arrow {\n top: auto;\n left: calc(var(--apx-tt-arrow-x, 50%) - 5px)\n}\n\n.apexcharts-tooltip[data-placement=\"top\"] .apexcharts-tooltip-arrow {\n bottom: -6px;\n border-right: 1px solid var(--apx-tt-border);\n border-bottom: 1px solid var(--apx-tt-border)\n}\n\n.apexcharts-tooltip[data-placement=\"bottom\"] .apexcharts-tooltip-arrow {\n top: -6px;\n border-top: 1px solid var(--apx-tt-border);\n border-left: 1px solid var(--apx-tt-border)\n}\n\n/* When the tooltip is flipped below the data point, the default\n * downward-biased shadow leaves its top edge undefined. Negating the\n * direction casts the whole elevation upward instead, so the shadow\n * falls between the tooltip and the mark above it. One multiplier flips\n * all three layers together; the arrow needs no counterpart, since its\n * border doesn't depend on light direction. */\n.apexcharts-tooltip[data-placement=\"bottom\"] {\n --apx-tt-shadow-dir: -1\n}\n\n.apexcharts-tooltip-text-goals-value,\n.apexcharts-tooltip-text-y-value,\n.apexcharts-tooltip-text-z-value {\n display: inline-block;\n margin-left: 5px;\n font-weight: 600\n}\n\n.apexcharts-tooltip-text-goals-label:empty,\n.apexcharts-tooltip-text-goals-value:empty,\n.apexcharts-tooltip-text-y-label:empty,\n.apexcharts-tooltip-text-y-value:empty,\n.apexcharts-tooltip-text-z-value:empty,\n.apexcharts-tooltip-title:empty {\n display: none\n}\n\n.apexcharts-tooltip-text-goals-label,\n.apexcharts-tooltip-text-goals-value {\n padding: 6px 0 5px\n}\n\n.apexcharts-tooltip-goals-group,\n.apexcharts-tooltip-text-goals-label,\n.apexcharts-tooltip-text-goals-value {\n display: flex\n}\n\n.apexcharts-tooltip-text-goals-label:not(:empty),\n.apexcharts-tooltip-text-goals-value:not(:empty) {\n margin-top: -6px\n}\n\n.apexcharts-tooltip-marker {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n position: relative;\n width: 12px;\n height: 12px;\n margin-right: 6px;\n vertical-align: middle;\n color: inherit;\n}\n\n.apexcharts-tooltip-marker svg {\n width: 100%;\n height: 100%;\n display: block;\n}\n\n.apexcharts-tooltip-series-group {\n padding: 4px 12px;\n display: none;\n gap: 8px;\n text-align: left;\n justify-content: left;\n align-items: center\n}\n\n.apexcharts-tooltip-series-group.apexcharts-active .apexcharts-tooltip-marker {\n opacity: 1\n}\n\n.apexcharts-tooltip-series-group.apexcharts-active:last-child,\n.apexcharts-tooltip-series-group:last-child {\n padding-bottom: 8px\n}\n\n.apexcharts-tooltip-y-group {\n padding: 6px 0 5px\n}\n\n/* `tooltip.compact`: a tight box instead of a card, for panels a normal card\n would cover (small multiples, sparklines, tiles). Only the box shrinks, so\n the arrow and every anchor rule still apply. Rows stay stacked when there\n are several series (the names are what tells them apart); a one-series\n chart collapses to a single line, see `-value-only` below. */\n.apexcharts-tooltip.apexcharts-tooltip-compact {\n padding: 3px 8px;\n font-size: 11px;\n line-height: 1.35\n}\n\n.apexcharts-tooltip-compact .apexcharts-tooltip-title {\n padding: 0;\n font-size: 11px;\n white-space: nowrap\n}\n\n.apexcharts-tooltip-compact .apexcharts-tooltip-series-group,\n.apexcharts-tooltip-compact .apexcharts-tooltip-series-group.apexcharts-active:last-child,\n.apexcharts-tooltip-compact .apexcharts-tooltip-series-group:last-child {\n padding: 0;\n gap: 5px\n}\n\n.apexcharts-tooltip-compact .apexcharts-tooltip-y-group {\n padding: 0\n}\n\n.apexcharts-tooltip-compact .apexcharts-tooltip-marker {\n width: 8px;\n height: 8px\n}\n\n/* A one-series panel: the series name repeats what the panel header already\n says, so the value stands alone and the x label becomes its prefix on one\n line (\"Aug 2024 6.59\"). */\n.apexcharts-tooltip.apexcharts-tooltip-compact.apexcharts-tooltip-value-only {\n /* The tooltip body is a flex COLUMN by default (title row, then series\n rows); one series needs no column, so the same box turns into one line. */\n flex-direction: row;\n align-items: baseline;\n gap: 6px\n}\n\n.apexcharts-tooltip-value-only .apexcharts-tooltip-marker {\n display: none\n}\n\n.apexcharts-tooltip-value-only .apexcharts-tooltip-text-y-label {\n display: none\n}\n\n.apexcharts-custom-tooltip,\n.apexcharts-tooltip-box {\n padding: 4px 8px\n}\n\n.apexcharts-tooltip-boxPlot {\n display: flex;\n flex-direction: column-reverse\n}\n\n.apexcharts-tooltip-box>div {\n margin: 4px 0\n}\n\n.apexcharts-tooltip-box span.value {\n font-weight: 700\n}\n\n.apexcharts-tooltip-rangebar {\n padding: 5px 8px\n}\n\n.apexcharts-tooltip-rangebar .category {\n font-weight: 600;\n color: #777\n}\n\n.apexcharts-tooltip-rangebar .series-name {\n font-weight: 700;\n display: block;\n margin-bottom: 5px\n}\n\n/* Streamgraph: every band read out at one column, top-down in stacking order.\n * A row per band rather than the shared tooltip's list, because a streamgraph's\n * `[lo, hi]` are stacking offsets and the values the reader gave live on\n * w.streamgraphData. */\n.apexcharts-tooltip-stream {\n padding: 5px 8px\n}\n\n.apexcharts-tooltip-stream .apexcharts-tooltip-title {\n background: transparent;\n border: 0;\n padding: 0 0 4px;\n margin: 0;\n font-weight: 700\n}\n\n.apexcharts-tooltip-stream-band {\n display: flex;\n align-items: center;\n gap: 5px;\n line-height: 1.6;\n opacity: .72\n}\n\n.apexcharts-tooltip-stream-band.apexcharts-active {\n opacity: 1;\n font-weight: 700\n}\n\n.apexcharts-tooltip-stream-band .series-name {\n flex: 1 1 auto;\n margin-right: 8px\n}\n\n.apexcharts-tooltip-stream-band .value {\n font-weight: 700;\n margin-left: auto\n}\n\n.apexcharts-tooltip-stream-total {\n display: flex;\n align-items: center;\n margin-top: 4px;\n padding-top: 4px;\n border-top: 1px solid var(--apx-tt-border, rgba(15, 23, 42, .12))\n}\n\n.apexcharts-tooltip-stream-total .series-name {\n flex: 1 1 auto;\n font-weight: 600\n}\n\n.apexcharts-tooltip-stream-total .value {\n font-weight: 700;\n margin-left: auto\n}\n\n/* The band labels themselves. Pointer events off so a name never blocks a\n * hover on the band it sits on. */\n.apexcharts-streamgraph-label {\n pointer-events: none\n}\n\n/* X/Y axis tooltips — small popovers that label the crosshair on the\n * axes. Restyled to match the modern data-tooltip palette: solid white\n * body with a subtle border + soft drop-shadow, smaller font, rounded\n * corners. The arrows still use the CSS border-triangle technique\n * (cheap, crisp at small sizes); their colours flow from CSS variables\n * so light/dark themes only need one override per axis. */\n.apexcharts-xaxistooltip,\n.apexcharts-yaxistooltip {\n --apx-axt-bg: #ffffff;\n --apx-axt-border: rgba(15, 23, 42, 0.08);\n --apx-axt-color: #0f172a;\n --apx-axt-shadow: 0 4px 12px -4px rgba(15, 23, 42, 0.18), 0 1px 3px -1px rgba(15, 23, 42, 0.12);\n opacity: 0;\n pointer-events: none;\n color: var(--apx-axt-color);\n font-size: 12px;\n font-weight: 500;\n text-align: center;\n border-radius: 6px;\n position: absolute;\n z-index: 10;\n background: var(--apx-axt-bg);\n border: 1px solid var(--apx-axt-border);\n box-shadow: var(--apx-axt-shadow)\n}\n\n.apexcharts-xaxistooltip.apexcharts-theme-dark,\n.apexcharts-yaxistooltip.apexcharts-theme-dark {\n --apx-axt-bg: #1c1c1f;\n --apx-axt-border: rgba(255, 255, 255, 0.1);\n --apx-axt-color: #f3f4f6;\n --apx-axt-shadow: 0 4px 12px -4px rgba(0, 0, 0, 0.55), 0 1px 3px -1px rgba(0, 0, 0, 0.45)\n}\n\n.apexcharts-xaxistooltip {\n padding: 4px 8px;\n transition: .15s ease all\n}\n\n.apexcharts-xaxistooltip:after,\n.apexcharts-xaxistooltip:before {\n left: 50%;\n border: solid transparent;\n content: \" \";\n height: 0;\n width: 0;\n position: absolute;\n pointer-events: none\n}\n\n/* :before paints the 1px border outline of the triangle (slightly larger\n * than :after); :after sits inside and paints the fill — leaves a 1px\n * ring of :before visible at the edges. */\n.apexcharts-xaxistooltip:after {\n border-color: transparent;\n border-width: 5px;\n margin-left: -5px\n}\n\n.apexcharts-xaxistooltip:before {\n border-color: transparent;\n border-width: 6px;\n margin-left: -6px\n}\n\n.apexcharts-xaxistooltip-bottom:after,\n.apexcharts-xaxistooltip-bottom:before {\n bottom: 100%\n}\n\n.apexcharts-xaxistooltip-top:after,\n.apexcharts-xaxistooltip-top:before {\n top: 100%\n}\n\n.apexcharts-xaxistooltip-bottom:after {\n border-bottom-color: var(--apx-axt-bg)\n}\n\n.apexcharts-xaxistooltip-bottom:before {\n border-bottom-color: var(--apx-axt-border)\n}\n\n.apexcharts-xaxistooltip-top:after {\n border-top-color: var(--apx-axt-bg)\n}\n\n.apexcharts-xaxistooltip-top:before {\n border-top-color: var(--apx-axt-border)\n}\n\n.apexcharts-xaxistooltip.apexcharts-active {\n opacity: 1;\n transition: .15s ease all\n}\n\n.apexcharts-yaxistooltip {\n padding: 3px 8px\n}\n\n.apexcharts-yaxistooltip:after,\n.apexcharts-yaxistooltip:before {\n top: 50%;\n border: solid transparent;\n content: \" \";\n height: 0;\n width: 0;\n position: absolute;\n pointer-events: none\n}\n\n.apexcharts-yaxistooltip:after {\n border-color: transparent;\n border-width: 5px;\n margin-top: -5px\n}\n\n.apexcharts-yaxistooltip:before {\n border-color: transparent;\n border-width: 6px;\n margin-top: -6px\n}\n\n.apexcharts-yaxistooltip-left:after,\n.apexcharts-yaxistooltip-left:before {\n left: 100%\n}\n\n.apexcharts-yaxistooltip-right:after,\n.apexcharts-yaxistooltip-right:before {\n right: 100%\n}\n\n.apexcharts-yaxistooltip-left:after {\n border-left-color: var(--apx-axt-bg)\n}\n\n.apexcharts-yaxistooltip-left:before {\n border-left-color: var(--apx-axt-border)\n}\n\n.apexcharts-yaxistooltip-right:after {\n border-right-color: var(--apx-axt-bg)\n}\n\n.apexcharts-yaxistooltip-right:before {\n border-right-color: var(--apx-axt-border)\n}\n\n.apexcharts-yaxistooltip.apexcharts-active {\n opacity: 1\n}\n\n.apexcharts-yaxistooltip-hidden {\n display: none\n}\n\n.apexcharts-xcrosshairs,\n.apexcharts-ycrosshairs {\n pointer-events: none;\n opacity: 0;\n transition: .15s ease all\n}\n\n.apexcharts-xcrosshairs.apexcharts-active,\n.apexcharts-ycrosshairs.apexcharts-active {\n opacity: 1;\n transition: .15s ease all\n}\n\n.apexcharts-ycrosshairs-hidden {\n opacity: 0\n}\n\n.apexcharts-selection-rect {\n cursor: move\n}\n\n.svg_select_shape {\n stroke-width: 1;\n stroke-dasharray: 10 10;\n stroke: black;\n stroke-opacity: 0.1;\n pointer-events: none;\n fill: none;\n}\n\n.svg_select_handle {\n stroke-width: 3;\n stroke: black;\n fill: none;\n}\n\n.svg_select_handle_r {\n cursor: e-resize;\n}\n\n.svg_select_handle_l {\n cursor: w-resize;\n}\n\n.apexcharts-svg.apexcharts-zoomable.hovering-zoom {\n cursor: crosshair\n}\n\n.apexcharts-svg.apexcharts-zoomable.hovering-pan {\n cursor: move\n}\n\n.apexcharts-menu-icon,\n.apexcharts-measure-icon,\n.apexcharts-pan-icon,\n.apexcharts-reset-icon,\n.apexcharts-selection-icon,\n.apexcharts-toolbar-custom-icon,\n.apexcharts-zoom-icon,\n.apexcharts-zoomin-icon,\n.apexcharts-zoomout-icon {\n cursor: pointer;\n /* WCAG 2.5.8 Target Size (Minimum): 24×24 CSS px hit target. */\n width: 26px;\n height: 24px;\n line-height: 24px;\n color: #6e8192;\n text-align: center;\n /* Reset native <button> chrome — these are styled via SVG icons. */\n padding: 0;\n margin: 0;\n background: transparent;\n border: 0;\n border-radius: 5px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transition: background-color .12s ease, color .12s ease;\n}\n\n.apexcharts-menu-icon svg,\n.apexcharts-measure-icon svg,\n.apexcharts-pan-icon svg,\n.apexcharts-reset-icon svg,\n.apexcharts-selection-icon svg,\n.apexcharts-zoom-icon svg,\n.apexcharts-zoomin-icon svg,\n.apexcharts-zoomout-icon svg {\n width: 18px;\n height: 18px;\n fill: none;\n stroke: currentColor;\n stroke-width: 2;\n stroke-linecap: round;\n stroke-linejoin: round\n}\n\n.apexcharts-theme-dark .apexcharts-menu-icon,\n.apexcharts-theme-dark .apexcharts-measure-icon,\n.apexcharts-theme-dark .apexcharts-pan-icon,\n.apexcharts-theme-dark .apexcharts-reset-icon,\n.apexcharts-theme-dark .apexcharts-selection-icon,\n.apexcharts-theme-dark .apexcharts-toolbar-custom-icon,\n.apexcharts-theme-dark .apexcharts-zoom-icon,\n.apexcharts-theme-dark .apexcharts-zoomin-icon,\n.apexcharts-theme-dark .apexcharts-zoomout-icon {\n color: #d4d6dc\n}\n\n.apexcharts-canvas .apexcharts-measure-icon.apexcharts-selected,\n.apexcharts-canvas .apexcharts-pan-icon.apexcharts-selected,\n.apexcharts-canvas .apexcharts-reset-zoom-icon.apexcharts-selected,\n.apexcharts-canvas .apexcharts-selection-icon.apexcharts-selected,\n.apexcharts-canvas .apexcharts-zoom-icon.apexcharts-selected {\n background: rgba(0, 143, 251, 0.12);\n color: #008ffb\n}\n\n.apexcharts-theme-light .apexcharts-menu-icon:hover,\n.apexcharts-theme-light .apexcharts-measure-icon:not(.apexcharts-selected):hover,\n.apexcharts-theme-light .apexcharts-pan-icon:not(.apexcharts-selected):hover,\n.apexcharts-theme-light .apexcharts-reset-icon:hover,\n.apexcharts-theme-light .apexcharts-selection-icon:not(.apexcharts-selected):hover,\n.apexcharts-theme-light .apexcharts-zoom-icon:not(.apexcharts-selected):hover,\n.apexcharts-theme-light .apexcharts-zoomin-icon:hover,\n.apexcharts-theme-light .apexcharts-zoomout-icon:hover {\n background: rgba(15, 23, 42, 0.06);\n color: #1f2937\n}\n\n.apexcharts-theme-dark .apexcharts-menu-icon:hover,\n.apexcharts-theme-dark .apexcharts-measure-icon:not(.apexcharts-selected):hover,\n.apexcharts-theme-dark .apexcharts-pan-icon:not(.apexcharts-selected):hover,\n.apexcharts-theme-dark .apexcharts-reset-icon:hover,\n.apexcharts-theme-dark .apexcharts-selection-icon:not(.apexcharts-selected):hover,\n.apexcharts-theme-dark .apexcharts-zoom-icon:not(.apexcharts-selected):hover,\n.apexcharts-theme-dark .apexcharts-zoomin-icon:hover,\n.apexcharts-theme-dark .apexcharts-zoomout-icon:hover {\n background: rgba(255, 255, 255, 0.08);\n color: #fff\n}\n\n.apexcharts-menu-icon,\n.apexcharts-selection-icon {\n position: relative\n}\n\n.apexcharts-toolbar {\n position: absolute;\n z-index: 11;\n display: inline-flex;\n align-items: center;\n gap: 1px;\n padding: 3px;\n border-radius: 8px;\n background: rgba(255, 255, 255, 0.85);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n}\n\n.apexcharts-theme-dark .apexcharts-toolbar {\n background: rgba(28, 28, 31, 0.82);\n}\n\n.apexcharts-menu {\n background: rgba(255, 255, 255, 0.95);\n backdrop-filter: blur(8px);\n -webkit-backdrop-filter: blur(8px);\n position: absolute;\n top: calc(100% + 4px);\n border: 1px solid rgba(15, 23, 42, 0.08);\n border-radius: 8px;\n padding: 4px;\n right: 0;\n opacity: 0;\n min-width: 120px;\n transition: opacity .15s ease, transform .15s ease;\n transform: translateY(-2px);\n pointer-events: none;\n box-shadow: 0 4px 16px -4px rgba(15, 23, 42, 0.12), 0 2px 4px -1px rgba(15, 23, 42, 0.06)\n}\n\n.apexcharts-menu.apexcharts-menu-open {\n opacity: 1;\n transform: translateY(0);\n pointer-events: all\n}\n\n.apexcharts-menu-item {\n padding: 6px 9px;\n font-size: 12px;\n border-radius: 5px;\n cursor: pointer\n}\n\n.apexcharts-theme-light .apexcharts-menu-item:hover {\n background: rgba(15, 23, 42, 0.06)\n}\n\n.apexcharts-theme-dark .apexcharts-menu {\n background: rgba(28, 28, 31, 0.92);\n border-color: rgba(255, 255, 255, 0.08);\n color: #f3f4f6;\n box-shadow: 0 4px 16px -4px rgba(0, 0, 0, 0.5), 0 2px 4px -1px rgba(0, 0, 0, 0.4)\n}\n\n.apexcharts-theme-dark .apexcharts-menu-item:hover {\n background: rgba(255, 255, 255, 0.08)\n}\n\n@media screen and (min-width:768px) {\n .apexcharts-canvas:hover .apexcharts-toolbar {\n opacity: 1\n }\n}\n\n/* Toolbar keyboard accessibility: show toolbar when any button inside it is focused */\n.apexcharts-toolbar:focus-within {\n opacity: 1\n}\n\n/* Focus indicator for toolbar icon buttons */\n.apexcharts-menu-icon:focus-visible,\n.apexcharts-measure-icon:focus-visible,\n.apexcharts-pan-icon:focus-visible,\n.apexcharts-reset-icon:focus-visible,\n.apexcharts-selection-icon:focus-visible,\n.apexcharts-toolbar-custom-icon:focus-visible,\n.apexcharts-zoom-icon:focus-visible,\n.apexcharts-zoomin-icon:focus-visible,\n.apexcharts-zoomout-icon:focus-visible {\n outline: 2px solid var(--apexcharts-focus-color, #008FFB);\n outline-offset: 1px;\n border-radius: 5px\n}\n\n/* Focus indicator for hamburger menu items */\n.apexcharts-menu-item:focus-visible {\n outline: 2px solid var(--apexcharts-focus-color, #008FFB);\n outline-offset: -2px;\n background: #eee\n}\n\n.apexcharts-canvas .apexcharts-element-hidden,\n.apexcharts-datalabel.apexcharts-element-hidden,\n.apexcharts-hide .apexcharts-series-points {\n opacity: 0;\n}\n\n.apexcharts-hidden-element-shown {\n opacity: 1;\n transition: 0.25s ease all;\n}\n\n.apexcharts-datalabel,\n.apexcharts-datalabel-label,\n.apexcharts-datalabel-value,\n.apexcharts-datalabels,\n.apexcharts-pie-label,\n.apexcharts-pie-name-label,\n.apexcharts-pie-name-label-group,\n.apexcharts-pie-label-connector,\n.apexcharts-unit-outer-label,\n.apexcharts-unit-outer-label-group,\n.apexcharts-unit-label-connector {\n cursor: default;\n pointer-events: none\n}\n\n.apexcharts-pie-label-connector,\n.apexcharts-unit-label-connector {\n fill: none\n}\n\n.apexcharts-pie-label-delay,\n.apexcharts-unit-label-delay {\n opacity: 0;\n animation-name: opaque;\n animation-duration: .3s;\n animation-fill-mode: forwards;\n animation-timing-function: ease\n}\n\n/* Slower than the pie's, on purpose: these come in while the dots are still\n easing into place, so a longer fade reads as arriving WITH the crowd. */\n.apexcharts-unit-label-delay {\n animation-duration: .5s\n}\n\n.apexcharts-radialbar-label {\n cursor: pointer;\n}\n\n.apexcharts-annotation-rect,\n.apexcharts-area-series .apexcharts-area,\n.apexcharts-gridline,\n.apexcharts-line,\n.apexcharts-point-annotation-label,\n.apexcharts-radar-series path:not(.apexcharts-marker),\n.apexcharts-radar-series polygon,\n.apexcharts-toolbar svg,\n.apexcharts-tooltip .apexcharts-marker,\n.apexcharts-xaxis-annotation-label,\n.apexcharts-yaxis-annotation-label,\n.apexcharts-zoom-rect,\n.no-pointer-events {\n pointer-events: none\n}\n\n.apexcharts-tooltip-active .apexcharts-marker {\n transition: .15s ease all\n}\n\n.apexcharts-radar-series .apexcharts-yaxis {\n pointer-events: none;\n}\n\n.apexcharts-bar-goals-markers {\n pointer-events: none\n}\n\n.apexcharts-bar-shadows {\n pointer-events: none\n}\n\n.apexcharts-rangebar-goals-markers {\n pointer-events: none\n}\n\n.apexcharts-drilldown-target {\n cursor: pointer\n}\n\n.apexcharts-breadcrumb {\n position: absolute;\n z-index: 11;\n display: inline-flex;\n align-items: center;\n gap: 2px;\n font-size: 12px;\n font-family: inherit;\n padding: 2px 4px\n}\n\n.apexcharts-breadcrumb-item {\n background: transparent;\n border: none;\n padding: 2px 6px;\n border-radius: 3px;\n font: inherit;\n color: inherit;\n cursor: pointer;\n line-height: 1.2\n}\n\n.apexcharts-breadcrumb-item:hover:not(.apexcharts-breadcrumb-current) {\n background: rgba(0, 0, 0, 0.08)\n}\n\n.apexcharts-breadcrumb-arrow {\n margin-right: 4px;\n font-weight: 600;\n user-select: none\n}\n\n.apexcharts-breadcrumb-current {\n cursor: default;\n font-weight: 600;\n opacity: 0.85\n}\n\n.apexcharts-breadcrumb-separator {\n opacity: 0.5;\n user-select: none\n}\n\n.apexcharts-theme-dark .apexcharts-breadcrumb-item:hover:not(.apexcharts-breadcrumb-current) {\n background: rgba(255, 255, 255, 0.12)\n}\n\n.apexcharts-drilldown-loading {\n position: absolute;\n inset: 0;\n z-index: 12;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n font-size: 13px;\n font-family: inherit;\n color: inherit;\n background: rgba(255, 255, 255, 0.62);\n /* The chart underneath stays interactive-looking but must not take clicks\n while a level is resolving, or a second drill can start mid-fetch. */\n cursor: progress\n}\n\n.apexcharts-drilldown-loading-spinner {\n width: 26px;\n height: 26px;\n border-radius: 50%;\n border: 2.5px solid rgba(0, 0, 0, 0.16);\n border-top-color: rgba(0, 0, 0, 0.55);\n animation: apexcharts-drilldown-spin 0.7s linear infinite\n}\n\n.apexcharts-drilldown-loading-text {\n opacity: 0.8\n}\n\n.apexcharts-theme-dark .apexcharts-drilldown-loading {\n background: rgba(30, 30, 30, 0.62)\n}\n\n.apexcharts-theme-dark .apexcharts-drilldown-loading-spinner {\n border-color: rgba(255, 255, 255, 0.22);\n border-top-color: rgba(255, 255, 255, 0.7)\n}\n\n@keyframes apexcharts-drilldown-spin {\n to {\n transform: rotate(360deg)\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n /* Swap the spin for a pulse: opacity only, nothing moves, which is what\n * 2.3.3 asks for while still showing the drill is working.\n *\n * Scoped and !important because the blanket rule at the top of this file\n * would otherwise flatten this fallback too (0.01ms, one iteration), leaving\n * a drill with no loading indication at all: the rule was written but never\n * actually ran. It has to beat that rule on both specificity and origin. */\n .apexcharts-canvas:not(.apexcharts-ignore-reduced-motion)\n .apexcharts-drilldown-loading-spinner {\n animation: apexcharts-drilldown-pulse 1.4s ease-in-out infinite !important\n }\n\n @keyframes apexcharts-drilldown-pulse {\n 0%, 100% {\n opacity: 0.35\n }\n\n 50% {\n opacity: 1\n }\n }\n}\n\n.apexcharts-disable-transitions * {\n transition: none !important;\n}\n/* ── Trellis (#22): small multiples ─────────────────────────────────────── */\n.apexcharts-trellis {\n position: relative;\n}\n.apexcharts-trellis-grid {\n display: grid;\n}\n.apexcharts-trellis-cell {\n min-width: 0;\n position: relative;\n}\n.apexcharts-trellis-header {\n font-size: 12px;\n font-weight: 600;\n line-height: 22px;\n height: 22px;\n text-align: center;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--apx-fore, #373d3f);\n}\n.apexcharts-trellis-title {\n font-size: 14px;\n font-weight: 700;\n padding: 2px 0 6px;\n color: var(--apx-fore, #373d3f);\n}\n/* Edge-label policy: a muted cell hides its axis-label INK, never the label\n SPACE — every panel keeps the identical plot rectangle, and flipping the\n policy on a resize is a class toggle, not a re-render. */\n.apexcharts-trellis-mute-y .apexcharts-yaxis {\n opacity: 0;\n}\n.apexcharts-trellis-mute-x .apexcharts-xaxis {\n opacity: 0;\n}\n/* The shared toolbar floats at the top-right, so a grid that has one starts\n below it: from four columns on, the last cell's header (or a 2-D column\n strip label) would otherwise run under the buttons. One band for the whole\n grid, not per panel. */\n.apexcharts-trellis-has-toolbar {\n padding-top: 24px;\n}\n/* 2-D faceting (P4): column labels once across the top, row labels once\n down the left. The row strip column is auto-sized; panel columns stay\n equal fractions, so panel alignment is independent of the strip width. */\n.apexcharts-trellis-strip {\n font-size: 12px;\n font-weight: 600;\n color: var(--apx-fore, #373d3f);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.apexcharts-trellis-strip-column {\n text-align: center;\n line-height: 22px;\n height: 22px;\n align-self: end;\n}\n.apexcharts-trellis-strip-row {\n align-self: center;\n max-width: 140px;\n padding-right: 6px;\n}\n/* Empty (row, column) combinations. 'placeholder' keeps a REAL panel with a\n quiet label; 'skip' shows the tinted skeleton; 'hide' shows nothing while\n keeping the grid slot. */\n.apexcharts-trellis-cell-empty {\n position: relative;\n}\n.apexcharts-trellis-empty-label {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n color: var(--apx-fore, #373d3f);\n opacity: 0.45;\n pointer-events: none;\n}\n.apexcharts-trellis-cell-hidden > * {\n visibility: hidden;\n}\n/* P5: one shared gradient strip is a heatmap grid's legend. The slot is\n content-sized inline (the strip svg's own box); centering is its own. */\n.apexcharts-trellis-gradient-legend {\n margin: 10px auto 0;\n}\n/* Virtualization (P2): an unmounted panel's mount div reserves the exact\n panel height (inline min-height) so page height and scroll position never\n shift; the skeleton itself is a quiet tinted block. Deliberately not\n animated: a shimmering grid of 200 placeholders is noise. */\n.apexcharts-trellis-panel.apexcharts-trellis-skeleton {\n background: var(--apx-fore, #373d3f);\n opacity: 0.05;\n border-radius: 4px;\n}\n/* tooltip: 'panel' — the group still syncs every panel's crosshair, but only\n the hovered cell shows its tooltip cards. */\n.apexcharts-trellis[data-tooltip-mode='panel'] .apexcharts-trellis-cell:not(:hover) .apexcharts-tooltip,\n.apexcharts-trellis[data-tooltip-mode='panel'] .apexcharts-trellis-cell:not(:hover) .apexcharts-xaxistooltip,\n.apexcharts-trellis[data-tooltip-mode='panel'] .apexcharts-trellis-cell:not(:hover) .apexcharts-yaxistooltip {\n opacity: 0 !important;\n}\n/* tooltip: 'grid' (P3) — ALL per-panel tooltip ink is hidden (the group\n still computes it; the trellis card reads it) and one trellis-owned card\n follows the cursor with one row per panel. */\n.apexcharts-trellis[data-tooltip-mode='grid'] .apexcharts-trellis-cell .apexcharts-tooltip,\n.apexcharts-trellis[data-tooltip-mode='grid'] .apexcharts-trellis-cell .apexcharts-xaxistooltip,\n.apexcharts-trellis[data-tooltip-mode='grid'] .apexcharts-trellis-cell .apexcharts-yaxistooltip {\n opacity: 0 !important;\n}\n.apexcharts-trellis-tooltip {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 14;\n pointer-events: none;\n opacity: 0;\n transition: opacity 0.1s ease;\n background: var(--apx-bg, #fff);\n color: var(--apx-fore, #373d3f);\n border: 1px solid rgba(120, 120, 120, 0.25);\n border-radius: 5px;\n box-shadow: 2px 2px 6px -4px rgba(0, 0, 0, 0.4);\n font-size: 12px;\n min-width: 140px;\n max-width: 320px;\n}\n.apexcharts-trellis-tooltip-active {\n opacity: 1;\n}\n.apexcharts-trellis-tooltip .apexcharts-tooltip-title {\n padding: 5px 10px;\n font-weight: 600;\n background: rgba(120, 120, 120, 0.08);\n border-bottom: 1px solid rgba(120, 120, 120, 0.18);\n margin-bottom: 2px;\n}\n.apexcharts-trellis-tooltip-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 14px;\n padding: 2px 10px;\n line-height: 1.6;\n}\n.apexcharts-trellis-tooltip-row-active {\n background: rgba(120, 120, 120, 0.1);\n font-weight: 600;\n}\n.apexcharts-trellis-tooltip-key {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.apexcharts-trellis-tooltip-vals {\n display: flex;\n gap: 10px;\n white-space: nowrap;\n}\n.apexcharts-trellis-tooltip-val {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n}\n.apexcharts-trellis-tooltip-marker {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n display: inline-block;\n flex: none;\n}\n/* Panel promotion (P3): the promoted cell spans the grid; the rest park.\n The promoted panel is the only visible one, so both its axes unmute. */\n.apexcharts-trellis-cell-promoted {\n grid-column: 1 / -1;\n}\n.apexcharts-trellis-cell-parked {\n display: none;\n}\n.apexcharts-trellis-cell-promoted.apexcharts-trellis-mute-y .apexcharts-yaxis,\n.apexcharts-trellis-cell-promoted.apexcharts-trellis-mute-x .apexcharts-xaxis {\n opacity: 1;\n}\n.apexcharts-trellis-header-clickable {\n cursor: pointer;\n}\n.apexcharts-trellis-header-clickable:hover {\n text-decoration: underline;\n text-underline-offset: 3px;\n}\n.apexcharts-trellis-breadcrumb {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n padding: 2px 0 6px;\n color: var(--apx-fore, #373d3f);\n}\n.apexcharts-trellis-breadcrumb-back {\n border: none;\n background: none;\n padding: 0;\n font-size: 12px;\n cursor: pointer;\n color: var(--apx-accent, #008ffb);\n}\n.apexcharts-trellis-breadcrumb-back:hover {\n text-decoration: underline;\n}\n.apexcharts-trellis-breadcrumb-sep {\n opacity: 0.5;\n}\n.apexcharts-trellis-breadcrumb-current {\n font-weight: 600;\n}\n/* The toolbar download menu (P3). */\n.apexcharts-trellis-menu {\n position: absolute;\n top: 26px;\n right: 0;\n display: none;\n flex-direction: column;\n min-width: 132px;\n background: var(--apx-bg, #fff);\n border: 1px solid rgba(120, 120, 120, 0.25);\n border-radius: 5px;\n box-shadow: 2px 2px 6px -4px rgba(0, 0, 0, 0.4);\n padding: 4px;\n z-index: 15;\n}\n.apexcharts-trellis-menu-open {\n display: flex;\n}\n.apexcharts-trellis-menu-item {\n border: none;\n background: none;\n text-align: left;\n font-size: 12px;\n padding: 5px 8px;\n border-radius: 3px;\n cursor: pointer;\n color: var(--apx-fore, #373d3f);\n}\n.apexcharts-trellis-menu-item:hover {\n background: rgba(120, 120, 120, 0.12);\n}\n.apexcharts-trellis-toolbar {\n position: absolute;\n top: 0;\n right: 0;\n display: flex;\n gap: 2px;\n z-index: 12;\n}\n.apexcharts-trellis-tool {\n border: 0;\n background: transparent;\n padding: 2px;\n cursor: pointer;\n border-radius: 3px;\n color: #6e8192;\n line-height: 0;\n}\n.apexcharts-trellis-tool:hover {\n color: var(--apx-fore, #373d3f);\n}\n.apexcharts-trellis-tool.apexcharts-selected {\n color: var(--apx-accent, #008ffb);\n}\n.apexcharts-trellis-legend {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 4px 14px;\n padding: 8px 10px 2px;\n}\n.apexcharts-trellis-legend-item {\n display: flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n line-height: 1;\n}\n.apexcharts-trellis-legend-item .apexcharts-legend-marker {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n display: inline-block;\n}\n.apexcharts-trellis-legend-item .apexcharts-legend-text {\n font-size: 12px;\n color: var(--apx-fore, #373d3f);\n}\n.apexcharts-trellis-legend-item.apexcharts-inactive-legend {\n opacity: 0.45;\n}\n\n/* Printing (#3352). The sheet is narrower than the screen and nothing reports\n its width to the page, so a chart laid out for the screen would be cropped at\n the edge of the paper. The chart lays itself out again for print (see\n chart.print in the options); this caps whatever is left over so it shrinks to\n fit rather than being cut. Shrink only: a chart narrower than the page keeps\n the size it was drawn at. */\n@media print {\n /* Scoped to the class the chart adds while it is laid out for the sheet: this\n pair of rules is only safe once an identity viewBox is in place, since\n without one a capped width crops the drawing instead of scaling it. A chart\n with chart.print.enabled:false gets neither, and prints as it always did. */\n .apexcharts-canvas.apexcharts-printing,\n .apexcharts-canvas.apexcharts-printing svg {\n max-width: 100% !important;\n }\n\n .apexcharts-canvas.apexcharts-printing svg {\n height: auto !important;\n }\n\n /* A scaled-down SVG is shorter than the box drawn for it, and the wrapper\n carries the pre-scale height inline, so without this a chart shrunk to fit a\n narrow column prints above a white gap the size of what it gave up. The\n host element's own inline min-height is cleared by _beforePrint. */\n .apexcharts-canvas.apexcharts-printing {\n height: auto !important;\n }\n\n .apexcharts-toolbar {\n display: none !important;\n }\n}\n";
28624
28861
  const e = globalThis.console;
28625
28862
  function t(t2, ...s2) {
28626
28863
  e.error(t2, ...s2);
@@ -29225,7 +29462,7 @@ var __async = (__this, __arguments, generator) => {
29225
29462
  if (inShadowRoot) {
29226
29463
  rootNode.prepend(css);
29227
29464
  } else if (this.w.config.chart.injectStyleSheet !== false) {
29228
- doc.head.appendChild(css);
29465
+ doc.head.prepend(css);
29229
29466
  }
29230
29467
  }
29231
29468
  }
@@ -29314,11 +29551,13 @@ var __async = (__this, __arguments, generator) => {
29314
29551
  return null;
29315
29552
  }
29316
29553
  let series = ser;
29554
+ const hiddenAtInit = [];
29317
29555
  ser.forEach((s2, realIndex) => {
29318
29556
  if (s2.hidden) {
29319
29557
  series = this.legend.legendHelpers.getSeriesAfterCollapsing({
29320
29558
  realIndex
29321
29559
  });
29560
+ hiddenAtInit.push(realIndex);
29322
29561
  }
29323
29562
  });
29324
29563
  const combo = CoreUtils.checkComboSeries(series, w.config.chart.type);
@@ -29337,6 +29576,23 @@ var __async = (__this, __arguments, generator) => {
29337
29576
  this._writeParsedCandleData(parsedState.candleData);
29338
29577
  this._writeParsedLabelData(parsedState.labelData);
29339
29578
  this._writeParsedAxisFlags(parsedState.axisFlags);
29579
+ if (overwriteInitialSeries && hiddenAtInit.length) {
29580
+ const baseline = (
29581
+ /** @type {any[]} */
29582
+ gl._initialSeriesPeek || []
29583
+ );
29584
+ const records = (
29585
+ /** @type {any[]} */
29586
+ gl.collapsedSeries.concat(
29587
+ gl.ancillaryCollapsedSeries
29588
+ )
29589
+ );
29590
+ gl.initialSeries = baseline.map((s2, i2) => {
29591
+ if (hiddenAtInit.indexOf(i2) === -1 || !Utils$1.isObject(s2)) return s2;
29592
+ const rec = records.find((c) => c.index === i2);
29593
+ return rec && Array.isArray(rec.data) && rec.data.length ? __spreadProps(__spreadValues({}, s2), { data: rec.data.slice() }) : s2;
29594
+ });
29595
+ }
29340
29596
  (_a = this.rendererController) == null ? void 0 : _a.resolve();
29341
29597
  (_b = this.weave) == null ? void 0 : _b.dispatch("afterParse");
29342
29598
  this.theme.init();
@@ -30298,7 +30554,7 @@ var __async = (__this, __arguments, generator) => {
30298
30554
  );
30299
30555
  return _ApexCharts;
30300
30556
  }
30301
- if (hasChartClass(name2) && !isCustom(name2) || TYPE_ALIASES[name2]) {
30557
+ if (hasChartClass(name2) && !isCustom(name2) || TYPE_ALIASES[name2] || RESERVED_TYPES.includes(name2)) {
30302
30558
  console.warn(
30303
30559
  `[apexcharts] registerSeriesType("${name2}") would override the built-in "${name2}" chart type; pick another name.`
30304
30560
  );