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.
- package/dist/apexcharts.common.js +2 -2
- package/dist/apexcharts.core.js +295 -39
- package/dist/apexcharts.core.min.js +2 -2
- package/dist/apexcharts.css +25 -46
- package/dist/apexcharts.esm.js +266 -203
- package/dist/apexcharts.js +561 -242
- package/dist/apexcharts.min.js +2 -2
- package/dist/apexcharts.ssr.common.js +2 -2
- package/dist/apexcharts.ssr.esm.js +561 -242
- package/dist/area.common.js +1 -1
- package/dist/area.esm.js +1 -1
- package/dist/bar.common.js +1 -1
- package/dist/bar.esm.js +1 -1
- package/dist/bar.js +1 -1
- package/dist/boxPlot.common.js +1 -1
- package/dist/boxPlot.esm.js +1 -1
- package/dist/bubble.common.js +1 -1
- package/dist/bubble.esm.js +1 -1
- package/dist/candlestick.common.js +1 -1
- package/dist/candlestick.esm.js +1 -1
- package/dist/candlestick.js +1 -1
- package/dist/column.common.js +1 -1
- package/dist/column.esm.js +1 -1
- package/dist/core.common.js +2 -2
- package/dist/core.esm.js +295 -39
- package/dist/donut.common.js +2 -2
- package/dist/donut.esm.js +3 -1
- package/dist/dumbbell.common.js +1 -1
- package/dist/dumbbell.esm.js +1 -1
- package/dist/features/all.common.js +2 -2
- package/dist/features/all.esm.js +17 -4
- package/dist/features/annotations.common.js +1 -1
- package/dist/features/annotations.esm.js +1 -1
- package/dist/features/annotations.js +1 -1
- package/dist/features/context-menu.common.js +1 -1
- package/dist/features/context-menu.esm.js +1 -1
- package/dist/features/context-menu.js +1 -1
- package/dist/features/drilldown.common.js +1 -1
- package/dist/features/drilldown.esm.js +1 -1
- package/dist/features/drilldown.js +1 -1
- package/dist/features/dumbbell.common.js +1 -1
- package/dist/features/dumbbell.esm.js +1 -1
- package/dist/features/dumbbell.js +1 -1
- package/dist/features/exports.common.js +1 -1
- package/dist/features/exports.esm.js +1 -1
- package/dist/features/exports.js +1 -1
- package/dist/features/facet.common.js +1 -1
- package/dist/features/facet.esm.js +1 -1
- package/dist/features/facet.js +1 -1
- package/dist/features/history.common.js +1 -1
- package/dist/features/history.esm.js +1 -1
- package/dist/features/history.js +1 -1
- package/dist/features/ink.common.js +1 -1
- package/dist/features/ink.esm.js +1 -1
- package/dist/features/ink.js +1 -1
- package/dist/features/keyboard.common.js +1 -1
- package/dist/features/keyboard.esm.js +1 -1
- package/dist/features/keyboard.js +1 -1
- package/dist/features/legend.common.js +2 -2
- package/dist/features/legend.esm.js +2 -2
- package/dist/features/legend.js +2 -2
- package/dist/features/link.common.js +1 -1
- package/dist/features/link.esm.js +1 -1
- package/dist/features/link.js +1 -1
- package/dist/features/marks.common.js +1 -1
- package/dist/features/marks.esm.js +1 -1
- package/dist/features/marks.js +1 -1
- package/dist/features/measure.common.js +1 -1
- package/dist/features/measure.esm.js +1 -1
- package/dist/features/measure.js +1 -1
- package/dist/features/morph.common.js +1 -1
- package/dist/features/morph.esm.js +1 -1
- package/dist/features/morph.js +1 -1
- package/dist/features/perspectives.common.js +1 -1
- package/dist/features/perspectives.esm.js +1 -1
- package/dist/features/perspectives.js +1 -1
- package/dist/features/raincloud.common.js +1 -1
- package/dist/features/raincloud.esm.js +1 -1
- package/dist/features/raincloud.js +1 -1
- package/dist/features/renderer-canvas.common.js +1 -1
- package/dist/features/renderer-canvas.esm.js +1 -1
- package/dist/features/renderer-canvas.js +1 -1
- package/dist/features/stats.common.js +1 -1
- package/dist/features/stats.esm.js +1 -1
- package/dist/features/stats.js +1 -1
- package/dist/features/storyboard.common.js +1 -1
- package/dist/features/storyboard.esm.js +1 -1
- package/dist/features/storyboard.js +1 -1
- package/dist/features/streamgraph.common.js +1 -1
- package/dist/features/streamgraph.esm.js +1 -1
- package/dist/features/streamgraph.js +1 -1
- package/dist/features/toolbar.common.js +1 -1
- package/dist/features/toolbar.esm.js +1 -1
- package/dist/features/toolbar.js +1 -1
- package/dist/features/trellis.common.js +1 -1
- package/dist/features/trellis.esm.js +1 -1
- package/dist/features/trellis.js +1 -1
- package/dist/features/waterfall.common.js +1 -1
- package/dist/features/waterfall.esm.js +1 -1
- package/dist/features/waterfall.js +1 -1
- package/dist/features/weave.common.js +2 -2
- package/dist/features/weave.esm.js +16 -3
- package/dist/features/weave.js +2 -2
- package/dist/heatmap.common.js +1 -1
- package/dist/heatmap.esm.js +1 -1
- package/dist/heatmap.js +1 -1
- package/dist/histogram.common.js +1 -1
- package/dist/histogram.esm.js +1 -1
- package/dist/icicle.common.js +5 -0
- package/dist/icicle.esm.js +1086 -0
- package/dist/icicle.js +5 -0
- package/dist/line.common.js +1 -1
- package/dist/line.esm.js +1 -1
- package/dist/line.js +1 -1
- package/dist/pictograms.common.js +1 -1
- package/dist/pictograms.esm.js +1 -1
- package/dist/pictograms.js +1 -1
- package/dist/pie.common.js +2 -2
- package/dist/pie.esm.js +3 -1
- package/dist/pie.js +2 -2
- package/dist/polarArea.common.js +2 -2
- package/dist/polarArea.esm.js +3 -1
- package/dist/radar.common.js +1 -1
- package/dist/radar.esm.js +1 -1
- package/dist/radar.js +1 -1
- package/dist/radialBar.common.js +2 -2
- package/dist/radialBar.esm.js +3 -1
- package/dist/radialBar.js +2 -2
- package/dist/raincloud.common.js +1 -1
- package/dist/raincloud.esm.js +1 -1
- package/dist/rangeArea.common.js +1 -1
- package/dist/rangeArea.esm.js +1 -1
- package/dist/rangeBar.common.js +1 -1
- package/dist/rangeBar.esm.js +1 -1
- package/dist/scatter.common.js +1 -1
- package/dist/scatter.esm.js +1 -1
- package/dist/streamgraph.common.js +1 -1
- package/dist/streamgraph.esm.js +1 -1
- package/dist/sunburst.common.js +2 -2
- package/dist/sunburst.esm.js +248 -200
- package/dist/sunburst.js +2 -2
- package/dist/treemap.common.js +1 -1
- package/dist/treemap.esm.js +1 -1
- package/dist/treemap.js +1 -1
- package/dist/unit-shapes.common.js +1 -1
- package/dist/unit-shapes.esm.js +1 -1
- package/dist/unit-shapes.js +1 -1
- package/dist/unit.common.js +1 -1
- package/dist/unit.esm.js +1 -1
- package/dist/unit.js +1 -1
- package/dist/violin.common.js +1 -1
- package/dist/violin.esm.js +1 -1
- package/dist/violin.js +1 -1
- package/dist/waterfall.common.js +1 -1
- package/dist/waterfall.esm.js +1 -1
- package/package.json +6 -1
- package/src/apexcharts.js +69 -4
- package/src/assets/apexcharts.css +25 -46
- package/src/charts/Icicle.js +861 -0
- package/src/charts/Pie.js +15 -0
- package/src/charts/Sunburst.js +58 -243
- package/src/charts/common/partition/NodeTooltip.js +118 -0
- package/src/charts/common/partition/Partition.js +276 -0
- package/src/charts/common/partition/Tint.js +67 -0
- package/src/entries/icicle.js +22 -0
- package/src/modules/Animations.js +40 -1
- package/src/modules/Core.js +21 -1
- package/src/modules/CoreUtils.js +25 -1
- package/src/modules/Data.js +33 -0
- package/src/modules/Range.js +2 -1
- package/src/modules/dimensions/Dimensions.js +13 -1
- package/src/modules/legend/Helpers.js +2 -1
- package/src/modules/settings/Config.js +2 -1
- package/src/modules/settings/Defaults.js +88 -15
- package/src/modules/settings/Globals.js +5 -0
- package/src/modules/settings/Options.js +92 -3
- package/src/modules/settings/TypeAliases.js +16 -0
- package/src/modules/tooltip/Intersect.js +5 -5
- package/src/modules/tooltip/Position.js +4 -3
- package/src/modules/tooltip/Tooltip.js +40 -1
- package/src/modules/tooltip/Utils.js +14 -0
- package/src/modules/weave/PluginAPI.js +12 -1
- package/src/modules/weave/WeaveHost.js +14 -1
- package/src/types/internal.d.ts +7 -0
- package/types/apexcharts.d.ts +223 -2
package/dist/apexcharts.core.js
CHANGED
|
@@ -42,7 +42,7 @@ var __async = (__this, __arguments, generator) => {
|
|
|
42
42
|
});
|
|
43
43
|
};
|
|
44
44
|
/*!
|
|
45
|
-
* ApexCharts v7.
|
|
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
|
|
2479
|
-
// and the
|
|
2480
|
-
//
|
|
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
|
-
|
|
6248
|
-
|
|
6249
|
-
|
|
6250
|
-
|
|
6251
|
-
|
|
6252
|
-
|
|
6253
|
-
|
|
6254
|
-
|
|
6255
|
-
|
|
6256
|
-
|
|
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 =
|
|
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 (
|
|
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((
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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
|
|
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.
|
|
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.
|
|
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
|
);
|