@agions/taroviz 1.3.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/index.js +1 -1
  3. package/dist/esm/index.js +1827 -1547
  4. package/package.json +1 -1
  5. package/src/__tests__/integration.test.tsx +12 -10
  6. package/src/adapters/BaseAdapter.ts +116 -0
  7. package/src/adapters/__tests__/index.test.ts +10 -10
  8. package/src/adapters/h5/index.ts +1 -3
  9. package/src/adapters/index.ts +65 -65
  10. package/src/adapters/swan/index.ts +26 -223
  11. package/src/adapters/tt/index.ts +28 -225
  12. package/src/adapters/types.ts +36 -0
  13. package/src/adapters/weapp/index.ts +29 -189
  14. package/src/charts/bar/index.tsx +5 -9
  15. package/src/charts/candlestick/__tests__/index.test.tsx +37 -0
  16. package/src/charts/candlestick/index.tsx +13 -0
  17. package/src/charts/common/BaseChartWrapper.tsx +49 -46
  18. package/src/charts/funnel/index.tsx +5 -9
  19. package/src/charts/gauge/index.tsx +5 -9
  20. package/src/charts/graph/__tests__/index.test.tsx +41 -0
  21. package/src/charts/graph/index.tsx +13 -0
  22. package/src/charts/heatmap/index.tsx +5 -9
  23. package/src/charts/index.ts +6 -1
  24. package/src/charts/line/index.tsx +4 -7
  25. package/src/charts/pie/index.tsx +5 -10
  26. package/src/charts/radar/index.tsx +5 -9
  27. package/src/charts/scatter/index.tsx +5 -9
  28. package/src/charts/types.ts +48 -4
  29. package/src/charts/wordcloud/__tests__/index.test.tsx +36 -0
  30. package/src/charts/wordcloud/index.tsx +13 -0
  31. package/src/core/animation/AnimationManager.ts +15 -0
  32. package/src/core/components/Annotation.tsx +26 -21
  33. package/src/core/components/BaseChart.tsx +280 -1105
  34. package/src/core/components/ErrorBoundary.tsx +4 -1
  35. package/src/core/components/LazyChart.tsx +42 -55
  36. package/src/core/components/hooks/index.ts +20 -0
  37. package/src/core/components/hooks/useChartEvents.ts +143 -0
  38. package/src/core/components/hooks/useChartInit.ts +80 -0
  39. package/src/core/components/hooks/usePerformance.ts +186 -0
  40. package/src/core/components/hooks/useVirtualScroll.ts +156 -0
  41. package/src/core/echarts.ts +1 -1
  42. package/src/core/themes/ThemeManager.ts +31 -15
  43. package/src/core/types/index.ts +2 -2
  44. package/src/core/utils/chartInstances.ts +18 -2
  45. package/src/core/utils/chartUtils.ts +46 -0
  46. package/src/core/utils/codeGenerator/CodeGenerator.ts +19 -5
  47. package/src/core/utils/common.ts +14 -1
  48. package/src/core/utils/export/ExportUtils.ts +13 -22
  49. package/src/core/utils/performance/PerformanceAnalyzer.ts +32 -5
  50. package/src/core/utils/uuid.ts +9 -5
  51. package/src/editor/ThemeEditor.tsx +1 -6
  52. package/src/hooks/__tests__/index.test.tsx +14 -11
  53. package/src/hooks/__tests__/useDataTransform.test.ts +159 -0
  54. package/src/hooks/index.ts +76 -23
  55. package/src/hooks/useDataTransform.ts +503 -0
  56. package/src/index.ts +15 -2
  57. package/src/main.tsx +4 -4
  58. package/src/themes/__tests__/index.test.ts +2 -2
  59. package/src/themes/index.ts +13 -0
package/dist/esm/index.js CHANGED
@@ -1,10 +1,121 @@
1
1
  /******/ var __webpack_modules__ = ({
2
2
 
3
+ /***/ 219
4
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
5
+
6
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
7
+ /* harmony export */ D: () => (/* binding */ BaseAdapter)
8
+ /* harmony export */ });
9
+ /**
10
+ * TaroViz 适配器基类
11
+ * 提供通用方法,减少子类重复代码
12
+ * 注意:这是一个工具基类,不直接实现 Adapter 接口
13
+ * 子类负责实现真正的 Adapter 接口
14
+ */
15
+ var BaseAdapter = /** @class */function () {
16
+ function BaseAdapter(config) {
17
+ if (config === void 0) {
18
+ config = {};
19
+ }
20
+ this.chartInstance = null;
21
+ this.config = config;
22
+ }
23
+ BaseAdapter.prototype.getInstance = function () {
24
+ return this.chartInstance;
25
+ };
26
+ BaseAdapter.prototype.setOption = function (option, opts) {
27
+ if (this.chartInstance) {
28
+ this.chartInstance.setOption(option, opts);
29
+ } else {
30
+ this.config['option'] = option;
31
+ }
32
+ };
33
+ BaseAdapter.prototype.setTheme = function (theme) {
34
+ this.config['theme'] = theme;
35
+ var instance = this.chartInstance;
36
+ if (instance === null || instance === void 0 ? void 0 : instance.setTheme) {
37
+ instance.setTheme(theme);
38
+ }
39
+ };
40
+ BaseAdapter.prototype.getWidth = function () {
41
+ var w = this.config['width'];
42
+ if (typeof w === 'number') return w;
43
+ if (typeof w === 'string') {
44
+ var parsed = parseInt(w, 10);
45
+ if (!isNaN(parsed)) return parsed;
46
+ }
47
+ return 300;
48
+ };
49
+ BaseAdapter.prototype.getHeight = function () {
50
+ var h = this.config['height'];
51
+ if (typeof h === 'number') return h;
52
+ if (typeof h === 'string') {
53
+ var parsed = parseInt(h, 10);
54
+ if (!isNaN(parsed)) return parsed;
55
+ }
56
+ return 300;
57
+ };
58
+ BaseAdapter.prototype.getDom = function () {
59
+ return null;
60
+ };
61
+ BaseAdapter.prototype.convertToDataURL = function (opts) {
62
+ var _a, _b;
63
+ return (_b = (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.getDataURL) === null || _b === void 0 ? void 0 : _b.call(_a, opts);
64
+ };
65
+ BaseAdapter.prototype.clear = function () {
66
+ var _a, _b;
67
+ (_b = (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.clear) === null || _b === void 0 ? void 0 : _b.call(_a);
68
+ };
69
+ BaseAdapter.prototype.on = function (event, handler) {
70
+ var _a, _b;
71
+ (_b = (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.on) === null || _b === void 0 ? void 0 : _b.call(_a, event, handler);
72
+ };
73
+ BaseAdapter.prototype.off = function (event, handler) {
74
+ var _a, _b;
75
+ (_b = (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.off) === null || _b === void 0 ? void 0 : _b.call(_a, event, handler);
76
+ };
77
+ BaseAdapter.prototype.showLoading = function (opts) {
78
+ var _a, _b;
79
+ (_b = (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.showLoading) === null || _b === void 0 ? void 0 : _b.call(_a, opts);
80
+ };
81
+ BaseAdapter.prototype.hideLoading = function () {
82
+ var _a, _b;
83
+ (_b = (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.hideLoading) === null || _b === void 0 ? void 0 : _b.call(_a);
84
+ };
85
+ BaseAdapter.prototype.dispose = function () {
86
+ var _a, _b;
87
+ if (this.chartInstance) {
88
+ (_b = (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.dispose) === null || _b === void 0 ? void 0 : _b.call(_a);
89
+ this.chartInstance = null;
90
+ }
91
+ };
92
+ BaseAdapter.prototype.resize = function (opts) {
93
+ var _a, _b;
94
+ (_b = (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.resize) === null || _b === void 0 ? void 0 : _b.call(_a, opts);
95
+ };
96
+ BaseAdapter.prototype.setComponent = function (component) {
97
+ this.config['component'] = component;
98
+ };
99
+ BaseAdapter.prototype.parseSize = function (value, defaultValue) {
100
+ if (typeof value === 'number') return value;
101
+ if (typeof value === 'string') {
102
+ var parsed = parseInt(value, 10);
103
+ if (!isNaN(parsed)) return parsed;
104
+ }
105
+ return defaultValue;
106
+ };
107
+ return BaseAdapter;
108
+ }();
109
+
110
+
111
+ /***/ },
112
+
3
113
  /***/ 123
4
114
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
5
115
 
116
+ __webpack_require__.r(__webpack_exports__);
6
117
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
7
- /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
118
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
8
119
  /* harmony export */ });
9
120
  /* harmony import */ var echarts_components__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(163);
10
121
  /* harmony import */ var echarts_components__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(echarts_components__WEBPACK_IMPORTED_MODULE_0__);
@@ -64,9 +175,7 @@ var H5Adapter = /** @class */function () {
64
175
  // 获取容器元素
65
176
  var container = ((_a = this.containerRef) === null || _a === void 0 ? void 0 : _a.current) || document.getElementById(this.canvasId);
66
177
  if (!container) {
67
- console.error('[TaroViz] H5Adapter: container not found');
68
- // 如果容器未找到,返回一个空对象
69
- return {};
178
+ throw new Error("[TaroViz] H5Adapter: container not found (canvasId: ".concat(this.canvasId, ")"));
70
179
  }
71
180
  // 初始化图表
72
181
  this.instance = echarts_core__WEBPACK_IMPORTED_MODULE_1__.init(container, this.options.theme, {
@@ -280,8 +389,9 @@ var H5Adapter = /** @class */function () {
280
389
  /***/ 382
281
390
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
282
391
 
392
+ __webpack_require__.r(__webpack_exports__);
283
393
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
284
- /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
394
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
285
395
  /* harmony export */ });
286
396
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(15);
287
397
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
@@ -647,7 +757,120 @@ var harmony = __webpack_require__(382);
647
757
  /**
648
758
  * TaroViz 平台适配器
649
759
  * 自动检测并加载适合当前平台的适配器
760
+ *
761
+ * 使用动态导入实现按需加载,减少包体积
650
762
  */
763
+ var __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {
764
+ function adopt(value) {
765
+ return value instanceof P ? value : new P(function (resolve) {
766
+ resolve(value);
767
+ });
768
+ }
769
+ return new (P || (P = Promise))(function (resolve, reject) {
770
+ function fulfilled(value) {
771
+ try {
772
+ step(generator.next(value));
773
+ } catch (e) {
774
+ reject(e);
775
+ }
776
+ }
777
+ function rejected(value) {
778
+ try {
779
+ step(generator["throw"](value));
780
+ } catch (e) {
781
+ reject(e);
782
+ }
783
+ }
784
+ function step(result) {
785
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
786
+ }
787
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
788
+ });
789
+ };
790
+ var __generator = undefined && undefined.__generator || function (thisArg, body) {
791
+ var _ = {
792
+ label: 0,
793
+ sent: function () {
794
+ if (t[0] & 1) throw t[1];
795
+ return t[1];
796
+ },
797
+ trys: [],
798
+ ops: []
799
+ },
800
+ f,
801
+ y,
802
+ t,
803
+ g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
804
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function () {
805
+ return this;
806
+ }), g;
807
+ function verb(n) {
808
+ return function (v) {
809
+ return step([n, v]);
810
+ };
811
+ }
812
+ function step(op) {
813
+ if (f) throw new TypeError("Generator is already executing.");
814
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
815
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
816
+ if (y = 0, t) op = [op[0] & 2, t.value];
817
+ switch (op[0]) {
818
+ case 0:
819
+ case 1:
820
+ t = op;
821
+ break;
822
+ case 4:
823
+ _.label++;
824
+ return {
825
+ value: op[1],
826
+ done: false
827
+ };
828
+ case 5:
829
+ _.label++;
830
+ y = op[1];
831
+ op = [0];
832
+ continue;
833
+ case 7:
834
+ op = _.ops.pop();
835
+ _.trys.pop();
836
+ continue;
837
+ default:
838
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
839
+ _ = 0;
840
+ continue;
841
+ }
842
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
843
+ _.label = op[1];
844
+ break;
845
+ }
846
+ if (op[0] === 6 && _.label < t[1]) {
847
+ _.label = t[1];
848
+ t = op;
849
+ break;
850
+ }
851
+ if (t && _.label < t[2]) {
852
+ _.label = t[2];
853
+ _.ops.push(op);
854
+ break;
855
+ }
856
+ if (t[2]) _.ops.pop();
857
+ _.trys.pop();
858
+ continue;
859
+ }
860
+ op = body.call(thisArg, _);
861
+ } catch (e) {
862
+ op = [6, e];
863
+ y = 0;
864
+ } finally {
865
+ f = t = 0;
866
+ }
867
+ if (op[0] & 5) throw op[1];
868
+ return {
869
+ value: op[0] ? op[1] : void 0,
870
+ done: true
871
+ };
872
+ }
873
+ };
651
874
  var _a;
652
875
 
653
876
  var PLATFORM_CONFIGS = (_a = {}, _a[PlatformType.H5] = {
@@ -677,6 +900,9 @@ var PLATFORM_CONFIGS = (_a = {}, _a[PlatformType.H5] = {
677
900
  name: 'QiyeWechat'
678
901
  }, _a[PlatformType.LARK] = {
679
902
  name: 'Lark'
903
+ }, _a[PlatformType.KWAI] = {
904
+ name: 'Kwai',
905
+ requireComponent: true
680
906
  }, _a[PlatformType.HARMONY] = {
681
907
  name: 'HarmonyOS',
682
908
  requireComponent: true
@@ -688,58 +914,59 @@ function detectPlatform() {
688
914
  if (typeof window === 'undefined') {
689
915
  return PlatformType.H5;
690
916
  }
917
+ var win = window;
691
918
  var checks = [{
692
919
  test: function () {
693
920
  var _a, _b;
694
- return 'wx' in window && ((_a = window.wx) === null || _a === void 0 ? void 0 : _a.getSystemInfoSync) && !((_b = window.wx) === null || _b === void 0 ? void 0 : _b.qy);
921
+ return !!((_a = win.wx) === null || _a === void 0 ? void 0 : _a.getSystemInfoSync) && !((_b = win.wx) === null || _b === void 0 ? void 0 : _b.qy);
695
922
  },
696
923
  platform: PlatformType.WEAPP
697
924
  }, {
698
925
  test: function () {
699
926
  var _a;
700
- return 'my' in window && ((_a = window.my) === null || _a === void 0 ? void 0 : _a.getSystemInfoSync);
927
+ return !!((_a = win.my) === null || _a === void 0 ? void 0 : _a.getSystemInfoSync);
701
928
  },
702
929
  platform: PlatformType.ALIPAY
703
930
  }, {
704
931
  test: function () {
705
932
  var _a;
706
- return 'swan' in window && ((_a = window.swan) === null || _a === void 0 ? void 0 : _a.getSystemInfoSync);
933
+ return !!((_a = win.swan) === null || _a === void 0 ? void 0 : _a.getSystemInfoSync);
707
934
  },
708
935
  platform: PlatformType.SWAN
709
936
  }, {
710
937
  test: function () {
711
938
  var _a;
712
- return 'tt' in window && ((_a = window.tt) === null || _a === void 0 ? void 0 : _a.getSystemInfoSync);
939
+ return !!((_a = win.tt) === null || _a === void 0 ? void 0 : _a.getSystemInfoSync);
713
940
  },
714
941
  platform: PlatformType.TT
715
942
  }, {
716
943
  test: function () {
717
944
  var _a;
718
- return 'qq' in window && ((_a = window.qq) === null || _a === void 0 ? void 0 : _a.getSystemInfoSync);
945
+ return !!((_a = win.qq) === null || _a === void 0 ? void 0 : _a.getSystemInfoSync);
719
946
  },
720
947
  platform: PlatformType.QQ
721
948
  }, {
722
949
  test: function () {
723
950
  var _a;
724
- return 'jd' in window && ((_a = window.jd) === null || _a === void 0 ? void 0 : _a.getSystemInfoSync);
951
+ return !!((_a = win.jd) === null || _a === void 0 ? void 0 : _a.getSystemInfoSync);
725
952
  },
726
953
  platform: PlatformType.JD
727
954
  }, {
728
955
  test: function () {
729
956
  var _a;
730
- return 'dd' in window && ((_a = window.dd) === null || _a === void 0 ? void 0 : _a.getSystemInfoSync);
957
+ return !!((_a = win.dd) === null || _a === void 0 ? void 0 : _a.getSystemInfoSync);
731
958
  },
732
959
  platform: PlatformType.DD
733
960
  }, {
734
961
  test: function () {
735
962
  var _a;
736
- return 'wx' in window && ((_a = window.wx) === null || _a === void 0 ? void 0 : _a.qy);
963
+ return !!((_a = win.wx) === null || _a === void 0 ? void 0 : _a.qy);
737
964
  },
738
965
  platform: PlatformType.QYWX
739
966
  }, {
740
967
  test: function () {
741
968
  var _a, _b;
742
- return 'tt' in window && ((_b = (_a = window.tt) === null || _a === void 0 ? void 0 : _a.env) === null || _b === void 0 ? void 0 : _b.appName) === 'lark';
969
+ return ((_b = (_a = win.tt) === null || _a === void 0 ? void 0 : _a.env) === null || _b === void 0 ? void 0 : _b.appName) === 'lark';
743
970
  },
744
971
  platform: PlatformType.LARK
745
972
  }, {
@@ -769,52 +996,97 @@ function getEnv() {
769
996
  }
770
997
  return 'unknown';
771
998
  }
772
- /**
773
- * 创建适配器实例
774
- */
775
- function createAdapterInstance(platform, options) {
776
- var _a;
777
- var adapters = (_a = {}, _a[PlatformType.H5] = function () {
778
- return (__webpack_require__(123)/* ["default"] */ .A).create(options);
779
- }, _a[PlatformType.WEAPP] = function () {
780
- return (__webpack_require__(999)/* ["default"] */ .A).create(options);
781
- }, _a[PlatformType.SWAN] = function () {
782
- return (__webpack_require__(85)/* ["default"] */ .A).create(options);
783
- }, _a[PlatformType.TT] = function () {
784
- return (__webpack_require__(280)/* ["default"] */ .A).create(options);
785
- }, _a[PlatformType.HARMONY] = function () {
786
- return (__webpack_require__(382)/* ["default"] */ .A).create(options);
787
- }, _a[PlatformType.ALIPAY] = function () {
788
- return (__webpack_require__(123)/* ["default"] */ .A).create(options);
789
- }, _a[PlatformType.QQ] = function () {
790
- return (__webpack_require__(123)/* ["default"] */ .A).create(options);
791
- }, _a[PlatformType.JD] = function () {
792
- return (__webpack_require__(123)/* ["default"] */ .A).create(options);
793
- }, _a[PlatformType.DD] = function () {
794
- return (__webpack_require__(123)/* ["default"] */ .A).create(options);
795
- }, _a[PlatformType.QYWX] = function () {
796
- return (__webpack_require__(123)/* ["default"] */ .A).create(options);
797
- }, _a[PlatformType.LARK] = function () {
798
- return (__webpack_require__(123)/* ["default"] */ .A).create(options);
799
- }, _a);
800
- return adapters[platform]();
801
- }
802
999
  /**
803
1000
  * 获取适配器
1001
+ * 返回 Promise 以支持动态导入
804
1002
  */
805
1003
  function getAdapter(options) {
806
- var platform = detectPlatform();
807
- var config = PLATFORM_CONFIGS[platform];
808
- // 检查是否需要 component 属性
809
- if ((config === null || config === void 0 ? void 0 : config.requireComponent) && !('component' in options)) {
810
- console.warn("[TaroViz] ".concat(config.name, "Adapter requires component property, fallback to H5Adapter"));
811
- }
812
- try {
813
- return createAdapterInstance(platform, options);
814
- } catch (error) {
815
- console.error("[TaroViz] Failed to load adapter for platform '".concat(platform, "':"), error);
816
- return (__webpack_require__(123)/* ["default"] */ .A).create(options);
817
- }
1004
+ return __awaiter(this, void 0, Promise, function () {
1005
+ var platform, config, _a, h5Adapter, weappAdapter, swanAdapter, ttAdapter, harmonyAdapter, h5Adapter, error_1, h5Adapter;
1006
+ return __generator(this, function (_b) {
1007
+ switch (_b.label) {
1008
+ case 0:
1009
+ platform = detectPlatform();
1010
+ config = PLATFORM_CONFIGS[platform];
1011
+ // 检查是否需要 component 属性
1012
+ if ((config === null || config === void 0 ? void 0 : config.requireComponent) && !('component' in options)) {
1013
+ console.warn("[TaroViz] ".concat(config.name, "Adapter requires component property, fallback to H5Adapter"));
1014
+ }
1015
+ _b.label = 1;
1016
+ case 1:
1017
+ _b.trys.push([1, 15,, 17]);
1018
+ _a = platform;
1019
+ switch (_a) {
1020
+ case PlatformType.H5:
1021
+ return [3 /*break*/, 2];
1022
+ case PlatformType.ALIPAY:
1023
+ return [3 /*break*/, 2];
1024
+ case PlatformType.QQ:
1025
+ return [3 /*break*/, 2];
1026
+ case PlatformType.JD:
1027
+ return [3 /*break*/, 2];
1028
+ case PlatformType.DD:
1029
+ return [3 /*break*/, 2];
1030
+ case PlatformType.QYWX:
1031
+ return [3 /*break*/, 2];
1032
+ case PlatformType.LARK:
1033
+ return [3 /*break*/, 2];
1034
+ case PlatformType.KWAI:
1035
+ return [3 /*break*/, 2];
1036
+ case PlatformType.WEAPP:
1037
+ return [3 /*break*/, 4];
1038
+ case PlatformType.SWAN:
1039
+ return [3 /*break*/, 6];
1040
+ case PlatformType.TT:
1041
+ return [3 /*break*/, 8];
1042
+ case PlatformType.HARMONY:
1043
+ return [3 /*break*/, 10];
1044
+ }
1045
+ return [3 /*break*/, 12];
1046
+ case 2:
1047
+ return [4 /*yield*/, Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 123))];
1048
+ case 3:
1049
+ h5Adapter = _b.sent().default;
1050
+ return [2 /*return*/, h5Adapter.create(options)];
1051
+ case 4:
1052
+ return [4 /*yield*/, Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 999))];
1053
+ case 5:
1054
+ weappAdapter = _b.sent().default;
1055
+ return [2 /*return*/, weappAdapter.create(options)];
1056
+ case 6:
1057
+ return [4 /*yield*/, Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 85))];
1058
+ case 7:
1059
+ swanAdapter = _b.sent().default;
1060
+ return [2 /*return*/, swanAdapter.create(options)];
1061
+ case 8:
1062
+ return [4 /*yield*/, Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 280))];
1063
+ case 9:
1064
+ ttAdapter = _b.sent().default;
1065
+ return [2 /*return*/, ttAdapter.create(options)];
1066
+ case 10:
1067
+ return [4 /*yield*/, Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 382))];
1068
+ case 11:
1069
+ harmonyAdapter = _b.sent().default;
1070
+ return [2 /*return*/, harmonyAdapter.create(options)];
1071
+ case 12:
1072
+ return [4 /*yield*/, Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 123))];
1073
+ case 13:
1074
+ h5Adapter = _b.sent().default;
1075
+ return [2 /*return*/, h5Adapter.create(options)];
1076
+ case 14:
1077
+ return [3 /*break*/, 17];
1078
+ case 15:
1079
+ error_1 = _b.sent();
1080
+ console.error("[TaroViz] Failed to load adapter for platform '".concat(platform, "':"), error_1);
1081
+ return [4 /*yield*/, Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 123))];
1082
+ case 16:
1083
+ h5Adapter = _b.sent().default;
1084
+ return [2 /*return*/, h5Adapter.create(options)];
1085
+ case 17:
1086
+ return [2 /*return*/];
1087
+ }
1088
+ });
1089
+ });
818
1090
  }
819
1091
  // 导出所有适配器
820
1092
 
@@ -830,12 +1102,7 @@ var adapters_version = '1.2.0';
830
1102
  /* harmony default export */ const adapters = ({
831
1103
  getAdapter: getAdapter,
832
1104
  getEnv: getEnv,
833
- detectPlatform: detectPlatform,
834
- h5: (__webpack_require__(123)/* ["default"] */ .A),
835
- weapp: (__webpack_require__(999)/* ["default"] */ .A),
836
- swan: (__webpack_require__(85)/* ["default"] */ .A),
837
- tt: (__webpack_require__(280)/* ["default"] */ .A),
838
- harmony: (__webpack_require__(382)/* ["default"] */ .A)
1105
+ detectPlatform: detectPlatform
839
1106
  });
840
1107
 
841
1108
  /***/ },
@@ -843,70 +1110,55 @@ var adapters_version = '1.2.0';
843
1110
  /***/ 85
844
1111
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
845
1112
 
1113
+ __webpack_require__.r(__webpack_exports__);
846
1114
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
847
- /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
1115
+ /* harmony export */ SwanAdapter: () => (/* binding */ SwanAdapter),
1116
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
848
1117
  /* harmony export */ });
849
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(15);
850
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
851
- var __assign = undefined && undefined.__assign || function () {
852
- __assign = Object.assign || function (t) {
853
- for (var s, i = 1, n = arguments.length; i < n; i++) {
854
- s = arguments[i];
855
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
856
- }
857
- return t;
858
- };
859
- return __assign.apply(this, arguments);
860
- };
1118
+ /* harmony import */ var _BaseAdapter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(219);
861
1119
  /**
862
1120
  * TaroViz 百度小程序适配器
863
1121
  * 基于百度小程序canvas组件实现图表渲染
864
1122
  */
1123
+ var __extends = undefined && undefined.__extends || function () {
1124
+ var extendStatics = function (d, b) {
1125
+ extendStatics = Object.setPrototypeOf || {
1126
+ __proto__: []
1127
+ } instanceof Array && function (d, b) {
1128
+ d.__proto__ = b;
1129
+ } || function (d, b) {
1130
+ for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];
1131
+ };
1132
+ return extendStatics(d, b);
1133
+ };
1134
+ return function (d, b) {
1135
+ if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
1136
+ extendStatics(d, b);
1137
+ function __() {
1138
+ this.constructor = d;
1139
+ }
1140
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
1141
+ };
1142
+ }();
865
1143
 
866
- /**
867
- * 百度小程序环境下的图表适配器
868
- */
869
- var SwanAdapter = /** @class */function () {
870
- /**
871
- * 构造函数
872
- * @param config 适配器配置
873
- */
1144
+ var SwanAdapter = /** @class */function (_super) {
1145
+ __extends(SwanAdapter, _super);
874
1146
  function SwanAdapter(config) {
875
- /**
876
- * 图表实例
877
- */
878
- this.chartInstance = null;
879
- /**
880
- * 组件实例
881
- */
882
- this.component = null;
883
- this.config = config;
884
- this.component = config.component;
1147
+ var _this = _super.call(this, config) || this;
1148
+ _this.component = null;
1149
+ _this.component = config.component;
1150
+ return _this;
885
1151
  }
886
- /**
887
- * 创建百度小程序适配器实例
888
- * @param options 适配器选项
889
- * @returns 适配器实例
890
- */
891
1152
  SwanAdapter.create = function (options) {
892
1153
  return new SwanAdapter(options);
893
1154
  };
894
- /**
895
- * 获取图表实例
896
- */
897
- SwanAdapter.prototype.getInstance = function () {
898
- return this.chartInstance;
899
- };
900
- /**
901
- * 初始化图表
902
- */
903
1155
  SwanAdapter.prototype.init = function () {
904
- var _a = this.config,
905
- canvasId = _a.canvasId,
906
- width = _a.width,
907
- height = _a.height,
908
- theme = _a.theme,
909
- option = _a.option;
1156
+ var config = this.config;
1157
+ var canvasId = config.canvasId,
1158
+ width = config.width,
1159
+ height = config.height,
1160
+ theme = config.theme,
1161
+ option = config.option;
910
1162
  if (!this.component) {
911
1163
  console.error('[TaroViz] SwanAdapter: component is required');
912
1164
  return null;
@@ -915,172 +1167,42 @@ var SwanAdapter = /** @class */function () {
915
1167
  console.error('[TaroViz] SwanAdapter: canvasId is required');
916
1168
  return null;
917
1169
  }
918
- // 创建图表实例
919
1170
  var chart = this.component.createChart({
920
1171
  id: canvasId,
921
1172
  width: width,
922
1173
  height: height,
923
1174
  theme: theme
924
1175
  });
925
- // 设置图表选项
926
1176
  if (option) {
927
1177
  chart.setOption(option);
928
1178
  }
929
- // 存储图表实例
930
1179
  this.chartInstance = chart;
931
- // 初始化回调
932
- if (this.config.onInit) {
933
- this.config.onInit(chart);
1180
+ var onInit = this.config['onInit'];
1181
+ if (onInit) {
1182
+ onInit(chart);
934
1183
  }
935
1184
  return chart;
936
1185
  };
937
- /**
938
- * 设置图表选项
939
- */
940
- SwanAdapter.prototype.setOption = function (option, opts) {
941
- if (this.chartInstance) {
942
- this.chartInstance.setOption(option, opts);
943
- } else {
944
- this.config.option = option;
945
- }
946
- };
947
- /**
948
- * 设置主题
949
- */
950
- SwanAdapter.prototype.setTheme = function (theme) {
951
- var _a, _b;
952
- this.config.theme = theme;
953
- if (this.chartInstance) {
954
- (_b = (_a = this.chartInstance).setTheme) === null || _b === void 0 ? void 0 : _b.call(_a, theme);
955
- }
956
- };
957
- /**
958
- * 获取图表宽度
959
- */
960
1186
  SwanAdapter.prototype.getWidth = function () {
961
- return 0;
1187
+ return this.parseSize(this.config.width, 300);
962
1188
  };
963
- /**
964
- * 获取图表高度
965
- */
966
1189
  SwanAdapter.prototype.getHeight = function () {
967
- return 0;
968
- };
969
- /**
970
- * 获取DOM元素
971
- */
972
- SwanAdapter.prototype.getDom = function () {
973
- return null;
974
- };
975
- /**
976
- * 转换为DataURL
977
- */
978
- SwanAdapter.prototype.convertToDataURL = function (opts) {
979
- var _a;
980
- return (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.getDataURL(opts);
1190
+ return this.parseSize(this.config.height, 300);
981
1191
  };
982
- /**
983
- * 清空图表
984
- */
985
- SwanAdapter.prototype.clear = function () {
986
- if (this.chartInstance) {
987
- this.chartInstance.clear();
988
- }
989
- };
990
- /**
991
- * 绑定事件
992
- */
993
- SwanAdapter.prototype.on = function (event, handler) {
994
- if (this.chartInstance) {
995
- this.chartInstance.on(event, handler);
996
- }
997
- };
998
- /**
999
- * 解绑事件
1000
- */
1001
- SwanAdapter.prototype.off = function (event, handler) {
1002
- if (this.chartInstance) {
1003
- this.chartInstance.off(event, handler);
1004
- }
1005
- };
1006
- /**
1007
- * 显示加载动画
1008
- */
1009
- SwanAdapter.prototype.showLoading = function (opts) {
1010
- if (this.chartInstance) {
1011
- this.chartInstance.showLoading(opts);
1012
- }
1013
- };
1014
- /**
1015
- * 隐藏加载动画
1016
- */
1017
- SwanAdapter.prototype.hideLoading = function () {
1018
- if (this.chartInstance) {
1019
- this.chartInstance.hideLoading();
1020
- }
1021
- };
1022
- /**
1023
- * 销毁图表
1024
- */
1025
- SwanAdapter.prototype.dispose = function () {
1026
- if (this.chartInstance) {
1027
- this.chartInstance.dispose();
1028
- this.chartInstance = null;
1029
- }
1030
- };
1031
- /**
1032
- * 处理图表大小变化
1033
- */
1034
- SwanAdapter.prototype.resize = function (opts) {
1035
- if (this.chartInstance) {
1036
- this.chartInstance.resize(opts);
1037
- }
1038
- };
1039
- /**
1040
- * 设置组件实例
1041
- */
1042
1192
  SwanAdapter.prototype.setComponent = function (component) {
1043
1193
  this.component = component;
1044
1194
  };
1045
- /**
1046
- * 渲染图表组件
1047
- */
1048
- SwanAdapter.prototype.render = function () {
1049
- var _a = this.config,
1050
- _b = _a.canvasId,
1051
- canvasId = _b === void 0 ? 'ec-canvas' : _b,
1052
- _c = _a.width,
1053
- width = _c === void 0 ? '100%' : _c,
1054
- _d = _a.height,
1055
- height = _d === void 0 ? '300px' : _d,
1056
- _e = _a.style,
1057
- style = _e === void 0 ? {} : _e;
1058
- // 注意:这里需要根据实际使用的Taro版本和组件库来调整
1059
- return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement('view', {
1060
- id: canvasId,
1061
- style: __assign({
1062
- width: width,
1063
- height: height
1064
- }, style)
1065
- });
1066
- };
1067
- /**
1068
- * 触发图表行为
1069
- */
1070
- SwanAdapter.prototype.dispatchAction = function (payload) {
1071
- if (this.chartInstance) {
1072
- this.chartInstance.dispatchAction(payload);
1073
- }
1195
+ SwanAdapter.prototype.dispatchAction = function (action) {
1196
+ var _a, _b;
1197
+ (_b = (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.dispatchAction) === null || _b === void 0 ? void 0 : _b.call(_a, action);
1074
1198
  };
1075
- /**
1076
- * 获取DataURL
1077
- */
1078
1199
  SwanAdapter.prototype.getDataURL = function (opts) {
1079
- var _a;
1080
- return (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.getDataURL(opts);
1200
+ var _a, _b;
1201
+ return (_b = (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.getDataURL) === null || _b === void 0 ? void 0 : _b.call(_a, opts);
1081
1202
  };
1082
1203
  return SwanAdapter;
1083
- }();
1204
+ }(_BaseAdapter__WEBPACK_IMPORTED_MODULE_0__/* .BaseAdapter */ .D);
1205
+
1084
1206
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SwanAdapter);
1085
1207
 
1086
1208
  /***/ },
@@ -1088,70 +1210,55 @@ var SwanAdapter = /** @class */function () {
1088
1210
  /***/ 280
1089
1211
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1090
1212
 
1213
+ __webpack_require__.r(__webpack_exports__);
1091
1214
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1092
- /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
1215
+ /* harmony export */ TTAdapter: () => (/* binding */ TTAdapter),
1216
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1093
1217
  /* harmony export */ });
1094
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(15);
1095
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
1096
- var __assign = undefined && undefined.__assign || function () {
1097
- __assign = Object.assign || function (t) {
1098
- for (var s, i = 1, n = arguments.length; i < n; i++) {
1099
- s = arguments[i];
1100
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
1101
- }
1102
- return t;
1103
- };
1104
- return __assign.apply(this, arguments);
1105
- };
1218
+ /* harmony import */ var _BaseAdapter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(219);
1106
1219
  /**
1107
- * TaroViz 字节跳动小程序适配器
1108
- * 基于字节跳动小程序canvas组件实现图表渲染
1220
+ * TaroViz 抖音小程序适配器
1221
+ * 基于抖音小程序canvas组件实现图表渲染
1109
1222
  */
1223
+ var __extends = undefined && undefined.__extends || function () {
1224
+ var extendStatics = function (d, b) {
1225
+ extendStatics = Object.setPrototypeOf || {
1226
+ __proto__: []
1227
+ } instanceof Array && function (d, b) {
1228
+ d.__proto__ = b;
1229
+ } || function (d, b) {
1230
+ for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];
1231
+ };
1232
+ return extendStatics(d, b);
1233
+ };
1234
+ return function (d, b) {
1235
+ if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
1236
+ extendStatics(d, b);
1237
+ function __() {
1238
+ this.constructor = d;
1239
+ }
1240
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
1241
+ };
1242
+ }();
1110
1243
 
1111
- /**
1112
- * 字节跳动小程序环境下的图表适配器
1113
- */
1114
- var TTAdapter = /** @class */function () {
1115
- /**
1116
- * 构造函数
1117
- * @param config 适配器配置
1118
- */
1244
+ var TTAdapter = /** @class */function (_super) {
1245
+ __extends(TTAdapter, _super);
1119
1246
  function TTAdapter(config) {
1120
- /**
1121
- * 图表实例
1122
- */
1123
- this.chartInstance = null;
1124
- /**
1125
- * 组件实例
1126
- */
1127
- this.component = null;
1128
- this.config = config;
1129
- this.component = config.component;
1247
+ var _this = _super.call(this, config) || this;
1248
+ _this.component = null;
1249
+ _this.component = config.component;
1250
+ return _this;
1130
1251
  }
1131
- /**
1132
- * 创建字节跳动小程序适配器实例
1133
- * @param options 适配器选项
1134
- * @returns 适配器实例
1135
- */
1136
1252
  TTAdapter.create = function (options) {
1137
1253
  return new TTAdapter(options);
1138
1254
  };
1139
- /**
1140
- * 获取图表实例
1141
- */
1142
- TTAdapter.prototype.getInstance = function () {
1143
- return this.chartInstance;
1144
- };
1145
- /**
1146
- * 初始化图表
1147
- */
1148
1255
  TTAdapter.prototype.init = function () {
1149
- var _a = this.config,
1150
- canvasId = _a.canvasId,
1151
- width = _a.width,
1152
- height = _a.height,
1153
- theme = _a.theme,
1154
- option = _a.option;
1256
+ var config = this.config;
1257
+ var canvasId = config.canvasId,
1258
+ width = config.width,
1259
+ height = config.height,
1260
+ theme = config.theme,
1261
+ option = config.option;
1155
1262
  if (!this.component) {
1156
1263
  console.error('[TaroViz] TTAdapter: component is required');
1157
1264
  return null;
@@ -1160,172 +1267,42 @@ var TTAdapter = /** @class */function () {
1160
1267
  console.error('[TaroViz] TTAdapter: canvasId is required');
1161
1268
  return null;
1162
1269
  }
1163
- // 创建图表实例
1164
1270
  var chart = this.component.createChart({
1165
1271
  id: canvasId,
1166
1272
  width: width,
1167
1273
  height: height,
1168
1274
  theme: theme
1169
1275
  });
1170
- // 设置图表选项
1171
1276
  if (option) {
1172
1277
  chart.setOption(option);
1173
1278
  }
1174
- // 存储图表实例
1175
1279
  this.chartInstance = chart;
1176
- // 初始化回调
1177
- if (this.config.onInit) {
1178
- this.config.onInit(chart);
1280
+ var onInit = this.config['onInit'];
1281
+ if (onInit) {
1282
+ onInit(chart);
1179
1283
  }
1180
1284
  return chart;
1181
1285
  };
1182
- /**
1183
- * 设置图表选项
1184
- */
1185
- TTAdapter.prototype.setOption = function (option, opts) {
1186
- if (this.chartInstance) {
1187
- this.chartInstance.setOption(option, opts);
1188
- } else {
1189
- this.config.option = option;
1190
- }
1191
- };
1192
- /**
1193
- * 设置主题
1194
- */
1195
- TTAdapter.prototype.setTheme = function (theme) {
1196
- var _a, _b;
1197
- this.config.theme = theme;
1198
- if (this.chartInstance) {
1199
- (_b = (_a = this.chartInstance).setTheme) === null || _b === void 0 ? void 0 : _b.call(_a, theme);
1200
- }
1201
- };
1202
- /**
1203
- * 获取图表宽度
1204
- */
1205
1286
  TTAdapter.prototype.getWidth = function () {
1206
- return 0;
1287
+ return this.parseSize(this.config.width, 300);
1207
1288
  };
1208
- /**
1209
- * 获取图表高度
1210
- */
1211
1289
  TTAdapter.prototype.getHeight = function () {
1212
- return 0;
1213
- };
1214
- /**
1215
- * 获取DOM元素
1216
- */
1217
- TTAdapter.prototype.getDom = function () {
1218
- return null;
1219
- };
1220
- /**
1221
- * 转换为DataURL
1222
- */
1223
- TTAdapter.prototype.convertToDataURL = function (opts) {
1224
- var _a;
1225
- return (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.getDataURL(opts);
1226
- };
1227
- /**
1228
- * 清空图表
1229
- */
1230
- TTAdapter.prototype.clear = function () {
1231
- if (this.chartInstance) {
1232
- this.chartInstance.clear();
1233
- }
1234
- };
1235
- /**
1236
- * 绑定事件
1237
- */
1238
- TTAdapter.prototype.on = function (event, handler) {
1239
- if (this.chartInstance) {
1240
- this.chartInstance.on(event, handler);
1241
- }
1242
- };
1243
- /**
1244
- * 解绑事件
1245
- */
1246
- TTAdapter.prototype.off = function (event, handler) {
1247
- if (this.chartInstance) {
1248
- this.chartInstance.off(event, handler);
1249
- }
1250
- };
1251
- /**
1252
- * 显示加载动画
1253
- */
1254
- TTAdapter.prototype.showLoading = function (opts) {
1255
- if (this.chartInstance) {
1256
- this.chartInstance.showLoading(opts);
1257
- }
1258
- };
1259
- /**
1260
- * 隐藏加载动画
1261
- */
1262
- TTAdapter.prototype.hideLoading = function () {
1263
- if (this.chartInstance) {
1264
- this.chartInstance.hideLoading();
1265
- }
1266
- };
1267
- /**
1268
- * 销毁图表
1269
- */
1270
- TTAdapter.prototype.dispose = function () {
1271
- if (this.chartInstance) {
1272
- this.chartInstance.dispose();
1273
- this.chartInstance = null;
1274
- }
1290
+ return this.parseSize(this.config.height, 300);
1275
1291
  };
1276
- /**
1277
- * 处理图表大小变化
1278
- */
1279
- TTAdapter.prototype.resize = function (opts) {
1280
- if (this.chartInstance) {
1281
- this.chartInstance.resize(opts);
1282
- }
1283
- };
1284
- /**
1285
- * 设置组件实例
1286
- */
1287
1292
  TTAdapter.prototype.setComponent = function (component) {
1288
1293
  this.component = component;
1289
1294
  };
1290
- /**
1291
- * 渲染图表组件
1292
- */
1293
- TTAdapter.prototype.render = function () {
1294
- var _a = this.config,
1295
- _b = _a.canvasId,
1296
- canvasId = _b === void 0 ? 'ec-canvas' : _b,
1297
- _c = _a.width,
1298
- width = _c === void 0 ? '100%' : _c,
1299
- _d = _a.height,
1300
- height = _d === void 0 ? '300px' : _d,
1301
- _e = _a.style,
1302
- style = _e === void 0 ? {} : _e;
1303
- // 注意:这里需要根据实际使用的Taro版本和组件库来调整
1304
- return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement('view', {
1305
- id: canvasId,
1306
- style: __assign({
1307
- width: width,
1308
- height: height
1309
- }, style)
1310
- });
1311
- };
1312
- /**
1313
- * 触发图表行为
1314
- */
1315
- TTAdapter.prototype.dispatchAction = function (payload) {
1316
- if (this.chartInstance) {
1317
- this.chartInstance.dispatchAction(payload);
1318
- }
1295
+ TTAdapter.prototype.dispatchAction = function (action) {
1296
+ var _a, _b;
1297
+ (_b = (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.dispatchAction) === null || _b === void 0 ? void 0 : _b.call(_a, action);
1319
1298
  };
1320
- /**
1321
- * 获取DataURL
1322
- */
1323
1299
  TTAdapter.prototype.getDataURL = function (opts) {
1324
- var _a;
1325
- return (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.getDataURL(opts);
1300
+ var _a, _b;
1301
+ return (_b = (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.getDataURL) === null || _b === void 0 ? void 0 : _b.call(_a, opts);
1326
1302
  };
1327
1303
  return TTAdapter;
1328
- }();
1304
+ }(_BaseAdapter__WEBPACK_IMPORTED_MODULE_0__/* .BaseAdapter */ .D);
1305
+
1329
1306
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TTAdapter);
1330
1307
 
1331
1308
  /***/ },
@@ -1333,229 +1310,99 @@ var TTAdapter = /** @class */function () {
1333
1310
  /***/ 999
1334
1311
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1335
1312
 
1313
+ __webpack_require__.r(__webpack_exports__);
1336
1314
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1337
- /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
1315
+ /* harmony export */ WeappAdapter: () => (/* binding */ WeappAdapter),
1316
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1338
1317
  /* harmony export */ });
1339
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(15);
1340
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
1341
- var __assign = undefined && undefined.__assign || function () {
1342
- __assign = Object.assign || function (t) {
1343
- for (var s, i = 1, n = arguments.length; i < n; i++) {
1344
- s = arguments[i];
1345
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
1346
- }
1347
- return t;
1348
- };
1349
- return __assign.apply(this, arguments);
1350
- };
1318
+ /* harmony import */ var _BaseAdapter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(219);
1351
1319
  /**
1352
1320
  * TaroViz 微信小程序适配器
1353
1321
  * 基于微信小程序canvas组件实现图表渲染
1354
1322
  */
1323
+ var __extends = undefined && undefined.__extends || function () {
1324
+ var extendStatics = function (d, b) {
1325
+ extendStatics = Object.setPrototypeOf || {
1326
+ __proto__: []
1327
+ } instanceof Array && function (d, b) {
1328
+ d.__proto__ = b;
1329
+ } || function (d, b) {
1330
+ for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];
1331
+ };
1332
+ return extendStatics(d, b);
1333
+ };
1334
+ return function (d, b) {
1335
+ if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
1336
+ extendStatics(d, b);
1337
+ function __() {
1338
+ this.constructor = d;
1339
+ }
1340
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
1341
+ };
1342
+ }();
1355
1343
 
1356
- /**
1357
- * 微信小程序环境下的图表适配器
1358
- */
1359
- var WeappAdapter = /** @class */function () {
1360
- /**
1361
- * 构造函数
1362
- * @param config 适配器配置
1363
- */
1344
+ var WeappAdapter = /** @class */function (_super) {
1345
+ __extends(WeappAdapter, _super);
1364
1346
  function WeappAdapter(config) {
1365
- /**
1366
- * 图表实例
1367
- */
1368
- this.chartInstance = null;
1369
- /**
1370
- * 组件实例
1371
- */
1372
- this.component = null;
1373
- this.config = config;
1374
- this.component = config.component;
1347
+ var _this = _super.call(this, config) || this;
1348
+ _this.component = null;
1349
+ _this.component = config.component;
1350
+ return _this;
1375
1351
  }
1376
- /**
1377
- * 创建微信小程序适配器实例
1378
- * @param options 适配器选项
1379
- * @returns 适配器实例
1380
- */
1381
1352
  WeappAdapter.create = function (options) {
1382
1353
  return new WeappAdapter(options);
1383
1354
  };
1384
- /**
1385
- * 获取图表实例
1386
- */
1387
- WeappAdapter.prototype.getInstance = function () {
1388
- return this.chartInstance;
1389
- };
1390
- /**
1391
- * 初始化图表
1392
- */
1393
1355
  WeappAdapter.prototype.init = function () {
1394
- var _a = this.config,
1395
- canvasId = _a.canvasId,
1396
- width = _a.width,
1397
- height = _a.height,
1398
- theme = _a.theme,
1399
- option = _a.option;
1356
+ var config = this.config;
1357
+ var canvasId = config.canvasId,
1358
+ width = config.width,
1359
+ height = config.height,
1360
+ theme = config.theme,
1361
+ option = config.option;
1400
1362
  if (!this.component) {
1401
1363
  console.error('[TaroViz] WeappAdapter: component is required');
1402
1364
  return null;
1403
1365
  }
1404
1366
  if (!canvasId) {
1405
- console.error('[TaroViz] WeappAdapter: canvasId is required');
1406
- return null;
1407
- }
1408
- // 创建图表实例
1409
- var chart = this.component.createChart({
1410
- id: canvasId,
1411
- width: width,
1412
- height: height,
1413
- theme: theme
1414
- });
1415
- // 设置图表选项
1416
- if (option) {
1417
- chart.setOption(option);
1418
- }
1419
- // 存储图表实例
1420
- this.chartInstance = chart;
1421
- // 初始化回调
1422
- if (this.config.onInit) {
1423
- this.config.onInit(chart);
1424
- }
1425
- return chart;
1426
- };
1427
- /**
1428
- * 设置图表选项
1429
- */
1430
- WeappAdapter.prototype.setOption = function (option, opts) {
1431
- if (this.chartInstance) {
1432
- this.chartInstance.setOption(option, opts);
1433
- } else {
1434
- this.config.option = option;
1435
- }
1436
- };
1437
- /**
1438
- * 设置主题
1439
- */
1440
- WeappAdapter.prototype.setTheme = function (theme) {
1441
- var _a, _b;
1442
- this.config.theme = theme;
1443
- if (this.chartInstance) {
1444
- (_b = (_a = this.chartInstance).setTheme) === null || _b === void 0 ? void 0 : _b.call(_a, theme);
1445
- }
1446
- };
1447
- /**
1448
- * 获取图表宽度
1449
- */
1450
- WeappAdapter.prototype.getWidth = function () {
1451
- return 0;
1452
- };
1453
- /**
1454
- * 获取图表高度
1455
- */
1456
- WeappAdapter.prototype.getHeight = function () {
1457
- return 0;
1458
- };
1459
- /**
1460
- * 获取DOM元素
1461
- */
1462
- WeappAdapter.prototype.getDom = function () {
1463
- return null;
1464
- };
1465
- /**
1466
- * 转换为DataURL
1467
- */
1468
- WeappAdapter.prototype.convertToDataURL = function (opts) {
1469
- var _a;
1470
- return (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.getDataURL(opts);
1471
- };
1472
- /**
1473
- * 清空图表
1474
- */
1475
- WeappAdapter.prototype.clear = function () {
1476
- if (this.chartInstance) {
1477
- this.chartInstance.clear();
1478
- }
1479
- };
1480
- /**
1481
- * 绑定事件
1482
- */
1483
- WeappAdapter.prototype.on = function (event, handler) {
1484
- if (this.chartInstance) {
1485
- this.chartInstance.on(event, handler);
1486
- }
1487
- };
1488
- /**
1489
- * 解绑事件
1490
- */
1491
- WeappAdapter.prototype.off = function (event, handler) {
1492
- if (this.chartInstance) {
1493
- this.chartInstance.off(event, handler);
1494
- }
1495
- };
1496
- /**
1497
- * 显示加载动画
1498
- */
1499
- WeappAdapter.prototype.showLoading = function (opts) {
1500
- if (this.chartInstance) {
1501
- this.chartInstance.showLoading(opts);
1367
+ console.error('[TaroViz] WeappAdapter: canvasId is required');
1368
+ return null;
1502
1369
  }
1503
- };
1504
- /**
1505
- * 隐藏加载动画
1506
- */
1507
- WeappAdapter.prototype.hideLoading = function () {
1508
- if (this.chartInstance) {
1509
- this.chartInstance.hideLoading();
1370
+ var chart = this.component.createChart({
1371
+ id: canvasId,
1372
+ width: width,
1373
+ height: height,
1374
+ theme: theme
1375
+ });
1376
+ if (option) {
1377
+ chart.setOption(option);
1510
1378
  }
1511
- };
1512
- /**
1513
- * 销毁图表
1514
- */
1515
- WeappAdapter.prototype.dispose = function () {
1516
- if (this.chartInstance) {
1517
- this.chartInstance.dispose();
1518
- this.chartInstance = null;
1379
+ this.chartInstance = chart;
1380
+ var onInit = this.config['onInit'];
1381
+ if (onInit) {
1382
+ onInit(chart);
1519
1383
  }
1384
+ return chart;
1520
1385
  };
1521
- /**
1522
- * 处理图表大小变化
1523
- */
1524
- WeappAdapter.prototype.resize = function (opts) {
1525
- if (this.chartInstance) {
1526
- this.chartInstance.resize(opts);
1527
- }
1386
+ WeappAdapter.prototype.getWidth = function () {
1387
+ return this.parseSize(this.config.width, 300);
1388
+ };
1389
+ WeappAdapter.prototype.getHeight = function () {
1390
+ return this.parseSize(this.config.height, 300);
1528
1391
  };
1529
- /**
1530
- * 设置组件实例
1531
- */
1532
1392
  WeappAdapter.prototype.setComponent = function (component) {
1533
1393
  this.component = component;
1534
1394
  };
1535
- /**
1536
- * 渲染图表组件
1537
- */
1538
- WeappAdapter.prototype.render = function () {
1539
- var _a = this.config,
1540
- _b = _a.canvasId,
1541
- canvasId = _b === void 0 ? 'ec-canvas' : _b,
1542
- _c = _a.width,
1543
- width = _c === void 0 ? '100%' : _c,
1544
- _d = _a.height,
1545
- height = _d === void 0 ? '300px' : _d,
1546
- _e = _a.style,
1547
- style = _e === void 0 ? {} : _e;
1548
- // 注意:这里需要根据实际使用的Taro版本和组件库来调整
1549
- return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement('view', {
1550
- id: canvasId,
1551
- style: __assign({
1552
- width: width,
1553
- height: height
1554
- }, style)
1555
- });
1395
+ WeappAdapter.prototype.dispatchAction = function (action) {
1396
+ var _a, _b;
1397
+ (_b = (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.dispatchAction) === null || _b === void 0 ? void 0 : _b.call(_a, action);
1398
+ };
1399
+ WeappAdapter.prototype.getDataURL = function (opts) {
1400
+ var _a, _b;
1401
+ return (_b = (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.getDataURL) === null || _b === void 0 ? void 0 : _b.call(_a, opts);
1556
1402
  };
1557
1403
  return WeappAdapter;
1558
- }();
1404
+ }(_BaseAdapter__WEBPACK_IMPORTED_MODULE_0__/* .BaseAdapter */ .D);
1405
+
1559
1406
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (WeappAdapter);
1560
1407
 
1561
1408
  /***/ },
@@ -1582,19 +1429,17 @@ var __assign = undefined && undefined.__assign || function () {
1582
1429
  return __assign.apply(this, arguments);
1583
1430
  };
1584
1431
  /**
1585
- * 柱状图组件
1432
+ * BarChart组件
1586
1433
  */
1587
1434
 
1588
1435
 
1589
1436
 
1590
- /**
1591
- * 柱状图组件
1592
- */
1593
- var BarChart = function (props) {
1437
+ var BarChart = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(function (props) {
1594
1438
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_common_BaseChartWrapper__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A, __assign({}, props, {
1595
1439
  chartType: "bar-chart"
1596
1440
  }));
1597
- };
1441
+ });
1442
+ BarChart.displayName = 'BarChart';
1598
1443
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BarChart);
1599
1444
 
1600
1445
  /***/ },
@@ -1679,6 +1524,121 @@ var BaseChartWrapper_assign = undefined && undefined.__assign || function () {
1679
1524
  };
1680
1525
  return BaseChartWrapper_assign.apply(this, arguments);
1681
1526
  };
1527
+ var __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {
1528
+ function adopt(value) {
1529
+ return value instanceof P ? value : new P(function (resolve) {
1530
+ resolve(value);
1531
+ });
1532
+ }
1533
+ return new (P || (P = Promise))(function (resolve, reject) {
1534
+ function fulfilled(value) {
1535
+ try {
1536
+ step(generator.next(value));
1537
+ } catch (e) {
1538
+ reject(e);
1539
+ }
1540
+ }
1541
+ function rejected(value) {
1542
+ try {
1543
+ step(generator["throw"](value));
1544
+ } catch (e) {
1545
+ reject(e);
1546
+ }
1547
+ }
1548
+ function step(result) {
1549
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
1550
+ }
1551
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
1552
+ });
1553
+ };
1554
+ var __generator = undefined && undefined.__generator || function (thisArg, body) {
1555
+ var _ = {
1556
+ label: 0,
1557
+ sent: function () {
1558
+ if (t[0] & 1) throw t[1];
1559
+ return t[1];
1560
+ },
1561
+ trys: [],
1562
+ ops: []
1563
+ },
1564
+ f,
1565
+ y,
1566
+ t,
1567
+ g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
1568
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function () {
1569
+ return this;
1570
+ }), g;
1571
+ function verb(n) {
1572
+ return function (v) {
1573
+ return step([n, v]);
1574
+ };
1575
+ }
1576
+ function step(op) {
1577
+ if (f) throw new TypeError("Generator is already executing.");
1578
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
1579
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
1580
+ if (y = 0, t) op = [op[0] & 2, t.value];
1581
+ switch (op[0]) {
1582
+ case 0:
1583
+ case 1:
1584
+ t = op;
1585
+ break;
1586
+ case 4:
1587
+ _.label++;
1588
+ return {
1589
+ value: op[1],
1590
+ done: false
1591
+ };
1592
+ case 5:
1593
+ _.label++;
1594
+ y = op[1];
1595
+ op = [0];
1596
+ continue;
1597
+ case 7:
1598
+ op = _.ops.pop();
1599
+ _.trys.pop();
1600
+ continue;
1601
+ default:
1602
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
1603
+ _ = 0;
1604
+ continue;
1605
+ }
1606
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
1607
+ _.label = op[1];
1608
+ break;
1609
+ }
1610
+ if (op[0] === 6 && _.label < t[1]) {
1611
+ _.label = t[1];
1612
+ t = op;
1613
+ break;
1614
+ }
1615
+ if (t && _.label < t[2]) {
1616
+ _.label = t[2];
1617
+ _.ops.push(op);
1618
+ break;
1619
+ }
1620
+ if (t[2]) _.ops.pop();
1621
+ _.trys.pop();
1622
+ continue;
1623
+ }
1624
+ op = body.call(thisArg, _);
1625
+ } catch (e) {
1626
+ op = [6, e];
1627
+ y = 0;
1628
+ } finally {
1629
+ f = t = 0;
1630
+ }
1631
+ if (op[0] & 5) throw op[1];
1632
+ return {
1633
+ value: op[0] ? op[1] : void 0,
1634
+ done: true
1635
+ };
1636
+ }
1637
+ };
1638
+ /**
1639
+ * 基础图表包装组件
1640
+ * 提供统一的图表初始化、渲染和生命周期管理
1641
+ */
1682
1642
 
1683
1643
 
1684
1644
 
@@ -1726,49 +1686,68 @@ var BaseChartWrapper = function (_a) {
1726
1686
  renderer: renderer,
1727
1687
  option: option
1728
1688
  });
1729
- }, [width, height, theme, autoResize, renderer, option, chartType]);
1689
+ }, [width, height, theme, autoResize, renderer, option]);
1730
1690
  // 处理图表初始化
1731
1691
  (0,external_react_.useEffect)(function () {
1732
- var initConfig = processAdapterConfig(BaseChartWrapper_assign(BaseChartWrapper_assign({}, adapterConfig), {
1733
- onInit: function (instance) {
1734
- chartInstance.current = instance;
1735
- // 绑定事件
1736
- if (onEvents) {
1737
- Object.keys(onEvents).forEach(function (eventName) {
1738
- instance.on(eventName, onEvents[eventName]);
1739
- });
1740
- }
1741
- // 初始化回调
1742
- if (onChartInit) {
1743
- onChartInit(instance);
1744
- }
1745
- // 准备好回调
1746
- if (onChartReady) {
1747
- onChartReady(instance);
1748
- }
1749
- }
1750
- }));
1751
- // 获取适配器并初始化
1752
- var adapter = (0,adapters/* getAdapter */.cK)(initConfig);
1753
- adapter.init();
1754
- // 组件卸载时清理
1692
+ var initChart = function () {
1693
+ return __awaiter(void 0, void 0, void 0, function () {
1694
+ var initConfig, adapter;
1695
+ return __generator(this, function (_a) {
1696
+ switch (_a.label) {
1697
+ case 0:
1698
+ initConfig = processAdapterConfig(BaseChartWrapper_assign(BaseChartWrapper_assign({}, adapterConfig), {
1699
+ onInit: function (instance) {
1700
+ chartInstance.current = instance;
1701
+ // 绑定事件
1702
+ if (onEvents) {
1703
+ Object.keys(onEvents).forEach(function (eventName) {
1704
+ instance.on(eventName, onEvents[eventName]);
1705
+ });
1706
+ }
1707
+ // 初始化回调
1708
+ if (onChartInit) {
1709
+ onChartInit(instance);
1710
+ }
1711
+ // 准备好回调
1712
+ if (onChartReady) {
1713
+ onChartReady(instance);
1714
+ }
1715
+ }
1716
+ }));
1717
+ return [4 /*yield*/, (0,adapters/* getAdapter */.cK)(initConfig)];
1718
+ case 1:
1719
+ adapter = _a.sent();
1720
+ adapter.init();
1721
+ // 返回清理函数
1722
+ return [2 /*return*/, function () {
1723
+ if (chartInstance.current) {
1724
+ // 解绑事件
1725
+ if (onEvents) {
1726
+ Object.keys(onEvents).forEach(function (eventName) {
1727
+ var _a;
1728
+ (_a = chartInstance.current) === null || _a === void 0 ? void 0 : _a.off(eventName);
1729
+ });
1730
+ }
1731
+ chartInstance.current.dispose();
1732
+ chartInstance.current = null;
1733
+ }
1734
+ }];
1735
+ }
1736
+ });
1737
+ });
1738
+ };
1739
+ // 执行异步初始化并获取清理函数
1740
+ var cleanupPromise = initChart();
1741
+ // 返回清理函数
1755
1742
  return function () {
1756
- if (chartInstance.current) {
1757
- // 解绑事件
1758
- if (onEvents) {
1759
- Object.keys(onEvents).forEach(function (eventName) {
1760
- var _a;
1761
- (_a = chartInstance.current) === null || _a === void 0 ? void 0 : _a.off(eventName);
1762
- });
1763
- }
1764
- chartInstance.current.dispose();
1765
- chartInstance.current = null;
1766
- }
1743
+ cleanupPromise.then(function (cleanup) {
1744
+ return cleanup === null || cleanup === void 0 ? void 0 : cleanup();
1745
+ });
1767
1746
  };
1768
1747
  }, [adapterConfig, onChartInit, onChartReady, onEvents]);
1769
1748
  // 更新配置
1770
1749
  (0,external_react_.useEffect)(function () {
1771
- if (chartInstance.current) {
1750
+ if (chartInstance.current && option) {
1772
1751
  chartInstance.current.setOption(option, true);
1773
1752
  }
1774
1753
  }, [option]);
@@ -1787,13 +1766,11 @@ var BaseChartWrapper = function (_a) {
1787
1766
  width: typeof width === 'number' ? "".concat(width, "px") : width,
1788
1767
  height: typeof height === 'number' ? "".concat(height, "px") : height
1789
1768
  }, style);
1790
- // 使用带有处理的适配器配置创建适配器实例
1791
- var adapter = (0,adapters/* getAdapter */.cK)(adapterConfig);
1792
1769
  return /*#__PURE__*/external_react_default().createElement("div", {
1793
1770
  className: "taroviz-".concat(chartType, " ").concat(className),
1794
1771
  style: mergedStyle,
1795
1772
  ref: containerRef
1796
- }, safeRenderAdapter(adapter));
1773
+ });
1797
1774
  };
1798
1775
  /* harmony default export */ const common_BaseChartWrapper = (BaseChartWrapper);
1799
1776
 
@@ -1821,19 +1798,17 @@ var __assign = undefined && undefined.__assign || function () {
1821
1798
  return __assign.apply(this, arguments);
1822
1799
  };
1823
1800
  /**
1824
- * 漏斗图组件
1801
+ * FunnelChart组件
1825
1802
  */
1826
1803
 
1827
1804
 
1828
1805
 
1829
- /**
1830
- * 漏斗图组件
1831
- */
1832
- var FunnelChart = function (props) {
1806
+ var FunnelChart = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(function (props) {
1833
1807
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_common_BaseChartWrapper__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A, __assign({}, props, {
1834
1808
  chartType: "funnel-chart"
1835
1809
  }));
1836
- };
1810
+ });
1811
+ FunnelChart.displayName = 'FunnelChart';
1837
1812
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (FunnelChart);
1838
1813
 
1839
1814
  /***/ },
@@ -1860,19 +1835,17 @@ var __assign = undefined && undefined.__assign || function () {
1860
1835
  return __assign.apply(this, arguments);
1861
1836
  };
1862
1837
  /**
1863
- * 仪表盘组件
1838
+ * GaugeChart组件
1864
1839
  */
1865
1840
 
1866
1841
 
1867
1842
 
1868
- /**
1869
- * 仪表盘组件
1870
- */
1871
- var GaugeChart = function (props) {
1843
+ var GaugeChart = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(function (props) {
1872
1844
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_common_BaseChartWrapper__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A, __assign({}, props, {
1873
1845
  chartType: "gauge-chart"
1874
1846
  }));
1875
- };
1847
+ });
1848
+ GaugeChart.displayName = 'GaugeChart';
1876
1849
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (GaugeChart);
1877
1850
 
1878
1851
  /***/ },
@@ -1899,19 +1872,17 @@ var __assign = undefined && undefined.__assign || function () {
1899
1872
  return __assign.apply(this, arguments);
1900
1873
  };
1901
1874
  /**
1902
- * 热力图组件
1875
+ * HeatmapChart组件
1903
1876
  */
1904
1877
 
1905
1878
 
1906
1879
 
1907
- /**
1908
- * 热力图组件
1909
- */
1910
- var HeatmapChart = function (props) {
1880
+ var HeatmapChart = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(function (props) {
1911
1881
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_common_BaseChartWrapper__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A, __assign({}, props, {
1912
1882
  chartType: "heatmap-chart"
1913
1883
  }));
1914
- };
1884
+ });
1885
+ HeatmapChart.displayName = 'HeatmapChart';
1915
1886
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (HeatmapChart);
1916
1887
 
1917
1888
  /***/ },
@@ -1943,14 +1914,12 @@ var __assign = undefined && undefined.__assign || function () {
1943
1914
 
1944
1915
 
1945
1916
 
1946
- /**
1947
- * 折线图组件
1948
- */
1949
- var LineChart = function (props) {
1917
+ var LineChart = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(function (props) {
1950
1918
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_common_BaseChartWrapper__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A, __assign({}, props, {
1951
1919
  chartType: "line-chart"
1952
1920
  }));
1953
- };
1921
+ });
1922
+ LineChart.displayName = 'LineChart';
1954
1923
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LineChart);
1955
1924
 
1956
1925
  /***/ },
@@ -1977,20 +1946,17 @@ var __assign = undefined && undefined.__assign || function () {
1977
1946
  return __assign.apply(this, arguments);
1978
1947
  };
1979
1948
  /**
1980
- * 饼图组件
1949
+ * PieChart组件
1981
1950
  */
1982
1951
 
1983
1952
 
1984
- // 导入统一注册的 echarts
1985
1953
 
1986
- /**
1987
- * 饼图组件
1988
- */
1989
- var PieChart = function (props) {
1954
+ var PieChart = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(function (props) {
1990
1955
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_common_BaseChartWrapper__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A, __assign({}, props, {
1991
1956
  chartType: "pie-chart"
1992
1957
  }));
1993
- };
1958
+ });
1959
+ PieChart.displayName = 'PieChart';
1994
1960
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PieChart);
1995
1961
 
1996
1962
  /***/ },
@@ -2017,19 +1983,17 @@ var __assign = undefined && undefined.__assign || function () {
2017
1983
  return __assign.apply(this, arguments);
2018
1984
  };
2019
1985
  /**
2020
- * 雷达图组件
1986
+ * RadarChart组件
2021
1987
  */
2022
1988
 
2023
1989
 
2024
1990
 
2025
- /**
2026
- * 雷达图组件
2027
- */
2028
- var RadarChart = function (props) {
1991
+ var RadarChart = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(function (props) {
2029
1992
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_common_BaseChartWrapper__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A, __assign({}, props, {
2030
1993
  chartType: "radar-chart"
2031
1994
  }));
2032
- };
1995
+ });
1996
+ RadarChart.displayName = 'RadarChart';
2033
1997
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (RadarChart);
2034
1998
 
2035
1999
  /***/ },
@@ -2095,19 +2059,17 @@ var __assign = undefined && undefined.__assign || function () {
2095
2059
  return __assign.apply(this, arguments);
2096
2060
  };
2097
2061
  /**
2098
- * 散点图组件
2062
+ * ScatterChart组件
2099
2063
  */
2100
2064
 
2101
2065
 
2102
2066
 
2103
- /**
2104
- * 散点图组件
2105
- */
2106
- var ScatterChart = function (props) {
2067
+ var ScatterChart = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(function (props) {
2107
2068
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_common_BaseChartWrapper__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A, __assign({}, props, {
2108
2069
  chartType: "scatter-chart"
2109
2070
  }));
2110
- };
2071
+ });
2072
+ ScatterChart.displayName = 'ScatterChart';
2111
2073
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ScatterChart);
2112
2074
 
2113
2075
  /***/ },
@@ -2362,6 +2324,9 @@ var AnimationManager = /** @class */function () {
2362
2324
  AnimationManager.getInstance = function (config) {
2363
2325
  if (!AnimationManager.instance) {
2364
2326
  AnimationManager.instance = new AnimationManager(config);
2327
+ } else if (config) {
2328
+ // 如果传入了新配置,更新配置
2329
+ AnimationManager.instance.updateConfig(config);
2365
2330
  }
2366
2331
  return AnimationManager.instance;
2367
2332
  };
@@ -2544,6 +2509,17 @@ var AnimationManager = /** @class */function () {
2544
2509
  AnimationManager.prototype.updatePerformanceConfig = function (config) {
2545
2510
  this.performanceConfig = __assign(__assign({}, this.performanceConfig), config);
2546
2511
  };
2512
+ /**
2513
+ * 更新配置
2514
+ */
2515
+ AnimationManager.prototype.updateConfig = function (config) {
2516
+ if (config.defaultConfig) {
2517
+ this.defaultConfig = config.defaultConfig;
2518
+ }
2519
+ if (config.performance) {
2520
+ this.updatePerformanceConfig(config.performance);
2521
+ }
2522
+ };
2547
2523
  /**
2548
2524
  * 获取性能配置
2549
2525
  */
@@ -3020,11 +2996,15 @@ var defaultLocalization = new Localization();
3020
2996
  * @returns 唯一标识符字符串
3021
2997
  */
3022
2998
  function uuid() {
3023
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
3024
- var r = Math.random() * 16 | 0;
3025
- var v = c === 'x' ? r : r & 0x3 | 0x8;
3026
- return v.toString(16);
3027
- });
2999
+ var _a;
3000
+ // 使用 crypto API 生成加密安全的 UUID
3001
+ if (typeof ((_a = globalThis.crypto) === null || _a === void 0 ? void 0 : _a.randomUUID) === 'function') {
3002
+ return globalThis.crypto.randomUUID();
3003
+ }
3004
+ // 回退:使用 Math.random() + 时间戳混合
3005
+ var timestamp = Date.now().toString(36);
3006
+ var randomPart = Math.random().toString(36).substring(2, 15);
3007
+ return "".concat(timestamp, "-").concat(randomPart, "-").concat(Math.random().toString(36).substring(2, 10));
3028
3008
  }
3029
3009
  /**
3030
3010
  * 生成简短的唯一标识符
@@ -3307,11 +3287,19 @@ var __webpack_exports__ = {};
3307
3287
  // EXTERNAL MODULE: external "react"
3308
3288
  var external_react_ = __webpack_require__(15);
3309
3289
  var external_react_default = /*#__PURE__*/__webpack_require__.n(external_react_);
3310
- // EXTERNAL MODULE: ./src/adapters/index.ts + 5 modules
3311
- var adapters = __webpack_require__(574);
3312
3290
  // EXTERNAL MODULE: ./src/core/animation/index.ts + 2 modules
3313
- var animation = __webpack_require__(251);
3291
+ var core_animation = __webpack_require__(251);
3314
3292
  ;// ./src/core/utils/chartInstances.ts
3293
+ var __assign = undefined && undefined.__assign || function () {
3294
+ __assign = Object.assign || function (t) {
3295
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
3296
+ s = arguments[i];
3297
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
3298
+ }
3299
+ return t;
3300
+ };
3301
+ return __assign.apply(this, arguments);
3302
+ };
3315
3303
  /**
3316
3304
  * 全局图表实例存储
3317
3305
  */
@@ -3322,6 +3310,15 @@ var CHART_INSTANCES = {};
3322
3310
  * @param instance 图表实例
3323
3311
  */
3324
3312
  function registerChart(id, instance) {
3313
+ // 如果已存在同名ID,先释放旧实例防止内存泄漏
3314
+ if (CHART_INSTANCES[id]) {
3315
+ try {
3316
+ console.warn("[TaroViz] Chart instance '".concat(id, "' already exists, replacing and disposing old instance"));
3317
+ CHART_INSTANCES[id].dispose();
3318
+ } catch (e) {
3319
+ console.warn("Failed to dispose old chart instance: ".concat(id), e);
3320
+ }
3321
+ }
3325
3322
  CHART_INSTANCES[id] = instance;
3326
3323
  }
3327
3324
  /**
@@ -3338,15 +3335,20 @@ function getChart(id) {
3338
3335
  */
3339
3336
  function removeChart(id) {
3340
3337
  if (CHART_INSTANCES[id]) {
3338
+ try {
3339
+ CHART_INSTANCES[id].dispose();
3340
+ } catch (e) {
3341
+ console.warn("Failed to dispose chart on removal: ".concat(id), e);
3342
+ }
3341
3343
  delete CHART_INSTANCES[id];
3342
3344
  }
3343
3345
  }
3344
3346
  /**
3345
3347
  * 获取所有图表实例
3346
- * @returns 所有图表实例
3348
+ * @returns 所有图表实例的浅拷贝
3347
3349
  */
3348
3350
  function getAllCharts() {
3349
- return CHART_INSTANCES;
3351
+ return __assign({}, CHART_INSTANCES);
3350
3352
  }
3351
3353
  /**
3352
3354
  * 清空所有图表实例
@@ -3400,15 +3402,15 @@ var DebugPanelEventType;
3400
3402
  DebugPanelEventType["INFO_UPDATE"] = "debugPanelInfoUpdate";
3401
3403
  })(DebugPanelEventType || (DebugPanelEventType = {}));
3402
3404
  ;// ./src/core/utils/debug/DebugPanel.tsx
3403
- var __assign = undefined && undefined.__assign || function () {
3404
- __assign = Object.assign || function (t) {
3405
+ var DebugPanel_assign = undefined && undefined.__assign || function () {
3406
+ DebugPanel_assign = Object.assign || function (t) {
3405
3407
  for (var s, i = 1, n = arguments.length; i < n; i++) {
3406
3408
  s = arguments[i];
3407
3409
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
3408
3410
  }
3409
3411
  return t;
3410
3412
  };
3411
- return __assign.apply(this, arguments);
3413
+ return DebugPanel_assign.apply(this, arguments);
3412
3414
  };
3413
3415
  /**
3414
3416
  * TaroViz 调试面板组件
@@ -3732,7 +3734,7 @@ var DebugPanel = function (_a) {
3732
3734
  }, "\u91CD\u7F6E\u56FE\u8868")));
3733
3735
  };
3734
3736
  // 构建面板样式
3735
- var panelStyle = __assign(__assign(__assign(__assign(__assign(__assign({
3737
+ var panelStyle = DebugPanel_assign(DebugPanel_assign(DebugPanel_assign(DebugPanel_assign(DebugPanel_assign(DebugPanel_assign({
3736
3738
  position: 'fixed',
3737
3739
  zIndex: 9999,
3738
3740
  backgroundColor: 'rgba(255, 255, 255, 0.95)',
@@ -3774,43 +3776,43 @@ var DebugPanel = function (_a) {
3774
3776
  }, isExpanded ? '▼' : '▶')), isExpanded && (/*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, /*#__PURE__*/external_react_default().createElement("div", {
3775
3777
  style: styles.debugPanelTabs
3776
3778
  }, /*#__PURE__*/external_react_default().createElement("button", {
3777
- style: __assign(__assign({}, styles.debugTab), activeTab === 'instance' && styles.debugTabActive),
3779
+ style: DebugPanel_assign(DebugPanel_assign({}, styles.debugTab), activeTab === 'instance' && styles.debugTabActive),
3778
3780
  onClick: function () {
3779
3781
  return switchTab('instance');
3780
3782
  },
3781
3783
  title: "\u5B9E\u4F8B\u4FE1\u606F"
3782
3784
  }, "\u5B9E\u4F8B"), /*#__PURE__*/external_react_default().createElement("button", {
3783
- style: __assign(__assign({}, styles.debugTab), activeTab === 'config' && styles.debugTabActive),
3785
+ style: DebugPanel_assign(DebugPanel_assign({}, styles.debugTab), activeTab === 'config' && styles.debugTabActive),
3784
3786
  onClick: function () {
3785
3787
  return switchTab('config');
3786
3788
  },
3787
3789
  title: "\u914D\u7F6E\u4FE1\u606F"
3788
3790
  }, "\u914D\u7F6E"), /*#__PURE__*/external_react_default().createElement("button", {
3789
- style: __assign(__assign({}, styles.debugTab), activeTab === 'data' && styles.debugTabActive),
3791
+ style: DebugPanel_assign(DebugPanel_assign({}, styles.debugTab), activeTab === 'data' && styles.debugTabActive),
3790
3792
  onClick: function () {
3791
3793
  return switchTab('data');
3792
3794
  },
3793
3795
  title: "\u6570\u636E\u4FE1\u606F"
3794
3796
  }, "\u6570\u636E"), /*#__PURE__*/external_react_default().createElement("button", {
3795
- style: __assign(__assign({}, styles.debugTab), activeTab === 'performance' && styles.debugTabActive),
3797
+ style: DebugPanel_assign(DebugPanel_assign({}, styles.debugTab), activeTab === 'performance' && styles.debugTabActive),
3796
3798
  onClick: function () {
3797
3799
  return switchTab('performance');
3798
3800
  },
3799
3801
  title: "\u6027\u80FD\u4FE1\u606F"
3800
3802
  }, "\u6027\u80FD"), /*#__PURE__*/external_react_default().createElement("button", {
3801
- style: __assign(__assign({}, styles.debugTab), activeTab === 'events' && styles.debugTabActive),
3803
+ style: DebugPanel_assign(DebugPanel_assign({}, styles.debugTab), activeTab === 'events' && styles.debugTabActive),
3802
3804
  onClick: function () {
3803
3805
  return switchTab('events');
3804
3806
  },
3805
3807
  title: "\u4E8B\u4EF6\u4FE1\u606F"
3806
3808
  }, "\u4E8B\u4EF6"), /*#__PURE__*/external_react_default().createElement("button", {
3807
- style: __assign(__assign({}, styles.debugTab), activeTab === 'errors' && styles.debugTabActive),
3809
+ style: DebugPanel_assign(DebugPanel_assign({}, styles.debugTab), activeTab === 'errors' && styles.debugTabActive),
3808
3810
  onClick: function () {
3809
3811
  return switchTab('errors');
3810
3812
  },
3811
3813
  title: "\u9519\u8BEF\u4FE1\u606F"
3812
3814
  }, "\u9519\u8BEF"), /*#__PURE__*/external_react_default().createElement("button", {
3813
- style: __assign(__assign({}, styles.debugTab), activeTab === 'tools' && styles.debugTabActive),
3815
+ style: DebugPanel_assign(DebugPanel_assign({}, styles.debugTab), activeTab === 'tools' && styles.debugTabActive),
3814
3816
  onClick: function () {
3815
3817
  return switchTab('tools');
3816
3818
  },
@@ -4428,6 +4430,10 @@ var PerformanceAnalyzer = /** @class */function () {
4428
4430
  this.sampleIntervalId = null;
4429
4431
  this.frameRateHistory = [];
4430
4432
  this.lastFrameTime = 0;
4433
+ /**
4434
+ * RAF 动画帧 ID,用于取消
4435
+ */
4436
+ this.rafId = null;
4431
4437
  this.config = PerformanceAnalyzer_assign({
4432
4438
  enabled: true,
4433
4439
  metrics: ['initTime', 'renderTime', 'updateTime', 'dataSize', 'frameRate'],
@@ -4539,32 +4545,53 @@ var PerformanceAnalyzer = /** @class */function () {
4539
4545
  this.stopFrameRateMonitoring();
4540
4546
  this.emit(PerformanceEventType.MONITORING_END);
4541
4547
  };
4548
+ /**
4549
+ * 释放资源
4550
+ * 完全清理性能分析器,包括单例实例
4551
+ */
4552
+ PerformanceAnalyzer.prototype.dispose = function () {
4553
+ this.stop();
4554
+ this.metrics.clear();
4555
+ this.eventHandlers.clear();
4556
+ this.frameRateHistory = [];
4557
+ // 如果是当前单例,清除单例引用
4558
+ if (PerformanceAnalyzer.instance === this) {
4559
+ PerformanceAnalyzer.instance = null;
4560
+ }
4561
+ };
4542
4562
  /**
4543
4563
  * 开始帧率监控
4544
4564
  */
4545
4565
  PerformanceAnalyzer.prototype.startFrameRateMonitoring = function () {
4546
4566
  var _this = this;
4547
4567
  var updateFrameRate = function () {
4568
+ var _a;
4548
4569
  if (!_this.isMonitoring) {
4549
4570
  return;
4550
4571
  }
4551
4572
  var currentTime = performance.now();
4552
4573
  var deltaTime = currentTime - _this.lastFrameTime;
4553
4574
  var frameRate = deltaTime > 0 ? Math.round(1000 / deltaTime) : 0;
4554
- _this.frameRateHistory.push(frameRate);
4555
- if (_this.frameRateHistory.length > 60) {
4575
+ // 使用 config.maxSamples 限制历史记录长度
4576
+ var maxSamples = (_a = _this.config.maxSamples) !== null && _a !== void 0 ? _a : 100;
4577
+ if (_this.frameRateHistory.length >= maxSamples) {
4556
4578
  _this.frameRateHistory.shift();
4557
4579
  }
4580
+ _this.frameRateHistory.push(frameRate);
4558
4581
  _this.lastFrameTime = currentTime;
4559
- requestAnimationFrame(updateFrameRate);
4582
+ _this.rafId = requestAnimationFrame(updateFrameRate);
4560
4583
  };
4561
- requestAnimationFrame(updateFrameRate);
4584
+ this.rafId = requestAnimationFrame(updateFrameRate);
4562
4585
  };
4563
4586
  /**
4564
4587
  * 停止帧率监控
4565
4588
  */
4566
4589
  PerformanceAnalyzer.prototype.stopFrameRateMonitoring = function () {
4567
- // requestAnimationFrame 会自动停止,不需要额外清理
4590
+ // 取消 RAF 循环,防止继续运行
4591
+ if (this.rafId !== null) {
4592
+ cancelAnimationFrame(this.rafId);
4593
+ this.rafId = null;
4594
+ }
4568
4595
  this.frameRateHistory = [];
4569
4596
  };
4570
4597
  /**
@@ -4866,6 +4893,53 @@ var PerformanceAnalyzer = /** @class */function () {
4866
4893
  // 导出默认实例
4867
4894
 
4868
4895
  var performanceAnalyzer = PerformanceAnalyzer.getInstance();
4896
+ ;// ./src/core/utils/chartUtils.ts
4897
+ /**
4898
+ * Normalize size value to CSS string
4899
+ */
4900
+ function normalizeSize(value, fallback) {
4901
+ if (value === undefined) return fallback;
4902
+ return typeof value === 'number' ? "".concat(value, "px") : value;
4903
+ }
4904
+ /**
4905
+ * Calculate total data points in an ECharts option for animation optimization
4906
+ */
4907
+ function calculateDataLength(option) {
4908
+ if (!option) return 0;
4909
+ var count = 0;
4910
+ if (option.series) {
4911
+ var series = Array.isArray(option.series) ? option.series : [option.series];
4912
+ for (var _i = 0, _a = series; _i < _a.length; _i++) {
4913
+ var seriesItem = _a[_i];
4914
+ if (seriesItem.data) {
4915
+ if (Array.isArray(seriesItem.data)) {
4916
+ count += seriesItem.data.length;
4917
+ } else if (typeof seriesItem.data === 'object') {
4918
+ count += Object.keys(seriesItem.data).length;
4919
+ }
4920
+ }
4921
+ }
4922
+ }
4923
+ return count;
4924
+ }
4925
+ /**
4926
+ * Filter data by filter conditions
4927
+ */
4928
+ function filterDataByKeys(data, filters) {
4929
+ if (!filters || Object.keys(filters).length === 0) return data;
4930
+ return data.filter(function (item) {
4931
+ var _a, _b;
4932
+ for (var _i = 0, _c = Object.entries(filters); _i < _c.length; _i++) {
4933
+ var _d = _c[_i],
4934
+ key = _d[0],
4935
+ value = _d[1];
4936
+ if (item[key] !== value && !((_b = (_a = item[key]) === null || _a === void 0 ? void 0 : _a.includes) === null || _b === void 0 ? void 0 : _b.call(_a, value))) return false;
4937
+ }
4938
+ return true;
4939
+ });
4940
+ }
4941
+ // EXTERNAL MODULE: ./src/charts/common/BaseChartWrapper.tsx + 1 modules
4942
+ var BaseChartWrapper = __webpack_require__(412);
4869
4943
  ;// ./src/core/components/BaseChart.tsx
4870
4944
  var BaseChart_assign = undefined && undefined.__assign || function () {
4871
4945
  BaseChart_assign = Object.assign || function (t) {
@@ -4890,18 +4964,15 @@ var BaseChart_assign = undefined && undefined.__assign || function () {
4890
4964
 
4891
4965
 
4892
4966
 
4893
- /**
4894
- * 基础图表组件
4895
- *
4896
- * @param {ChartProps} props - 组件属性
4897
- * @returns {JSX.Element} - 返回的 JSX 元素
4898
- *
4899
- * @description 基础图表组件,所有具体图表组件的基类
4900
- * 负责处理图表的初始化、事件绑定、主题设置等核心逻辑
4901
- */
4967
+
4968
+ // ============================================================================
4969
+ // BaseChart 组件
4970
+ // ============================================================================
4902
4971
  var BaseChart = function (props) {
4903
4972
  var chartId = props.chartId,
4904
4973
  option = props.option,
4974
+ animation = props.animation,
4975
+ debug = props.debug,
4905
4976
  _a = props.width,
4906
4977
  width = _a === void 0 ? '100%' : _a,
4907
4978
  _b = props.height,
@@ -4916,7 +4987,7 @@ var BaseChart = function (props) {
4916
4987
  onDataZoom = props.onDataZoom,
4917
4988
  style = props.style,
4918
4989
  className = props.className,
4919
- children = props.children,
4990
+ _children = props.children,
4920
4991
  _e = props.virtualScroll,
4921
4992
  virtualScroll = _e === void 0 ? false : _e,
4922
4993
  _f = props.virtualScrollPageSize,
@@ -4927,7 +4998,7 @@ var BaseChart = function (props) {
4927
4998
  enablePerformanceMonitoring = _h === void 0 ? false : _h,
4928
4999
  onPerformance = props.onPerformance,
4929
5000
  _j = props.enableZoom,
4930
- enableZoom = _j === void 0 ? false : _j,
5001
+ _enableZoom = _j === void 0 ? false : _j,
4931
5002
  onZoom = props.onZoom,
4932
5003
  _k = props.enableDataFiltering,
4933
5004
  enableDataFiltering = _k === void 0 ? false : _k,
@@ -4948,735 +5019,308 @@ var BaseChart = function (props) {
4948
5019
  customTooltipStyle = props.customTooltipStyle,
4949
5020
  onTooltipShow = props.onTooltipShow,
4950
5021
  onTooltipHide = props.onTooltipHide,
4951
- onExport = props.onExport,
5022
+ _onExport = props.onExport,
4952
5023
  _q = props.linkageConfig,
4953
5024
  linkageConfig = _q === void 0 ? {} : _q,
4954
5025
  onDataUpdate = props.onDataUpdate,
4955
5026
  _r = props.dataUpdateOptions,
4956
5027
  dataUpdateOptions = _r === void 0 ? {} : _r;
4957
- /**
4958
- * 图表容器的引用
4959
- */
4960
- var chartRef = (0,external_react_.useRef)(null);
4961
- /**
4962
- * 图表适配器的引用
4963
- */
4964
- var adapterRef = (0,external_react_.useRef)(null);
4965
- /**
4966
- * 虚拟滚动状态
4967
- */
4968
- var virtualScrollRef = (0,external_react_.useRef)({
4969
- currentPage: 0,
4970
- totalPages: 1,
4971
- totalDataCount: 0,
4972
- startIndex: 0,
4973
- endIndex: 0,
4974
- isScrolling: false
4975
- });
4976
- /**
4977
- * 性能分析器实例引用
4978
- */
4979
- var performanceAnalyzerRef = (0,external_react_.useRef)(null);
4980
- /**
4981
- * 性能监控状态
4982
- */
5028
+ // Refs
5029
+ var chartInstanceRef = (0,external_react_.useRef)(null);
4983
5030
  var performanceRef = (0,external_react_.useRef)({
4984
5031
  initStartTime: 0,
4985
5032
  initEndTime: 0,
4986
5033
  renderStartTime: 0,
4987
5034
  renderEndTime: 0,
4988
5035
  updateStartTime: 0,
4989
- updateEndTime: 0,
4990
- dataSize: 0
5036
+ updateEndTime: 0
5037
+ });
5038
+ var virtualScrollRef = (0,external_react_.useRef)({
5039
+ currentPage: 0,
5040
+ totalPages: 1,
5041
+ totalDataCount: 0,
5042
+ isScrolling: false
4991
5043
  });
4992
- /**
4993
- * 旧的图表配置引用,用于数据更新监听
4994
- */
4995
5044
  var oldOptionRef = (0,external_react_.useRef)(option);
4996
- /**
4997
- * 调试配置引用
4998
- */
5045
+ var adapterRef = (0,external_react_.useRef)(null);
4999
5046
  var debugConfigRef = (0,external_react_.useRef)(null);
5000
- /**
5001
- * 处理调试配置
5002
- */
5003
- var processDebugConfig = function () {
5004
- if (!props.debug) {
5005
- return null;
5006
- }
5007
- if (typeof props.debug === 'boolean') {
5008
- return {
5009
- enabled: props.debug,
5010
- autoExpand: false
5011
- };
5012
- }
5013
- return BaseChart_assign({
5047
+ var performanceAnalyzerRef = (0,external_react_.useRef)(null);
5048
+ // Debug config
5049
+ var debugConfig = (0,external_react_.useMemo)(function () {
5050
+ if (!debug) return null;
5051
+ return typeof debug === 'boolean' ? {
5052
+ enabled: debug,
5053
+ autoExpand: false
5054
+ } : BaseChart_assign({
5014
5055
  enabled: true
5015
- }, props.debug);
5016
- };
5017
- /**
5018
- * 导出图表为DataURL
5019
- * @param options 导出选项
5020
- * @returns 导出的数据URL
5021
- */
5022
- var exportChartToDataURL = function (options) {
5023
- if (options === void 0) {
5024
- options = {};
5025
- }
5026
- if (!adapterRef.current) {
5027
- console.error('Chart adapter not initialized');
5028
- return undefined;
5029
- }
5030
- var _a = options.type,
5031
- type = _a === void 0 ? 'png' : _a,
5032
- _b = options.pixelRatio,
5033
- pixelRatio = _b === void 0 ? 2 : _b,
5034
- _c = options.backgroundColor,
5035
- backgroundColor = _c === void 0 ? 'transparent' : _c;
5036
- var dataURL = adapterRef.current.convertToDataURL({
5037
- type: type,
5038
- pixelRatio: pixelRatio,
5039
- backgroundColor: backgroundColor
5040
- });
5041
- // 触发导出回调
5042
- if (onExport && dataURL) {
5043
- onExport(dataURL, options);
5044
- }
5045
- return dataURL;
5046
- };
5047
- /**
5048
- * 导出图表并下载
5049
- * @param options 导出选项
5050
- */
5051
- var exportChart = function (options) {
5052
- if (options === void 0) {
5053
- options = {};
5054
- }
5055
- var dataURL = exportChartToDataURL(options);
5056
- if (!dataURL) {
5057
- console.error('Failed to export chart');
5058
- return;
5059
- }
5060
- var _a = options.type,
5061
- type = _a === void 0 ? 'png' : _a,
5062
- _b = options.filename,
5063
- filename = _b === void 0 ? "chart-".concat(Date.now()) : _b;
5064
- var fullFilename = "".concat(filename, ".").concat(type);
5065
- // 创建下载链接
5066
- var link = document.createElement('a');
5067
- link.download = fullFilename;
5068
- link.href = dataURL;
5069
- link.click();
5070
- };
5071
- /**
5072
- * 组件实例引用,用于暴露公共方法
5073
- */
5074
- var chartInstanceRef = (0,external_react_.useRef)({
5075
- exportChartToDataURL: exportChartToDataURL,
5076
- exportChart: exportChart
5077
- });
5078
- // 暴露组件实例方法
5079
- external_react_default().useImperativeHandle(props, function () {
5080
- return chartInstanceRef.current;
5081
- });
5082
- /**
5083
- * 记录性能数据
5084
- * @param type 性能数据类型
5085
- * @param data 性能数据
5086
- */
5087
- var recordPerformance = function (type, _data) {
5088
- var now = Date.now();
5089
- switch (type) {
5090
- case 'init':
5091
- if (!performanceRef.current.initStartTime) {
5092
- performanceRef.current.initStartTime = now;
5093
- } else {
5094
- performanceRef.current.initEndTime = now;
5095
- var initTime = performanceRef.current.initEndTime - performanceRef.current.initStartTime;
5096
- // 计算数据大小
5097
- var dataSize = JSON.stringify(option).length;
5098
- // 使用性能分析器记录数据
5099
- if (performanceAnalyzerRef.current) {
5100
- performanceAnalyzerRef.current.recordInitTime(initTime);
5101
- performanceAnalyzerRef.current.recordDataSize(option);
5102
- }
5103
- // 触发性能回调
5104
- if (onPerformance) {
5105
- onPerformance({
5106
- renderTime: 0,
5107
- initTime: initTime,
5108
- updateTime: 0,
5109
- dataSize: dataSize
5110
- });
5111
- }
5112
- }
5113
- break;
5114
- case 'render':
5115
- if (!performanceRef.current.renderStartTime) {
5116
- performanceRef.current.renderStartTime = now;
5117
- } else {
5118
- performanceRef.current.renderEndTime = now;
5119
- var renderTime = performanceRef.current.renderEndTime - performanceRef.current.renderStartTime;
5120
- // 计算数据大小
5121
- var dataSize = JSON.stringify(option).length;
5122
- // 使用性能分析器记录数据
5123
- if (performanceAnalyzerRef.current) {
5124
- performanceAnalyzerRef.current.recordRenderTime(renderTime);
5125
- }
5126
- // 触发性能回调
5127
- if (onPerformance) {
5128
- onPerformance({
5129
- renderTime: renderTime,
5130
- initTime: performanceRef.current.initEndTime - performanceRef.current.initStartTime,
5131
- updateTime: 0,
5132
- dataSize: dataSize
5133
- });
5134
- }
5135
- }
5136
- break;
5137
- case 'update':
5138
- if (!performanceRef.current.updateStartTime) {
5139
- performanceRef.current.updateStartTime = now;
5140
- } else {
5141
- performanceRef.current.updateEndTime = now;
5142
- var updateTime = performanceRef.current.updateEndTime - performanceRef.current.updateStartTime;
5143
- // 计算数据大小
5144
- var dataSize = JSON.stringify(option).length;
5145
- // 使用性能分析器记录数据
5146
- if (performanceAnalyzerRef.current) {
5147
- performanceAnalyzerRef.current.recordUpdateTime(updateTime);
5148
- performanceAnalyzerRef.current.recordDataSize(option);
5149
- }
5150
- // 触发性能回调
5151
- if (onPerformance) {
5152
- onPerformance({
5153
- renderTime: 0,
5154
- initTime: 0,
5155
- updateTime: updateTime,
5156
- dataSize: dataSize
5056
+ }, debug);
5057
+ }, [debug]);
5058
+ // Wrapper option that applies virtual scroll + data filtering
5059
+ var wrappedOption = (0,external_react_.useMemo)(function () {
5060
+ if (!option) return undefined;
5061
+ var processed = BaseChart_assign({}, option);
5062
+ // Apply data filtering
5063
+ if (enableDataFiltering && filters && Object.keys(filters).length > 0) {
5064
+ processed = JSON.parse(JSON.stringify(processed));
5065
+ if (processed.series && Array.isArray(processed.series)) {
5066
+ processed.series = processed.series.map(function (s) {
5067
+ if (s.data && Array.isArray(s.data)) {
5068
+ var filtered = filterDataByKeys(s.data, filters);
5069
+ if (onDataFiltered) onDataFiltered(filtered, filters);
5070
+ if (virtualScroll) {
5071
+ virtualScrollRef.current.totalDataCount = filtered.length;
5072
+ virtualScrollRef.current.totalPages = Math.ceil(filtered.length / virtualScrollPageSize);
5073
+ var start = virtualScrollRef.current.currentPage * virtualScrollPageSize;
5074
+ var end = Math.min(start + virtualScrollPageSize + virtualScrollPreloadSize, filtered.length);
5075
+ return BaseChart_assign(BaseChart_assign({}, s), {
5076
+ data: filtered.slice(start, end)
5077
+ });
5078
+ }
5079
+ return BaseChart_assign(BaseChart_assign({}, s), {
5080
+ data: filtered
5157
5081
  });
5158
5082
  }
5159
- }
5160
- break;
5161
- }
5162
- };
5163
- /**
5164
- * 筛选数据
5165
- * @param data 原始数据
5166
- * @param filters 筛选条件
5167
- * @returns 筛选后的数据
5168
- */
5169
- var filterData = function (data, filters) {
5170
- if (!enableDataFiltering || !filters || Object.keys(filters).length === 0) {
5171
- return data;
5172
- }
5173
- return data.filter(function (item) {
5174
- var _a, _b;
5175
- // 遍历所有筛选条件
5176
- for (var _i = 0, _c = Object.entries(filters); _i < _c.length; _i++) {
5177
- var _d = _c[_i],
5178
- key = _d[0],
5179
- value = _d[1];
5180
- // 检查数据项是否满足筛选条件
5181
- if (item[key] !== value && !((_b = (_a = item[key]) === null || _a === void 0 ? void 0 : _a.includes) === null || _b === void 0 ? void 0 : _b.call(_a, value))) {
5182
- return false;
5183
- }
5083
+ return s;
5084
+ });
5184
5085
  }
5185
- return true;
5186
- });
5187
- };
5188
- /**
5189
- * 计算数据长度,用于动画性能优化
5190
- */
5191
- var calculateDataLength = function (option) {
5192
- var count = 0;
5193
- // 计算系列数据长度
5194
- if (option.series) {
5195
- var series = Array.isArray(option.series) ? option.series : [option.series];
5196
- series.forEach(function (seriesItem) {
5197
- if (seriesItem.data) {
5198
- if (Array.isArray(seriesItem.data)) {
5199
- count += seriesItem.data.length;
5200
- } else if (typeof seriesItem.data === 'object') {
5201
- // 处理对象类型数据
5202
- count += Object.keys(seriesItem.data).length;
5203
- }
5204
- }
5086
+ }
5087
+ // Apply animation config
5088
+ var dataLength = calculateDataLength(processed);
5089
+ var animConfig = (0,core_animation/* generateEChartsAnimationConfig */.ek)(animation, dataLength);
5090
+ return BaseChart_assign(BaseChart_assign({}, processed), animConfig);
5091
+ }, [option, animation, enableDataFiltering, filters, virtualScroll, virtualScrollPageSize, virtualScrollPreloadSize, onDataFiltered]);
5092
+ // Internal chartInit that wraps the user's callback
5093
+ var handleChartInit = (0,external_react_.useCallback)(function (instance) {
5094
+ var _a;
5095
+ chartInstanceRef.current = instance;
5096
+ adapterRef.current = instance;
5097
+ // Performance monitoring init
5098
+ if (enablePerformanceMonitoring) {
5099
+ performanceAnalyzerRef.current = PerformanceAnalyzer.getInstance({
5100
+ enabled: true,
5101
+ metrics: ['initTime', 'renderTime', 'updateTime', 'dataSize', 'frameRate'],
5102
+ sampleInterval: 1000,
5103
+ maxSamples: 100,
5104
+ realTime: true,
5105
+ autoStart: true
5205
5106
  });
5206
5107
  }
5207
- return count;
5208
- };
5209
- /**
5210
- * 处理大数据集的虚拟滚动和数据筛选
5211
- * @param originalOption 原始图表配置
5212
- * @returns 处理后的图表配置,只包含当前页的数据和筛选后的数据
5213
- */
5214
- var processVirtualScroll = function (originalOption) {
5215
- if (!originalOption) {
5216
- return originalOption;
5217
- }
5218
- // 深拷贝原始配置,避免修改原始数据
5219
- var processedOption = JSON.parse(JSON.stringify(originalOption));
5220
- // 处理series数据
5221
- if (processedOption.series && Array.isArray(processedOption.series)) {
5222
- // 使用类型断言解决类型不匹配问题
5223
- processedOption.series = processedOption.series.map(function (series) {
5224
- if (series.data && Array.isArray(series.data)) {
5225
- var data = series.data;
5226
- // 应用数据筛选
5227
- var filteredData = filterData(data, filters);
5228
- // 触发数据筛选回调
5229
- if (onDataFiltered) {
5230
- onDataFiltered(filteredData, filters);
5231
- }
5232
- // 应用虚拟滚动
5233
- if (virtualScroll) {
5234
- virtualScrollRef.current.totalDataCount = filteredData.length;
5235
- virtualScrollRef.current.totalPages = Math.ceil(filteredData.length / virtualScrollPageSize);
5236
- // 计算当前页的起始和结束索引
5237
- var startIndex = virtualScrollRef.current.currentPage * virtualScrollPageSize;
5238
- var endIndex = Math.min(startIndex + virtualScrollPageSize + virtualScrollPreloadSize, filteredData.length);
5239
- virtualScrollRef.current.startIndex = startIndex;
5240
- virtualScrollRef.current.endIndex = endIndex;
5241
- // 返回只包含当前页数据的series
5242
- return BaseChart_assign(BaseChart_assign({}, series), {
5243
- data: filteredData.slice(startIndex, endIndex)
5108
+ performanceRef.current.initStartTime = Date.now();
5109
+ // Register for linkage
5110
+ if (chartId) registerChart(chartId, instance);
5111
+ // Setup internal event handlers for linkage + virtual scroll
5112
+ if (instance) {
5113
+ // Click linkage
5114
+ if (linkageConfig.enableClickLinkage && chartId && linkageConfig.linkedChartIds) {
5115
+ instance.on('click', function (params) {
5116
+ linkageConfig.linkedChartIds.forEach(function (lid) {
5117
+ var linked = getChart(lid);
5118
+ if (linked) linked.dispatchAction({
5119
+ type: 'highlight',
5120
+ name: params.name
5244
5121
  });
5245
- }
5246
- // 只应用数据筛选,不应用虚拟滚动
5247
- return BaseChart_assign(BaseChart_assign({}, series), {
5248
- data: filteredData
5249
5122
  });
5250
- }
5251
- return series;
5252
- });
5253
- }
5254
- // 生成动画配置
5255
- var dataLength = calculateDataLength(processedOption);
5256
- var animationOption = (0,animation/* generateEChartsAnimationConfig */.ek)(props.animation, dataLength);
5257
- // 合并动画配置到图表选项
5258
- return BaseChart_assign(BaseChart_assign({}, processedOption), animationOption);
5259
- };
5260
- /**
5261
- * 初始化图表的 useEffect
5262
- *
5263
- * @description 当图表容器 ref 变化时,初始化图表适配器和图表实例
5264
- * 负责图表的创建、事件绑定和清理工作
5265
- */
5266
- (0,external_react_.useEffect)(function () {
5267
- if (chartRef.current) {
5268
- // 处理调试配置
5269
- var debugConfig_1 = processDebugConfig();
5270
- debugConfigRef.current = debugConfig_1;
5271
- // 初始化性能分析器
5272
- if (enablePerformanceMonitoring) {
5273
- performanceAnalyzerRef.current = PerformanceAnalyzer.getInstance({
5274
- enabled: true,
5275
- metrics: ['initTime', 'renderTime', 'updateTime', 'dataSize', 'frameRate'],
5276
- sampleInterval: 1000,
5277
- maxSamples: 100,
5278
- realTime: true,
5279
- autoStart: true
5280
- });
5281
- }
5282
- // 开始记录初始化时间
5283
- recordPerformance('init');
5284
- // 处理虚拟滚动
5285
- var processedOption = processVirtualScroll(option);
5286
- // 获取适配器实例
5287
- var chartAdapter_1 = (0,adapters/* getAdapter */.cK)({
5288
- width: width,
5289
- height: height,
5290
- theme: theme,
5291
- option: processedOption,
5292
- onInit: onInit,
5293
- containerRef: chartRef,
5294
- direction: direction
5295
- });
5296
- // 设置组件实例(针对小程序环境)
5297
- if (typeof chartAdapter_1.setComponent === 'function') {
5298
- chartAdapter_1.setComponent({
5299
- createChart: function (_config) {
5300
- // 这里应该根据具体平台实现创建图表的逻辑
5301
- return {};
5302
- }
5303
- });
5304
- }
5305
- // 开始记录渲染时间
5306
- recordPerformance('render');
5307
- // 初始化图表
5308
- var instance_1 = chartAdapter_1.init();
5309
- // 结束记录渲染时间
5310
- recordPerformance('render');
5311
- // 注册图表实例
5312
- if (chartId && instance_1) {
5313
- registerChart(chartId, instance_1);
5314
- }
5315
- // 更新调试信息
5316
- if (debugConfig_1 === null || debugConfig_1 === void 0 ? void 0 : debugConfig_1.enabled) {
5317
- // 更新实例信息
5318
- updateDebugInfo({
5319
- instance: {
5320
- id: chartId,
5321
- type: 'ECharts',
5322
- renderer: 'canvas',
5323
- // 简化处理,使用默认值
5324
- width: typeof width === 'number' ? width : undefined,
5325
- height: typeof height === 'number' ? height : undefined,
5326
- platform: 'web' // 简化处理,使用默认值
5327
- },
5328
- config: processedOption,
5329
- data: {
5330
- series: Array.isArray(processedOption.series) ? processedOption.series : [],
5331
- totalDataCount: calculateDataLength(processedOption),
5332
- currentDataCount: calculateDataLength(processedOption)
5333
- },
5334
- performance: {
5335
- initTime: performanceRef.current.initEndTime - performanceRef.current.initStartTime,
5336
- renderTime: performanceRef.current.renderEndTime - performanceRef.current.renderStartTime,
5337
- dataSize: JSON.stringify(processedOption).length
5338
- }
5339
5123
  });
5340
5124
  }
5341
- // 绑定事件
5342
- if (instance_1 && onClick) {
5343
- instance_1.on('click', function (params) {
5344
- onClick(params);
5345
- // 点击联动
5346
- if (linkageConfig.enableClickLinkage && chartId && linkageConfig.linkedChartIds) {
5347
- linkageConfig.linkedChartIds.forEach(function (linkedChartId) {
5348
- var linkedChart = getChart(linkedChartId);
5349
- if (linkedChart) {
5350
- // 这里可以根据需要实现点击联动逻辑
5351
- // 例如:高亮联动图表中对应的系列或数据点
5352
- linkedChart.dispatchAction({
5353
- type: 'highlight',
5354
- name: params.name
5355
- });
5356
- }
5357
- });
5358
- }
5125
+ // Zoom + zoom linkage + virtual scroll page update
5126
+ instance.on('datazoom', function (params) {
5127
+ if (onZoom) onZoom({
5128
+ start: params.start || 0,
5129
+ end: params.end || 100,
5130
+ dataZoomIndex: params.dataZoomIndex || 0
5359
5131
  });
5360
- }
5361
- // 绑定datazoom事件
5362
- if (instance_1) {
5363
- instance_1.on('datazoom', function (params) {
5364
- // 触发原始的datazoom事件
5365
- if (onDataZoom) {
5366
- onDataZoom(params);
5132
+ if (virtualScroll && !virtualScrollRef.current.isScrolling) {
5133
+ virtualScrollRef.current.isScrolling = true;
5134
+ var newPage = Math.floor((params.start || 0) / 100 * virtualScrollRef.current.totalPages);
5135
+ if (newPage !== virtualScrollRef.current.currentPage) {
5136
+ virtualScrollRef.current.currentPage = newPage;
5137
+ // Trigger re-render via option update
5367
5138
  }
5368
- // 触发缩放事件
5369
- if (onZoom) {
5370
- onZoom({
5371
- start: params.start || 0,
5372
- end: params.end || 100,
5373
- dataZoomIndex: params.dataZoomIndex || 0
5374
- });
5375
- }
5376
- // 缩放联动
5377
- if (linkageConfig.enableZoomLinkage && chartId && linkageConfig.linkedChartIds) {
5378
- linkageConfig.linkedChartIds.forEach(function (linkedChartId) {
5379
- var linkedChart = getChart(linkedChartId);
5380
- if (linkedChart) {
5381
- linkedChart.dispatchAction({
5382
- type: 'dataZoom',
5383
- start: params.start,
5384
- end: params.end,
5385
- dataZoomIndex: params.dataZoomIndex
5386
- });
5387
- }
5139
+ setTimeout(function () {
5140
+ virtualScrollRef.current.isScrolling = false;
5141
+ }, 100);
5142
+ }
5143
+ if (linkageConfig.enableZoomLinkage && chartId && linkageConfig.linkedChartIds) {
5144
+ linkageConfig.linkedChartIds.forEach(function (lid) {
5145
+ var linked = getChart(lid);
5146
+ if (linked) linked.dispatchAction({
5147
+ type: 'dataZoom',
5148
+ start: params.start,
5149
+ end: params.end,
5150
+ dataZoomIndex: params.dataZoomIndex
5388
5151
  });
5389
- }
5390
- // 处理虚拟滚动
5391
- if (virtualScroll) {
5392
- if (virtualScrollRef.current.isScrolling) {
5393
- return;
5394
- }
5395
- virtualScrollRef.current.isScrolling = true;
5396
- // 根据滚动位置计算当前页码
5397
- var scrollPercent = params.start || 0;
5398
- var newPage = Math.floor(scrollPercent / 100 * virtualScrollRef.current.totalPages);
5399
- if (newPage !== virtualScrollRef.current.currentPage) {
5400
- virtualScrollRef.current.currentPage = newPage;
5401
- // 更新图表数据
5402
- var updatedOption = processVirtualScroll(option);
5403
- chartAdapter_1.setOption(updatedOption);
5404
- }
5405
- // 延迟重置滚动状态,避免频繁触发
5406
- setTimeout(function () {
5407
- virtualScrollRef.current.isScrolling = false;
5408
- }, 100);
5409
- }
5410
- });
5411
- }
5412
- // 启用图表缩放功能
5413
- if (instance_1 && enableZoom) {
5414
- // 这里可以根据需要添加更多缩放相关的配置
5415
- // 例如:instance.setOption({ dataZoom: [{ type: 'inside', start: 0, end: 100 }] });
5416
- }
5417
- // 增强图例交互功能
5418
- if (instance_1 && enableLegendInteraction) {
5419
- // 图例选择事件
5420
- instance_1.on('legendselectchanged', function (params) {
5152
+ });
5153
+ }
5154
+ });
5155
+ // Legend interaction
5156
+ if (enableLegendInteraction) {
5157
+ instance.on('legendselectchanged', function (params) {
5421
5158
  var name = params.name,
5422
5159
  selected = params.selected;
5423
- // 图例联动
5424
5160
  if (linkageConfig.enableLegendLinkage && chartId && linkageConfig.linkedChartIds) {
5425
- linkageConfig.linkedChartIds.forEach(function (linkedChartId) {
5426
- var linkedChart = getChart(linkedChartId);
5427
- if (linkedChart) {
5428
- linkedChart.setOption({
5429
- legend: {
5430
- selected: selected
5431
- }
5432
- });
5433
- }
5161
+ linkageConfig.linkedChartIds.forEach(function (lid) {
5162
+ var linked = getChart(lid);
5163
+ if (linked) linked.setOption({
5164
+ legend: {
5165
+ selected: selected
5166
+ }
5167
+ });
5434
5168
  });
5435
5169
  }
5436
- // 根据交互模式处理图例选择
5437
5170
  if (legendInteractionMode === 'single') {
5438
- // 单选模式:只显示当前选中项
5439
5171
  var newSelected_1 = {};
5440
- Object.keys(selected).forEach(function (key) {
5441
- newSelected_1[key] = key === name;
5172
+ Object.keys(selected).forEach(function (k) {
5173
+ newSelected_1[k] = k === name;
5442
5174
  });
5443
- instance_1.setOption({
5175
+ instance.setOption({
5444
5176
  legend: {
5445
5177
  selected: newSelected_1
5446
5178
  }
5447
5179
  });
5448
- // 触发回调
5449
- if (onLegendSelect) {
5450
- onLegendSelect({
5451
- name: name,
5452
- selected: newSelected_1
5453
- });
5454
- }
5180
+ onLegendSelect === null || onLegendSelect === void 0 ? void 0 : onLegendSelect({
5181
+ name: name,
5182
+ selected: newSelected_1
5183
+ });
5455
5184
  } else {
5456
- // 多选或全选模式:保持原有选择
5457
- if (selected[name]) {
5458
- // 选择图例项
5459
- if (onLegendSelect) {
5460
- onLegendSelect({
5461
- name: name,
5462
- selected: selected
5463
- });
5464
- }
5465
- } else {
5466
- // 取消选择图例项
5467
- if (onLegendUnselect) {
5468
- onLegendUnselect({
5469
- name: name,
5470
- selected: selected
5471
- });
5472
- }
5473
- }
5185
+ if (selected[name]) onLegendSelect === null || onLegendSelect === void 0 ? void 0 : onLegendSelect({
5186
+ name: name,
5187
+ selected: selected
5188
+ });else onLegendUnselect === null || onLegendUnselect === void 0 ? void 0 : onLegendUnselect({
5189
+ name: name,
5190
+ selected: selected
5191
+ });
5474
5192
  }
5475
5193
  });
5476
- // 图例全选功能
5477
- if (legendInteractionMode === 'all') {
5478
- // 这里可以添加全选/反选的逻辑
5479
- // 例如:监听特定事件或添加自定义按钮
5480
- }
5481
5194
  }
5482
- // 自定义提示框功能
5483
- if (instance_1 && enableCustomTooltip) {
5484
- // 提示框显示事件
5485
- instance_1.on('tooltipshow', function (params) {
5486
- // 触发提示框显示回调
5487
- if (onTooltipShow) {
5488
- onTooltipShow(params);
5489
- }
5490
- });
5491
- // 提示框隐藏事件
5492
- instance_1.on('tooltiphide', function (params) {
5493
- // 触发提示框隐藏回调
5494
- if (onTooltipHide) {
5495
- onTooltipHide(params);
5496
- }
5195
+ // Custom tooltip
5196
+ if (enableCustomTooltip && customTooltipContent) {
5197
+ instance.on('tooltipshow', function (params) {
5198
+ return onTooltipShow === null || onTooltipShow === void 0 ? void 0 : onTooltipShow(params);
5497
5199
  });
5498
- // 提示框格式化功能
5499
- if (customTooltipContent) {
5500
- // 这里可以添加自定义提示框的格式化逻辑
5501
- // 例如:使用ECharts的tooltip.formatter选项
5502
- instance_1.setOption({
5503
- tooltip: BaseChart_assign({
5504
- formatter: function (params) {
5505
- // 这里可以返回自定义的HTML内容
5506
- // 由于ECharts的tooltip.formatter只支持返回字符串,我们需要将React组件转换为HTML字符串
5507
- // 注意:这种方式有局限性,更复杂的自定义提示框可能需要使用其他方案
5508
- return '<div style="background: white; padding: 10px; border: 1px solid #ccc;">' + JSON.stringify(params) + '</div>';
5509
- }
5510
- }, customTooltipStyle && {
5511
- backgroundColor: 'transparent',
5512
- borderColor: 'transparent',
5513
- textStyle: {}
5514
- })
5515
- });
5516
- }
5517
- }
5518
- adapterRef.current = chartAdapter_1;
5519
- // 结束记录初始化时间
5520
- recordPerformance('init');
5521
- // 清理函数
5522
- return function () {
5523
- // 移除图表实例
5524
- if (chartId) {
5525
- removeChart(chartId);
5526
- }
5527
- // 停止性能监控
5528
- if (performanceAnalyzerRef.current) {
5529
- performanceAnalyzerRef.current.stop();
5530
- performanceAnalyzerRef.current = null;
5531
- }
5532
- if (chartAdapter_1) {
5533
- chartAdapter_1.dispose();
5534
- }
5535
- };
5536
- }
5537
- // eslint-disable-next-line react-hooks/exhaustive-deps
5538
- }, [chartRef, width, height, theme, option, onInit, onClick, onDataZoom, chartId, linkageConfig]);
5539
- /**
5540
- * 更新图表尺寸的 useEffect
5541
- *
5542
- * @description 当图表宽度或高度变化时,调整图表大小
5543
- */
5544
- (0,external_react_.useEffect)(function () {
5545
- if (adapterRef.current) {
5546
- adapterRef.current.resize();
5547
- }
5548
- }, [width, height]);
5549
- /**
5550
- * 比较两个配置是否相同
5551
- * @param oldOption 旧的配置
5552
- * @param newOption 新的配置
5553
- * @returns 是否相同
5554
- */
5555
- var isOptionEqual = function (oldOption, newOption) {
5556
- if (oldOption === newOption) {
5557
- return true;
5558
- }
5559
- if (!oldOption || !newOption) {
5560
- return false;
5561
- }
5562
- if (dataUpdateOptions.deepCompare) {
5563
- // 深度比较
5564
- return JSON.stringify(oldOption) === JSON.stringify(newOption);
5565
- } else {
5566
- // 浅比较,只比较引用
5567
- return oldOption === newOption;
5568
- }
5569
- };
5570
- /**
5571
- * 更新图表配置的 useEffect
5572
- *
5573
- * @description 当图表配置项变化时,更新图表
5574
- */
5575
- (0,external_react_.useEffect)(function () {
5576
- if (adapterRef.current && option) {
5577
- // 开始记录更新时间
5578
- recordPerformance('update');
5579
- // 处理虚拟滚动
5580
- var processedOption = processVirtualScroll(option);
5581
- adapterRef.current.setOption(processedOption);
5582
- // 结束记录更新时间
5583
- recordPerformance('update');
5584
- }
5585
- // 数据更新监听
5586
- if (onDataUpdate && dataUpdateOptions.enabled !== false) {
5587
- var oldOption = oldOptionRef.current;
5588
- if (!isOptionEqual(oldOption, option)) {
5589
- onDataUpdate(oldOption, option);
5590
- // 更新旧的配置引用
5591
- oldOptionRef.current = option;
5592
- }
5593
- }
5594
- }, [option, onDataUpdate, dataUpdateOptions]);
5595
- /**
5596
- * 更新图表主题的 useEffect
5597
- *
5598
- * @description 当图表主题变化时,更新图表主题
5599
- */
5600
- (0,external_react_.useEffect)(function () {
5601
- if (adapterRef.current && theme) {
5602
- adapterRef.current.setTheme(theme);
5603
- }
5604
- }, [theme]);
5605
- /**
5606
- * 处理窗口大小变化的 useEffect
5607
- *
5608
- * @description 当窗口大小变化时,如果开启了自动调整大小,则调整图表大小
5609
- */
5610
- (0,external_react_.useEffect)(function () {
5611
- if (!autoResize || !adapterRef.current) {
5612
- return;
5613
- }
5614
- var handleResize = function () {
5615
- adapterRef.current.resize();
5616
- };
5617
- window.addEventListener('resize', handleResize);
5618
- return function () {
5619
- window.removeEventListener('resize', handleResize);
5620
- };
5621
- }, [autoResize]);
5622
- /**
5623
- * 合并后的样式对象
5624
- *
5625
- * @description 合并用户传入的样式和组件默认样式
5626
- */
5627
- var mergedStyle = BaseChart_assign({
5628
- width: typeof width === 'number' ? "".concat(width, "px") : width,
5629
- height: typeof height === 'number' ? "".concat(height, "px") : height,
5630
- direction: direction
5631
- }, style);
5632
- /**
5633
- * 组件渲染函数
5634
- *
5635
- * @returns {JSX.Element} - 返回渲染后的 JSX 元素
5636
- * @description 渲染图表容器,并将 chartRef 绑定到容器上
5637
- */
5638
- var debugConfig = processDebugConfig();
5639
- // 渲染图表容器
5640
- var chartContainer = /*#__PURE__*/external_react_default().createElement('div', {
5641
- ref: chartRef,
5642
- style: mergedStyle,
5643
- className: className
5644
- }, children);
5645
- // 如果启用了调试面板,渲染调试面板
5646
- if (debugConfig === null || debugConfig === void 0 ? void 0 : debugConfig.enabled) {
5647
- return /*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, chartContainer, /*#__PURE__*/external_react_default().createElement(DebugPanel, {
5648
- options: debugConfig,
5649
- debugInfo: {
5200
+ instance.on('tooltiphide', function (params) {
5201
+ return onTooltipHide === null || onTooltipHide === void 0 ? void 0 : onTooltipHide(params);
5202
+ });
5203
+ instance.setOption({
5204
+ tooltip: BaseChart_assign({
5205
+ formatter: function (params) {
5206
+ return String(customTooltipContent(params));
5207
+ }
5208
+ }, customTooltipStyle && {
5209
+ backgroundColor: 'transparent',
5210
+ borderColor: 'transparent',
5211
+ textStyle: {}
5212
+ })
5213
+ });
5214
+ }
5215
+ }
5216
+ // Update debug panel
5217
+ if ((_a = debugConfigRef.current) === null || _a === void 0 ? void 0 : _a.enabled) {
5218
+ updateDebugInfo({
5650
5219
  instance: {
5651
5220
  id: chartId,
5652
5221
  type: 'ECharts',
5653
5222
  renderer: 'canvas',
5654
- // 简化处理,使用默认值
5655
5223
  width: typeof width === 'number' ? width : undefined,
5656
5224
  height: typeof height === 'number' ? height : undefined,
5657
- platform: 'web' // 简化处理,使用默认值
5225
+ platform: 'web'
5658
5226
  },
5659
- config: option,
5227
+ config: wrappedOption,
5660
5228
  data: {
5661
- series: Array.isArray(option === null || option === void 0 ? void 0 : option.series) ? option.series : [],
5662
- totalDataCount: calculateDataLength(option),
5663
- currentDataCount: calculateDataLength(option)
5229
+ series: Array.isArray(wrappedOption === null || wrappedOption === void 0 ? void 0 : wrappedOption.series) ? wrappedOption.series : [],
5230
+ totalDataCount: calculateDataLength(wrappedOption),
5231
+ currentDataCount: calculateDataLength(wrappedOption)
5664
5232
  },
5665
5233
  performance: {
5666
- initTime: performanceRef.current.initEndTime - performanceRef.current.initStartTime,
5667
- renderTime: performanceRef.current.renderEndTime - performanceRef.current.renderStartTime,
5668
- updateTime: performanceRef.current.updateEndTime - performanceRef.current.updateStartTime,
5669
- dataSize: JSON.stringify(option).length
5234
+ initTime: 0,
5235
+ renderTime: 0,
5236
+ dataSize: JSON.stringify(wrappedOption).length
5670
5237
  }
5238
+ });
5239
+ }
5240
+ onInit === null || onInit === void 0 ? void 0 : onInit(instance);
5241
+ performanceRef.current.initEndTime = Date.now();
5242
+ }, [chartId, enablePerformanceMonitoring, onInit, linkageConfig, virtualScroll, onZoom, enableLegendInteraction, legendInteractionMode, onLegendSelect, onLegendUnselect, enableCustomTooltip, customTooltipContent, customTooltipStyle, onTooltipShow, onTooltipHide, wrappedOption, width, height]);
5243
+ // Update performance record
5244
+ (0,external_react_.useEffect)(function () {
5245
+ if (chartInstanceRef.current && onPerformance) {
5246
+ var p = performanceRef.current;
5247
+ onPerformance({
5248
+ renderTime: p.renderEndTime - p.renderStartTime,
5249
+ initTime: p.initEndTime - p.initStartTime,
5250
+ updateTime: p.updateEndTime - p.updateStartTime,
5251
+ dataSize: JSON.stringify(option).length
5252
+ });
5253
+ }
5254
+ }, [option, onPerformance]);
5255
+ // Data update callback
5256
+ (0,external_react_.useEffect)(function () {
5257
+ if (onDataUpdate && (dataUpdateOptions === null || dataUpdateOptions === void 0 ? void 0 : dataUpdateOptions.enabled) !== false) {
5258
+ var oldOpt = oldOptionRef.current;
5259
+ if (oldOpt !== option) {
5260
+ onDataUpdate(oldOpt, option);
5261
+ oldOptionRef.current = option;
5671
5262
  }
5672
- }));
5673
- }
5674
- // 否则只渲染图表容器
5675
- return chartContainer;
5263
+ }
5264
+ }, [option, onDataUpdate, dataUpdateOptions]);
5265
+ // Cleanup on unmount
5266
+ (0,external_react_.useEffect)(function () {
5267
+ return function () {
5268
+ if (chartId) removeChart(chartId);
5269
+ if (performanceAnalyzerRef.current) {
5270
+ performanceAnalyzerRef.current.dispose();
5271
+ performanceAnalyzerRef.current = null;
5272
+ }
5273
+ if (adapterRef.current) adapterRef.current.dispose();
5274
+ };
5275
+ }, [chartId]);
5276
+ var mergedStyle = BaseChart_assign({}, normalizeSizeObject(width, height, direction, style));
5277
+ var wrapperProps = {
5278
+ option: wrappedOption,
5279
+ width: width,
5280
+ height: height,
5281
+ theme: typeof theme === 'string' ? theme : theme,
5282
+ autoResize: autoResize,
5283
+ loading: false,
5284
+ onChartInit: handleChartInit,
5285
+ renderer: 'canvas',
5286
+ onEvents: {},
5287
+ chartType: 'base',
5288
+ style: mergedStyle,
5289
+ className: className
5290
+ };
5291
+ return /*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, /*#__PURE__*/external_react_default().createElement(BaseChartWrapper/* default */.A, BaseChart_assign({}, wrapperProps)), (debugConfig === null || debugConfig === void 0 ? void 0 : debugConfig.enabled) && (/*#__PURE__*/external_react_default().createElement(DebugPanel, {
5292
+ options: debugConfig,
5293
+ debugInfo: {
5294
+ instance: {
5295
+ id: chartId,
5296
+ type: 'ECharts',
5297
+ renderer: 'canvas',
5298
+ width: typeof width === 'number' ? width : undefined,
5299
+ height: typeof height === 'number' ? height : undefined,
5300
+ platform: 'web'
5301
+ },
5302
+ config: option,
5303
+ data: {
5304
+ series: Array.isArray(option === null || option === void 0 ? void 0 : option.series) ? option.series : [],
5305
+ totalDataCount: calculateDataLength(option),
5306
+ currentDataCount: calculateDataLength(option)
5307
+ },
5308
+ performance: {
5309
+ initTime: performanceRef.current.initEndTime - performanceRef.current.initStartTime,
5310
+ renderTime: performanceRef.current.renderEndTime - performanceRef.current.renderStartTime,
5311
+ updateTime: 0,
5312
+ dataSize: JSON.stringify(option).length
5313
+ }
5314
+ }
5315
+ })));
5676
5316
  };
5677
- /**
5678
- * 导出基础图表组件
5679
- */
5317
+ function normalizeSizeObject(width, height, direction, style) {
5318
+ return BaseChart_assign({
5319
+ width: normalizeSize(width, '100%'),
5320
+ height: normalizeSize(height, '300px'),
5321
+ direction: direction
5322
+ }, style);
5323
+ }
5680
5324
  /* harmony default export */ const components_BaseChart = (BaseChart);
5681
5325
  // EXTERNAL MODULE: ./src/core/utils/index.ts + 2 modules
5682
5326
  var utils = __webpack_require__(524);
@@ -5702,6 +5346,77 @@ var treemap = __webpack_require__(37);
5702
5346
  var sunburst = __webpack_require__(673);
5703
5347
  // EXTERNAL MODULE: ./src/charts/sankey/index.tsx
5704
5348
  var sankey = __webpack_require__(490);
5349
+ ;// ./src/charts/graph/index.tsx
5350
+ var graph_assign = undefined && undefined.__assign || function () {
5351
+ graph_assign = Object.assign || function (t) {
5352
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5353
+ s = arguments[i];
5354
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
5355
+ }
5356
+ return t;
5357
+ };
5358
+ return graph_assign.apply(this, arguments);
5359
+ };
5360
+ /**
5361
+ * GraphChart组件
5362
+ */
5363
+
5364
+
5365
+ var GraphChart = /*#__PURE__*/(0,external_react_.memo)(function (props) {
5366
+ return /*#__PURE__*/external_react_default().createElement(BaseChartWrapper/* default */.A, graph_assign({}, props, {
5367
+ chartType: "graph-chart"
5368
+ }));
5369
+ });
5370
+ GraphChart.displayName = 'GraphChart';
5371
+ /* harmony default export */ const graph = (GraphChart);
5372
+ ;// ./src/charts/candlestick/index.tsx
5373
+ var candlestick_assign = undefined && undefined.__assign || function () {
5374
+ candlestick_assign = Object.assign || function (t) {
5375
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5376
+ s = arguments[i];
5377
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
5378
+ }
5379
+ return t;
5380
+ };
5381
+ return candlestick_assign.apply(this, arguments);
5382
+ };
5383
+ /**
5384
+ * CandlestickChart组件
5385
+ */
5386
+
5387
+
5388
+ var CandlestickChart = /*#__PURE__*/(0,external_react_.memo)(function (props) {
5389
+ return /*#__PURE__*/external_react_default().createElement(BaseChartWrapper/* default */.A, candlestick_assign({}, props, {
5390
+ chartType: "candlestick-chart"
5391
+ }));
5392
+ });
5393
+ CandlestickChart.displayName = 'CandlestickChart';
5394
+ /* harmony default export */ const candlestick = (CandlestickChart);
5395
+ ;// ./src/charts/wordcloud/index.tsx
5396
+ var wordcloud_assign = undefined && undefined.__assign || function () {
5397
+ wordcloud_assign = Object.assign || function (t) {
5398
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5399
+ s = arguments[i];
5400
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
5401
+ }
5402
+ return t;
5403
+ };
5404
+ return wordcloud_assign.apply(this, arguments);
5405
+ };
5406
+ /**
5407
+ * WordCloudChart组件
5408
+ */
5409
+
5410
+
5411
+ var WordCloudChart = /*#__PURE__*/(0,external_react_.memo)(function (props) {
5412
+ return /*#__PURE__*/external_react_default().createElement(BaseChartWrapper/* default */.A, wordcloud_assign({}, props, {
5413
+ chartType: "wordcloud-chart"
5414
+ }));
5415
+ });
5416
+ WordCloudChart.displayName = 'WordCloudChart';
5417
+ /* harmony default export */ const wordcloud = (WordCloudChart);
5418
+ // EXTERNAL MODULE: ./src/adapters/index.ts + 5 modules
5419
+ var adapters = __webpack_require__(574);
5705
5420
  // EXTERNAL MODULE: ./src/adapters/h5/index.ts
5706
5421
  var h5 = __webpack_require__(123);
5707
5422
  // EXTERNAL MODULE: ./src/adapters/weapp/index.ts
@@ -6039,7 +5754,7 @@ var elegantTheme = {
6039
5754
  * @param options 自定义选项
6040
5755
  * @returns 合并后的主题配置
6041
5756
  */
6042
- function themes_getTheme(options) {
5757
+ function getTheme(options) {
6043
5758
  if (!options) {
6044
5759
  return defaultTheme;
6045
5760
  }
@@ -6088,6 +5803,19 @@ function getThemeByName(name) {
6088
5803
  function unregisterTheme(name) {
6089
5804
  themeRegistry.delete(name);
6090
5805
  }
5806
+ /**
5807
+ * 重置主题注册表(清除所有已注册的主题,恢复内置主题)
5808
+ * 主要用于测试环境
5809
+ */
5810
+ function resetThemeRegistry() {
5811
+ themeRegistry.clear();
5812
+ // 重新注册所有内置主题
5813
+ Object.entries(builtinThemes).forEach(function (_a) {
5814
+ var name = _a[0],
5815
+ theme = _a[1];
5816
+ themeRegistry.set(name, theme);
5817
+ });
5818
+ }
6091
5819
  /**
6092
5820
  * 动态切换主题
6093
5821
  * @param theme 主题名称或主题配置
@@ -6226,17 +5954,22 @@ Object.entries(builtinThemes).forEach(function (_a) {
6226
5954
  cyberTheme: cyberTheme,
6227
5955
  retroTheme: retroTheme,
6228
5956
  elegantTheme: elegantTheme,
6229
- getTheme: themes_getTheme,
5957
+ getTheme: getTheme,
6230
5958
  registerTheme: registerTheme,
6231
5959
  getRegisteredThemes: getRegisteredThemes,
6232
5960
  getThemeByName: getThemeByName,
6233
5961
  unregisterTheme: unregisterTheme,
5962
+ resetThemeRegistry: resetThemeRegistry,
6234
5963
  switchTheme: switchTheme,
6235
5964
  getThemesByTag: getThemesByTag,
6236
5965
  getLightThemes: getLightThemes,
6237
5966
  getDarkThemes: getDarkThemes
6238
5967
  });
6239
5968
  ;// ./src/core/themes/ThemeManager.ts
5969
+ /**
5970
+ * TaroViz 主题系统
5971
+ * 支持 CSS 变量、动态主题切换、自定义主题
5972
+ */
6240
5973
  var ThemeManager_assign = undefined && undefined.__assign || function () {
6241
5974
  ThemeManager_assign = Object.assign || function (t) {
6242
5975
  for (var s, i = 1, n = arguments.length; i < n; i++) {
@@ -6862,31 +6595,26 @@ var ThemeEditor = function (_a) {
6862
6595
  var handleColorChange = function (index, color) {
6863
6596
  var newColors = ThemeEditor_spreadArray([], colors, true);
6864
6597
  newColors[index] = color;
6865
- setColors(newColors);
6866
6598
  updateCurrentTheme({
6867
6599
  colors: newColors
6868
6600
  });
6869
6601
  };
6870
6602
  // 处理背景色变化
6871
6603
  var handleBackgroundColorChange = function (color) {
6872
- setBackgroundColor(color);
6873
6604
  updateCurrentTheme({
6874
6605
  backgroundColor: color
6875
6606
  });
6876
6607
  };
6877
6608
  // 处理文本颜色变化
6878
6609
  var handleTextColorChange = function (color) {
6879
- setTextColor(color);
6880
6610
  updateCurrentTheme({
6881
6611
  textColor: color
6882
6612
  });
6883
6613
  };
6884
6614
  // 处理深色模式切换
6885
6615
  var handleDarkModeToggle = function () {
6886
- var newDarkMode = !darkMode;
6887
- setDarkMode(newDarkMode);
6888
6616
  updateCurrentTheme({
6889
- darkMode: newDarkMode
6617
+ darkMode: !darkMode
6890
6618
  });
6891
6619
  };
6892
6620
  // 更新当前主题
@@ -7390,7 +7118,8 @@ function withErrorBoundary(ChartComponent, errorBoundaryProps) {
7390
7118
  var WrappedChart = function (props) {
7391
7119
  return /*#__PURE__*/external_react_default().createElement(ErrorBoundary, ErrorBoundary_assign({}, errorBoundaryProps), /*#__PURE__*/external_react_default().createElement(ChartComponent, ErrorBoundary_assign({}, props)));
7392
7120
  };
7393
- WrappedChart.displayName = "withErrorBoundary(".concat(ChartComponent.displayName || ChartComponent.name || 'Chart', ")");
7121
+ var componentName = ChartComponent.displayName || ChartComponent.name;
7122
+ WrappedChart.displayName = componentName ? "withErrorBoundary(".concat(componentName, ")") : 'withErrorBoundary(WrappedChart)';
7394
7123
  return WrappedChart;
7395
7124
  }
7396
7125
  /* harmony default export */ const components_ErrorBoundary = ((/* unused pure expression or super */ null && (ErrorBoundary)));
@@ -7452,6 +7181,43 @@ var LazySunburstChart = /*#__PURE__*/(0,external_react_.lazy)(function () {
7452
7181
  var LazySankeyChart = /*#__PURE__*/(0,external_react_.lazy)(function () {
7453
7182
  return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 490));
7454
7183
  });
7184
+ // 统一的图表类型到懒加载组件映射
7185
+ var LAZY_CHART_MODULES = {
7186
+ line: function () {
7187
+ return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 127));
7188
+ },
7189
+ bar: function () {
7190
+ return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 188));
7191
+ },
7192
+ pie: function () {
7193
+ return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 481));
7194
+ },
7195
+ scatter: function () {
7196
+ return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 589));
7197
+ },
7198
+ radar: function () {
7199
+ return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 443));
7200
+ },
7201
+ heatmap: function () {
7202
+ return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 835));
7203
+ },
7204
+ gauge: function () {
7205
+ return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 334));
7206
+ },
7207
+ funnel: function () {
7208
+ return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 133));
7209
+ },
7210
+ treemap: function () {
7211
+ return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 37));
7212
+ },
7213
+ sunburst: function () {
7214
+ return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 673));
7215
+ },
7216
+ sankey: function () {
7217
+ return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 490));
7218
+ }
7219
+ };
7220
+ var LAZY_CHART_TYPES = Object.keys(LAZY_CHART_MODULES);
7455
7221
  /**
7456
7222
  * 默认加载状态组件
7457
7223
  */
@@ -7511,56 +7277,31 @@ function withLazyLoad(ChartComponent, loadingFallback) {
7511
7277
  /**
7512
7278
  * 预加载图表组件
7513
7279
  * 在需要显示图表之前预先加载
7280
+ * @param silent - 如果为 true,错误不会被打印到控制台(保持旧行为兼容)
7281
+ * @returns Promise that resolves when loaded, rejects on error
7514
7282
  */
7515
- function preloadChart(chartType) {
7516
- var chartModules = {
7517
- line: function () {
7518
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 127));
7519
- },
7520
- bar: function () {
7521
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 188));
7522
- },
7523
- pie: function () {
7524
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 481));
7525
- },
7526
- scatter: function () {
7527
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 589));
7528
- },
7529
- radar: function () {
7530
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 443));
7531
- },
7532
- heatmap: function () {
7533
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 835));
7534
- },
7535
- gauge: function () {
7536
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 334));
7537
- },
7538
- funnel: function () {
7539
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 133));
7540
- },
7541
- treemap: function () {
7542
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 37));
7543
- },
7544
- sunburst: function () {
7545
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 673));
7546
- },
7547
- sankey: function () {
7548
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 490));
7549
- }
7550
- };
7551
- var loader = chartModules[chartType];
7552
- if (loader) {
7553
- loader().catch(console.error);
7283
+ function preloadChart(chartType, silent) {
7284
+ if (silent === void 0) {
7285
+ silent = true;
7554
7286
  }
7287
+ var loader = LAZY_CHART_MODULES[chartType];
7288
+ if (!loader) {
7289
+ if (silent) return Promise.resolve();
7290
+ return Promise.reject(new Error("Unknown chart type: ".concat(chartType)));
7291
+ }
7292
+ return loader().then(function () {
7293
+ return undefined;
7294
+ }).catch(function (e) {
7295
+ if (!silent) console.error('[TaroViz] Failed to preload chart:', chartType, e);
7296
+ });
7555
7297
  }
7556
7298
  /**
7557
7299
  * 预加载所有图表组件
7558
7300
  */
7559
7301
  function preloadAllCharts() {
7560
- var chartTypes = ['line', 'bar', 'pie', 'scatter', 'radar', 'heatmap', 'gauge', 'funnel', 'treemap', 'sunburst', 'sankey'];
7561
- chartTypes.forEach(function (type) {
7302
+ return Promise.all(LAZY_CHART_TYPES.map(function (type) {
7562
7303
  return preloadChart(type);
7563
- });
7304
+ }));
7564
7305
  }
7565
7306
  /**
7566
7307
  * 创建懒加载图表映射
@@ -7590,11 +7331,14 @@ var LazyChartRegistry = {
7590
7331
  get: function (chartType) {
7591
7332
  return createLazyChart(chartType);
7592
7333
  },
7593
- preload: function (chartType) {
7594
- preloadChart(chartType);
7334
+ preload: function (chartType, silent) {
7335
+ if (silent === void 0) {
7336
+ silent = true;
7337
+ }
7338
+ return preloadChart(chartType, silent);
7595
7339
  },
7596
7340
  preloadAll: function () {
7597
- preloadAllCharts();
7341
+ return preloadAllCharts();
7598
7342
  }
7599
7343
  };
7600
7344
 
@@ -7724,15 +7468,19 @@ function useAnnotation(props) {
7724
7468
  markArea = props.markArea,
7725
7469
  scatter = props.scatter;
7726
7470
  return (0,external_react_.useMemo)(function () {
7471
+ // 使用 any 避免类型复杂性问题
7727
7472
  var series = [];
7728
7473
  if (type === 'line' && markLine) {
7729
- series.push.apply(series, convertAnnotationToMarkLine(markLine));
7474
+ var markLineResult = convertAnnotationToMarkLine(markLine);
7475
+ series.push.apply(series, Array.isArray(markLineResult) ? markLineResult : [markLineResult]);
7730
7476
  }
7731
7477
  if (type === 'area' && markArea) {
7732
- series.push.apply(series, convertAnnotationToMarkArea(markArea));
7478
+ var markAreaResult = convertAnnotationToMarkArea(markArea);
7479
+ series.push.apply(series, Array.isArray(markAreaResult) ? markAreaResult : [markAreaResult]);
7733
7480
  }
7734
7481
  if (type === 'scatter' && scatter) {
7735
- series.push.apply(series, convertAnnotationToScatter(scatter));
7482
+ var scatterResult = convertAnnotationToScatter(scatter);
7483
+ series.push.apply(series, Array.isArray(scatterResult) ? scatterResult : [scatterResult]);
7736
7484
  }
7737
7485
  return {
7738
7486
  series: series
@@ -7883,13 +7631,16 @@ function createCompositeAnnotation(annotations) {
7883
7631
  var allSeries = [];
7884
7632
  annotations.forEach(function (annotation) {
7885
7633
  if (annotation.type === 'line' && annotation.markLine) {
7886
- allSeries.push.apply(allSeries, convertAnnotationToMarkLine(annotation.markLine));
7634
+ var result = convertAnnotationToMarkLine(annotation.markLine);
7635
+ allSeries.push.apply(allSeries, Array.isArray(result) ? result : [result]);
7887
7636
  }
7888
7637
  if (annotation.type === 'area' && annotation.markArea) {
7889
- allSeries.push.apply(allSeries, convertAnnotationToMarkArea(annotation.markArea));
7638
+ var result = convertAnnotationToMarkArea(annotation.markArea);
7639
+ allSeries.push.apply(allSeries, Array.isArray(result) ? result : [result]);
7890
7640
  }
7891
7641
  if (annotation.type === 'scatter' && annotation.scatter) {
7892
- allSeries.push.apply(allSeries, convertAnnotationToScatter(annotation.scatter));
7642
+ var result = convertAnnotationToScatter(annotation.scatter);
7643
+ allSeries.push.apply(allSeries, Array.isArray(result) ? result : [result]);
7893
7644
  }
7894
7645
  });
7895
7646
  return {
@@ -8049,7 +7800,7 @@ function dataURLToBlob(dataURL) {
8049
7800
  /**
8050
7801
  * 下载文件
8051
7802
  */
8052
- function downloadFile(data, filename, mimeType) {
7803
+ function downloadFile(data, filename, _mimeType) {
8053
7804
  var blob = typeof data === 'string' ? dataURLToBlob(data) : data;
8054
7805
  var url = URL.createObjectURL(blob);
8055
7806
  var link = document.createElement('a');
@@ -8096,6 +7847,7 @@ var ChartExporter = /** @class */function () {
8096
7847
  _d = options.quality,
8097
7848
  quality = _d === void 0 ? 0.8 : _d;
8098
7849
  var mimeType = "image/".concat(type);
7850
+ // 使用 any 避免 ECharts 类型定义与实际支持类型不匹配
8099
7851
  var data = chart.getDataURL({
8100
7852
  type: type,
8101
7853
  pixelRatio: pixelRatio,
@@ -8117,8 +7869,11 @@ var ChartExporter = /** @class */function () {
8117
7869
  }
8118
7870
  var _a = options.compress,
8119
7871
  compress = _a === void 0 ? false : _a;
8120
- var svgData = chart.getSvgData();
8121
- if (!svgData) {
7872
+ // ECharts 5.x 使用 getDataURL 获取 SVG
7873
+ var svgData = chart.getDataURL({
7874
+ type: 'svg'
7875
+ });
7876
+ if (!svgData || svgData === 'data:image/svg+xml;charset=utf8,') {
8122
7877
  throw new Error('SVG export is not supported. Please use canvas renderer.');
8123
7878
  }
8124
7879
  var data = svgData;
@@ -8140,11 +7895,12 @@ var ChartExporter = /** @class */function () {
8140
7895
  ChartExporter.exportPDF = function (chart_1) {
8141
7896
  return __awaiter(this, arguments, Promise, function (chart, options) {
8142
7897
  var _a, orientation, _b, pageSize, _c, title, _d, author, _e, margin, _f, includeTitle, imageData, jsPDF, _g, pageSizes, size, isLandscape, doc, chartWidth, chartHeight, pageWidth, pageHeight, marginTop, marginLeft, chartY, chartX, footerY, pdfBlob;
7898
+ var _h;
8143
7899
  if (options === void 0) {
8144
7900
  options = {};
8145
7901
  }
8146
- return __generator(this, function (_h) {
8147
- switch (_h.label) {
7902
+ return __generator(this, function (_j) {
7903
+ switch (_j.label) {
8148
7904
  case 0:
8149
7905
  _a = options.orientation, orientation = _a === void 0 ? 'portrait' : _a, _b = options.pageSize, pageSize = _b === void 0 ? 'a4' : _b, _c = options.title, title = _c === void 0 ? 'Chart Export' : _c, _d = options.author, author = _d === void 0 ? 'TaroViz' : _d, _e = options.margin, margin = _e === void 0 ? {
8150
7906
  top: 40,
@@ -8157,17 +7913,17 @@ var ChartExporter = /** @class */function () {
8157
7913
  pixelRatio: 2,
8158
7914
  backgroundColor: '#ffffff'
8159
7915
  });
8160
- _h.label = 1;
7916
+ _j.label = 1;
8161
7917
  case 1:
8162
- _h.trys.push([1, 3,, 4]);
7918
+ _j.trys.push([1, 3,, 4]);
8163
7919
  return [4 /*yield*/, import(/* webpackIgnore: true */'jspdf')];
8164
7920
  case 2:
8165
7921
  // 尝试使用动态导入,使用 webpackIgnore 注释避免预解析
8166
- // @ts-ignore - 动态导入
8167
- jsPDF = _h.sent().default;
7922
+ // @ts-expect-error - 动态导入
7923
+ jsPDF = _j.sent().default;
8168
7924
  return [3 /*break*/, 4];
8169
7925
  case 3:
8170
- _g = _h.sent();
7926
+ _g = _j.sent();
8171
7927
  // 如果没有 jspdf,提供备选方案
8172
7928
  console.warn('[TaroViz] jspdf not found, falling back to image download');
8173
7929
  return [2 /*return*/, {
@@ -8223,7 +7979,7 @@ var ChartExporter = /** @class */function () {
8223
7979
  chartY = includeTitle ? marginTop + 15 : marginTop;
8224
7980
  chartX = (pageWidth - chartWidth) / 2;
8225
7981
  doc.addImage(imageData, 'PNG', chartX, chartY, chartWidth, chartHeight);
8226
- footerY = pageHeight - margin.bottom / 2;
7982
+ footerY = pageHeight - ((_h = margin.bottom) !== null && _h !== void 0 ? _h : 40) / 2;
8227
7983
  doc.setFontSize(10);
8228
7984
  doc.setTextColor(153, 153, 153);
8229
7985
  doc.text("Generated by TaroViz on ".concat(new Date().toLocaleDateString()), marginLeft, footerY);
@@ -8243,11 +7999,11 @@ var ChartExporter = /** @class */function () {
8243
7999
  */
8244
8000
  ChartExporter.exportBatch = function (charts, options) {
8245
8001
  return __awaiter(this, void 0, Promise, function () {
8246
- var format, _a, filenamePrefix, compress, results, _i, charts_1, _b, name, chart, result, error_1;
8002
+ var format, _a, _filenamePrefix, compress, results, _i, charts_1, _b, name, chart, result, error_1;
8247
8003
  return __generator(this, function (_c) {
8248
8004
  switch (_c.label) {
8249
8005
  case 0:
8250
- format = options.format, _a = options.filenamePrefix, filenamePrefix = _a === void 0 ? 'chart' : _a, compress = options.compress;
8006
+ format = options.format, _a = options.filenamePrefix, _filenamePrefix = _a === void 0 ? 'chart' : _a, compress = options.compress;
8251
8007
  results = [];
8252
8008
  _i = 0, charts_1 = charts;
8253
8009
  _c.label = 1;
@@ -8347,6 +8103,466 @@ var ChartExporter = /** @class */function () {
8347
8103
  }();
8348
8104
  var exportChart = ChartExporter;
8349
8105
  /* harmony default export */ const ExportUtils = ((/* unused pure expression or super */ null && (ChartExporter)));
8106
+ ;// ./src/hooks/useDataTransform.ts
8107
+ var useDataTransform_assign = undefined && undefined.__assign || function () {
8108
+ useDataTransform_assign = Object.assign || function (t) {
8109
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
8110
+ s = arguments[i];
8111
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
8112
+ }
8113
+ return t;
8114
+ };
8115
+ return useDataTransform_assign.apply(this, arguments);
8116
+ };
8117
+ var useDataTransform_spreadArray = undefined && undefined.__spreadArray || function (to, from, pack) {
8118
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
8119
+ if (ar || !(i in from)) {
8120
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
8121
+ ar[i] = from[i];
8122
+ }
8123
+ }
8124
+ return to.concat(ar || Array.prototype.slice.call(from));
8125
+ };
8126
+ /**
8127
+ * useDataTransform - 数据转换 Hook
8128
+ * 提供便捷的数据转换功能,将原始数据转换为 ECharts 配置
8129
+ */
8130
+
8131
+ // ============================================================================
8132
+ // 数据转换 Hook
8133
+ // ============================================================================
8134
+ /**
8135
+ * 使用数据转换
8136
+ * @param options 转换选项
8137
+ * @returns 转换后的 ECharts 配置
8138
+ */
8139
+ function useDataTransform(options) {
8140
+ var data = options.data,
8141
+ chartType = options.chartType,
8142
+ _a = options.mapping,
8143
+ mapping = _a === void 0 ? {} : _a,
8144
+ _b = options.extraConfig,
8145
+ extraConfig = _b === void 0 ? {} : _b;
8146
+ return (0,external_react_.useMemo)(function () {
8147
+ switch (chartType) {
8148
+ case 'line':
8149
+ case 'bar':
8150
+ return transformLineOrBar(data, chartType, mapping, extraConfig);
8151
+ case 'pie':
8152
+ return transformPie(data, mapping, extraConfig);
8153
+ case 'scatter':
8154
+ return transformScatter(data, mapping, extraConfig);
8155
+ case 'radar':
8156
+ return transformRadar(data, mapping, extraConfig);
8157
+ case 'heatmap':
8158
+ return transformHeatmap(data, mapping, extraConfig);
8159
+ default:
8160
+ return {};
8161
+ }
8162
+ }, [data, chartType, mapping, extraConfig]);
8163
+ }
8164
+ /**
8165
+ * 使用表格数据转换
8166
+ * 将表格数据转换为 ECharts 配置
8167
+ */
8168
+ function useTableTransform(options) {
8169
+ var data = options.data,
8170
+ _a = options.columns,
8171
+ columns = _a === void 0 ? [] : _a,
8172
+ _b = options.transpose,
8173
+ transpose = _b === void 0 ? false : _b,
8174
+ _c = options.extraConfig,
8175
+ extraConfig = _c === void 0 ? {} : _c;
8176
+ return (0,external_react_.useMemo)(function () {
8177
+ if (!data || data.length === 0) {
8178
+ return {};
8179
+ }
8180
+ var firstRow = data[0];
8181
+ var fields = columns.length > 0 ? columns.map(function (c) {
8182
+ return c.field;
8183
+ }) : Object.keys(firstRow);
8184
+ // Build columns map for O(1) lookup instead of O(n) find
8185
+ var columnsMap = new Map(columns.map(function (c) {
8186
+ return [c.field, c];
8187
+ }));
8188
+ var categories = transpose ? fields : data.map(function (row) {
8189
+ return String(row[fields[0]] || '');
8190
+ });
8191
+ // For non-transpose, we skip the first field (it's used for categories)
8192
+ var seriesFields = transpose ? fields : fields.slice(1);
8193
+ var series = seriesFields.map(function (fieldName) {
8194
+ var key = typeof fieldName === 'string' ? fieldName : '';
8195
+ var colConfig = columnsMap.get(key);
8196
+ // values calculation is the same regardless of transpose
8197
+ var values = data.map(function (row) {
8198
+ return Number(row[key]) || 0;
8199
+ });
8200
+ return {
8201
+ name: (colConfig === null || colConfig === void 0 ? void 0 : colConfig.label) || key,
8202
+ type: 'bar',
8203
+ data: values,
8204
+ itemStyle: (colConfig === null || colConfig === void 0 ? void 0 : colConfig.color) ? {
8205
+ color: colConfig.color
8206
+ } : undefined
8207
+ };
8208
+ });
8209
+ return useDataTransform_assign({
8210
+ xAxis: {
8211
+ type: 'category',
8212
+ data: categories
8213
+ },
8214
+ yAxis: {
8215
+ type: 'value'
8216
+ },
8217
+ series: series
8218
+ }, extraConfig);
8219
+ }, [data, columns, transpose, extraConfig]);
8220
+ }
8221
+ /**
8222
+ * 使用时间序列转换
8223
+ * 将时间序列数据转换为 ECharts 配置
8224
+ */
8225
+ function useTimeSeriesTransform(options) {
8226
+ var data = options.data,
8227
+ dateField = options.dateField,
8228
+ valueField = options.valueField,
8229
+ groupField = options.groupField,
8230
+ _a = options.period,
8231
+ period = _a === void 0 ? 'day' : _a,
8232
+ _b = options.aggregation,
8233
+ aggregation = _b === void 0 ? 'sum' : _b,
8234
+ _c = options.fillMissing,
8235
+ fillMissing = _c === void 0 ? 'forward' : _c,
8236
+ _d = options.extraConfig,
8237
+ extraConfig = _d === void 0 ? {} : _d;
8238
+ return (0,external_react_.useMemo)(function () {
8239
+ if (!data || data.length === 0) {
8240
+ return {};
8241
+ }
8242
+ // 按时间分组
8243
+ var groupedData = groupByTime(data, dateField, period);
8244
+ var categories = Object.keys(groupedData).sort();
8245
+ if (groupField) {
8246
+ // 多系列
8247
+ var groups = new Set(data.map(function (d) {
8248
+ return String(d[groupField]);
8249
+ }));
8250
+ var series = Array.from(groups).map(function (group) {
8251
+ var groupValues = categories.map(function (date) {
8252
+ var _a;
8253
+ var items = ((_a = groupedData[date]) === null || _a === void 0 ? void 0 : _a.filter(function (d) {
8254
+ return String(d[groupField]) === group;
8255
+ })) || [];
8256
+ return aggregateValues(items, valueField, aggregation, fillMissing);
8257
+ });
8258
+ return {
8259
+ name: group,
8260
+ type: 'line',
8261
+ data: groupValues,
8262
+ smooth: true
8263
+ };
8264
+ });
8265
+ return useDataTransform_assign({
8266
+ xAxis: {
8267
+ type: 'category',
8268
+ data: categories
8269
+ },
8270
+ yAxis: {
8271
+ type: 'value'
8272
+ },
8273
+ series: series
8274
+ }, extraConfig);
8275
+ } else {
8276
+ // 单系列
8277
+ var values = categories.map(function (date) {
8278
+ return aggregateValues(groupedData[date] || [], valueField, aggregation, fillMissing);
8279
+ });
8280
+ return useDataTransform_assign({
8281
+ xAxis: {
8282
+ type: 'category',
8283
+ data: categories
8284
+ },
8285
+ yAxis: {
8286
+ type: 'value'
8287
+ },
8288
+ series: [{
8289
+ type: 'line',
8290
+ data: values,
8291
+ smooth: true
8292
+ }]
8293
+ }, extraConfig);
8294
+ }
8295
+ }, [data, dateField, valueField, groupField, period, aggregation, fillMissing, extraConfig]);
8296
+ }
8297
+ // ============================================================================
8298
+ // 辅助函数
8299
+ // ============================================================================
8300
+ function transformLineOrBar(data, chartType, mapping, extraConfig) {
8301
+ var _a;
8302
+ var _b = mapping || {},
8303
+ _c = _b.xField,
8304
+ xField = _c === void 0 ? 'name' : _c,
8305
+ _d = _b.yField,
8306
+ yField = _d === void 0 ? 'value' : _d,
8307
+ seriesField = _b.seriesField;
8308
+ var categories = data.categories || ((_a = data.rows) === null || _a === void 0 ? void 0 : _a.map(function (r) {
8309
+ return String(r[xField]);
8310
+ })) || [];
8311
+ var seriesData = data.series || data.rows || [];
8312
+ if (seriesField) {
8313
+ var groups_1 = new Map();
8314
+ seriesData.forEach(function (item) {
8315
+ var key = String(item[seriesField] || 'default');
8316
+ if (!groups_1.has(key)) groups_1.set(key, []);
8317
+ groups_1.get(key).push(item);
8318
+ });
8319
+ var series_1 = Array.from(groups_1.entries()).map(function (_a) {
8320
+ var name = _a[0],
8321
+ items = _a[1];
8322
+ return {
8323
+ name: name,
8324
+ type: chartType,
8325
+ data: items.map(function (item) {
8326
+ var _a;
8327
+ return (_a = item[yField]) !== null && _a !== void 0 ? _a : 0;
8328
+ })
8329
+ };
8330
+ });
8331
+ return useDataTransform_assign({
8332
+ xAxis: {
8333
+ type: 'category',
8334
+ data: categories
8335
+ },
8336
+ yAxis: {
8337
+ type: 'value'
8338
+ },
8339
+ series: series_1
8340
+ }, extraConfig);
8341
+ }
8342
+ var series = [{
8343
+ type: chartType,
8344
+ data: seriesData.map(function (item) {
8345
+ var _a;
8346
+ return (_a = item[yField]) !== null && _a !== void 0 ? _a : 0;
8347
+ })
8348
+ }];
8349
+ return useDataTransform_assign({
8350
+ xAxis: {
8351
+ type: 'category',
8352
+ data: categories
8353
+ },
8354
+ yAxis: {
8355
+ type: 'value'
8356
+ },
8357
+ series: series
8358
+ }, extraConfig);
8359
+ }
8360
+ function transformPie(data, mapping, extraConfig) {
8361
+ var _a = mapping || {},
8362
+ _b = _a.nameField,
8363
+ nameField = _b === void 0 ? 'name' : _b,
8364
+ _c = _a.valueField,
8365
+ valueField = _c === void 0 ? 'value' : _c;
8366
+ var seriesData = (data.series || data.rows || []).map(function (item) {
8367
+ return {
8368
+ name: String(item[nameField] || ''),
8369
+ value: Number(item[valueField]) || 0
8370
+ };
8371
+ });
8372
+ return useDataTransform_assign({
8373
+ series: [{
8374
+ type: 'pie',
8375
+ radius: '60%',
8376
+ data: seriesData
8377
+ }]
8378
+ }, extraConfig);
8379
+ }
8380
+ function transformScatter(data, mapping, extraConfig) {
8381
+ var _a = mapping || {},
8382
+ _b = _a.xField,
8383
+ xField = _b === void 0 ? 'x' : _b,
8384
+ _c = _a.yField,
8385
+ yField = _c === void 0 ? 'y' : _c,
8386
+ sizeField = _a.sizeField;
8387
+ var seriesData = (data.series || data.rows || []).map(function (item) {
8388
+ var record = item;
8389
+ var point = [Number(record[xField]) || 0, Number(record[yField]) || 0];
8390
+ if (sizeField) point.push(Number(record[sizeField]) || 1);
8391
+ return point;
8392
+ });
8393
+ return useDataTransform_assign({
8394
+ xAxis: {
8395
+ type: 'value',
8396
+ scale: true
8397
+ },
8398
+ yAxis: {
8399
+ type: 'value',
8400
+ scale: true
8401
+ },
8402
+ series: [{
8403
+ type: 'scatter',
8404
+ data: seriesData
8405
+ }]
8406
+ }, extraConfig);
8407
+ }
8408
+ function transformRadar(data, mapping, extraConfig) {
8409
+ var _a = mapping || {},
8410
+ _b = _a.nameField,
8411
+ nameField = _b === void 0 ? 'name' : _b,
8412
+ _c = _a.valueField,
8413
+ valueField = _c === void 0 ? 'value' : _c;
8414
+ var indicators = (data.series || data.rows || []).map(function (item) {
8415
+ var record = item;
8416
+ return {
8417
+ name: String(record[nameField] || ''),
8418
+ max: Math.max(Number(record[valueField]) || 100, 100)
8419
+ };
8420
+ });
8421
+ var values = (data.series || data.rows || []).map(function (item) {
8422
+ return Number(item[valueField]) || 0;
8423
+ });
8424
+ return useDataTransform_assign({
8425
+ radar: {
8426
+ indicator: indicators
8427
+ },
8428
+ series: [{
8429
+ type: 'radar',
8430
+ data: [{
8431
+ value: values
8432
+ }]
8433
+ }]
8434
+ }, extraConfig);
8435
+ }
8436
+ function transformHeatmap(data, mapping, extraConfig) {
8437
+ var _a = mapping || {},
8438
+ _b = _a.xField,
8439
+ xField = _b === void 0 ? 'x' : _b,
8440
+ _c = _a.yField,
8441
+ yField = _c === void 0 ? 'y' : _c,
8442
+ _d = _a.valueField,
8443
+ valueField = _d === void 0 ? 'value' : _d;
8444
+ var xCategories = useDataTransform_spreadArray([], new Set((data.series || data.rows || []).map(function (d) {
8445
+ return String(d[xField]);
8446
+ })), true);
8447
+ var yCategories = useDataTransform_spreadArray([], new Set((data.series || data.rows || []).map(function (d) {
8448
+ return String(d[yField]);
8449
+ })), true);
8450
+ var seriesData = (data.series || data.rows || []).map(function (item) {
8451
+ var record = item;
8452
+ var xIndex = xCategories.indexOf(String(record[xField]));
8453
+ var yIndex = yCategories.indexOf(String(record[yField]));
8454
+ return [xIndex, yIndex, Number(record[valueField]) || 0];
8455
+ });
8456
+ return useDataTransform_assign({
8457
+ xAxis: {
8458
+ type: 'category',
8459
+ data: xCategories
8460
+ },
8461
+ yAxis: {
8462
+ type: 'category',
8463
+ data: yCategories
8464
+ },
8465
+ visualMap: {
8466
+ min: 0,
8467
+ calculable: true
8468
+ },
8469
+ series: [{
8470
+ type: 'heatmap',
8471
+ data: seriesData
8472
+ }]
8473
+ }, extraConfig);
8474
+ }
8475
+ function groupByTime(data, dateField, period) {
8476
+ return data.reduce(function (acc, item) {
8477
+ var date = new Date(String(item[dateField]));
8478
+ var key;
8479
+ switch (period) {
8480
+ case 'day':
8481
+ key = date.toISOString().split('T')[0];
8482
+ break;
8483
+ case 'week':
8484
+ {
8485
+ var week = getWeekNumber(date);
8486
+ key = "".concat(date.getFullYear(), "-W").concat(week);
8487
+ break;
8488
+ }
8489
+ case 'month':
8490
+ key = "".concat(date.getFullYear(), "-").concat(String(date.getMonth() + 1).padStart(2, '0'));
8491
+ break;
8492
+ case 'quarter':
8493
+ key = "".concat(date.getFullYear(), "-Q").concat(Math.ceil((date.getMonth() + 1) / 3));
8494
+ break;
8495
+ case 'year':
8496
+ key = String(date.getFullYear());
8497
+ break;
8498
+ default:
8499
+ key = date.toISOString().split('T')[0];
8500
+ }
8501
+ if (!acc[key]) acc[key] = [];
8502
+ acc[key].push(item);
8503
+ return acc;
8504
+ }, {});
8505
+ }
8506
+ function getWeekNumber(date) {
8507
+ var d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
8508
+ var dayNum = d.getUTCDay() || 7;
8509
+ d.setUTCDate(d.getUTCDate() + 4 - dayNum);
8510
+ var yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
8511
+ return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);
8512
+ }
8513
+ function aggregateValues(items, field, method, fillMissing) {
8514
+ if (items.length === 0) {
8515
+ if (fillMissing === 'zero') return 0;
8516
+ return NaN;
8517
+ }
8518
+ var values = items.map(function (item) {
8519
+ return Number(item[field]) || 0;
8520
+ });
8521
+ switch (method) {
8522
+ case 'sum':
8523
+ {
8524
+ var sum = 0;
8525
+ for (var i = 0; i < values.length; i++) sum += values[i];
8526
+ return sum;
8527
+ }
8528
+ case 'average':
8529
+ {
8530
+ if (values.length === 0) return 0;
8531
+ var sum = 0;
8532
+ for (var i = 0; i < values.length; i++) sum += values[i];
8533
+ return sum / values.length;
8534
+ }
8535
+ case 'max':
8536
+ {
8537
+ var max = values[0];
8538
+ for (var i = 1; i < values.length; i++) if (values[i] > max) max = values[i];
8539
+ return max;
8540
+ }
8541
+ case 'min':
8542
+ {
8543
+ var min = values[0];
8544
+ for (var i = 1; i < values.length; i++) if (values[i] < min) min = values[i];
8545
+ return min;
8546
+ }
8547
+ case 'count':
8548
+ return values.length;
8549
+ case 'first':
8550
+ return values[0];
8551
+ case 'last':
8552
+ return values[values.length - 1];
8553
+ default:
8554
+ return values[0];
8555
+ }
8556
+ }
8557
+ // ============================================================================
8558
+ // 导出
8559
+ // ============================================================================
8560
+ var useTransform = (/* unused pure expression or super */ null && (useDataTransform));
8561
+ /* harmony default export */ const hooks_useDataTransform = ({
8562
+ useDataTransform: useDataTransform,
8563
+ useTableTransform: useTableTransform,
8564
+ useTimeSeriesTransform: useTimeSeriesTransform
8565
+ });
8350
8566
  ;// ./src/hooks/index.ts
8351
8567
  var hooks_awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {
8352
8568
  function adopt(value) {
@@ -8474,6 +8690,7 @@ var hooks_spreadArray = undefined && undefined.__spreadArray || function (to, fr
8474
8690
  */
8475
8691
 
8476
8692
 
8693
+
8477
8694
  // ============================================================================
8478
8695
  // Hooks
8479
8696
  // ============================================================================
@@ -8484,6 +8701,7 @@ var hooks_spreadArray = undefined && undefined.__spreadArray || function (to, fr
8484
8701
  * @returns [图表实例, 设置实例函数, 是否已初始化]
8485
8702
  */
8486
8703
  function useChart(chartRef, config) {
8704
+ var _this = this;
8487
8705
  var _a = (0,external_react_.useState)(null),
8488
8706
  instance = _a[0],
8489
8707
  setInstance = _a[1];
@@ -8496,14 +8714,31 @@ function useChart(chartRef, config) {
8496
8714
  if (!chartRef.current || instance) {
8497
8715
  return;
8498
8716
  }
8499
- try {
8500
- var adapter = (0,adapters/* getAdapter */.cK)(configRef.current || {});
8501
- var chartInstance = adapter;
8502
- setInstance(chartInstance);
8503
- setInitialized(true);
8504
- } catch (error) {
8505
- console.error('Failed to initialize chart:', error);
8506
- }
8717
+ var initAdapter = function () {
8718
+ return hooks_awaiter(_this, void 0, void 0, function () {
8719
+ var adapter, chartInstance, error_1;
8720
+ return hooks_generator(this, function (_a) {
8721
+ switch (_a.label) {
8722
+ case 0:
8723
+ _a.trys.push([0, 2,, 3]);
8724
+ return [4 /*yield*/, (0,adapters/* getAdapter */.cK)(configRef.current || {})];
8725
+ case 1:
8726
+ adapter = _a.sent();
8727
+ chartInstance = adapter;
8728
+ setInstance(chartInstance);
8729
+ setInitialized(true);
8730
+ return [3 /*break*/, 3];
8731
+ case 2:
8732
+ error_1 = _a.sent();
8733
+ console.error('Failed to initialize chart:', error_1);
8734
+ return [3 /*break*/, 3];
8735
+ case 3:
8736
+ return [2 /*return*/];
8737
+ }
8738
+ });
8739
+ });
8740
+ };
8741
+ initAdapter();
8507
8742
  return function () {
8508
8743
  var _a;
8509
8744
  if (instance) {
@@ -8673,9 +8908,9 @@ function useChartTheme(theme, darkMode) {
8673
8908
  }
8674
8909
  return (0,external_react_.useMemo)(function () {
8675
8910
  if (typeof theme === 'string') {
8676
- // 如果是字符串,尝试获取内置主题
8911
+ // 如果是字符串,尝试获取内置主题配置
8677
8912
  try {
8678
- var builtinTheme = getTheme(theme);
8913
+ var builtinTheme = getThemeByName(theme);
8679
8914
  return builtinTheme || (darkMode ? 'dark' : theme);
8680
8915
  } catch (_a) {
8681
8916
  return darkMode ? 'dark' : theme;
@@ -8810,37 +9045,49 @@ function useDataPolling(fetchFn, options) {
8810
9045
  var _h = (0,external_react_.useState)(null),
8811
9046
  error = _h[0],
8812
9047
  setError = _h[1];
8813
- var _j = (0,external_react_.useState)(0),
8814
- refreshIndex = _j[0],
8815
- setRefreshIndex = _j[1];
9048
+ // 用于取消进行中的请求
9049
+ var abortRef = (0,external_react_.useRef)({
9050
+ cancelled: false
9051
+ });
8816
9052
  var fetchData = (0,external_react_.useCallback)(function () {
8817
9053
  return hooks_awaiter(_this, void 0, void 0, function () {
8818
- var retries, result, e_1;
9054
+ var currentAbort, retries, result, e_1, result, e_2;
8819
9055
  return hooks_generator(this, function (_a) {
8820
9056
  switch (_a.label) {
8821
9057
  case 0:
9058
+ // 取消之前的请求
9059
+ abortRef.current.cancelled = true;
9060
+ // 创建新的取消标记
9061
+ abortRef.current = {
9062
+ cancelled: false
9063
+ };
9064
+ currentAbort = abortRef.current;
8822
9065
  retries = retryCount;
8823
9066
  setLoading(true);
8824
9067
  setError(null);
8825
9068
  _a.label = 1;
8826
9069
  case 1:
8827
- if (!(retries >= 0)) return [3 /*break*/, 9];
9070
+ if (!(retries > 0 && !currentAbort.cancelled)) return [3 /*break*/, 9];
8828
9071
  _a.label = 2;
8829
9072
  case 2:
8830
9073
  _a.trys.push([2, 4,, 8]);
8831
9074
  return [4 /*yield*/, fetchFn()];
8832
9075
  case 3:
8833
9076
  result = _a.sent();
8834
- setData(result);
8835
- setLoading(false);
9077
+ if (!currentAbort.cancelled) {
9078
+ setData(result);
9079
+ setLoading(false);
9080
+ }
8836
9081
  return [2 /*return*/];
8837
9082
  case 4:
8838
9083
  e_1 = _a.sent();
8839
9084
  retries--;
8840
- if (!(retries < 0)) return [3 /*break*/, 5];
8841
- setError(e_1);
9085
+ if (!(retries <= 0 || currentAbort.cancelled)) return [3 /*break*/, 5];
9086
+ if (!currentAbort.cancelled) {
9087
+ setError(e_1);
9088
+ }
8842
9089
  setLoading(false);
8843
- return [3 /*break*/, 7];
9090
+ return [2 /*return*/];
8844
9091
  case 5:
8845
9092
  return [4 /*yield*/, new Promise(function (resolve) {
8846
9093
  return setTimeout(resolve, retryDelay);
@@ -8853,6 +9100,33 @@ function useDataPolling(fetchFn, options) {
8853
9100
  case 8:
8854
9101
  return [3 /*break*/, 1];
8855
9102
  case 9:
9103
+ if (!(retryCount <= 0 && !currentAbort.cancelled)) return [3 /*break*/, 14];
9104
+ _a.label = 10;
9105
+ case 10:
9106
+ _a.trys.push([10, 12,, 13]);
9107
+ return [4 /*yield*/, fetchFn()];
9108
+ case 11:
9109
+ result = _a.sent();
9110
+ if (!currentAbort.cancelled) {
9111
+ setData(result);
9112
+ setLoading(false);
9113
+ }
9114
+ return [3 /*break*/, 13];
9115
+ case 12:
9116
+ e_2 = _a.sent();
9117
+ if (!currentAbort.cancelled) {
9118
+ setError(e_2);
9119
+ setLoading(false);
9120
+ }
9121
+ return [3 /*break*/, 13];
9122
+ case 13:
9123
+ return [2 /*return*/];
9124
+ case 14:
9125
+ // All retries exhausted without success (caught in loop already handled above)
9126
+ if (!currentAbort.cancelled) {
9127
+ setError(new Error('All retries failed'));
9128
+ setLoading(false);
9129
+ }
8856
9130
  return [2 /*return*/];
8857
9131
  }
8858
9132
  });
@@ -8865,14 +9139,15 @@ function useDataPolling(fetchFn, options) {
8865
9139
  if (interval > 0) {
8866
9140
  var timer_1 = setInterval(fetchData, interval);
8867
9141
  return function () {
8868
- return clearInterval(timer_1);
9142
+ clearInterval(timer_1);
9143
+ abortRef.current.cancelled = true;
8869
9144
  };
8870
9145
  }
8871
- }, [interval, autoStart, fetchData, refreshIndex]);
9146
+ return function () {
9147
+ abortRef.current.cancelled = true;
9148
+ };
9149
+ }, [interval, autoStart, fetchData]);
8872
9150
  var refresh = (0,external_react_.useCallback)(function () {
8873
- setRefreshIndex(function (prev) {
8874
- return prev + 1;
8875
- });
8876
9151
  fetchData();
8877
9152
  }, [fetchData]);
8878
9153
  return {
@@ -9012,8 +9287,10 @@ function useChartTools(instance) {
9012
9287
  // ============================================================================
9013
9288
  // 导出
9014
9289
  // ============================================================================
9015
- var version = '1.2.0';
9016
- var hooks = {
9290
+ var version = '1.4.0';
9291
+ // 新增数据转换 hooks
9292
+
9293
+ /* harmony default export */ const hooks = ({
9017
9294
  useChart: useChart,
9018
9295
  useOption: useOption,
9019
9296
  useResize: useResize,
@@ -9027,8 +9304,7 @@ var hooks = {
9027
9304
  useFullscreen: useFullscreen,
9028
9305
  useExport: useExport,
9029
9306
  useChartTools: useChartTools
9030
- };
9031
- /* harmony default export */ const src_hooks = ((/* unused pure expression or super */ null && (hooks)));
9307
+ });
9032
9308
  ;// ./src/index.ts
9033
9309
  /**
9034
9310
  * TaroViz - 基于 Taro 和 ECharts 的多端图表组件库
@@ -9050,6 +9326,10 @@ var hooks = {
9050
9326
 
9051
9327
 
9052
9328
 
9329
+ // 新增图表组件
9330
+
9331
+
9332
+
9053
9333
  // 适配器
9054
9334
 
9055
9335
 
@@ -9073,12 +9353,12 @@ var hooks = {
9073
9353
  * 库信息
9074
9354
  */
9075
9355
  var src_name = 'taroviz';
9076
- var src_version = '1.2.1';
9077
- export { AnnotationPresets, components_BaseChart as BaseChart, ErrorBoundary, LazyChartRegistry, PRESET_THEMES, editor_ThemeEditor as ThemeEditor, convertAnnotationToMarkArea, convertAnnotationToMarkLine, convertAnnotationToScatter, createCompositeAnnotation, createLazyChart, darkTheme, defaultTheme, exportChart, getDarkThemes, getLightThemes, getRegisteredThemes, themes_getTheme as getTheme, getThemeByName, getThemesByTag, src_name as name, preloadAllCharts, preloadChart, registerTheme, switchTheme, themeManager, useAnnotation, useChart, useChartData, useChartTheme, useChartTools, useDataPolling, useEvents, useExport, useFullscreen, useLoading, useOption, useResize, useResponsive, useThemeSwitcher, src_version as version, withErrorBoundary, withLazyLoad };
9356
+ var src_version = '1.4.0';
9357
+ export { AnnotationPresets, components_BaseChart as BaseChart, candlestick as CandlestickChart, ErrorBoundary, graph as GraphChart, LazyChartRegistry, PRESET_THEMES, editor_ThemeEditor as ThemeEditor, wordcloud as WordCloudChart, convertAnnotationToMarkArea, convertAnnotationToMarkLine, convertAnnotationToScatter, createCompositeAnnotation, createLazyChart, darkTheme, defaultTheme, exportChart, getDarkThemes, getLightThemes, getRegisteredThemes, getTheme, getThemeByName, getThemesByTag, src_name as name, preloadAllCharts, preloadChart, registerTheme, switchTheme, themeManager, useAnnotation, useChart, useChartData, useChartTheme, useChartTools, useDataPolling, useDataTransform, useEvents, useExport, useFullscreen, useLoading, useOption, useResize, useResponsive, useTableTransform, useThemeSwitcher, useTimeSeriesTransform, src_version as version, withErrorBoundary, withLazyLoad };
9078
9358
  export const BarChart = bar["default"];
9079
9359
  export const FunnelChart = funnel["default"];
9080
9360
  export const GaugeChart = gauge["default"];
9081
- export const H5Adapter = h5/* default */.A;
9361
+ export const H5Adapter = h5["default"];
9082
9362
  export const HeatmapChart = heatmap["default"];
9083
9363
  export const LineChart = line["default"];
9084
9364
  export const PieChart = pie["default"];
@@ -9087,7 +9367,7 @@ export const SankeyChart = sankey["default"];
9087
9367
  export const ScatterChart = scatter["default"];
9088
9368
  export const SunburstChart = sunburst["default"];
9089
9369
  export const TreeMapChart = treemap["default"];
9090
- export const WeappAdapter = weapp/* default */.A;
9370
+ export const WeappAdapter = weapp["default"];
9091
9371
  export const debounce = utils/* debounce */.sg;
9092
9372
  export const deepMerge = utils/* deepMerge */.$N;
9093
9373
  export const detectPlatform = adapters/* detectPlatform */.li;