@flux-ui/statistics 3.0.0-next.72 → 3.0.0-next.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/component/index.d.ts +1 -1
  2. package/dist/index.js +94 -76
  3. package/dist/index.js.map +1 -1
  4. package/dist/util/html.d.ts +9 -0
  5. package/dist/util/index.d.ts +1 -0
  6. package/dist/util/options/cartesian/buildCandlestickChartOptions.d.ts +1 -2
  7. package/dist/util/options/circular/buildGaugeChartOptions.d.ts +1 -2
  8. package/package.json +10 -10
  9. package/src/component/FluxStatisticsAreaChart.vue +1 -1
  10. package/src/component/FluxStatisticsBarChart.vue +1 -1
  11. package/src/component/FluxStatisticsBoxPlotChart.vue +1 -1
  12. package/src/component/FluxStatisticsBubbleChart.vue +1 -1
  13. package/src/component/FluxStatisticsCandlestickChart.vue +1 -1
  14. package/src/component/FluxStatisticsDonutChart.vue +1 -1
  15. package/src/component/FluxStatisticsHeatmapChart.vue +1 -1
  16. package/src/component/FluxStatisticsLineChart.vue +1 -1
  17. package/src/component/FluxStatisticsMixedChart.vue +1 -1
  18. package/src/component/FluxStatisticsPercentageBar.vue +1 -1
  19. package/src/component/FluxStatisticsPieChart.vue +1 -1
  20. package/src/component/FluxStatisticsPolarAreaChart.vue +1 -1
  21. package/src/component/FluxStatisticsRadarChart.vue +1 -1
  22. package/src/component/FluxStatisticsRadialBar.vue +1 -1
  23. package/src/component/FluxStatisticsScatterChart.vue +1 -1
  24. package/src/component/FluxStatisticsTreemapChart.vue +1 -1
  25. package/src/component/index.ts +1 -1
  26. package/src/index.ts +2 -2
  27. package/src/util/html.ts +25 -0
  28. package/src/util/icons.ts +3 -1
  29. package/src/util/index.ts +1 -0
  30. package/src/util/options/cartesian/buildCandlestickChartOptions.ts +1 -2
  31. package/src/util/options/circular/buildGaugeChartOptions.ts +1 -2
  32. package/src/util/tooltips/render.ts +7 -5
@@ -14,8 +14,8 @@ export { default as FluxStatisticsDonutChart } from './FluxStatisticsDonutChart.
14
14
  export { default as FluxStatisticsEmpty } from './FluxStatisticsEmpty.vue';
15
15
  export { default as FluxStatisticsGrid } from './FluxStatisticsGrid.vue';
16
16
  export { default as FluxStatisticsHeatmapChart } from './FluxStatisticsHeatmapChart.vue';
17
- export { default as FluxStatisticsLineChart } from './FluxStatisticsLineChart.vue';
18
17
  export { default as FluxStatisticsKpi } from './FluxStatisticsKpi.vue';
18
+ export { default as FluxStatisticsLineChart } from './FluxStatisticsLineChart.vue';
19
19
  export { default as FluxStatisticsLegend } from './FluxStatisticsLegend.vue';
20
20
  export { default as FluxStatisticsLegendItem } from './FluxStatisticsLegendItem.vue';
21
21
  export { default as FluxStatisticsLegendScope } from './FluxStatisticsLegendScope.vue';
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import { FluxIcon, FluxPane, FluxToolbar, FluxTooltip, iconRegistry } from "@flu
4
4
  import { merge } from "lodash-es";
5
5
  import { init } from "echarts/core";
6
6
  //#region ../internals/dist/data/index.js
7
- var oe = `#ef4444`, _e$1 = `#f97316`, Oe = `#f59e0b`, ze = `#eab308`, Xe = `#84cc16`, st = `#22c55e`, vt = `#10b981`, kt = `#14b8a6`, Bt = `#06b6d4`, Zt = `#0ea5e9`, an = `#dbeafe`, sn = `#93c5fd`, ln = `#3b82f6`, dn = `#1d4ed8`, bn = `#6366f1`, jn = `#8b5cf6`, Hn = `#a855f7`, $n = `#d946ef`, ur = `#ec4899`, gr = `#fff1f2`;
7
+ var oe = `#ef4444`, _e$1 = `#f97316`, Oe = `#f59e0b`, ze = `#eab308`, Xe = `#84cc16`, st = `#22c55e`, vt = `#10b981`, kt = `#14b8a6`, Bt = `#06b6d4`, Zt = `#0ea5e9`, an = `#dbeafe`, sn = `#93c5fd`, ln = `#3b82f6`, dn = `#1d4ed8`, bn = `#6366f1`, jn = `#8b5cf6`, Hn = `#a855f7`, $n = `#d946ef`, ur = `#ec4899`, xr = `#f43f5e`;
8
8
  //#endregion
9
9
  //#region src/composable/useChartBaseSetup.ts
10
10
  function useChartBaseSetup() {
@@ -130,13 +130,39 @@ function deepResolveCssVars(value, root) {
130
130
  return changed ? out : value;
131
131
  }
132
132
  //#endregion
133
+ //#region src/util/html.ts
134
+ var HTML_ESCAPES = {
135
+ "&": "&",
136
+ "<": "&lt;",
137
+ ">": "&gt;",
138
+ "\"": "&quot;",
139
+ "'": "&#39;"
140
+ };
141
+ var HTML_PATTERN = /[&<>"']/g;
142
+ var ATTR_PATTERN = /[&<>"]/g;
143
+ /**
144
+ * Escapes a value for safe interpolation into HTML text content.
145
+ */
146
+ function escapeHtml(value) {
147
+ return String(value ?? "").replace(HTML_PATTERN, (char) => HTML_ESCAPES[char]);
148
+ }
149
+ /**
150
+ * Escapes a value for safe interpolation into a double-quoted HTML attribute
151
+ * or inline style value. Prevents attribute breakout from untrusted input.
152
+ */
153
+ function escapeAttr(value) {
154
+ return String(value ?? "").replace(ATTR_PATTERN, (char) => HTML_ESCAPES[char]);
155
+ }
156
+ //#endregion
133
157
  //#region src/util/icons.ts
134
158
  function renderIconSvg(name, color, size = 14) {
135
159
  if (!name) return "";
136
160
  const icon = iconRegistry[name];
137
161
  if (!icon) return "";
138
162
  const [width, height, , , pathData] = icon;
139
- return `<svg viewBox="0 0 ${width} ${height}" width="${size}" height="${size}" focusable="false" aria-hidden="true">${(Array.isArray(pathData) ? pathData : [pathData]).map((d) => `<path d="${d}" fill="${color}"/>`).join("")}</svg>`;
163
+ const paths = Array.isArray(pathData) ? pathData : [pathData];
164
+ const safeColor = escapeAttr(color);
165
+ return `<svg viewBox="0 0 ${width} ${height}" width="${size}" height="${size}" focusable="false" aria-hidden="true">${paths.map((d) => `<path d="${escapeAttr(d)}" fill="${safeColor}"/>`).join("")}</svg>`;
140
166
  }
141
167
  //#endregion
142
168
  //#region src/util/series/chartColors.ts
@@ -6782,7 +6808,7 @@ function friendlyDateTime(dateTimeish) {
6782
6808
  else throw new InvalidArgumentError(`Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`);
6783
6809
  }
6784
6810
  //#endregion
6785
- //#region ../../node_modules/.bun/@basmilius+utils@3.37.0+f2ed1ec6a4c7f7fd/node_modules/@basmilius/utils/dist/index.mjs
6811
+ //#region ../../node_modules/.bun/@basmilius+utils@3.40.0+f2ed1ec6a4c7f7fd/node_modules/@basmilius/utils/dist/index.mjs
6786
6812
  function p$2(e, t = 0) {
6787
6813
  let n = typeof navigator < `u` ? navigator.language : `nl-NL`;
6788
6814
  return new Intl.NumberFormat(n, {
@@ -6822,17 +6848,18 @@ function K(e, t, n) {
6822
6848
  //#region src/util/tooltips/render.ts
6823
6849
  function renderTooltip(t, styles, title, items, activeIndex = -1, valueFormatter) {
6824
6850
  if (items.length === 0) return "";
6825
- const titleHtml = title ? `<div class="${styles.statisticsChartTooltipTitle}">${title}</div>` : "";
6851
+ const titleHtml = title ? `<div class="${styles.statisticsChartTooltipTitle}">${escapeHtml(title)}</div>` : "";
6826
6852
  const hasActive = activeIndex !== -1;
6827
6853
  const body = items.map((item, idx) => {
6828
6854
  const activeClass = !hasActive || idx === activeIndex ? ` ${styles.isActive}` : "";
6829
6855
  const translatedName = item.name ? t(String(item.name)) : "";
6830
- const marker = item.icon ? `<div class="${styles.statisticsChartTooltipSeriesIcon}${activeClass}" style="color: ${item.color}">${renderIconSvg(item.icon, item.color, 14)}</div>` : `<div class="${styles.statisticsChartTooltipSeriesColor}${activeClass}" style="background: ${item.color}"></div>`;
6856
+ const safeColor = escapeAttr(item.color);
6857
+ const marker = item.icon ? `<div class="${styles.statisticsChartTooltipSeriesIcon}${activeClass}" style="color: ${safeColor}">${renderIconSvg(item.icon, item.color, 14)}</div>` : `<div class="${styles.statisticsChartTooltipSeriesColor}${activeClass}" style="background: ${safeColor}"></div>`;
6831
6858
  const display = valueFormatter ? valueFormatter(item.value, item) : formatValue(item.value);
6832
6859
  return `
6833
6860
  ${marker}
6834
- <div class="${styles.statisticsChartTooltipSeriesName}${activeClass}">${translatedName}</div>
6835
- <div class="${styles.statisticsChartTooltipSeriesValue}${activeClass}">${display}</div>
6861
+ <div class="${styles.statisticsChartTooltipSeriesName}${activeClass}">${escapeHtml(translatedName)}</div>
6862
+ <div class="${styles.statisticsChartTooltipSeriesValue}${activeClass}">${escapeHtml(display)}</div>
6836
6863
  `;
6837
6864
  }).join("");
6838
6865
  return `<div class="${styles.statisticsChartTooltip}">${titleHtml}<div class="${styles.statisticsChartTooltipBody}">${body}</div></div>`;
@@ -10740,7 +10767,7 @@ useMode(definition$2);
10740
10767
  useMode(definition$1);
10741
10768
  useMode(definition);
10742
10769
  //#endregion
10743
- //#region ../../node_modules/.bun/@basmilius+http-client@3.37.0+f97c77f67c914c00/node_modules/@basmilius/http-client/dist/index.mjs
10770
+ //#region ../../node_modules/.bun/@basmilius+http-client@3.40.0+24cbb59c6ffe9d25/node_modules/@basmilius/http-client/dist/index.mjs
10744
10771
  function adapter_default(Parent) {
10745
10772
  return class extends Parent {
10746
10773
  constructor(...args) {
@@ -10748,11 +10775,6 @@ function adapter_default(Parent) {
10748
10775
  }
10749
10776
  };
10750
10777
  }
10751
- function bound_default() {
10752
- return (target, method) => {
10753
- target[method] = target[method].bind(target);
10754
- };
10755
- }
10756
10778
  /**
10757
10779
  * Checks if the two given values are equal. When both values are a
10758
10780
  * dto, the check is done by firstly converthing them to JSON.
@@ -10776,7 +10798,7 @@ var TRIGGER = Symbol();
10776
10798
  * Checks if the given object is a dto.
10777
10799
  */
10778
10800
  function isDto_default(obj) {
10779
- return typeof obj === "object" && obj !== null && NAME in obj;
10801
+ return obj && typeof obj === "object" && !!obj[NAME];
10780
10802
  }
10781
10803
  /**
10782
10804
  * Asserts that the given object is a dto.
@@ -10831,9 +10853,6 @@ var markDtoClean = circularProtect_default(function(obj) {
10831
10853
  if (!obj[CHILDREN] || obj[CHILDREN].length === 0) return;
10832
10854
  obj[CHILDREN].filter(isDtoDirty_default).forEach(markDtoClean);
10833
10855
  });
10834
- function isProxiedArray_default(value) {
10835
- return Array.isArray(value) && PARENT in value;
10836
- }
10837
10856
  /**
10838
10857
  * Marks the given dto dirty.
10839
10858
  */
@@ -10860,7 +10879,7 @@ function relateDtoTo_default(dto, parent, key) {
10860
10879
  */
10861
10880
  function relateValueTo_default(dto, key, value) {
10862
10881
  if (isDto_default(value)) relateDtoTo_default(value, dto, key);
10863
- else if (isProxiedArray_default(value)) {
10882
+ else if (Array.isArray(value)) {
10864
10883
  for (const item of value) {
10865
10884
  if (!isDto_default(item)) continue;
10866
10885
  relateDtoTo_default(item, dto, key);
@@ -10892,7 +10911,7 @@ function unrelateDtoFrom_default(dto, parent) {
10892
10911
  */
10893
10912
  function unrelateValueFrom_default(dto, value) {
10894
10913
  if (isDto_default(value)) unrelateDtoFrom_default(value, dto);
10895
- else if (isProxiedArray_default(value)) {
10914
+ else if (Array.isArray(value)) {
10896
10915
  for (const item of value) if (isDto_default(item)) unrelateDtoFrom_default(item, dto);
10897
10916
  value[PARENT] = void 0;
10898
10917
  value[PARENT_KEY] = void 0;
@@ -10936,7 +10955,7 @@ var arrayProxy_default = {
10936
10955
  }
10937
10956
  };
10938
10957
  /**
10939
- * Checks if the proxy should ignore the given key.
10958
+ * Checks if the given key should be ignored by the proxy.
10940
10959
  */
10941
10960
  function ignored(target, key) {
10942
10961
  return typeof key === "symbol" || typeof target[key] === "function" || key === "length";
@@ -10981,7 +11000,7 @@ var instanceProxy_default = {
10981
11000
  const oldValue = descriptor.get?.call(target) ?? void 0;
10982
11001
  if (areEqual_default(value, oldValue)) return true;
10983
11002
  unrelateValueFrom_default(target, oldValue);
10984
- if (Array.isArray(value) && !isProxiedArray_default(value)) value = new Proxy(value, arrayProxy_default);
11003
+ if (Array.isArray(value) && !value[PROXY]) value = new Proxy(value, arrayProxy_default);
10985
11004
  descriptor.set.call(target, value);
10986
11005
  relateValueTo_default(target, key, value);
10987
11006
  markDtoDirty(target, key);
@@ -11105,7 +11124,7 @@ function dto_default(clazz) {
11105
11124
  K(clazz.prototype, DESCRIPTORS, descriptors);
11106
11125
  K(clazz.prototype, NAME, clazz.name);
11107
11126
  K(clazz.prototype, PROPERTIES, properties);
11108
- K(clazz, Symbol.hasInstance, (instance) => typeof instance === "object" && instance !== null && NAME in instance && instance[NAME] === clazz.name);
11127
+ K(clazz, Symbol.hasInstance, (instance) => typeof instance === "object" && instance?.[NAME] === clazz.name);
11109
11128
  G$1(clazz, "clone", clone_default);
11110
11129
  G$1(clazz, "fill", fill_default);
11111
11130
  G$1(clazz, "toJSON", toJSON_default);
@@ -11126,12 +11145,6 @@ function __decorate(decorators, target, key, desc) {
11126
11145
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
11127
11146
  return c > 3 && r && Object.defineProperty(target, key, r), r;
11128
11147
  }
11129
- var X = class {
11130
- test() {
11131
- return true;
11132
- }
11133
- };
11134
- __decorate([bound_default()], X.prototype, "test", null);
11135
11148
  var BlobResponse = class BlobResponse {
11136
11149
  get blob() {
11137
11150
  return this.#blob;
@@ -11244,7 +11257,7 @@ var HttpAdapter = _HttpAdapter = class HttpAdapter {
11244
11257
  const defaultFilename = `download-${DateTime.now().toFormat("yyyy-MM-dd HH-mm-ss")}`;
11245
11258
  if (!header.startsWith("attachment")) return defaultFilename;
11246
11259
  const matches = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/.exec(header);
11247
- if (!matches || matches.length < 2) return defaultFilename;
11260
+ if ((matches?.length || 0) < 2) return defaultFilename;
11248
11261
  return matches[1].replaceAll("'", "").replaceAll("\"", "").replaceAll("/", "-").replaceAll(":", "-");
11249
11262
  }
11250
11263
  static parseRequestError(data, statusCode) {
@@ -11252,7 +11265,12 @@ var HttpAdapter = _HttpAdapter = class HttpAdapter {
11252
11265
  }
11253
11266
  static parseValidationError(data) {
11254
11267
  let errors;
11255
- if (data.errors) errors = Object.fromEntries(Object.entries(data.errors).map(([key, value]) => [key, _HttpAdapter.parseValidationError(value)]));
11268
+ if (data.errors) {
11269
+ errors = {};
11270
+ Object.entries(data.errors).forEach(([key, value]) => {
11271
+ errors[key] = _HttpAdapter.parseValidationError(value);
11272
+ });
11273
+ }
11256
11274
  return new ValidationError_default(data.code, data.error, data.error_description, errors, data.params);
11257
11275
  }
11258
11276
  };
@@ -12015,6 +12033,51 @@ var FluxStatisticsHeatmapChart_default = /* @__PURE__ */ defineComponent({
12015
12033
  };
12016
12034
  }
12017
12035
  });
12036
+ var Kpi_module_default = {
12037
+ statisticsKpiBottom: `statistics-kpi-bottom`,
12038
+ statisticsChange: `statistics-change`,
12039
+ statisticsKpiFooter: `statistics-kpi-footer`,
12040
+ statisticsKpiValue: `statistics-kpi-value`
12041
+ };
12042
+ //#endregion
12043
+ //#region src/component/FluxStatisticsKpi.vue
12044
+ var FluxStatisticsKpi_default = /* @__PURE__ */ defineComponent({
12045
+ __name: "FluxStatisticsKpi",
12046
+ props: {
12047
+ footer: {},
12048
+ change: {},
12049
+ icon: {},
12050
+ title: {},
12051
+ value: {}
12052
+ },
12053
+ setup(__props) {
12054
+ return (_ctx, _cache) => {
12055
+ return openBlock(), createBlock(FluxStatisticsBase_default, {
12056
+ "is-small": "",
12057
+ icon: __props.icon,
12058
+ title: __props.title
12059
+ }, {
12060
+ default: withCtx(() => [createElementVNode("div", { class: normalizeClass(unref(Kpi_module_default).statisticsKpiValue) }, toDisplayString(__props.value), 3), __props.change || __props.footer ? (openBlock(), createElementBlock("div", {
12061
+ key: 0,
12062
+ class: normalizeClass(unref(Kpi_module_default).statisticsKpiBottom)
12063
+ }, [__props.change ? (openBlock(), createBlock(FluxStatisticsChange_default, {
12064
+ key: 0,
12065
+ color: __props.change.color,
12066
+ icon: __props.change.icon,
12067
+ value: __props.change.value
12068
+ }, null, 8, [
12069
+ "color",
12070
+ "icon",
12071
+ "value"
12072
+ ])) : createCommentVNode("", true), __props.footer ? (openBlock(), createElementBlock("span", {
12073
+ key: 1,
12074
+ class: normalizeClass(unref(Kpi_module_default).statisticsKpiFooter)
12075
+ }, toDisplayString(__props.footer), 3)) : createCommentVNode("", true)], 2)) : createCommentVNode("", true)]),
12076
+ _: 1
12077
+ }, 8, ["icon", "title"]);
12078
+ };
12079
+ }
12080
+ });
12018
12081
  //#endregion
12019
12082
  //#region src/component/FluxStatisticsLineChart.vue
12020
12083
  var FluxStatisticsLineChart_default = /* @__PURE__ */ defineComponent({
@@ -12064,51 +12127,6 @@ var FluxStatisticsLineChart_default = /* @__PURE__ */ defineComponent({
12064
12127
  };
12065
12128
  }
12066
12129
  });
12067
- var Kpi_module_default = {
12068
- statisticsKpiBottom: `statistics-kpi-bottom`,
12069
- statisticsChange: `statistics-change`,
12070
- statisticsKpiFooter: `statistics-kpi-footer`,
12071
- statisticsKpiValue: `statistics-kpi-value`
12072
- };
12073
- //#endregion
12074
- //#region src/component/FluxStatisticsKpi.vue
12075
- var FluxStatisticsKpi_default = /* @__PURE__ */ defineComponent({
12076
- __name: "FluxStatisticsKpi",
12077
- props: {
12078
- footer: {},
12079
- change: {},
12080
- icon: {},
12081
- title: {},
12082
- value: {}
12083
- },
12084
- setup(__props) {
12085
- return (_ctx, _cache) => {
12086
- return openBlock(), createBlock(FluxStatisticsBase_default, {
12087
- "is-small": "",
12088
- icon: __props.icon,
12089
- title: __props.title
12090
- }, {
12091
- default: withCtx(() => [createElementVNode("div", { class: normalizeClass(unref(Kpi_module_default).statisticsKpiValue) }, toDisplayString(__props.value), 3), __props.change || __props.footer ? (openBlock(), createElementBlock("div", {
12092
- key: 0,
12093
- class: normalizeClass(unref(Kpi_module_default).statisticsKpiBottom)
12094
- }, [__props.change ? (openBlock(), createBlock(FluxStatisticsChange_default, {
12095
- key: 0,
12096
- color: __props.change.color,
12097
- icon: __props.change.icon,
12098
- value: __props.change.value
12099
- }, null, 8, [
12100
- "color",
12101
- "icon",
12102
- "value"
12103
- ])) : createCommentVNode("", true), __props.footer ? (openBlock(), createElementBlock("span", {
12104
- key: 1,
12105
- class: normalizeClass(unref(Kpi_module_default).statisticsKpiFooter)
12106
- }, toDisplayString(__props.footer), 3)) : createCommentVNode("", true)], 2)) : createCommentVNode("", true)]),
12107
- _: 1
12108
- }, 8, ["icon", "title"]);
12109
- };
12110
- }
12111
- });
12112
12130
  var Legend_module_default = {
12113
12131
  statisticsLegend: `statistics-legend`,
12114
12132
  statisticsChartPaneBody: `statistics-chart-pane-body`,
@@ -12745,7 +12763,7 @@ var CHART_COLORFUL_COLORS = [
12745
12763
  Hn,
12746
12764
  $n,
12747
12765
  ur,
12748
- gr
12766
+ xr
12749
12767
  ];
12750
12768
  //#endregion
12751
12769
  export { CHART_COLORFUL_COLORS, CHART_COLORS, FluxStatisticsAreaChart_default as FluxStatisticsAreaChart, FluxStatisticsBarChart_default as FluxStatisticsBarChart, FluxStatisticsBase_default as FluxStatisticsBase, FluxStatisticsBoxPlotChart_default as FluxStatisticsBoxPlotChart, FluxStatisticsBubbleChart_default as FluxStatisticsBubbleChart, FluxStatisticsCandlestickChart_default as FluxStatisticsCandlestickChart, FluxStatisticsChange_default as FluxStatisticsChange, FluxStatisticsChart_default as FluxStatisticsChart, FluxStatisticsChartLegendInjectionKey, FluxStatisticsChartPane_default as FluxStatisticsChartPane, FluxStatisticsComparison_default as FluxStatisticsComparison, FluxStatisticsDetailsTable_default as FluxStatisticsDetailsTable, FluxStatisticsDetailsTableRow_default as FluxStatisticsDetailsTableRow, FluxStatisticsDonutChart_default as FluxStatisticsDonutChart, FluxStatisticsEmpty_default as FluxStatisticsEmpty, FluxStatisticsGrid_default as FluxStatisticsGrid, FluxStatisticsHeatmapChart_default as FluxStatisticsHeatmapChart, FluxStatisticsKpi_default as FluxStatisticsKpi, FluxStatisticsLegend_default as FluxStatisticsLegend, FluxStatisticsLegendItem_default as FluxStatisticsLegendItem, FluxStatisticsLegendScope_default as FluxStatisticsLegendScope, FluxStatisticsLineChart_default as FluxStatisticsLineChart, FluxStatisticsMeter_default as FluxStatisticsMeter, FluxStatisticsMetric_default as FluxStatisticsMetric, FluxStatisticsMixedChart_default as FluxStatisticsMixedChart, FluxStatisticsPercentageBar_default as FluxStatisticsPercentageBar, FluxStatisticsPieChart_default as FluxStatisticsPieChart, FluxStatisticsPolarAreaChart_default as FluxStatisticsPolarAreaChart, FluxStatisticsRadarChart_default as FluxStatisticsRadarChart, FluxStatisticsRadialBar_default as FluxStatisticsRadialBar, FluxStatisticsScatterChart_default as FluxStatisticsScatterChart, FluxStatisticsSparkline_default as FluxStatisticsSparkline, FluxStatisticsTreemapChart_default as FluxStatisticsTreemapChart, createChartLegendContext, useChartBaseSetup, useChartHoverSync, useChartSeriesSetup, useChartSlicesSetup, useECharts };