@agions/taroviz 1.3.1 → 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 (56) hide show
  1. package/dist/cjs/index.js +1 -1
  2. package/dist/esm/index.js +2035 -1745
  3. package/package.json +1 -1
  4. package/src/__tests__/integration.test.tsx +12 -10
  5. package/src/adapters/BaseAdapter.ts +116 -0
  6. package/src/adapters/__tests__/index.test.ts +10 -10
  7. package/src/adapters/index.ts +63 -74
  8. package/src/adapters/swan/index.ts +26 -223
  9. package/src/adapters/tt/index.ts +28 -225
  10. package/src/adapters/types.ts +36 -0
  11. package/src/adapters/weapp/index.ts +29 -189
  12. package/src/charts/bar/index.tsx +5 -9
  13. package/src/charts/candlestick/__tests__/index.test.tsx +37 -0
  14. package/src/charts/candlestick/index.tsx +13 -0
  15. package/src/charts/common/BaseChartWrapper.tsx +47 -38
  16. package/src/charts/funnel/index.tsx +5 -9
  17. package/src/charts/gauge/index.tsx +5 -9
  18. package/src/charts/graph/__tests__/index.test.tsx +41 -0
  19. package/src/charts/graph/index.tsx +13 -0
  20. package/src/charts/heatmap/index.tsx +5 -9
  21. package/src/charts/index.ts +6 -1
  22. package/src/charts/line/index.tsx +4 -7
  23. package/src/charts/pie/index.tsx +5 -10
  24. package/src/charts/radar/index.tsx +5 -9
  25. package/src/charts/scatter/index.tsx +5 -9
  26. package/src/charts/types.ts +48 -4
  27. package/src/charts/wordcloud/__tests__/index.test.tsx +36 -0
  28. package/src/charts/wordcloud/index.tsx +13 -0
  29. package/src/core/animation/AnimationManager.ts +15 -0
  30. package/src/core/components/Annotation.tsx +26 -21
  31. package/src/core/components/BaseChart.tsx +280 -1105
  32. package/src/core/components/ErrorBoundary.tsx +4 -1
  33. package/src/core/components/LazyChart.tsx +42 -55
  34. package/src/core/components/hooks/index.ts +20 -0
  35. package/src/core/components/hooks/useChartEvents.ts +143 -0
  36. package/src/core/components/hooks/useChartInit.ts +80 -0
  37. package/src/core/components/hooks/usePerformance.ts +186 -0
  38. package/src/core/components/hooks/useVirtualScroll.ts +156 -0
  39. package/src/core/echarts.ts +1 -1
  40. package/src/core/themes/ThemeManager.ts +31 -15
  41. package/src/core/types/index.ts +2 -2
  42. package/src/core/utils/chartInstances.ts +10 -3
  43. package/src/core/utils/chartUtils.ts +46 -0
  44. package/src/core/utils/common.ts +14 -1
  45. package/src/core/utils/export/ExportUtils.ts +13 -22
  46. package/src/core/utils/performance/PerformanceAnalyzer.ts +32 -5
  47. package/src/core/utils/uuid.ts +1 -1
  48. package/src/editor/ThemeEditor.tsx +1 -6
  49. package/src/hooks/__tests__/index.test.tsx +14 -11
  50. package/src/hooks/__tests__/useDataTransform.test.ts +159 -0
  51. package/src/hooks/index.ts +54 -19
  52. package/src/hooks/useDataTransform.ts +503 -0
  53. package/src/index.ts +15 -2
  54. package/src/main.tsx +4 -4
  55. package/src/themes/__tests__/index.test.ts +2 -2
  56. 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__);
@@ -275,121 +386,15 @@ var H5Adapter = /** @class */function () {
275
386
 
276
387
  /***/ },
277
388
 
278
- /***/ 234
389
+ /***/ 382
279
390
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
280
391
 
281
-
282
- // EXPORTS
283
- __webpack_require__.d(__webpack_exports__, {
284
- li: () => (/* binding */ detectPlatform),
285
- cK: () => (/* binding */ getAdapter),
286
- _$: () => (/* binding */ getEnv)
287
- });
288
-
289
- // UNUSED EXPORTS: H5Adapter, HarmonyAdapter, PlatformType, SwanAdapter, TTAdapter, WeappAdapter, default, version
290
-
291
- ;// ./src/core/types/common.ts
292
- /**
293
- * 图表事件声明
294
- */
295
- var ChartEventType;
296
- (function (ChartEventType) {
297
- ChartEventType["CLICK"] = "click";
298
- ChartEventType["MOUSEMOVE"] = "mousemove";
299
- ChartEventType["MOUSEUP"] = "mouseup";
300
- ChartEventType["MOUSEDOWN"] = "mousedown";
301
- ChartEventType["MOUSEOVER"] = "mouseover";
302
- ChartEventType["MOUSEOUT"] = "mouseout";
303
- ChartEventType["GLOBALOUT"] = "globalout";
304
- ChartEventType["LEGENDSELECTED"] = "legendselected";
305
- ChartEventType["LEGENDUNSELECTED"] = "legendunselected";
306
- ChartEventType["LEGENDSELECTCHANGED"] = "legendselectchanged";
307
- ChartEventType["LEGENDSCROLL"] = "legendscroll";
308
- ChartEventType["DATAZOOM"] = "datazoom";
309
- ChartEventType["DATARANGESELECTED"] = "datarangeselected";
310
- ChartEventType["TIMELINECHANGED"] = "timelinechanged";
311
- ChartEventType["TIMELINEPLAYCHANGED"] = "timelineplaychanged";
312
- ChartEventType["RESTORE"] = "restore";
313
- ChartEventType["DATAVIEWCHANGED"] = "dataviewchanged";
314
- ChartEventType["MAGICTYPECHANGED"] = "magictypechanged";
315
- ChartEventType["GEOSELECTCHANGED"] = "geoselectchanged";
316
- ChartEventType["GEOSELECTED"] = "geoselected";
317
- ChartEventType["GEOUNSELECTED"] = "geounselected";
318
- ChartEventType["PIESELECTCHANGED"] = "pieselectchanged";
319
- ChartEventType["PIESELECTED"] = "pieselected";
320
- ChartEventType["PIEUNSELECTED"] = "pieunselected";
321
- ChartEventType["MAPSELECTCHANGED"] = "mapselectchanged";
322
- ChartEventType["MAPSELECTED"] = "mapselected";
323
- ChartEventType["MAPUNSELECTED"] = "mapunselected";
324
- ChartEventType["AXISAREASELECTED"] = "axisareaselected";
325
- ChartEventType["FOCUSNODEADJACENCY"] = "focusnodeadjacency";
326
- ChartEventType["UNFOCUSNODEADJACENCY"] = "unfocusnodeadjacency";
327
- ChartEventType["BRUSH"] = "brush";
328
- ChartEventType["BRUSHSELECTED"] = "brushselected";
329
- ChartEventType["RENDERED"] = "rendered";
330
- ChartEventType["FINISHED"] = "finished";
331
- // 自定义事件
332
- ChartEventType["CHART_READY"] = "chartReady";
333
- ChartEventType["CHART_RESIZE"] = "chartResize";
334
- ChartEventType["CHART_ERROR"] = "chartError";
335
- ChartEventType["CHART_DISPOSE"] = "chartDispose";
336
- })(ChartEventType || (ChartEventType = {}));
337
- ;// ./src/core/types/platform.ts
338
- /**
339
- * 支持的平台类型
340
- */
341
- var PlatformType;
342
- (function (PlatformType) {
343
- PlatformType["H5"] = "h5";
344
- PlatformType["WEAPP"] = "weapp";
345
- PlatformType["ALIPAY"] = "alipay";
346
- PlatformType["SWAN"] = "swan";
347
- PlatformType["TT"] = "tt";
348
- PlatformType["QQ"] = "qq";
349
- PlatformType["JD"] = "jd";
350
- PlatformType["HARMONY"] = "harmony";
351
- PlatformType["DD"] = "dd";
352
- PlatformType["QYWX"] = "qywx";
353
- PlatformType["LARK"] = "lark";
354
- PlatformType["KWAI"] = "kwai";
355
- })(PlatformType || (PlatformType = {}));
356
- // EXTERNAL MODULE: ./src/core/animation/index.ts + 2 modules
357
- var animation = __webpack_require__(251);
358
- ;// ./src/core/types/index.ts
359
- // 公共类型
360
-
361
- // 平台类型
362
-
363
-
364
- // 导出动画相关类型
365
-
366
- // EXTERNAL MODULE: ./src/core/utils/index.ts + 2 modules
367
- var utils = __webpack_require__(524);
368
- // EXTERNAL MODULE: ./src/core/echarts.ts + 1 modules
369
- var echarts = __webpack_require__(930);
370
- ;// ./src/core/index.ts
371
- /**
372
- * TaroViz 核心组件库
373
- * 提供基础组件和工具函数
374
- */
375
- // 类型定义
376
-
377
- // 工具函数
378
-
379
- // ECharts 统一导出
380
-
381
- /**
382
- * 库信息
383
- */
384
- var core_name = 'taroviz';
385
- var version = '1.2.0';
386
- // EXTERNAL MODULE: ./src/adapters/h5/index.ts
387
- var h5 = __webpack_require__(123);
388
- // EXTERNAL MODULE: ./src/adapters/weapp/index.ts
389
- var weapp = __webpack_require__(999);
390
- // EXTERNAL MODULE: external "react"
391
- var external_react_ = __webpack_require__(15);
392
- ;// ./src/adapters/swan/index.ts
392
+ __webpack_require__.r(__webpack_exports__);
393
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
394
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
395
+ /* harmony export */ });
396
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(15);
397
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
393
398
  var __assign = undefined && undefined.__assign || function () {
394
399
  __assign = Object.assign || function (t) {
395
400
  for (var s, i = 1, n = arguments.length; i < n; i++) {
@@ -401,19 +406,19 @@ var __assign = undefined && undefined.__assign || function () {
401
406
  return __assign.apply(this, arguments);
402
407
  };
403
408
  /**
404
- * TaroViz 百度小程序适配器
405
- * 基于百度小程序canvas组件实现图表渲染
409
+ * TaroViz HarmonyOS适配器
410
+ * 基于HarmonyOS Canvas实现图表渲染
406
411
  */
407
412
 
408
413
  /**
409
- * 百度小程序环境下的图表适配器
414
+ * HarmonyOS环境下的图表适配器
410
415
  */
411
- var SwanAdapter = /** @class */function () {
416
+ var HarmonyAdapter = /** @class */function () {
412
417
  /**
413
418
  * 构造函数
414
419
  * @param config 适配器配置
415
420
  */
416
- function SwanAdapter(config) {
421
+ function HarmonyAdapter(config) {
417
422
  /**
418
423
  * 图表实例
419
424
  */
@@ -426,23 +431,23 @@ var SwanAdapter = /** @class */function () {
426
431
  this.component = config.component;
427
432
  }
428
433
  /**
429
- * 创建百度小程序适配器实例
434
+ * 创建HarmonyOS适配器实例
430
435
  * @param options 适配器选项
431
436
  * @returns 适配器实例
432
437
  */
433
- SwanAdapter.create = function (options) {
434
- return new SwanAdapter(options);
438
+ HarmonyAdapter.create = function (options) {
439
+ return new HarmonyAdapter(options);
435
440
  };
436
441
  /**
437
442
  * 获取图表实例
438
443
  */
439
- SwanAdapter.prototype.getInstance = function () {
444
+ HarmonyAdapter.prototype.getInstance = function () {
440
445
  return this.chartInstance;
441
446
  };
442
447
  /**
443
448
  * 初始化图表
444
449
  */
445
- SwanAdapter.prototype.init = function () {
450
+ HarmonyAdapter.prototype.init = function () {
446
451
  var _a = this.config,
447
452
  canvasId = _a.canvasId,
448
453
  width = _a.width,
@@ -450,11 +455,11 @@ var SwanAdapter = /** @class */function () {
450
455
  theme = _a.theme,
451
456
  option = _a.option;
452
457
  if (!this.component) {
453
- console.error('[TaroViz] SwanAdapter: component is required');
458
+ console.error('[TaroViz] HarmonyAdapter: component is required');
454
459
  return null;
455
460
  }
456
461
  if (!canvasId) {
457
- console.error('[TaroViz] SwanAdapter: canvasId is required');
462
+ console.error('[TaroViz] HarmonyAdapter: canvasId is required');
458
463
  return null;
459
464
  }
460
465
  // 创建图表实例
@@ -479,7 +484,7 @@ var SwanAdapter = /** @class */function () {
479
484
  /**
480
485
  * 设置图表选项
481
486
  */
482
- SwanAdapter.prototype.setOption = function (option, opts) {
487
+ HarmonyAdapter.prototype.setOption = function (option, opts) {
483
488
  if (this.chartInstance) {
484
489
  this.chartInstance.setOption(option, opts);
485
490
  } else {
@@ -489,7 +494,7 @@ var SwanAdapter = /** @class */function () {
489
494
  /**
490
495
  * 设置主题
491
496
  */
492
- SwanAdapter.prototype.setTheme = function (theme) {
497
+ HarmonyAdapter.prototype.setTheme = function (theme) {
493
498
  var _a, _b;
494
499
  this.config.theme = theme;
495
500
  if (this.chartInstance) {
@@ -499,32 +504,32 @@ var SwanAdapter = /** @class */function () {
499
504
  /**
500
505
  * 获取图表宽度
501
506
  */
502
- SwanAdapter.prototype.getWidth = function () {
507
+ HarmonyAdapter.prototype.getWidth = function () {
503
508
  return 0;
504
509
  };
505
510
  /**
506
511
  * 获取图表高度
507
512
  */
508
- SwanAdapter.prototype.getHeight = function () {
513
+ HarmonyAdapter.prototype.getHeight = function () {
509
514
  return 0;
510
515
  };
511
516
  /**
512
517
  * 获取DOM元素
513
518
  */
514
- SwanAdapter.prototype.getDom = function () {
519
+ HarmonyAdapter.prototype.getDom = function () {
515
520
  return null;
516
521
  };
517
522
  /**
518
523
  * 转换为DataURL
519
524
  */
520
- SwanAdapter.prototype.convertToDataURL = function (opts) {
525
+ HarmonyAdapter.prototype.convertToDataURL = function (opts) {
521
526
  var _a;
522
527
  return (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.getDataURL(opts);
523
528
  };
524
529
  /**
525
530
  * 清空图表
526
531
  */
527
- SwanAdapter.prototype.clear = function () {
532
+ HarmonyAdapter.prototype.clear = function () {
528
533
  if (this.chartInstance) {
529
534
  this.chartInstance.clear();
530
535
  }
@@ -532,7 +537,7 @@ var SwanAdapter = /** @class */function () {
532
537
  /**
533
538
  * 绑定事件
534
539
  */
535
- SwanAdapter.prototype.on = function (event, handler) {
540
+ HarmonyAdapter.prototype.on = function (event, handler) {
536
541
  if (this.chartInstance) {
537
542
  this.chartInstance.on(event, handler);
538
543
  }
@@ -540,7 +545,7 @@ var SwanAdapter = /** @class */function () {
540
545
  /**
541
546
  * 解绑事件
542
547
  */
543
- SwanAdapter.prototype.off = function (event, handler) {
548
+ HarmonyAdapter.prototype.off = function (event, handler) {
544
549
  if (this.chartInstance) {
545
550
  this.chartInstance.off(event, handler);
546
551
  }
@@ -548,7 +553,7 @@ var SwanAdapter = /** @class */function () {
548
553
  /**
549
554
  * 显示加载动画
550
555
  */
551
- SwanAdapter.prototype.showLoading = function (opts) {
556
+ HarmonyAdapter.prototype.showLoading = function (opts) {
552
557
  if (this.chartInstance) {
553
558
  this.chartInstance.showLoading(opts);
554
559
  }
@@ -556,7 +561,7 @@ var SwanAdapter = /** @class */function () {
556
561
  /**
557
562
  * 隐藏加载动画
558
563
  */
559
- SwanAdapter.prototype.hideLoading = function () {
564
+ HarmonyAdapter.prototype.hideLoading = function () {
560
565
  if (this.chartInstance) {
561
566
  this.chartInstance.hideLoading();
562
567
  }
@@ -564,7 +569,7 @@ var SwanAdapter = /** @class */function () {
564
569
  /**
565
570
  * 销毁图表
566
571
  */
567
- SwanAdapter.prototype.dispose = function () {
572
+ HarmonyAdapter.prototype.dispose = function () {
568
573
  if (this.chartInstance) {
569
574
  this.chartInstance.dispose();
570
575
  this.chartInstance = null;
@@ -573,7 +578,7 @@ var SwanAdapter = /** @class */function () {
573
578
  /**
574
579
  * 处理图表大小变化
575
580
  */
576
- SwanAdapter.prototype.resize = function (opts) {
581
+ HarmonyAdapter.prototype.resize = function (opts) {
577
582
  if (this.chartInstance) {
578
583
  this.chartInstance.resize(opts);
579
584
  }
@@ -581,13 +586,13 @@ var SwanAdapter = /** @class */function () {
581
586
  /**
582
587
  * 设置组件实例
583
588
  */
584
- SwanAdapter.prototype.setComponent = function (component) {
589
+ HarmonyAdapter.prototype.setComponent = function (component) {
585
590
  this.component = component;
586
591
  };
587
592
  /**
588
593
  * 渲染图表组件
589
594
  */
590
- SwanAdapter.prototype.render = function () {
595
+ HarmonyAdapter.prototype.render = function () {
591
596
  var _a = this.config,
592
597
  _b = _a.canvasId,
593
598
  canvasId = _b === void 0 ? 'ec-canvas' : _b,
@@ -598,7 +603,7 @@ var SwanAdapter = /** @class */function () {
598
603
  _e = _a.style,
599
604
  style = _e === void 0 ? {} : _e;
600
605
  // 注意:这里需要根据实际使用的Taro版本和组件库来调整
601
- return /*#__PURE__*/external_react_.createElement('view', {
606
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement('view', {
602
607
  id: canvasId,
603
608
  style: __assign({
604
609
  width: width,
@@ -609,7 +614,7 @@ var SwanAdapter = /** @class */function () {
609
614
  /**
610
615
  * 触发图表行为
611
616
  */
612
- SwanAdapter.prototype.dispatchAction = function (payload) {
617
+ HarmonyAdapter.prototype.dispatchAction = function (payload) {
613
618
  if (this.chartInstance) {
614
619
  this.chartInstance.dispatchAction(payload);
615
620
  }
@@ -617,483 +622,134 @@ var SwanAdapter = /** @class */function () {
617
622
  /**
618
623
  * 获取DataURL
619
624
  */
620
- SwanAdapter.prototype.getDataURL = function (opts) {
625
+ HarmonyAdapter.prototype.getDataURL = function (opts) {
621
626
  var _a;
622
627
  return (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.getDataURL(opts);
623
628
  };
624
- return SwanAdapter;
629
+ return HarmonyAdapter;
625
630
  }();
626
- /* harmony default export */ const swan = (SwanAdapter);
627
- ;// ./src/adapters/tt/index.ts
628
- var tt_assign = undefined && undefined.__assign || function () {
629
- tt_assign = Object.assign || function (t) {
630
- for (var s, i = 1, n = arguments.length; i < n; i++) {
631
- s = arguments[i];
632
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
633
- }
634
- return t;
635
- };
636
- return tt_assign.apply(this, arguments);
637
- };
638
- /**
639
- * TaroViz 字节跳动小程序适配器
640
- * 基于字节跳动小程序canvas组件实现图表渲染
641
- */
631
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (HarmonyAdapter);
632
+
633
+ /***/ },
634
+
635
+ /***/ 574
636
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
637
+
638
+
639
+ // EXPORTS
640
+ __webpack_require__.d(__webpack_exports__, {
641
+ li: () => (/* binding */ detectPlatform),
642
+ cK: () => (/* binding */ getAdapter),
643
+ _$: () => (/* binding */ getEnv)
644
+ });
645
+
646
+ // UNUSED EXPORTS: H5Adapter, HarmonyAdapter, PlatformType, SwanAdapter, TTAdapter, WeappAdapter, default, version
642
647
 
648
+ ;// ./src/core/types/common.ts
643
649
  /**
644
- * 字节跳动小程序环境下的图表适配器
650
+ * 图表事件声明
645
651
  */
646
- var TTAdapter = /** @class */function () {
647
- /**
648
- * 构造函数
649
- * @param config 适配器配置
650
- */
651
- function TTAdapter(config) {
652
- /**
653
- * 图表实例
654
- */
655
- this.chartInstance = null;
656
- /**
657
- * 组件实例
658
- */
659
- this.component = null;
660
- this.config = config;
661
- this.component = config.component;
662
- }
663
- /**
664
- * 创建字节跳动小程序适配器实例
665
- * @param options 适配器选项
666
- * @returns 适配器实例
667
- */
668
- TTAdapter.create = function (options) {
669
- return new TTAdapter(options);
670
- };
671
- /**
672
- * 获取图表实例
673
- */
674
- TTAdapter.prototype.getInstance = function () {
675
- return this.chartInstance;
676
- };
677
- /**
678
- * 初始化图表
679
- */
680
- TTAdapter.prototype.init = function () {
681
- var _a = this.config,
682
- canvasId = _a.canvasId,
683
- width = _a.width,
684
- height = _a.height,
685
- theme = _a.theme,
686
- option = _a.option;
687
- if (!this.component) {
688
- console.error('[TaroViz] TTAdapter: component is required');
689
- return null;
690
- }
691
- if (!canvasId) {
692
- console.error('[TaroViz] TTAdapter: canvasId is required');
693
- return null;
694
- }
695
- // 创建图表实例
696
- var chart = this.component.createChart({
697
- id: canvasId,
698
- width: width,
699
- height: height,
700
- theme: theme
701
- });
702
- // 设置图表选项
703
- if (option) {
704
- chart.setOption(option);
705
- }
706
- // 存储图表实例
707
- this.chartInstance = chart;
708
- // 初始化回调
709
- if (this.config.onInit) {
710
- this.config.onInit(chart);
711
- }
712
- return chart;
713
- };
714
- /**
715
- * 设置图表选项
716
- */
717
- TTAdapter.prototype.setOption = function (option, opts) {
718
- if (this.chartInstance) {
719
- this.chartInstance.setOption(option, opts);
720
- } else {
721
- this.config.option = option;
722
- }
723
- };
724
- /**
725
- * 设置主题
726
- */
727
- TTAdapter.prototype.setTheme = function (theme) {
728
- var _a, _b;
729
- this.config.theme = theme;
730
- if (this.chartInstance) {
731
- (_b = (_a = this.chartInstance).setTheme) === null || _b === void 0 ? void 0 : _b.call(_a, theme);
732
- }
733
- };
734
- /**
735
- * 获取图表宽度
736
- */
737
- TTAdapter.prototype.getWidth = function () {
738
- return 0;
739
- };
740
- /**
741
- * 获取图表高度
742
- */
743
- TTAdapter.prototype.getHeight = function () {
744
- return 0;
745
- };
746
- /**
747
- * 获取DOM元素
748
- */
749
- TTAdapter.prototype.getDom = function () {
750
- return null;
751
- };
752
- /**
753
- * 转换为DataURL
754
- */
755
- TTAdapter.prototype.convertToDataURL = function (opts) {
756
- var _a;
757
- return (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.getDataURL(opts);
758
- };
759
- /**
760
- * 清空图表
761
- */
762
- TTAdapter.prototype.clear = function () {
763
- if (this.chartInstance) {
764
- this.chartInstance.clear();
765
- }
766
- };
767
- /**
768
- * 绑定事件
769
- */
770
- TTAdapter.prototype.on = function (event, handler) {
771
- if (this.chartInstance) {
772
- this.chartInstance.on(event, handler);
773
- }
774
- };
775
- /**
776
- * 解绑事件
777
- */
778
- TTAdapter.prototype.off = function (event, handler) {
779
- if (this.chartInstance) {
780
- this.chartInstance.off(event, handler);
781
- }
782
- };
783
- /**
784
- * 显示加载动画
785
- */
786
- TTAdapter.prototype.showLoading = function (opts) {
787
- if (this.chartInstance) {
788
- this.chartInstance.showLoading(opts);
789
- }
790
- };
791
- /**
792
- * 隐藏加载动画
793
- */
794
- TTAdapter.prototype.hideLoading = function () {
795
- if (this.chartInstance) {
796
- this.chartInstance.hideLoading();
797
- }
798
- };
799
- /**
800
- * 销毁图表
801
- */
802
- TTAdapter.prototype.dispose = function () {
803
- if (this.chartInstance) {
804
- this.chartInstance.dispose();
805
- this.chartInstance = null;
806
- }
807
- };
808
- /**
809
- * 处理图表大小变化
810
- */
811
- TTAdapter.prototype.resize = function (opts) {
812
- if (this.chartInstance) {
813
- this.chartInstance.resize(opts);
814
- }
815
- };
816
- /**
817
- * 设置组件实例
818
- */
819
- TTAdapter.prototype.setComponent = function (component) {
820
- this.component = component;
821
- };
822
- /**
823
- * 渲染图表组件
824
- */
825
- TTAdapter.prototype.render = function () {
826
- var _a = this.config,
827
- _b = _a.canvasId,
828
- canvasId = _b === void 0 ? 'ec-canvas' : _b,
829
- _c = _a.width,
830
- width = _c === void 0 ? '100%' : _c,
831
- _d = _a.height,
832
- height = _d === void 0 ? '300px' : _d,
833
- _e = _a.style,
834
- style = _e === void 0 ? {} : _e;
835
- // 注意:这里需要根据实际使用的Taro版本和组件库来调整
836
- return /*#__PURE__*/external_react_.createElement('view', {
837
- id: canvasId,
838
- style: tt_assign({
839
- width: width,
840
- height: height
841
- }, style)
842
- });
843
- };
844
- /**
845
- * 触发图表行为
846
- */
847
- TTAdapter.prototype.dispatchAction = function (payload) {
848
- if (this.chartInstance) {
849
- this.chartInstance.dispatchAction(payload);
850
- }
851
- };
852
- /**
853
- * 获取DataURL
854
- */
855
- TTAdapter.prototype.getDataURL = function (opts) {
856
- var _a;
857
- return (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.getDataURL(opts);
858
- };
859
- return TTAdapter;
860
- }();
861
- /* harmony default export */ const tt = (TTAdapter);
862
- ;// ./src/adapters/harmony/index.ts
863
- var harmony_assign = undefined && undefined.__assign || function () {
864
- harmony_assign = Object.assign || function (t) {
865
- for (var s, i = 1, n = arguments.length; i < n; i++) {
866
- s = arguments[i];
867
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
868
- }
869
- return t;
870
- };
871
- return harmony_assign.apply(this, arguments);
872
- };
873
- /**
874
- * TaroViz HarmonyOS适配器
875
- * 基于HarmonyOS Canvas实现图表渲染
876
- */
877
-
878
- /**
879
- * HarmonyOS环境下的图表适配器
880
- */
881
- var HarmonyAdapter = /** @class */function () {
882
- /**
883
- * 构造函数
884
- * @param config 适配器配置
885
- */
886
- function HarmonyAdapter(config) {
887
- /**
888
- * 图表实例
889
- */
890
- this.chartInstance = null;
891
- /**
892
- * 组件实例
893
- */
894
- this.component = null;
895
- this.config = config;
896
- this.component = config.component;
897
- }
898
- /**
899
- * 创建HarmonyOS适配器实例
900
- * @param options 适配器选项
901
- * @returns 适配器实例
902
- */
903
- HarmonyAdapter.create = function (options) {
904
- return new HarmonyAdapter(options);
905
- };
906
- /**
907
- * 获取图表实例
908
- */
909
- HarmonyAdapter.prototype.getInstance = function () {
910
- return this.chartInstance;
911
- };
912
- /**
913
- * 初始化图表
914
- */
915
- HarmonyAdapter.prototype.init = function () {
916
- var _a = this.config,
917
- canvasId = _a.canvasId,
918
- width = _a.width,
919
- height = _a.height,
920
- theme = _a.theme,
921
- option = _a.option;
922
- if (!this.component) {
923
- console.error('[TaroViz] HarmonyAdapter: component is required');
924
- return null;
925
- }
926
- if (!canvasId) {
927
- console.error('[TaroViz] HarmonyAdapter: canvasId is required');
928
- return null;
929
- }
930
- // 创建图表实例
931
- var chart = this.component.createChart({
932
- id: canvasId,
933
- width: width,
934
- height: height,
935
- theme: theme
936
- });
937
- // 设置图表选项
938
- if (option) {
939
- chart.setOption(option);
940
- }
941
- // 存储图表实例
942
- this.chartInstance = chart;
943
- // 初始化回调
944
- if (this.config.onInit) {
945
- this.config.onInit(chart);
946
- }
947
- return chart;
948
- };
949
- /**
950
- * 设置图表选项
951
- */
952
- HarmonyAdapter.prototype.setOption = function (option, opts) {
953
- if (this.chartInstance) {
954
- this.chartInstance.setOption(option, opts);
955
- } else {
956
- this.config.option = option;
957
- }
958
- };
959
- /**
960
- * 设置主题
961
- */
962
- HarmonyAdapter.prototype.setTheme = function (theme) {
963
- var _a, _b;
964
- this.config.theme = theme;
965
- if (this.chartInstance) {
966
- (_b = (_a = this.chartInstance).setTheme) === null || _b === void 0 ? void 0 : _b.call(_a, theme);
967
- }
968
- };
969
- /**
970
- * 获取图表宽度
971
- */
972
- HarmonyAdapter.prototype.getWidth = function () {
973
- return 0;
974
- };
975
- /**
976
- * 获取图表高度
977
- */
978
- HarmonyAdapter.prototype.getHeight = function () {
979
- return 0;
980
- };
981
- /**
982
- * 获取DOM元素
983
- */
984
- HarmonyAdapter.prototype.getDom = function () {
985
- return null;
986
- };
987
- /**
988
- * 转换为DataURL
989
- */
990
- HarmonyAdapter.prototype.convertToDataURL = function (opts) {
991
- var _a;
992
- return (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.getDataURL(opts);
993
- };
994
- /**
995
- * 清空图表
996
- */
997
- HarmonyAdapter.prototype.clear = function () {
998
- if (this.chartInstance) {
999
- this.chartInstance.clear();
1000
- }
1001
- };
1002
- /**
1003
- * 绑定事件
1004
- */
1005
- HarmonyAdapter.prototype.on = function (event, handler) {
1006
- if (this.chartInstance) {
1007
- this.chartInstance.on(event, handler);
1008
- }
1009
- };
1010
- /**
1011
- * 解绑事件
1012
- */
1013
- HarmonyAdapter.prototype.off = function (event, handler) {
1014
- if (this.chartInstance) {
1015
- this.chartInstance.off(event, handler);
1016
- }
1017
- };
1018
- /**
1019
- * 显示加载动画
1020
- */
1021
- HarmonyAdapter.prototype.showLoading = function (opts) {
1022
- if (this.chartInstance) {
1023
- this.chartInstance.showLoading(opts);
1024
- }
1025
- };
1026
- /**
1027
- * 隐藏加载动画
1028
- */
1029
- HarmonyAdapter.prototype.hideLoading = function () {
1030
- if (this.chartInstance) {
1031
- this.chartInstance.hideLoading();
1032
- }
1033
- };
1034
- /**
1035
- * 销毁图表
1036
- */
1037
- HarmonyAdapter.prototype.dispose = function () {
1038
- if (this.chartInstance) {
1039
- this.chartInstance.dispose();
1040
- this.chartInstance = null;
1041
- }
1042
- };
1043
- /**
1044
- * 处理图表大小变化
1045
- */
1046
- HarmonyAdapter.prototype.resize = function (opts) {
1047
- if (this.chartInstance) {
1048
- this.chartInstance.resize(opts);
1049
- }
1050
- };
1051
- /**
1052
- * 设置组件实例
1053
- */
1054
- HarmonyAdapter.prototype.setComponent = function (component) {
1055
- this.component = component;
1056
- };
1057
- /**
1058
- * 渲染图表组件
1059
- */
1060
- HarmonyAdapter.prototype.render = function () {
1061
- var _a = this.config,
1062
- _b = _a.canvasId,
1063
- canvasId = _b === void 0 ? 'ec-canvas' : _b,
1064
- _c = _a.width,
1065
- width = _c === void 0 ? '100%' : _c,
1066
- _d = _a.height,
1067
- height = _d === void 0 ? '300px' : _d,
1068
- _e = _a.style,
1069
- style = _e === void 0 ? {} : _e;
1070
- // 注意:这里需要根据实际使用的Taro版本和组件库来调整
1071
- return /*#__PURE__*/external_react_.createElement('view', {
1072
- id: canvasId,
1073
- style: harmony_assign({
1074
- width: width,
1075
- height: height
1076
- }, style)
1077
- });
1078
- };
1079
- /**
1080
- * 触发图表行为
1081
- */
1082
- HarmonyAdapter.prototype.dispatchAction = function (payload) {
1083
- if (this.chartInstance) {
1084
- this.chartInstance.dispatchAction(payload);
1085
- }
1086
- };
1087
- /**
1088
- * 获取DataURL
1089
- */
1090
- HarmonyAdapter.prototype.getDataURL = function (opts) {
1091
- var _a;
1092
- return (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.getDataURL(opts);
1093
- };
1094
- return HarmonyAdapter;
1095
- }();
1096
- /* harmony default export */ const harmony = (HarmonyAdapter);
652
+ var ChartEventType;
653
+ (function (ChartEventType) {
654
+ ChartEventType["CLICK"] = "click";
655
+ ChartEventType["MOUSEMOVE"] = "mousemove";
656
+ ChartEventType["MOUSEUP"] = "mouseup";
657
+ ChartEventType["MOUSEDOWN"] = "mousedown";
658
+ ChartEventType["MOUSEOVER"] = "mouseover";
659
+ ChartEventType["MOUSEOUT"] = "mouseout";
660
+ ChartEventType["GLOBALOUT"] = "globalout";
661
+ ChartEventType["LEGENDSELECTED"] = "legendselected";
662
+ ChartEventType["LEGENDUNSELECTED"] = "legendunselected";
663
+ ChartEventType["LEGENDSELECTCHANGED"] = "legendselectchanged";
664
+ ChartEventType["LEGENDSCROLL"] = "legendscroll";
665
+ ChartEventType["DATAZOOM"] = "datazoom";
666
+ ChartEventType["DATARANGESELECTED"] = "datarangeselected";
667
+ ChartEventType["TIMELINECHANGED"] = "timelinechanged";
668
+ ChartEventType["TIMELINEPLAYCHANGED"] = "timelineplaychanged";
669
+ ChartEventType["RESTORE"] = "restore";
670
+ ChartEventType["DATAVIEWCHANGED"] = "dataviewchanged";
671
+ ChartEventType["MAGICTYPECHANGED"] = "magictypechanged";
672
+ ChartEventType["GEOSELECTCHANGED"] = "geoselectchanged";
673
+ ChartEventType["GEOSELECTED"] = "geoselected";
674
+ ChartEventType["GEOUNSELECTED"] = "geounselected";
675
+ ChartEventType["PIESELECTCHANGED"] = "pieselectchanged";
676
+ ChartEventType["PIESELECTED"] = "pieselected";
677
+ ChartEventType["PIEUNSELECTED"] = "pieunselected";
678
+ ChartEventType["MAPSELECTCHANGED"] = "mapselectchanged";
679
+ ChartEventType["MAPSELECTED"] = "mapselected";
680
+ ChartEventType["MAPUNSELECTED"] = "mapunselected";
681
+ ChartEventType["AXISAREASELECTED"] = "axisareaselected";
682
+ ChartEventType["FOCUSNODEADJACENCY"] = "focusnodeadjacency";
683
+ ChartEventType["UNFOCUSNODEADJACENCY"] = "unfocusnodeadjacency";
684
+ ChartEventType["BRUSH"] = "brush";
685
+ ChartEventType["BRUSHSELECTED"] = "brushselected";
686
+ ChartEventType["RENDERED"] = "rendered";
687
+ ChartEventType["FINISHED"] = "finished";
688
+ // 自定义事件
689
+ ChartEventType["CHART_READY"] = "chartReady";
690
+ ChartEventType["CHART_RESIZE"] = "chartResize";
691
+ ChartEventType["CHART_ERROR"] = "chartError";
692
+ ChartEventType["CHART_DISPOSE"] = "chartDispose";
693
+ })(ChartEventType || (ChartEventType = {}));
694
+ ;// ./src/core/types/platform.ts
695
+ /**
696
+ * 支持的平台类型
697
+ */
698
+ var PlatformType;
699
+ (function (PlatformType) {
700
+ PlatformType["H5"] = "h5";
701
+ PlatformType["WEAPP"] = "weapp";
702
+ PlatformType["ALIPAY"] = "alipay";
703
+ PlatformType["SWAN"] = "swan";
704
+ PlatformType["TT"] = "tt";
705
+ PlatformType["QQ"] = "qq";
706
+ PlatformType["JD"] = "jd";
707
+ PlatformType["HARMONY"] = "harmony";
708
+ PlatformType["DD"] = "dd";
709
+ PlatformType["QYWX"] = "qywx";
710
+ PlatformType["LARK"] = "lark";
711
+ PlatformType["KWAI"] = "kwai";
712
+ })(PlatformType || (PlatformType = {}));
713
+ // EXTERNAL MODULE: ./src/core/animation/index.ts + 2 modules
714
+ var animation = __webpack_require__(251);
715
+ ;// ./src/core/types/index.ts
716
+ // 公共类型
717
+
718
+ // 平台类型
719
+
720
+
721
+ // 导出动画相关类型
722
+
723
+ // EXTERNAL MODULE: ./src/core/utils/index.ts + 2 modules
724
+ var utils = __webpack_require__(524);
725
+ // EXTERNAL MODULE: ./src/core/echarts.ts + 1 modules
726
+ var echarts = __webpack_require__(930);
727
+ ;// ./src/core/index.ts
728
+ /**
729
+ * TaroViz 核心组件库
730
+ * 提供基础组件和工具函数
731
+ */
732
+ // 类型定义
733
+
734
+ // 工具函数
735
+
736
+ // ECharts 统一导出
737
+
738
+ /**
739
+ * 库信息
740
+ */
741
+ var core_name = 'taroviz';
742
+ var version = '1.2.0';
743
+ // EXTERNAL MODULE: ./src/adapters/h5/index.ts
744
+ var h5 = __webpack_require__(123);
745
+ // EXTERNAL MODULE: ./src/adapters/weapp/index.ts
746
+ var weapp = __webpack_require__(999);
747
+ // EXTERNAL MODULE: ./src/adapters/swan/index.ts
748
+ var swan = __webpack_require__(85);
749
+ // EXTERNAL MODULE: ./src/adapters/tt/index.ts
750
+ var tt = __webpack_require__(280);
751
+ // EXTERNAL MODULE: ./src/adapters/harmony/index.ts
752
+ var harmony = __webpack_require__(382);
1097
753
  ;// ./src/adapters/types.ts
1098
754
 
1099
755
 
@@ -1101,7 +757,120 @@ var HarmonyAdapter = /** @class */function () {
1101
757
  /**
1102
758
  * TaroViz 平台适配器
1103
759
  * 自动检测并加载适合当前平台的适配器
760
+ *
761
+ * 使用动态导入实现按需加载,减少包体积
1104
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
+ };
1105
874
  var _a;
1106
875
 
1107
876
  var PLATFORM_CONFIGS = (_a = {}, _a[PlatformType.H5] = {
@@ -1145,58 +914,59 @@ function detectPlatform() {
1145
914
  if (typeof window === 'undefined') {
1146
915
  return PlatformType.H5;
1147
916
  }
917
+ var win = window;
1148
918
  var checks = [{
1149
919
  test: function () {
1150
920
  var _a, _b;
1151
- 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);
1152
922
  },
1153
923
  platform: PlatformType.WEAPP
1154
924
  }, {
1155
925
  test: function () {
1156
926
  var _a;
1157
- 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);
1158
928
  },
1159
929
  platform: PlatformType.ALIPAY
1160
930
  }, {
1161
931
  test: function () {
1162
932
  var _a;
1163
- 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);
1164
934
  },
1165
935
  platform: PlatformType.SWAN
1166
936
  }, {
1167
937
  test: function () {
1168
938
  var _a;
1169
- 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);
1170
940
  },
1171
941
  platform: PlatformType.TT
1172
942
  }, {
1173
943
  test: function () {
1174
944
  var _a;
1175
- 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);
1176
946
  },
1177
947
  platform: PlatformType.QQ
1178
948
  }, {
1179
949
  test: function () {
1180
950
  var _a;
1181
- 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);
1182
952
  },
1183
953
  platform: PlatformType.JD
1184
954
  }, {
1185
955
  test: function () {
1186
956
  var _a;
1187
- 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);
1188
958
  },
1189
959
  platform: PlatformType.DD
1190
960
  }, {
1191
961
  test: function () {
1192
962
  var _a;
1193
- 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);
1194
964
  },
1195
965
  platform: PlatformType.QYWX
1196
966
  }, {
1197
967
  test: function () {
1198
968
  var _a, _b;
1199
- 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';
1200
970
  },
1201
971
  platform: PlatformType.LARK
1202
972
  }, {
@@ -1227,301 +997,412 @@ function getEnv() {
1227
997
  return 'unknown';
1228
998
  }
1229
999
  /**
1230
- * 创建适配器实例
1231
- * 使用静态导入避免动态 require 的 ESM 问题
1232
- */
1233
- function createAdapterInstance(platform, options) {
1234
- // 预加载所有适配器(编译时解析,支持 tree-shaking)
1235
- switch (platform) {
1236
- case PlatformType.H5:
1237
- case PlatformType.ALIPAY:
1238
- case PlatformType.QQ:
1239
- case PlatformType.JD:
1240
- case PlatformType.DD:
1241
- case PlatformType.QYWX:
1242
- case PlatformType.LARK:
1243
- case PlatformType.KWAI:
1244
- return h5/* default */.A.create(options);
1245
- case PlatformType.WEAPP:
1246
- return weapp/* default */.A.create(options);
1247
- case PlatformType.SWAN:
1248
- return swan.create(options);
1249
- case PlatformType.TT:
1250
- return tt.create(options);
1251
- case PlatformType.HARMONY:
1252
- return harmony.create(options);
1253
- default:
1254
- return h5/* default */.A.create(options);
1255
- }
1000
+ * 获取适配器
1001
+ * 返回 Promise 以支持动态导入
1002
+ */
1003
+ function getAdapter(options) {
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
+ });
1256
1090
  }
1257
- // 静态导入适配器
1091
+ // 导出所有适配器
1092
+
1093
+
1094
+
1095
+
1096
+
1097
+ /**
1098
+ * 版本信息
1099
+ */
1100
+ var adapters_version = '1.2.0';
1258
1101
 
1102
+ /* harmony default export */ const adapters = ({
1103
+ getAdapter: getAdapter,
1104
+ getEnv: getEnv,
1105
+ detectPlatform: detectPlatform
1106
+ });
1259
1107
 
1108
+ /***/ },
1260
1109
 
1110
+ /***/ 85
1111
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1261
1112
 
1113
+ __webpack_require__.r(__webpack_exports__);
1114
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1115
+ /* harmony export */ SwanAdapter: () => (/* binding */ SwanAdapter),
1116
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1117
+ /* harmony export */ });
1118
+ /* harmony import */ var _BaseAdapter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(219);
1119
+ /**
1120
+ * TaroViz 百度小程序适配器
1121
+ * 基于百度小程序canvas组件实现图表渲染
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
+ }();
1262
1143
 
1263
- /**
1264
- * 获取适配器
1265
- */
1266
- function getAdapter(options) {
1267
- var platform = detectPlatform();
1268
- var config = PLATFORM_CONFIGS[platform];
1269
- // 检查是否需要 component 属性
1270
- if ((config === null || config === void 0 ? void 0 : config.requireComponent) && !('component' in options)) {
1271
- console.warn("[TaroViz] ".concat(config.name, "Adapter requires component property, fallback to H5Adapter"));
1272
- }
1273
- try {
1274
- return createAdapterInstance(platform, options);
1275
- } catch (error) {
1276
- console.error("[TaroViz] Failed to load adapter for platform '".concat(platform, "':"), error);
1277
- return h5/* default */.A.create(options);
1144
+ var SwanAdapter = /** @class */function (_super) {
1145
+ __extends(SwanAdapter, _super);
1146
+ function SwanAdapter(config) {
1147
+ var _this = _super.call(this, config) || this;
1148
+ _this.component = null;
1149
+ _this.component = config.component;
1150
+ return _this;
1278
1151
  }
1279
- }
1280
- // 导出所有适配器
1281
-
1282
-
1283
-
1284
-
1285
-
1286
- /**
1287
- * 版本信息
1288
- */
1289
- var adapters_version = '1.2.0';
1152
+ SwanAdapter.create = function (options) {
1153
+ return new SwanAdapter(options);
1154
+ };
1155
+ SwanAdapter.prototype.init = function () {
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;
1162
+ if (!this.component) {
1163
+ console.error('[TaroViz] SwanAdapter: component is required');
1164
+ return null;
1165
+ }
1166
+ if (!canvasId) {
1167
+ console.error('[TaroViz] SwanAdapter: canvasId is required');
1168
+ return null;
1169
+ }
1170
+ var chart = this.component.createChart({
1171
+ id: canvasId,
1172
+ width: width,
1173
+ height: height,
1174
+ theme: theme
1175
+ });
1176
+ if (option) {
1177
+ chart.setOption(option);
1178
+ }
1179
+ this.chartInstance = chart;
1180
+ var onInit = this.config['onInit'];
1181
+ if (onInit) {
1182
+ onInit(chart);
1183
+ }
1184
+ return chart;
1185
+ };
1186
+ SwanAdapter.prototype.getWidth = function () {
1187
+ return this.parseSize(this.config.width, 300);
1188
+ };
1189
+ SwanAdapter.prototype.getHeight = function () {
1190
+ return this.parseSize(this.config.height, 300);
1191
+ };
1192
+ SwanAdapter.prototype.setComponent = function (component) {
1193
+ this.component = component;
1194
+ };
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);
1198
+ };
1199
+ SwanAdapter.prototype.getDataURL = function (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);
1202
+ };
1203
+ return SwanAdapter;
1204
+ }(_BaseAdapter__WEBPACK_IMPORTED_MODULE_0__/* .BaseAdapter */ .D);
1290
1205
 
1291
- /* harmony default export */ const adapters = ({
1292
- getAdapter: getAdapter,
1293
- getEnv: getEnv,
1294
- detectPlatform: detectPlatform
1295
- });
1206
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SwanAdapter);
1296
1207
 
1297
1208
  /***/ },
1298
1209
 
1299
- /***/ 999
1210
+ /***/ 280
1300
1211
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1301
1212
 
1213
+ __webpack_require__.r(__webpack_exports__);
1302
1214
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1303
- /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)
1215
+ /* harmony export */ TTAdapter: () => (/* binding */ TTAdapter),
1216
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1304
1217
  /* harmony export */ });
1305
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(15);
1306
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
1307
- var __assign = undefined && undefined.__assign || function () {
1308
- __assign = Object.assign || function (t) {
1309
- for (var s, i = 1, n = arguments.length; i < n; i++) {
1310
- s = arguments[i];
1311
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
1312
- }
1313
- return t;
1314
- };
1315
- return __assign.apply(this, arguments);
1316
- };
1218
+ /* harmony import */ var _BaseAdapter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(219);
1317
1219
  /**
1318
- * TaroViz 微信小程序适配器
1319
- * 基于微信小程序canvas组件实现图表渲染
1220
+ * TaroViz 抖音小程序适配器
1221
+ * 基于抖音小程序canvas组件实现图表渲染
1320
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
+ }();
1321
1243
 
1322
- /**
1323
- * 微信小程序环境下的图表适配器
1324
- */
1325
- var WeappAdapter = /** @class */function () {
1326
- /**
1327
- * 构造函数
1328
- * @param config 适配器配置
1329
- */
1330
- function WeappAdapter(config) {
1331
- /**
1332
- * 图表实例
1333
- */
1334
- this.chartInstance = null;
1335
- /**
1336
- * 组件实例
1337
- */
1338
- this.component = null;
1339
- this.config = config;
1340
- this.component = config.component;
1244
+ var TTAdapter = /** @class */function (_super) {
1245
+ __extends(TTAdapter, _super);
1246
+ function TTAdapter(config) {
1247
+ var _this = _super.call(this, config) || this;
1248
+ _this.component = null;
1249
+ _this.component = config.component;
1250
+ return _this;
1341
1251
  }
1342
- /**
1343
- * 创建微信小程序适配器实例
1344
- * @param options 适配器选项
1345
- * @returns 适配器实例
1346
- */
1347
- WeappAdapter.create = function (options) {
1348
- return new WeappAdapter(options);
1349
- };
1350
- /**
1351
- * 获取图表实例
1352
- */
1353
- WeappAdapter.prototype.getInstance = function () {
1354
- return this.chartInstance;
1252
+ TTAdapter.create = function (options) {
1253
+ return new TTAdapter(options);
1355
1254
  };
1356
- /**
1357
- * 初始化图表
1358
- */
1359
- WeappAdapter.prototype.init = function () {
1360
- var _a = this.config,
1361
- canvasId = _a.canvasId,
1362
- width = _a.width,
1363
- height = _a.height,
1364
- theme = _a.theme,
1365
- option = _a.option;
1255
+ TTAdapter.prototype.init = function () {
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;
1366
1262
  if (!this.component) {
1367
- console.error('[TaroViz] WeappAdapter: component is required');
1263
+ console.error('[TaroViz] TTAdapter: component is required');
1368
1264
  return null;
1369
1265
  }
1370
1266
  if (!canvasId) {
1371
- console.error('[TaroViz] WeappAdapter: canvasId is required');
1267
+ console.error('[TaroViz] TTAdapter: canvasId is required');
1372
1268
  return null;
1373
1269
  }
1374
- // 创建图表实例
1375
1270
  var chart = this.component.createChart({
1376
1271
  id: canvasId,
1377
1272
  width: width,
1378
1273
  height: height,
1379
1274
  theme: theme
1380
1275
  });
1381
- // 设置图表选项
1382
1276
  if (option) {
1383
1277
  chart.setOption(option);
1384
1278
  }
1385
- // 存储图表实例
1386
1279
  this.chartInstance = chart;
1387
- // 初始化回调
1388
- if (this.config.onInit) {
1389
- this.config.onInit(chart);
1280
+ var onInit = this.config['onInit'];
1281
+ if (onInit) {
1282
+ onInit(chart);
1390
1283
  }
1391
1284
  return chart;
1392
1285
  };
1393
- /**
1394
- * 设置图表选项
1395
- */
1396
- WeappAdapter.prototype.setOption = function (option, opts) {
1397
- if (this.chartInstance) {
1398
- this.chartInstance.setOption(option, opts);
1399
- } else {
1400
- this.config.option = option;
1401
- }
1286
+ TTAdapter.prototype.getWidth = function () {
1287
+ return this.parseSize(this.config.width, 300);
1402
1288
  };
1403
- /**
1404
- * 设置主题
1405
- */
1406
- WeappAdapter.prototype.setTheme = function (theme) {
1407
- var _a, _b;
1408
- this.config.theme = theme;
1409
- if (this.chartInstance) {
1410
- (_b = (_a = this.chartInstance).setTheme) === null || _b === void 0 ? void 0 : _b.call(_a, theme);
1411
- }
1289
+ TTAdapter.prototype.getHeight = function () {
1290
+ return this.parseSize(this.config.height, 300);
1412
1291
  };
1413
- /**
1414
- * 获取图表宽度
1415
- */
1416
- WeappAdapter.prototype.getWidth = function () {
1417
- return 0;
1292
+ TTAdapter.prototype.setComponent = function (component) {
1293
+ this.component = component;
1418
1294
  };
1419
- /**
1420
- * 获取图表高度
1421
- */
1422
- WeappAdapter.prototype.getHeight = function () {
1423
- return 0;
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);
1424
1298
  };
1425
- /**
1426
- * 获取DOM元素
1427
- */
1428
- WeappAdapter.prototype.getDom = function () {
1429
- return null;
1299
+ TTAdapter.prototype.getDataURL = function (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);
1430
1302
  };
1431
- /**
1432
- * 转换为DataURL
1433
- */
1434
- WeappAdapter.prototype.convertToDataURL = function (opts) {
1435
- var _a;
1436
- return (_a = this.chartInstance) === null || _a === void 0 ? void 0 : _a.getDataURL(opts);
1303
+ return TTAdapter;
1304
+ }(_BaseAdapter__WEBPACK_IMPORTED_MODULE_0__/* .BaseAdapter */ .D);
1305
+
1306
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (TTAdapter);
1307
+
1308
+ /***/ },
1309
+
1310
+ /***/ 999
1311
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1312
+
1313
+ __webpack_require__.r(__webpack_exports__);
1314
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1315
+ /* harmony export */ WeappAdapter: () => (/* binding */ WeappAdapter),
1316
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1317
+ /* harmony export */ });
1318
+ /* harmony import */ var _BaseAdapter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(219);
1319
+ /**
1320
+ * TaroViz 微信小程序适配器
1321
+ * 基于微信小程序canvas组件实现图表渲染
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);
1437
1333
  };
1438
- /**
1439
- * 清空图表
1440
- */
1441
- WeappAdapter.prototype.clear = function () {
1442
- if (this.chartInstance) {
1443
- this.chartInstance.clear();
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;
1444
1339
  }
1340
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
1445
1341
  };
1446
- /**
1447
- * 绑定事件
1448
- */
1449
- WeappAdapter.prototype.on = function (event, handler) {
1450
- if (this.chartInstance) {
1451
- this.chartInstance.on(event, handler);
1452
- }
1342
+ }();
1343
+
1344
+ var WeappAdapter = /** @class */function (_super) {
1345
+ __extends(WeappAdapter, _super);
1346
+ function WeappAdapter(config) {
1347
+ var _this = _super.call(this, config) || this;
1348
+ _this.component = null;
1349
+ _this.component = config.component;
1350
+ return _this;
1351
+ }
1352
+ WeappAdapter.create = function (options) {
1353
+ return new WeappAdapter(options);
1453
1354
  };
1454
- /**
1455
- * 解绑事件
1456
- */
1457
- WeappAdapter.prototype.off = function (event, handler) {
1458
- if (this.chartInstance) {
1459
- this.chartInstance.off(event, handler);
1355
+ WeappAdapter.prototype.init = function () {
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;
1362
+ if (!this.component) {
1363
+ console.error('[TaroViz] WeappAdapter: component is required');
1364
+ return null;
1460
1365
  }
1461
- };
1462
- /**
1463
- * 显示加载动画
1464
- */
1465
- WeappAdapter.prototype.showLoading = function (opts) {
1466
- if (this.chartInstance) {
1467
- this.chartInstance.showLoading(opts);
1366
+ if (!canvasId) {
1367
+ console.error('[TaroViz] WeappAdapter: canvasId is required');
1368
+ return null;
1468
1369
  }
1469
- };
1470
- /**
1471
- * 隐藏加载动画
1472
- */
1473
- WeappAdapter.prototype.hideLoading = function () {
1474
- if (this.chartInstance) {
1475
- 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);
1476
1378
  }
1477
- };
1478
- /**
1479
- * 销毁图表
1480
- */
1481
- WeappAdapter.prototype.dispose = function () {
1482
- if (this.chartInstance) {
1483
- this.chartInstance.dispose();
1484
- this.chartInstance = null;
1379
+ this.chartInstance = chart;
1380
+ var onInit = this.config['onInit'];
1381
+ if (onInit) {
1382
+ onInit(chart);
1485
1383
  }
1384
+ return chart;
1486
1385
  };
1487
- /**
1488
- * 处理图表大小变化
1489
- */
1490
- WeappAdapter.prototype.resize = function (opts) {
1491
- if (this.chartInstance) {
1492
- this.chartInstance.resize(opts);
1493
- }
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);
1494
1391
  };
1495
- /**
1496
- * 设置组件实例
1497
- */
1498
1392
  WeappAdapter.prototype.setComponent = function (component) {
1499
1393
  this.component = component;
1500
1394
  };
1501
- /**
1502
- * 渲染图表组件
1503
- */
1504
- WeappAdapter.prototype.render = function () {
1505
- var _a = this.config,
1506
- _b = _a.canvasId,
1507
- canvasId = _b === void 0 ? 'ec-canvas' : _b,
1508
- _c = _a.width,
1509
- width = _c === void 0 ? '100%' : _c,
1510
- _d = _a.height,
1511
- height = _d === void 0 ? '300px' : _d,
1512
- _e = _a.style,
1513
- style = _e === void 0 ? {} : _e;
1514
- // 注意:这里需要根据实际使用的Taro版本和组件库来调整
1515
- return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement('view', {
1516
- id: canvasId,
1517
- style: __assign({
1518
- width: width,
1519
- height: height
1520
- }, style)
1521
- });
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);
1522
1402
  };
1523
1403
  return WeappAdapter;
1524
- }();
1404
+ }(_BaseAdapter__WEBPACK_IMPORTED_MODULE_0__/* .BaseAdapter */ .D);
1405
+
1525
1406
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (WeappAdapter);
1526
1407
 
1527
1408
  /***/ },
@@ -1548,19 +1429,17 @@ var __assign = undefined && undefined.__assign || function () {
1548
1429
  return __assign.apply(this, arguments);
1549
1430
  };
1550
1431
  /**
1551
- * 柱状图组件
1432
+ * BarChart组件
1552
1433
  */
1553
1434
 
1554
1435
 
1555
1436
 
1556
- /**
1557
- * 柱状图组件
1558
- */
1559
- var BarChart = function (props) {
1437
+ var BarChart = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(function (props) {
1560
1438
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_common_BaseChartWrapper__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A, __assign({}, props, {
1561
1439
  chartType: "bar-chart"
1562
1440
  }));
1563
- };
1441
+ });
1442
+ BarChart.displayName = 'BarChart';
1564
1443
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BarChart);
1565
1444
 
1566
1445
  /***/ },
@@ -1577,8 +1456,8 @@ __webpack_require__.d(__webpack_exports__, {
1577
1456
  // EXTERNAL MODULE: external "react"
1578
1457
  var external_react_ = __webpack_require__(15);
1579
1458
  var external_react_default = /*#__PURE__*/__webpack_require__.n(external_react_);
1580
- // EXTERNAL MODULE: ./src/adapters/index.ts + 8 modules
1581
- var adapters = __webpack_require__(234);
1459
+ // EXTERNAL MODULE: ./src/adapters/index.ts + 5 modules
1460
+ var adapters = __webpack_require__(574);
1582
1461
  // EXTERNAL MODULE: ./src/core/utils/index.ts + 2 modules
1583
1462
  var utils = __webpack_require__(524);
1584
1463
  ;// ./src/charts/utils.ts
@@ -1645,6 +1524,121 @@ var BaseChartWrapper_assign = undefined && undefined.__assign || function () {
1645
1524
  };
1646
1525
  return BaseChartWrapper_assign.apply(this, arguments);
1647
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
+ */
1648
1642
 
1649
1643
 
1650
1644
 
@@ -1692,49 +1686,68 @@ var BaseChartWrapper = function (_a) {
1692
1686
  renderer: renderer,
1693
1687
  option: option
1694
1688
  });
1695
- }, [width, height, theme, autoResize, renderer, option, chartType]);
1689
+ }, [width, height, theme, autoResize, renderer, option]);
1696
1690
  // 处理图表初始化
1697
1691
  (0,external_react_.useEffect)(function () {
1698
- var 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
- // 获取适配器并初始化
1718
- var adapter = (0,adapters/* getAdapter */.cK)(initConfig);
1719
- adapter.init();
1720
- // 组件卸载时清理
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
+ // 返回清理函数
1721
1742
  return function () {
1722
- if (chartInstance.current) {
1723
- // 解绑事件
1724
- if (onEvents) {
1725
- Object.keys(onEvents).forEach(function (eventName) {
1726
- var _a;
1727
- (_a = chartInstance.current) === null || _a === void 0 ? void 0 : _a.off(eventName);
1728
- });
1729
- }
1730
- chartInstance.current.dispose();
1731
- chartInstance.current = null;
1732
- }
1743
+ cleanupPromise.then(function (cleanup) {
1744
+ return cleanup === null || cleanup === void 0 ? void 0 : cleanup();
1745
+ });
1733
1746
  };
1734
1747
  }, [adapterConfig, onChartInit, onChartReady, onEvents]);
1735
1748
  // 更新配置
1736
1749
  (0,external_react_.useEffect)(function () {
1737
- if (chartInstance.current) {
1750
+ if (chartInstance.current && option) {
1738
1751
  chartInstance.current.setOption(option, true);
1739
1752
  }
1740
1753
  }, [option]);
@@ -1785,19 +1798,17 @@ var __assign = undefined && undefined.__assign || function () {
1785
1798
  return __assign.apply(this, arguments);
1786
1799
  };
1787
1800
  /**
1788
- * 漏斗图组件
1801
+ * FunnelChart组件
1789
1802
  */
1790
1803
 
1791
1804
 
1792
1805
 
1793
- /**
1794
- * 漏斗图组件
1795
- */
1796
- var FunnelChart = function (props) {
1806
+ var FunnelChart = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(function (props) {
1797
1807
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_common_BaseChartWrapper__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A, __assign({}, props, {
1798
1808
  chartType: "funnel-chart"
1799
1809
  }));
1800
- };
1810
+ });
1811
+ FunnelChart.displayName = 'FunnelChart';
1801
1812
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (FunnelChart);
1802
1813
 
1803
1814
  /***/ },
@@ -1824,19 +1835,17 @@ var __assign = undefined && undefined.__assign || function () {
1824
1835
  return __assign.apply(this, arguments);
1825
1836
  };
1826
1837
  /**
1827
- * 仪表盘组件
1838
+ * GaugeChart组件
1828
1839
  */
1829
1840
 
1830
1841
 
1831
1842
 
1832
- /**
1833
- * 仪表盘组件
1834
- */
1835
- var GaugeChart = function (props) {
1843
+ var GaugeChart = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(function (props) {
1836
1844
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_common_BaseChartWrapper__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A, __assign({}, props, {
1837
1845
  chartType: "gauge-chart"
1838
1846
  }));
1839
- };
1847
+ });
1848
+ GaugeChart.displayName = 'GaugeChart';
1840
1849
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (GaugeChart);
1841
1850
 
1842
1851
  /***/ },
@@ -1863,19 +1872,17 @@ var __assign = undefined && undefined.__assign || function () {
1863
1872
  return __assign.apply(this, arguments);
1864
1873
  };
1865
1874
  /**
1866
- * 热力图组件
1875
+ * HeatmapChart组件
1867
1876
  */
1868
1877
 
1869
1878
 
1870
1879
 
1871
- /**
1872
- * 热力图组件
1873
- */
1874
- var HeatmapChart = function (props) {
1880
+ var HeatmapChart = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(function (props) {
1875
1881
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_common_BaseChartWrapper__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A, __assign({}, props, {
1876
1882
  chartType: "heatmap-chart"
1877
1883
  }));
1878
- };
1884
+ });
1885
+ HeatmapChart.displayName = 'HeatmapChart';
1879
1886
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (HeatmapChart);
1880
1887
 
1881
1888
  /***/ },
@@ -1907,14 +1914,12 @@ var __assign = undefined && undefined.__assign || function () {
1907
1914
 
1908
1915
 
1909
1916
 
1910
- /**
1911
- * 折线图组件
1912
- */
1913
- var LineChart = function (props) {
1917
+ var LineChart = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(function (props) {
1914
1918
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_common_BaseChartWrapper__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A, __assign({}, props, {
1915
1919
  chartType: "line-chart"
1916
1920
  }));
1917
- };
1921
+ });
1922
+ LineChart.displayName = 'LineChart';
1918
1923
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (LineChart);
1919
1924
 
1920
1925
  /***/ },
@@ -1941,20 +1946,17 @@ var __assign = undefined && undefined.__assign || function () {
1941
1946
  return __assign.apply(this, arguments);
1942
1947
  };
1943
1948
  /**
1944
- * 饼图组件
1949
+ * PieChart组件
1945
1950
  */
1946
1951
 
1947
1952
 
1948
- // 导入统一注册的 echarts
1949
1953
 
1950
- /**
1951
- * 饼图组件
1952
- */
1953
- var PieChart = function (props) {
1954
+ var PieChart = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(function (props) {
1954
1955
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_common_BaseChartWrapper__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A, __assign({}, props, {
1955
1956
  chartType: "pie-chart"
1956
1957
  }));
1957
- };
1958
+ });
1959
+ PieChart.displayName = 'PieChart';
1958
1960
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (PieChart);
1959
1961
 
1960
1962
  /***/ },
@@ -1981,19 +1983,17 @@ var __assign = undefined && undefined.__assign || function () {
1981
1983
  return __assign.apply(this, arguments);
1982
1984
  };
1983
1985
  /**
1984
- * 雷达图组件
1986
+ * RadarChart组件
1985
1987
  */
1986
1988
 
1987
1989
 
1988
1990
 
1989
- /**
1990
- * 雷达图组件
1991
- */
1992
- var RadarChart = function (props) {
1991
+ var RadarChart = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(function (props) {
1993
1992
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_common_BaseChartWrapper__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A, __assign({}, props, {
1994
1993
  chartType: "radar-chart"
1995
1994
  }));
1996
- };
1995
+ });
1996
+ RadarChart.displayName = 'RadarChart';
1997
1997
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (RadarChart);
1998
1998
 
1999
1999
  /***/ },
@@ -2059,19 +2059,17 @@ var __assign = undefined && undefined.__assign || function () {
2059
2059
  return __assign.apply(this, arguments);
2060
2060
  };
2061
2061
  /**
2062
- * 散点图组件
2062
+ * ScatterChart组件
2063
2063
  */
2064
2064
 
2065
2065
 
2066
2066
 
2067
- /**
2068
- * 散点图组件
2069
- */
2070
- var ScatterChart = function (props) {
2067
+ var ScatterChart = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(function (props) {
2071
2068
  return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_common_BaseChartWrapper__WEBPACK_IMPORTED_MODULE_1__/* ["default"] */ .A, __assign({}, props, {
2072
2069
  chartType: "scatter-chart"
2073
2070
  }));
2074
- };
2071
+ });
2072
+ ScatterChart.displayName = 'ScatterChart';
2075
2073
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ScatterChart);
2076
2074
 
2077
2075
  /***/ },
@@ -2326,6 +2324,9 @@ var AnimationManager = /** @class */function () {
2326
2324
  AnimationManager.getInstance = function (config) {
2327
2325
  if (!AnimationManager.instance) {
2328
2326
  AnimationManager.instance = new AnimationManager(config);
2327
+ } else if (config) {
2328
+ // 如果传入了新配置,更新配置
2329
+ AnimationManager.instance.updateConfig(config);
2329
2330
  }
2330
2331
  return AnimationManager.instance;
2331
2332
  };
@@ -2508,6 +2509,17 @@ var AnimationManager = /** @class */function () {
2508
2509
  AnimationManager.prototype.updatePerformanceConfig = function (config) {
2509
2510
  this.performanceConfig = __assign(__assign({}, this.performanceConfig), config);
2510
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
+ };
2511
2523
  /**
2512
2524
  * 获取性能配置
2513
2525
  */
@@ -3275,11 +3287,19 @@ var __webpack_exports__ = {};
3275
3287
  // EXTERNAL MODULE: external "react"
3276
3288
  var external_react_ = __webpack_require__(15);
3277
3289
  var external_react_default = /*#__PURE__*/__webpack_require__.n(external_react_);
3278
- // EXTERNAL MODULE: ./src/adapters/index.ts + 8 modules
3279
- var adapters = __webpack_require__(234);
3280
3290
  // EXTERNAL MODULE: ./src/core/animation/index.ts + 2 modules
3281
- var animation = __webpack_require__(251);
3291
+ var core_animation = __webpack_require__(251);
3282
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
+ };
3283
3303
  /**
3284
3304
  * 全局图表实例存储
3285
3305
  */
@@ -3315,15 +3335,20 @@ function getChart(id) {
3315
3335
  */
3316
3336
  function removeChart(id) {
3317
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
+ }
3318
3343
  delete CHART_INSTANCES[id];
3319
3344
  }
3320
3345
  }
3321
3346
  /**
3322
3347
  * 获取所有图表实例
3323
- * @returns 所有图表实例
3348
+ * @returns 所有图表实例的浅拷贝
3324
3349
  */
3325
3350
  function getAllCharts() {
3326
- return CHART_INSTANCES;
3351
+ return __assign({}, CHART_INSTANCES);
3327
3352
  }
3328
3353
  /**
3329
3354
  * 清空所有图表实例
@@ -3377,15 +3402,15 @@ var DebugPanelEventType;
3377
3402
  DebugPanelEventType["INFO_UPDATE"] = "debugPanelInfoUpdate";
3378
3403
  })(DebugPanelEventType || (DebugPanelEventType = {}));
3379
3404
  ;// ./src/core/utils/debug/DebugPanel.tsx
3380
- var __assign = undefined && undefined.__assign || function () {
3381
- __assign = Object.assign || function (t) {
3405
+ var DebugPanel_assign = undefined && undefined.__assign || function () {
3406
+ DebugPanel_assign = Object.assign || function (t) {
3382
3407
  for (var s, i = 1, n = arguments.length; i < n; i++) {
3383
3408
  s = arguments[i];
3384
3409
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
3385
3410
  }
3386
3411
  return t;
3387
3412
  };
3388
- return __assign.apply(this, arguments);
3413
+ return DebugPanel_assign.apply(this, arguments);
3389
3414
  };
3390
3415
  /**
3391
3416
  * TaroViz 调试面板组件
@@ -3709,7 +3734,7 @@ var DebugPanel = function (_a) {
3709
3734
  }, "\u91CD\u7F6E\u56FE\u8868")));
3710
3735
  };
3711
3736
  // 构建面板样式
3712
- var panelStyle = __assign(__assign(__assign(__assign(__assign(__assign({
3737
+ var panelStyle = DebugPanel_assign(DebugPanel_assign(DebugPanel_assign(DebugPanel_assign(DebugPanel_assign(DebugPanel_assign({
3713
3738
  position: 'fixed',
3714
3739
  zIndex: 9999,
3715
3740
  backgroundColor: 'rgba(255, 255, 255, 0.95)',
@@ -3751,43 +3776,43 @@ var DebugPanel = function (_a) {
3751
3776
  }, isExpanded ? '▼' : '▶')), isExpanded && (/*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, /*#__PURE__*/external_react_default().createElement("div", {
3752
3777
  style: styles.debugPanelTabs
3753
3778
  }, /*#__PURE__*/external_react_default().createElement("button", {
3754
- style: __assign(__assign({}, styles.debugTab), activeTab === 'instance' && styles.debugTabActive),
3779
+ style: DebugPanel_assign(DebugPanel_assign({}, styles.debugTab), activeTab === 'instance' && styles.debugTabActive),
3755
3780
  onClick: function () {
3756
3781
  return switchTab('instance');
3757
3782
  },
3758
3783
  title: "\u5B9E\u4F8B\u4FE1\u606F"
3759
3784
  }, "\u5B9E\u4F8B"), /*#__PURE__*/external_react_default().createElement("button", {
3760
- style: __assign(__assign({}, styles.debugTab), activeTab === 'config' && styles.debugTabActive),
3785
+ style: DebugPanel_assign(DebugPanel_assign({}, styles.debugTab), activeTab === 'config' && styles.debugTabActive),
3761
3786
  onClick: function () {
3762
3787
  return switchTab('config');
3763
3788
  },
3764
3789
  title: "\u914D\u7F6E\u4FE1\u606F"
3765
3790
  }, "\u914D\u7F6E"), /*#__PURE__*/external_react_default().createElement("button", {
3766
- style: __assign(__assign({}, styles.debugTab), activeTab === 'data' && styles.debugTabActive),
3791
+ style: DebugPanel_assign(DebugPanel_assign({}, styles.debugTab), activeTab === 'data' && styles.debugTabActive),
3767
3792
  onClick: function () {
3768
3793
  return switchTab('data');
3769
3794
  },
3770
3795
  title: "\u6570\u636E\u4FE1\u606F"
3771
3796
  }, "\u6570\u636E"), /*#__PURE__*/external_react_default().createElement("button", {
3772
- style: __assign(__assign({}, styles.debugTab), activeTab === 'performance' && styles.debugTabActive),
3797
+ style: DebugPanel_assign(DebugPanel_assign({}, styles.debugTab), activeTab === 'performance' && styles.debugTabActive),
3773
3798
  onClick: function () {
3774
3799
  return switchTab('performance');
3775
3800
  },
3776
3801
  title: "\u6027\u80FD\u4FE1\u606F"
3777
3802
  }, "\u6027\u80FD"), /*#__PURE__*/external_react_default().createElement("button", {
3778
- style: __assign(__assign({}, styles.debugTab), activeTab === 'events' && styles.debugTabActive),
3803
+ style: DebugPanel_assign(DebugPanel_assign({}, styles.debugTab), activeTab === 'events' && styles.debugTabActive),
3779
3804
  onClick: function () {
3780
3805
  return switchTab('events');
3781
3806
  },
3782
3807
  title: "\u4E8B\u4EF6\u4FE1\u606F"
3783
3808
  }, "\u4E8B\u4EF6"), /*#__PURE__*/external_react_default().createElement("button", {
3784
- style: __assign(__assign({}, styles.debugTab), activeTab === 'errors' && styles.debugTabActive),
3809
+ style: DebugPanel_assign(DebugPanel_assign({}, styles.debugTab), activeTab === 'errors' && styles.debugTabActive),
3785
3810
  onClick: function () {
3786
3811
  return switchTab('errors');
3787
3812
  },
3788
3813
  title: "\u9519\u8BEF\u4FE1\u606F"
3789
3814
  }, "\u9519\u8BEF"), /*#__PURE__*/external_react_default().createElement("button", {
3790
- style: __assign(__assign({}, styles.debugTab), activeTab === 'tools' && styles.debugTabActive),
3815
+ style: DebugPanel_assign(DebugPanel_assign({}, styles.debugTab), activeTab === 'tools' && styles.debugTabActive),
3791
3816
  onClick: function () {
3792
3817
  return switchTab('tools');
3793
3818
  },
@@ -4405,6 +4430,10 @@ var PerformanceAnalyzer = /** @class */function () {
4405
4430
  this.sampleIntervalId = null;
4406
4431
  this.frameRateHistory = [];
4407
4432
  this.lastFrameTime = 0;
4433
+ /**
4434
+ * RAF 动画帧 ID,用于取消
4435
+ */
4436
+ this.rafId = null;
4408
4437
  this.config = PerformanceAnalyzer_assign({
4409
4438
  enabled: true,
4410
4439
  metrics: ['initTime', 'renderTime', 'updateTime', 'dataSize', 'frameRate'],
@@ -4516,32 +4545,53 @@ var PerformanceAnalyzer = /** @class */function () {
4516
4545
  this.stopFrameRateMonitoring();
4517
4546
  this.emit(PerformanceEventType.MONITORING_END);
4518
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
+ };
4519
4562
  /**
4520
4563
  * 开始帧率监控
4521
4564
  */
4522
4565
  PerformanceAnalyzer.prototype.startFrameRateMonitoring = function () {
4523
4566
  var _this = this;
4524
4567
  var updateFrameRate = function () {
4568
+ var _a;
4525
4569
  if (!_this.isMonitoring) {
4526
4570
  return;
4527
4571
  }
4528
4572
  var currentTime = performance.now();
4529
4573
  var deltaTime = currentTime - _this.lastFrameTime;
4530
4574
  var frameRate = deltaTime > 0 ? Math.round(1000 / deltaTime) : 0;
4531
- _this.frameRateHistory.push(frameRate);
4532
- 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) {
4533
4578
  _this.frameRateHistory.shift();
4534
4579
  }
4580
+ _this.frameRateHistory.push(frameRate);
4535
4581
  _this.lastFrameTime = currentTime;
4536
- requestAnimationFrame(updateFrameRate);
4582
+ _this.rafId = requestAnimationFrame(updateFrameRate);
4537
4583
  };
4538
- requestAnimationFrame(updateFrameRate);
4584
+ this.rafId = requestAnimationFrame(updateFrameRate);
4539
4585
  };
4540
4586
  /**
4541
4587
  * 停止帧率监控
4542
4588
  */
4543
4589
  PerformanceAnalyzer.prototype.stopFrameRateMonitoring = function () {
4544
- // requestAnimationFrame 会自动停止,不需要额外清理
4590
+ // 取消 RAF 循环,防止继续运行
4591
+ if (this.rafId !== null) {
4592
+ cancelAnimationFrame(this.rafId);
4593
+ this.rafId = null;
4594
+ }
4545
4595
  this.frameRateHistory = [];
4546
4596
  };
4547
4597
  /**
@@ -4843,6 +4893,53 @@ var PerformanceAnalyzer = /** @class */function () {
4843
4893
  // 导出默认实例
4844
4894
 
4845
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);
4846
4943
  ;// ./src/core/components/BaseChart.tsx
4847
4944
  var BaseChart_assign = undefined && undefined.__assign || function () {
4848
4945
  BaseChart_assign = Object.assign || function (t) {
@@ -4867,18 +4964,15 @@ var BaseChart_assign = undefined && undefined.__assign || function () {
4867
4964
 
4868
4965
 
4869
4966
 
4870
- /**
4871
- * 基础图表组件
4872
- *
4873
- * @param {ChartProps} props - 组件属性
4874
- * @returns {JSX.Element} - 返回的 JSX 元素
4875
- *
4876
- * @description 基础图表组件,所有具体图表组件的基类
4877
- * 负责处理图表的初始化、事件绑定、主题设置等核心逻辑
4878
- */
4967
+
4968
+ // ============================================================================
4969
+ // BaseChart 组件
4970
+ // ============================================================================
4879
4971
  var BaseChart = function (props) {
4880
4972
  var chartId = props.chartId,
4881
4973
  option = props.option,
4974
+ animation = props.animation,
4975
+ debug = props.debug,
4882
4976
  _a = props.width,
4883
4977
  width = _a === void 0 ? '100%' : _a,
4884
4978
  _b = props.height,
@@ -4893,7 +4987,7 @@ var BaseChart = function (props) {
4893
4987
  onDataZoom = props.onDataZoom,
4894
4988
  style = props.style,
4895
4989
  className = props.className,
4896
- children = props.children,
4990
+ _children = props.children,
4897
4991
  _e = props.virtualScroll,
4898
4992
  virtualScroll = _e === void 0 ? false : _e,
4899
4993
  _f = props.virtualScrollPageSize,
@@ -4904,7 +4998,7 @@ var BaseChart = function (props) {
4904
4998
  enablePerformanceMonitoring = _h === void 0 ? false : _h,
4905
4999
  onPerformance = props.onPerformance,
4906
5000
  _j = props.enableZoom,
4907
- enableZoom = _j === void 0 ? false : _j,
5001
+ _enableZoom = _j === void 0 ? false : _j,
4908
5002
  onZoom = props.onZoom,
4909
5003
  _k = props.enableDataFiltering,
4910
5004
  enableDataFiltering = _k === void 0 ? false : _k,
@@ -4925,735 +5019,308 @@ var BaseChart = function (props) {
4925
5019
  customTooltipStyle = props.customTooltipStyle,
4926
5020
  onTooltipShow = props.onTooltipShow,
4927
5021
  onTooltipHide = props.onTooltipHide,
4928
- onExport = props.onExport,
5022
+ _onExport = props.onExport,
4929
5023
  _q = props.linkageConfig,
4930
5024
  linkageConfig = _q === void 0 ? {} : _q,
4931
5025
  onDataUpdate = props.onDataUpdate,
4932
5026
  _r = props.dataUpdateOptions,
4933
5027
  dataUpdateOptions = _r === void 0 ? {} : _r;
4934
- /**
4935
- * 图表容器的引用
4936
- */
4937
- var chartRef = (0,external_react_.useRef)(null);
4938
- /**
4939
- * 图表适配器的引用
4940
- */
4941
- var adapterRef = (0,external_react_.useRef)(null);
4942
- /**
4943
- * 虚拟滚动状态
4944
- */
4945
- var virtualScrollRef = (0,external_react_.useRef)({
4946
- currentPage: 0,
4947
- totalPages: 1,
4948
- totalDataCount: 0,
4949
- startIndex: 0,
4950
- endIndex: 0,
4951
- isScrolling: false
4952
- });
4953
- /**
4954
- * 性能分析器实例引用
4955
- */
4956
- var performanceAnalyzerRef = (0,external_react_.useRef)(null);
4957
- /**
4958
- * 性能监控状态
4959
- */
5028
+ // Refs
5029
+ var chartInstanceRef = (0,external_react_.useRef)(null);
4960
5030
  var performanceRef = (0,external_react_.useRef)({
4961
5031
  initStartTime: 0,
4962
5032
  initEndTime: 0,
4963
5033
  renderStartTime: 0,
4964
5034
  renderEndTime: 0,
4965
5035
  updateStartTime: 0,
4966
- updateEndTime: 0,
4967
- 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
4968
5043
  });
4969
- /**
4970
- * 旧的图表配置引用,用于数据更新监听
4971
- */
4972
5044
  var oldOptionRef = (0,external_react_.useRef)(option);
4973
- /**
4974
- * 调试配置引用
4975
- */
5045
+ var adapterRef = (0,external_react_.useRef)(null);
4976
5046
  var debugConfigRef = (0,external_react_.useRef)(null);
4977
- /**
4978
- * 处理调试配置
4979
- */
4980
- var processDebugConfig = function () {
4981
- if (!props.debug) {
4982
- return null;
4983
- }
4984
- if (typeof props.debug === 'boolean') {
4985
- return {
4986
- enabled: props.debug,
4987
- autoExpand: false
4988
- };
4989
- }
4990
- 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({
4991
5055
  enabled: true
4992
- }, props.debug);
4993
- };
4994
- /**
4995
- * 导出图表为DataURL
4996
- * @param options 导出选项
4997
- * @returns 导出的数据URL
4998
- */
4999
- var exportChartToDataURL = function (options) {
5000
- if (options === void 0) {
5001
- options = {};
5002
- }
5003
- if (!adapterRef.current) {
5004
- console.error('Chart adapter not initialized');
5005
- return undefined;
5006
- }
5007
- var _a = options.type,
5008
- type = _a === void 0 ? 'png' : _a,
5009
- _b = options.pixelRatio,
5010
- pixelRatio = _b === void 0 ? 2 : _b,
5011
- _c = options.backgroundColor,
5012
- backgroundColor = _c === void 0 ? 'transparent' : _c;
5013
- var dataURL = adapterRef.current.convertToDataURL({
5014
- type: type,
5015
- pixelRatio: pixelRatio,
5016
- backgroundColor: backgroundColor
5017
- });
5018
- // 触发导出回调
5019
- if (onExport && dataURL) {
5020
- onExport(dataURL, options);
5021
- }
5022
- return dataURL;
5023
- };
5024
- /**
5025
- * 导出图表并下载
5026
- * @param options 导出选项
5027
- */
5028
- var exportChart = function (options) {
5029
- if (options === void 0) {
5030
- options = {};
5031
- }
5032
- var dataURL = exportChartToDataURL(options);
5033
- if (!dataURL) {
5034
- console.error('Failed to export chart');
5035
- return;
5036
- }
5037
- var _a = options.type,
5038
- type = _a === void 0 ? 'png' : _a,
5039
- _b = options.filename,
5040
- filename = _b === void 0 ? "chart-".concat(Date.now()) : _b;
5041
- var fullFilename = "".concat(filename, ".").concat(type);
5042
- // 创建下载链接
5043
- var link = document.createElement('a');
5044
- link.download = fullFilename;
5045
- link.href = dataURL;
5046
- link.click();
5047
- };
5048
- /**
5049
- * 组件实例引用,用于暴露公共方法
5050
- */
5051
- var chartInstanceRef = (0,external_react_.useRef)({
5052
- exportChartToDataURL: exportChartToDataURL,
5053
- exportChart: exportChart
5054
- });
5055
- // 暴露组件实例方法
5056
- external_react_default().useImperativeHandle(props, function () {
5057
- return chartInstanceRef.current;
5058
- });
5059
- /**
5060
- * 记录性能数据
5061
- * @param type 性能数据类型
5062
- * @param data 性能数据
5063
- */
5064
- var recordPerformance = function (type, _data) {
5065
- var now = Date.now();
5066
- switch (type) {
5067
- case 'init':
5068
- if (!performanceRef.current.initStartTime) {
5069
- performanceRef.current.initStartTime = now;
5070
- } else {
5071
- performanceRef.current.initEndTime = now;
5072
- var initTime = performanceRef.current.initEndTime - performanceRef.current.initStartTime;
5073
- // 计算数据大小
5074
- var dataSize = JSON.stringify(option).length;
5075
- // 使用性能分析器记录数据
5076
- if (performanceAnalyzerRef.current) {
5077
- performanceAnalyzerRef.current.recordInitTime(initTime);
5078
- performanceAnalyzerRef.current.recordDataSize(option);
5079
- }
5080
- // 触发性能回调
5081
- if (onPerformance) {
5082
- onPerformance({
5083
- renderTime: 0,
5084
- initTime: initTime,
5085
- updateTime: 0,
5086
- dataSize: dataSize
5087
- });
5088
- }
5089
- }
5090
- break;
5091
- case 'render':
5092
- if (!performanceRef.current.renderStartTime) {
5093
- performanceRef.current.renderStartTime = now;
5094
- } else {
5095
- performanceRef.current.renderEndTime = now;
5096
- var renderTime = performanceRef.current.renderEndTime - performanceRef.current.renderStartTime;
5097
- // 计算数据大小
5098
- var dataSize = JSON.stringify(option).length;
5099
- // 使用性能分析器记录数据
5100
- if (performanceAnalyzerRef.current) {
5101
- performanceAnalyzerRef.current.recordRenderTime(renderTime);
5102
- }
5103
- // 触发性能回调
5104
- if (onPerformance) {
5105
- onPerformance({
5106
- renderTime: renderTime,
5107
- initTime: performanceRef.current.initEndTime - performanceRef.current.initStartTime,
5108
- updateTime: 0,
5109
- dataSize: dataSize
5110
- });
5111
- }
5112
- }
5113
- break;
5114
- case 'update':
5115
- if (!performanceRef.current.updateStartTime) {
5116
- performanceRef.current.updateStartTime = now;
5117
- } else {
5118
- performanceRef.current.updateEndTime = now;
5119
- var updateTime = performanceRef.current.updateEndTime - performanceRef.current.updateStartTime;
5120
- // 计算数据大小
5121
- var dataSize = JSON.stringify(option).length;
5122
- // 使用性能分析器记录数据
5123
- if (performanceAnalyzerRef.current) {
5124
- performanceAnalyzerRef.current.recordUpdateTime(updateTime);
5125
- performanceAnalyzerRef.current.recordDataSize(option);
5126
- }
5127
- // 触发性能回调
5128
- if (onPerformance) {
5129
- onPerformance({
5130
- renderTime: 0,
5131
- initTime: 0,
5132
- updateTime: updateTime,
5133
- 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
5134
5081
  });
5135
5082
  }
5136
- }
5137
- break;
5138
- }
5139
- };
5140
- /**
5141
- * 筛选数据
5142
- * @param data 原始数据
5143
- * @param filters 筛选条件
5144
- * @returns 筛选后的数据
5145
- */
5146
- var filterData = function (data, filters) {
5147
- if (!enableDataFiltering || !filters || Object.keys(filters).length === 0) {
5148
- return data;
5149
- }
5150
- return data.filter(function (item) {
5151
- var _a, _b;
5152
- // 遍历所有筛选条件
5153
- for (var _i = 0, _c = Object.entries(filters); _i < _c.length; _i++) {
5154
- var _d = _c[_i],
5155
- key = _d[0],
5156
- value = _d[1];
5157
- // 检查数据项是否满足筛选条件
5158
- 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))) {
5159
- return false;
5160
- }
5083
+ return s;
5084
+ });
5161
5085
  }
5162
- return true;
5163
- });
5164
- };
5165
- /**
5166
- * 计算数据长度,用于动画性能优化
5167
- */
5168
- var calculateDataLength = function (option) {
5169
- var count = 0;
5170
- // 计算系列数据长度
5171
- if (option.series) {
5172
- var series = Array.isArray(option.series) ? option.series : [option.series];
5173
- series.forEach(function (seriesItem) {
5174
- if (seriesItem.data) {
5175
- if (Array.isArray(seriesItem.data)) {
5176
- count += seriesItem.data.length;
5177
- } else if (typeof seriesItem.data === 'object') {
5178
- // 处理对象类型数据
5179
- count += Object.keys(seriesItem.data).length;
5180
- }
5181
- }
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
5182
5106
  });
5183
5107
  }
5184
- return count;
5185
- };
5186
- /**
5187
- * 处理大数据集的虚拟滚动和数据筛选
5188
- * @param originalOption 原始图表配置
5189
- * @returns 处理后的图表配置,只包含当前页的数据和筛选后的数据
5190
- */
5191
- var processVirtualScroll = function (originalOption) {
5192
- if (!originalOption) {
5193
- return originalOption;
5194
- }
5195
- // 深拷贝原始配置,避免修改原始数据
5196
- var processedOption = JSON.parse(JSON.stringify(originalOption));
5197
- // 处理series数据
5198
- if (processedOption.series && Array.isArray(processedOption.series)) {
5199
- // 使用类型断言解决类型不匹配问题
5200
- processedOption.series = processedOption.series.map(function (series) {
5201
- if (series.data && Array.isArray(series.data)) {
5202
- var data = series.data;
5203
- // 应用数据筛选
5204
- var filteredData = filterData(data, filters);
5205
- // 触发数据筛选回调
5206
- if (onDataFiltered) {
5207
- onDataFiltered(filteredData, filters);
5208
- }
5209
- // 应用虚拟滚动
5210
- if (virtualScroll) {
5211
- virtualScrollRef.current.totalDataCount = filteredData.length;
5212
- virtualScrollRef.current.totalPages = Math.ceil(filteredData.length / virtualScrollPageSize);
5213
- // 计算当前页的起始和结束索引
5214
- var startIndex = virtualScrollRef.current.currentPage * virtualScrollPageSize;
5215
- var endIndex = Math.min(startIndex + virtualScrollPageSize + virtualScrollPreloadSize, filteredData.length);
5216
- virtualScrollRef.current.startIndex = startIndex;
5217
- virtualScrollRef.current.endIndex = endIndex;
5218
- // 返回只包含当前页数据的series
5219
- return BaseChart_assign(BaseChart_assign({}, series), {
5220
- 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
5221
5121
  });
5222
- }
5223
- // 只应用数据筛选,不应用虚拟滚动
5224
- return BaseChart_assign(BaseChart_assign({}, series), {
5225
- data: filteredData
5226
5122
  });
5227
- }
5228
- return series;
5229
- });
5230
- }
5231
- // 生成动画配置
5232
- var dataLength = calculateDataLength(processedOption);
5233
- var animationOption = (0,animation/* generateEChartsAnimationConfig */.ek)(props.animation, dataLength);
5234
- // 合并动画配置到图表选项
5235
- return BaseChart_assign(BaseChart_assign({}, processedOption), animationOption);
5236
- };
5237
- /**
5238
- * 初始化图表的 useEffect
5239
- *
5240
- * @description 当图表容器 ref 变化时,初始化图表适配器和图表实例
5241
- * 负责图表的创建、事件绑定和清理工作
5242
- */
5243
- (0,external_react_.useEffect)(function () {
5244
- if (chartRef.current) {
5245
- // 处理调试配置
5246
- var debugConfig_1 = processDebugConfig();
5247
- debugConfigRef.current = debugConfig_1;
5248
- // 初始化性能分析器
5249
- if (enablePerformanceMonitoring) {
5250
- performanceAnalyzerRef.current = PerformanceAnalyzer.getInstance({
5251
- enabled: true,
5252
- metrics: ['initTime', 'renderTime', 'updateTime', 'dataSize', 'frameRate'],
5253
- sampleInterval: 1000,
5254
- maxSamples: 100,
5255
- realTime: true,
5256
- autoStart: true
5257
- });
5258
- }
5259
- // 开始记录初始化时间
5260
- recordPerformance('init');
5261
- // 处理虚拟滚动
5262
- var processedOption = processVirtualScroll(option);
5263
- // 获取适配器实例
5264
- var chartAdapter_1 = (0,adapters/* getAdapter */.cK)({
5265
- width: width,
5266
- height: height,
5267
- theme: theme,
5268
- option: processedOption,
5269
- onInit: onInit,
5270
- containerRef: chartRef,
5271
- direction: direction
5272
- });
5273
- // 设置组件实例(针对小程序环境)
5274
- if (typeof chartAdapter_1.setComponent === 'function') {
5275
- chartAdapter_1.setComponent({
5276
- createChart: function (_config) {
5277
- // 这里应该根据具体平台实现创建图表的逻辑
5278
- return {};
5279
- }
5280
- });
5281
- }
5282
- // 开始记录渲染时间
5283
- recordPerformance('render');
5284
- // 初始化图表
5285
- var instance_1 = chartAdapter_1.init();
5286
- // 结束记录渲染时间
5287
- recordPerformance('render');
5288
- // 注册图表实例
5289
- if (chartId && instance_1) {
5290
- registerChart(chartId, instance_1);
5291
- }
5292
- // 更新调试信息
5293
- if (debugConfig_1 === null || debugConfig_1 === void 0 ? void 0 : debugConfig_1.enabled) {
5294
- // 更新实例信息
5295
- updateDebugInfo({
5296
- instance: {
5297
- id: chartId,
5298
- type: 'ECharts',
5299
- renderer: 'canvas',
5300
- // 简化处理,使用默认值
5301
- width: typeof width === 'number' ? width : undefined,
5302
- height: typeof height === 'number' ? height : undefined,
5303
- platform: 'web' // 简化处理,使用默认值
5304
- },
5305
- config: processedOption,
5306
- data: {
5307
- series: Array.isArray(processedOption.series) ? processedOption.series : [],
5308
- totalDataCount: calculateDataLength(processedOption),
5309
- currentDataCount: calculateDataLength(processedOption)
5310
- },
5311
- performance: {
5312
- initTime: performanceRef.current.initEndTime - performanceRef.current.initStartTime,
5313
- renderTime: performanceRef.current.renderEndTime - performanceRef.current.renderStartTime,
5314
- dataSize: JSON.stringify(processedOption).length
5315
- }
5316
5123
  });
5317
5124
  }
5318
- // 绑定事件
5319
- if (instance_1 && onClick) {
5320
- instance_1.on('click', function (params) {
5321
- onClick(params);
5322
- // 点击联动
5323
- if (linkageConfig.enableClickLinkage && chartId && linkageConfig.linkedChartIds) {
5324
- linkageConfig.linkedChartIds.forEach(function (linkedChartId) {
5325
- var linkedChart = getChart(linkedChartId);
5326
- if (linkedChart) {
5327
- // 这里可以根据需要实现点击联动逻辑
5328
- // 例如:高亮联动图表中对应的系列或数据点
5329
- linkedChart.dispatchAction({
5330
- type: 'highlight',
5331
- name: params.name
5332
- });
5333
- }
5334
- });
5335
- }
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
5336
5131
  });
5337
- }
5338
- // 绑定datazoom事件
5339
- if (instance_1) {
5340
- instance_1.on('datazoom', function (params) {
5341
- // 触发原始的datazoom事件
5342
- if (onDataZoom) {
5343
- onDataZoom(params);
5344
- }
5345
- // 触发缩放事件
5346
- if (onZoom) {
5347
- onZoom({
5348
- start: params.start || 0,
5349
- end: params.end || 100,
5350
- dataZoomIndex: params.dataZoomIndex || 0
5351
- });
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
5352
5138
  }
5353
- // 缩放联动
5354
- if (linkageConfig.enableZoomLinkage && chartId && linkageConfig.linkedChartIds) {
5355
- linkageConfig.linkedChartIds.forEach(function (linkedChartId) {
5356
- var linkedChart = getChart(linkedChartId);
5357
- if (linkedChart) {
5358
- linkedChart.dispatchAction({
5359
- type: 'dataZoom',
5360
- start: params.start,
5361
- end: params.end,
5362
- dataZoomIndex: params.dataZoomIndex
5363
- });
5364
- }
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
5365
5151
  });
5366
- }
5367
- // 处理虚拟滚动
5368
- if (virtualScroll) {
5369
- if (virtualScrollRef.current.isScrolling) {
5370
- return;
5371
- }
5372
- virtualScrollRef.current.isScrolling = true;
5373
- // 根据滚动位置计算当前页码
5374
- var scrollPercent = params.start || 0;
5375
- var newPage = Math.floor(scrollPercent / 100 * virtualScrollRef.current.totalPages);
5376
- if (newPage !== virtualScrollRef.current.currentPage) {
5377
- virtualScrollRef.current.currentPage = newPage;
5378
- // 更新图表数据
5379
- var updatedOption = processVirtualScroll(option);
5380
- chartAdapter_1.setOption(updatedOption);
5381
- }
5382
- // 延迟重置滚动状态,避免频繁触发
5383
- setTimeout(function () {
5384
- virtualScrollRef.current.isScrolling = false;
5385
- }, 100);
5386
- }
5387
- });
5388
- }
5389
- // 启用图表缩放功能
5390
- if (instance_1 && enableZoom) {
5391
- // 这里可以根据需要添加更多缩放相关的配置
5392
- // 例如:instance.setOption({ dataZoom: [{ type: 'inside', start: 0, end: 100 }] });
5393
- }
5394
- // 增强图例交互功能
5395
- if (instance_1 && enableLegendInteraction) {
5396
- // 图例选择事件
5397
- instance_1.on('legendselectchanged', function (params) {
5152
+ });
5153
+ }
5154
+ });
5155
+ // Legend interaction
5156
+ if (enableLegendInteraction) {
5157
+ instance.on('legendselectchanged', function (params) {
5398
5158
  var name = params.name,
5399
5159
  selected = params.selected;
5400
- // 图例联动
5401
5160
  if (linkageConfig.enableLegendLinkage && chartId && linkageConfig.linkedChartIds) {
5402
- linkageConfig.linkedChartIds.forEach(function (linkedChartId) {
5403
- var linkedChart = getChart(linkedChartId);
5404
- if (linkedChart) {
5405
- linkedChart.setOption({
5406
- legend: {
5407
- selected: selected
5408
- }
5409
- });
5410
- }
5161
+ linkageConfig.linkedChartIds.forEach(function (lid) {
5162
+ var linked = getChart(lid);
5163
+ if (linked) linked.setOption({
5164
+ legend: {
5165
+ selected: selected
5166
+ }
5167
+ });
5411
5168
  });
5412
5169
  }
5413
- // 根据交互模式处理图例选择
5414
5170
  if (legendInteractionMode === 'single') {
5415
- // 单选模式:只显示当前选中项
5416
5171
  var newSelected_1 = {};
5417
- Object.keys(selected).forEach(function (key) {
5418
- newSelected_1[key] = key === name;
5172
+ Object.keys(selected).forEach(function (k) {
5173
+ newSelected_1[k] = k === name;
5419
5174
  });
5420
- instance_1.setOption({
5175
+ instance.setOption({
5421
5176
  legend: {
5422
5177
  selected: newSelected_1
5423
5178
  }
5424
5179
  });
5425
- // 触发回调
5426
- if (onLegendSelect) {
5427
- onLegendSelect({
5428
- name: name,
5429
- selected: newSelected_1
5430
- });
5431
- }
5180
+ onLegendSelect === null || onLegendSelect === void 0 ? void 0 : onLegendSelect({
5181
+ name: name,
5182
+ selected: newSelected_1
5183
+ });
5432
5184
  } else {
5433
- // 多选或全选模式:保持原有选择
5434
- if (selected[name]) {
5435
- // 选择图例项
5436
- if (onLegendSelect) {
5437
- onLegendSelect({
5438
- name: name,
5439
- selected: selected
5440
- });
5441
- }
5442
- } else {
5443
- // 取消选择图例项
5444
- if (onLegendUnselect) {
5445
- onLegendUnselect({
5446
- name: name,
5447
- selected: selected
5448
- });
5449
- }
5450
- }
5451
- }
5452
- });
5453
- // 图例全选功能
5454
- if (legendInteractionMode === 'all') {
5455
- // 这里可以添加全选/反选的逻辑
5456
- // 例如:监听特定事件或添加自定义按钮
5457
- }
5458
- }
5459
- // 自定义提示框功能
5460
- if (instance_1 && enableCustomTooltip) {
5461
- // 提示框显示事件
5462
- instance_1.on('tooltipshow', function (params) {
5463
- // 触发提示框显示回调
5464
- if (onTooltipShow) {
5465
- onTooltipShow(params);
5466
- }
5467
- });
5468
- // 提示框隐藏事件
5469
- instance_1.on('tooltiphide', function (params) {
5470
- // 触发提示框隐藏回调
5471
- if (onTooltipHide) {
5472
- onTooltipHide(params);
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
+ });
5473
5192
  }
5474
5193
  });
5475
- // 提示框格式化功能
5476
- if (customTooltipContent) {
5477
- // 这里可以添加自定义提示框的格式化逻辑
5478
- // 例如:使用ECharts的tooltip.formatter选项
5479
- instance_1.setOption({
5480
- tooltip: BaseChart_assign({
5481
- formatter: function (params) {
5482
- // 这里可以返回自定义的HTML内容
5483
- // 由于ECharts的tooltip.formatter只支持返回字符串,我们需要将React组件转换为HTML字符串
5484
- // 注意:这种方式有局限性,更复杂的自定义提示框可能需要使用其他方案
5485
- return '<div style="background: white; padding: 10px; border: 1px solid #ccc;">' + JSON.stringify(params) + '</div>';
5486
- }
5487
- }, customTooltipStyle && {
5488
- backgroundColor: 'transparent',
5489
- borderColor: 'transparent',
5490
- textStyle: {}
5491
- })
5492
- });
5493
- }
5494
- }
5495
- adapterRef.current = chartAdapter_1;
5496
- // 结束记录初始化时间
5497
- recordPerformance('init');
5498
- // 清理函数
5499
- return function () {
5500
- // 移除图表实例
5501
- if (chartId) {
5502
- removeChart(chartId);
5503
- }
5504
- // 停止性能监控
5505
- if (performanceAnalyzerRef.current) {
5506
- performanceAnalyzerRef.current.stop();
5507
- performanceAnalyzerRef.current = null;
5508
- }
5509
- if (chartAdapter_1) {
5510
- chartAdapter_1.dispose();
5511
- }
5512
- };
5513
- }
5514
- // eslint-disable-next-line react-hooks/exhaustive-deps
5515
- }, [chartRef, width, height, theme, option, onInit, onClick, onDataZoom, chartId, linkageConfig]);
5516
- /**
5517
- * 更新图表尺寸的 useEffect
5518
- *
5519
- * @description 当图表宽度或高度变化时,调整图表大小
5520
- */
5521
- (0,external_react_.useEffect)(function () {
5522
- if (adapterRef.current) {
5523
- adapterRef.current.resize();
5524
- }
5525
- }, [width, height]);
5526
- /**
5527
- * 比较两个配置是否相同
5528
- * @param oldOption 旧的配置
5529
- * @param newOption 新的配置
5530
- * @returns 是否相同
5531
- */
5532
- var isOptionEqual = function (oldOption, newOption) {
5533
- if (oldOption === newOption) {
5534
- return true;
5535
- }
5536
- if (!oldOption || !newOption) {
5537
- return false;
5538
- }
5539
- if (dataUpdateOptions.deepCompare) {
5540
- // 深度比较
5541
- return JSON.stringify(oldOption) === JSON.stringify(newOption);
5542
- } else {
5543
- // 浅比较,只比较引用
5544
- return oldOption === newOption;
5545
- }
5546
- };
5547
- /**
5548
- * 更新图表配置的 useEffect
5549
- *
5550
- * @description 当图表配置项变化时,更新图表
5551
- */
5552
- (0,external_react_.useEffect)(function () {
5553
- if (adapterRef.current && option) {
5554
- // 开始记录更新时间
5555
- recordPerformance('update');
5556
- // 处理虚拟滚动
5557
- var processedOption = processVirtualScroll(option);
5558
- adapterRef.current.setOption(processedOption);
5559
- // 结束记录更新时间
5560
- recordPerformance('update');
5561
- }
5562
- // 数据更新监听
5563
- if (onDataUpdate && dataUpdateOptions.enabled !== false) {
5564
- var oldOption = oldOptionRef.current;
5565
- if (!isOptionEqual(oldOption, option)) {
5566
- onDataUpdate(oldOption, option);
5567
- // 更新旧的配置引用
5568
- oldOptionRef.current = option;
5569
- }
5570
- }
5571
- }, [option, onDataUpdate, dataUpdateOptions]);
5572
- /**
5573
- * 更新图表主题的 useEffect
5574
- *
5575
- * @description 当图表主题变化时,更新图表主题
5576
- */
5577
- (0,external_react_.useEffect)(function () {
5578
- if (adapterRef.current && theme) {
5579
- adapterRef.current.setTheme(theme);
5580
- }
5581
- }, [theme]);
5582
- /**
5583
- * 处理窗口大小变化的 useEffect
5584
- *
5585
- * @description 当窗口大小变化时,如果开启了自动调整大小,则调整图表大小
5586
- */
5587
- (0,external_react_.useEffect)(function () {
5588
- if (!autoResize || !adapterRef.current) {
5589
- return;
5590
- }
5591
- var handleResize = function () {
5592
- adapterRef.current.resize();
5593
- };
5594
- window.addEventListener('resize', handleResize);
5595
- return function () {
5596
- window.removeEventListener('resize', handleResize);
5597
- };
5598
- }, [autoResize]);
5599
- /**
5600
- * 合并后的样式对象
5601
- *
5602
- * @description 合并用户传入的样式和组件默认样式
5603
- */
5604
- var mergedStyle = BaseChart_assign({
5605
- width: typeof width === 'number' ? "".concat(width, "px") : width,
5606
- height: typeof height === 'number' ? "".concat(height, "px") : height,
5607
- direction: direction
5608
- }, style);
5609
- /**
5610
- * 组件渲染函数
5611
- *
5612
- * @returns {JSX.Element} - 返回渲染后的 JSX 元素
5613
- * @description 渲染图表容器,并将 chartRef 绑定到容器上
5614
- */
5615
- var debugConfig = processDebugConfig();
5616
- // 渲染图表容器
5617
- var chartContainer = /*#__PURE__*/external_react_default().createElement('div', {
5618
- ref: chartRef,
5619
- style: mergedStyle,
5620
- className: className
5621
- }, children);
5622
- // 如果启用了调试面板,渲染调试面板
5623
- if (debugConfig === null || debugConfig === void 0 ? void 0 : debugConfig.enabled) {
5624
- return /*#__PURE__*/external_react_default().createElement((external_react_default()).Fragment, null, chartContainer, /*#__PURE__*/external_react_default().createElement(DebugPanel, {
5625
- options: debugConfig,
5626
- debugInfo: {
5194
+ }
5195
+ // Custom tooltip
5196
+ if (enableCustomTooltip && customTooltipContent) {
5197
+ instance.on('tooltipshow', function (params) {
5198
+ return onTooltipShow === null || onTooltipShow === void 0 ? void 0 : onTooltipShow(params);
5199
+ });
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({
5627
5219
  instance: {
5628
5220
  id: chartId,
5629
5221
  type: 'ECharts',
5630
5222
  renderer: 'canvas',
5631
- // 简化处理,使用默认值
5632
5223
  width: typeof width === 'number' ? width : undefined,
5633
5224
  height: typeof height === 'number' ? height : undefined,
5634
- platform: 'web' // 简化处理,使用默认值
5225
+ platform: 'web'
5635
5226
  },
5636
- config: option,
5227
+ config: wrappedOption,
5637
5228
  data: {
5638
- series: Array.isArray(option === null || option === void 0 ? void 0 : option.series) ? option.series : [],
5639
- totalDataCount: calculateDataLength(option),
5640
- 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)
5641
5232
  },
5642
5233
  performance: {
5643
- initTime: performanceRef.current.initEndTime - performanceRef.current.initStartTime,
5644
- renderTime: performanceRef.current.renderEndTime - performanceRef.current.renderStartTime,
5645
- updateTime: performanceRef.current.updateEndTime - performanceRef.current.updateStartTime,
5646
- dataSize: JSON.stringify(option).length
5234
+ initTime: 0,
5235
+ renderTime: 0,
5236
+ dataSize: JSON.stringify(wrappedOption).length
5647
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;
5648
5262
  }
5649
- }));
5650
- }
5651
- // 否则只渲染图表容器
5652
- 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
+ })));
5653
5316
  };
5654
- /**
5655
- * 导出基础图表组件
5656
- */
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
+ }
5657
5324
  /* harmony default export */ const components_BaseChart = (BaseChart);
5658
5325
  // EXTERNAL MODULE: ./src/core/utils/index.ts + 2 modules
5659
5326
  var utils = __webpack_require__(524);
@@ -5679,6 +5346,77 @@ var treemap = __webpack_require__(37);
5679
5346
  var sunburst = __webpack_require__(673);
5680
5347
  // EXTERNAL MODULE: ./src/charts/sankey/index.tsx
5681
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);
5682
5420
  // EXTERNAL MODULE: ./src/adapters/h5/index.ts
5683
5421
  var h5 = __webpack_require__(123);
5684
5422
  // EXTERNAL MODULE: ./src/adapters/weapp/index.ts
@@ -6016,7 +5754,7 @@ var elegantTheme = {
6016
5754
  * @param options 自定义选项
6017
5755
  * @returns 合并后的主题配置
6018
5756
  */
6019
- function themes_getTheme(options) {
5757
+ function getTheme(options) {
6020
5758
  if (!options) {
6021
5759
  return defaultTheme;
6022
5760
  }
@@ -6065,6 +5803,19 @@ function getThemeByName(name) {
6065
5803
  function unregisterTheme(name) {
6066
5804
  themeRegistry.delete(name);
6067
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
+ }
6068
5819
  /**
6069
5820
  * 动态切换主题
6070
5821
  * @param theme 主题名称或主题配置
@@ -6203,17 +5954,22 @@ Object.entries(builtinThemes).forEach(function (_a) {
6203
5954
  cyberTheme: cyberTheme,
6204
5955
  retroTheme: retroTheme,
6205
5956
  elegantTheme: elegantTheme,
6206
- getTheme: themes_getTheme,
5957
+ getTheme: getTheme,
6207
5958
  registerTheme: registerTheme,
6208
5959
  getRegisteredThemes: getRegisteredThemes,
6209
5960
  getThemeByName: getThemeByName,
6210
5961
  unregisterTheme: unregisterTheme,
5962
+ resetThemeRegistry: resetThemeRegistry,
6211
5963
  switchTheme: switchTheme,
6212
5964
  getThemesByTag: getThemesByTag,
6213
5965
  getLightThemes: getLightThemes,
6214
5966
  getDarkThemes: getDarkThemes
6215
5967
  });
6216
5968
  ;// ./src/core/themes/ThemeManager.ts
5969
+ /**
5970
+ * TaroViz 主题系统
5971
+ * 支持 CSS 变量、动态主题切换、自定义主题
5972
+ */
6217
5973
  var ThemeManager_assign = undefined && undefined.__assign || function () {
6218
5974
  ThemeManager_assign = Object.assign || function (t) {
6219
5975
  for (var s, i = 1, n = arguments.length; i < n; i++) {
@@ -6839,31 +6595,26 @@ var ThemeEditor = function (_a) {
6839
6595
  var handleColorChange = function (index, color) {
6840
6596
  var newColors = ThemeEditor_spreadArray([], colors, true);
6841
6597
  newColors[index] = color;
6842
- setColors(newColors);
6843
6598
  updateCurrentTheme({
6844
6599
  colors: newColors
6845
6600
  });
6846
6601
  };
6847
6602
  // 处理背景色变化
6848
6603
  var handleBackgroundColorChange = function (color) {
6849
- setBackgroundColor(color);
6850
6604
  updateCurrentTheme({
6851
6605
  backgroundColor: color
6852
6606
  });
6853
6607
  };
6854
6608
  // 处理文本颜色变化
6855
6609
  var handleTextColorChange = function (color) {
6856
- setTextColor(color);
6857
6610
  updateCurrentTheme({
6858
6611
  textColor: color
6859
6612
  });
6860
6613
  };
6861
6614
  // 处理深色模式切换
6862
6615
  var handleDarkModeToggle = function () {
6863
- var newDarkMode = !darkMode;
6864
- setDarkMode(newDarkMode);
6865
6616
  updateCurrentTheme({
6866
- darkMode: newDarkMode
6617
+ darkMode: !darkMode
6867
6618
  });
6868
6619
  };
6869
6620
  // 更新当前主题
@@ -7367,7 +7118,8 @@ function withErrorBoundary(ChartComponent, errorBoundaryProps) {
7367
7118
  var WrappedChart = function (props) {
7368
7119
  return /*#__PURE__*/external_react_default().createElement(ErrorBoundary, ErrorBoundary_assign({}, errorBoundaryProps), /*#__PURE__*/external_react_default().createElement(ChartComponent, ErrorBoundary_assign({}, props)));
7369
7120
  };
7370
- 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)';
7371
7123
  return WrappedChart;
7372
7124
  }
7373
7125
  /* harmony default export */ const components_ErrorBoundary = ((/* unused pure expression or super */ null && (ErrorBoundary)));
@@ -7429,6 +7181,43 @@ var LazySunburstChart = /*#__PURE__*/(0,external_react_.lazy)(function () {
7429
7181
  var LazySankeyChart = /*#__PURE__*/(0,external_react_.lazy)(function () {
7430
7182
  return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 490));
7431
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);
7432
7221
  /**
7433
7222
  * 默认加载状态组件
7434
7223
  */
@@ -7488,56 +7277,31 @@ function withLazyLoad(ChartComponent, loadingFallback) {
7488
7277
  /**
7489
7278
  * 预加载图表组件
7490
7279
  * 在需要显示图表之前预先加载
7280
+ * @param silent - 如果为 true,错误不会被打印到控制台(保持旧行为兼容)
7281
+ * @returns Promise that resolves when loaded, rejects on error
7491
7282
  */
7492
- function preloadChart(chartType) {
7493
- var chartModules = {
7494
- line: function () {
7495
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 127));
7496
- },
7497
- bar: function () {
7498
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 188));
7499
- },
7500
- pie: function () {
7501
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 481));
7502
- },
7503
- scatter: function () {
7504
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 589));
7505
- },
7506
- radar: function () {
7507
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 443));
7508
- },
7509
- heatmap: function () {
7510
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 835));
7511
- },
7512
- gauge: function () {
7513
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 334));
7514
- },
7515
- funnel: function () {
7516
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 133));
7517
- },
7518
- treemap: function () {
7519
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 37));
7520
- },
7521
- sunburst: function () {
7522
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 673));
7523
- },
7524
- sankey: function () {
7525
- return Promise.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 490));
7526
- }
7527
- };
7528
- var loader = chartModules[chartType];
7529
- if (loader) {
7530
- loader().catch(console.error);
7283
+ function preloadChart(chartType, silent) {
7284
+ if (silent === void 0) {
7285
+ silent = true;
7531
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
+ });
7532
7297
  }
7533
7298
  /**
7534
7299
  * 预加载所有图表组件
7535
7300
  */
7536
7301
  function preloadAllCharts() {
7537
- var chartTypes = ['line', 'bar', 'pie', 'scatter', 'radar', 'heatmap', 'gauge', 'funnel', 'treemap', 'sunburst', 'sankey'];
7538
- chartTypes.forEach(function (type) {
7302
+ return Promise.all(LAZY_CHART_TYPES.map(function (type) {
7539
7303
  return preloadChart(type);
7540
- });
7304
+ }));
7541
7305
  }
7542
7306
  /**
7543
7307
  * 创建懒加载图表映射
@@ -7567,11 +7331,14 @@ var LazyChartRegistry = {
7567
7331
  get: function (chartType) {
7568
7332
  return createLazyChart(chartType);
7569
7333
  },
7570
- preload: function (chartType) {
7571
- preloadChart(chartType);
7334
+ preload: function (chartType, silent) {
7335
+ if (silent === void 0) {
7336
+ silent = true;
7337
+ }
7338
+ return preloadChart(chartType, silent);
7572
7339
  },
7573
7340
  preloadAll: function () {
7574
- preloadAllCharts();
7341
+ return preloadAllCharts();
7575
7342
  }
7576
7343
  };
7577
7344
 
@@ -7701,15 +7468,19 @@ function useAnnotation(props) {
7701
7468
  markArea = props.markArea,
7702
7469
  scatter = props.scatter;
7703
7470
  return (0,external_react_.useMemo)(function () {
7471
+ // 使用 any 避免类型复杂性问题
7704
7472
  var series = [];
7705
7473
  if (type === 'line' && markLine) {
7706
- series.push.apply(series, convertAnnotationToMarkLine(markLine));
7474
+ var markLineResult = convertAnnotationToMarkLine(markLine);
7475
+ series.push.apply(series, Array.isArray(markLineResult) ? markLineResult : [markLineResult]);
7707
7476
  }
7708
7477
  if (type === 'area' && markArea) {
7709
- series.push.apply(series, convertAnnotationToMarkArea(markArea));
7478
+ var markAreaResult = convertAnnotationToMarkArea(markArea);
7479
+ series.push.apply(series, Array.isArray(markAreaResult) ? markAreaResult : [markAreaResult]);
7710
7480
  }
7711
7481
  if (type === 'scatter' && scatter) {
7712
- series.push.apply(series, convertAnnotationToScatter(scatter));
7482
+ var scatterResult = convertAnnotationToScatter(scatter);
7483
+ series.push.apply(series, Array.isArray(scatterResult) ? scatterResult : [scatterResult]);
7713
7484
  }
7714
7485
  return {
7715
7486
  series: series
@@ -7860,13 +7631,16 @@ function createCompositeAnnotation(annotations) {
7860
7631
  var allSeries = [];
7861
7632
  annotations.forEach(function (annotation) {
7862
7633
  if (annotation.type === 'line' && annotation.markLine) {
7863
- allSeries.push.apply(allSeries, convertAnnotationToMarkLine(annotation.markLine));
7634
+ var result = convertAnnotationToMarkLine(annotation.markLine);
7635
+ allSeries.push.apply(allSeries, Array.isArray(result) ? result : [result]);
7864
7636
  }
7865
7637
  if (annotation.type === 'area' && annotation.markArea) {
7866
- allSeries.push.apply(allSeries, convertAnnotationToMarkArea(annotation.markArea));
7638
+ var result = convertAnnotationToMarkArea(annotation.markArea);
7639
+ allSeries.push.apply(allSeries, Array.isArray(result) ? result : [result]);
7867
7640
  }
7868
7641
  if (annotation.type === 'scatter' && annotation.scatter) {
7869
- allSeries.push.apply(allSeries, convertAnnotationToScatter(annotation.scatter));
7642
+ var result = convertAnnotationToScatter(annotation.scatter);
7643
+ allSeries.push.apply(allSeries, Array.isArray(result) ? result : [result]);
7870
7644
  }
7871
7645
  });
7872
7646
  return {
@@ -8026,7 +7800,7 @@ function dataURLToBlob(dataURL) {
8026
7800
  /**
8027
7801
  * 下载文件
8028
7802
  */
8029
- function downloadFile(data, filename, mimeType) {
7803
+ function downloadFile(data, filename, _mimeType) {
8030
7804
  var blob = typeof data === 'string' ? dataURLToBlob(data) : data;
8031
7805
  var url = URL.createObjectURL(blob);
8032
7806
  var link = document.createElement('a');
@@ -8073,6 +7847,7 @@ var ChartExporter = /** @class */function () {
8073
7847
  _d = options.quality,
8074
7848
  quality = _d === void 0 ? 0.8 : _d;
8075
7849
  var mimeType = "image/".concat(type);
7850
+ // 使用 any 避免 ECharts 类型定义与实际支持类型不匹配
8076
7851
  var data = chart.getDataURL({
8077
7852
  type: type,
8078
7853
  pixelRatio: pixelRatio,
@@ -8094,8 +7869,11 @@ var ChartExporter = /** @class */function () {
8094
7869
  }
8095
7870
  var _a = options.compress,
8096
7871
  compress = _a === void 0 ? false : _a;
8097
- var svgData = chart.getSvgData();
8098
- 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,') {
8099
7877
  throw new Error('SVG export is not supported. Please use canvas renderer.');
8100
7878
  }
8101
7879
  var data = svgData;
@@ -8117,11 +7895,12 @@ var ChartExporter = /** @class */function () {
8117
7895
  ChartExporter.exportPDF = function (chart_1) {
8118
7896
  return __awaiter(this, arguments, Promise, function (chart, options) {
8119
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;
8120
7899
  if (options === void 0) {
8121
7900
  options = {};
8122
7901
  }
8123
- return __generator(this, function (_h) {
8124
- switch (_h.label) {
7902
+ return __generator(this, function (_j) {
7903
+ switch (_j.label) {
8125
7904
  case 0:
8126
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 ? {
8127
7906
  top: 40,
@@ -8134,17 +7913,17 @@ var ChartExporter = /** @class */function () {
8134
7913
  pixelRatio: 2,
8135
7914
  backgroundColor: '#ffffff'
8136
7915
  });
8137
- _h.label = 1;
7916
+ _j.label = 1;
8138
7917
  case 1:
8139
- _h.trys.push([1, 3,, 4]);
7918
+ _j.trys.push([1, 3,, 4]);
8140
7919
  return [4 /*yield*/, import(/* webpackIgnore: true */'jspdf')];
8141
7920
  case 2:
8142
7921
  // 尝试使用动态导入,使用 webpackIgnore 注释避免预解析
8143
- // @ts-ignore - 动态导入
8144
- jsPDF = _h.sent().default;
7922
+ // @ts-expect-error - 动态导入
7923
+ jsPDF = _j.sent().default;
8145
7924
  return [3 /*break*/, 4];
8146
7925
  case 3:
8147
- _g = _h.sent();
7926
+ _g = _j.sent();
8148
7927
  // 如果没有 jspdf,提供备选方案
8149
7928
  console.warn('[TaroViz] jspdf not found, falling back to image download');
8150
7929
  return [2 /*return*/, {
@@ -8200,7 +7979,7 @@ var ChartExporter = /** @class */function () {
8200
7979
  chartY = includeTitle ? marginTop + 15 : marginTop;
8201
7980
  chartX = (pageWidth - chartWidth) / 2;
8202
7981
  doc.addImage(imageData, 'PNG', chartX, chartY, chartWidth, chartHeight);
8203
- footerY = pageHeight - margin.bottom / 2;
7982
+ footerY = pageHeight - ((_h = margin.bottom) !== null && _h !== void 0 ? _h : 40) / 2;
8204
7983
  doc.setFontSize(10);
8205
7984
  doc.setTextColor(153, 153, 153);
8206
7985
  doc.text("Generated by TaroViz on ".concat(new Date().toLocaleDateString()), marginLeft, footerY);
@@ -8220,11 +7999,11 @@ var ChartExporter = /** @class */function () {
8220
7999
  */
8221
8000
  ChartExporter.exportBatch = function (charts, options) {
8222
8001
  return __awaiter(this, void 0, Promise, function () {
8223
- 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;
8224
8003
  return __generator(this, function (_c) {
8225
8004
  switch (_c.label) {
8226
8005
  case 0:
8227
- 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;
8228
8007
  results = [];
8229
8008
  _i = 0, charts_1 = charts;
8230
8009
  _c.label = 1;
@@ -8324,6 +8103,466 @@ var ChartExporter = /** @class */function () {
8324
8103
  }();
8325
8104
  var exportChart = ChartExporter;
8326
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
+ });
8327
8566
  ;// ./src/hooks/index.ts
8328
8567
  var hooks_awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {
8329
8568
  function adopt(value) {
@@ -8451,6 +8690,7 @@ var hooks_spreadArray = undefined && undefined.__spreadArray || function (to, fr
8451
8690
  */
8452
8691
 
8453
8692
 
8693
+
8454
8694
  // ============================================================================
8455
8695
  // Hooks
8456
8696
  // ============================================================================
@@ -8461,6 +8701,7 @@ var hooks_spreadArray = undefined && undefined.__spreadArray || function (to, fr
8461
8701
  * @returns [图表实例, 设置实例函数, 是否已初始化]
8462
8702
  */
8463
8703
  function useChart(chartRef, config) {
8704
+ var _this = this;
8464
8705
  var _a = (0,external_react_.useState)(null),
8465
8706
  instance = _a[0],
8466
8707
  setInstance = _a[1];
@@ -8473,14 +8714,31 @@ function useChart(chartRef, config) {
8473
8714
  if (!chartRef.current || instance) {
8474
8715
  return;
8475
8716
  }
8476
- try {
8477
- var adapter = (0,adapters/* getAdapter */.cK)(configRef.current || {});
8478
- var chartInstance = adapter;
8479
- setInstance(chartInstance);
8480
- setInitialized(true);
8481
- } catch (error) {
8482
- console.error('Failed to initialize chart:', error);
8483
- }
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();
8484
8742
  return function () {
8485
8743
  var _a;
8486
8744
  if (instance) {
@@ -8650,9 +8908,9 @@ function useChartTheme(theme, darkMode) {
8650
8908
  }
8651
8909
  return (0,external_react_.useMemo)(function () {
8652
8910
  if (typeof theme === 'string') {
8653
- // 如果是字符串,尝试获取内置主题
8911
+ // 如果是字符串,尝试获取内置主题配置
8654
8912
  try {
8655
- var builtinTheme = getTheme(theme);
8913
+ var builtinTheme = getThemeByName(theme);
8656
8914
  return builtinTheme || (darkMode ? 'dark' : theme);
8657
8915
  } catch (_a) {
8658
8916
  return darkMode ? 'dark' : theme;
@@ -8793,7 +9051,7 @@ function useDataPolling(fetchFn, options) {
8793
9051
  });
8794
9052
  var fetchData = (0,external_react_.useCallback)(function () {
8795
9053
  return hooks_awaiter(_this, void 0, void 0, function () {
8796
- var currentAbort, retries, result, e_1;
9054
+ var currentAbort, retries, result, e_1, result, e_2;
8797
9055
  return hooks_generator(this, function (_a) {
8798
9056
  switch (_a.label) {
8799
9057
  case 0:
@@ -8809,7 +9067,7 @@ function useDataPolling(fetchFn, options) {
8809
9067
  setError(null);
8810
9068
  _a.label = 1;
8811
9069
  case 1:
8812
- if (!(retries >= 0 && !currentAbort.cancelled)) return [3 /*break*/, 9];
9070
+ if (!(retries > 0 && !currentAbort.cancelled)) return [3 /*break*/, 9];
8813
9071
  _a.label = 2;
8814
9072
  case 2:
8815
9073
  _a.trys.push([2, 4,, 8]);
@@ -8824,12 +9082,12 @@ function useDataPolling(fetchFn, options) {
8824
9082
  case 4:
8825
9083
  e_1 = _a.sent();
8826
9084
  retries--;
8827
- if (!(retries < 0 || currentAbort.cancelled)) return [3 /*break*/, 5];
9085
+ if (!(retries <= 0 || currentAbort.cancelled)) return [3 /*break*/, 5];
8828
9086
  if (!currentAbort.cancelled) {
8829
9087
  setError(e_1);
8830
9088
  }
8831
9089
  setLoading(false);
8832
- return [3 /*break*/, 7];
9090
+ return [2 /*return*/];
8833
9091
  case 5:
8834
9092
  return [4 /*yield*/, new Promise(function (resolve) {
8835
9093
  return setTimeout(resolve, retryDelay);
@@ -8842,6 +9100,33 @@ function useDataPolling(fetchFn, options) {
8842
9100
  case 8:
8843
9101
  return [3 /*break*/, 1];
8844
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
+ }
8845
9130
  return [2 /*return*/];
8846
9131
  }
8847
9132
  });
@@ -9002,8 +9287,10 @@ function useChartTools(instance) {
9002
9287
  // ============================================================================
9003
9288
  // 导出
9004
9289
  // ============================================================================
9005
- var version = '1.2.0';
9006
- var hooks = {
9290
+ var version = '1.4.0';
9291
+ // 新增数据转换 hooks
9292
+
9293
+ /* harmony default export */ const hooks = ({
9007
9294
  useChart: useChart,
9008
9295
  useOption: useOption,
9009
9296
  useResize: useResize,
@@ -9017,8 +9304,7 @@ var hooks = {
9017
9304
  useFullscreen: useFullscreen,
9018
9305
  useExport: useExport,
9019
9306
  useChartTools: useChartTools
9020
- };
9021
- /* harmony default export */ const src_hooks = ((/* unused pure expression or super */ null && (hooks)));
9307
+ });
9022
9308
  ;// ./src/index.ts
9023
9309
  /**
9024
9310
  * TaroViz - 基于 Taro 和 ECharts 的多端图表组件库
@@ -9040,6 +9326,10 @@ var hooks = {
9040
9326
 
9041
9327
 
9042
9328
 
9329
+ // 新增图表组件
9330
+
9331
+
9332
+
9043
9333
  // 适配器
9044
9334
 
9045
9335
 
@@ -9063,12 +9353,12 @@ var hooks = {
9063
9353
  * 库信息
9064
9354
  */
9065
9355
  var src_name = 'taroviz';
9066
- var src_version = '1.2.1';
9067
- 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 };
9068
9358
  export const BarChart = bar["default"];
9069
9359
  export const FunnelChart = funnel["default"];
9070
9360
  export const GaugeChart = gauge["default"];
9071
- export const H5Adapter = h5/* default */.A;
9361
+ export const H5Adapter = h5["default"];
9072
9362
  export const HeatmapChart = heatmap["default"];
9073
9363
  export const LineChart = line["default"];
9074
9364
  export const PieChart = pie["default"];
@@ -9077,7 +9367,7 @@ export const SankeyChart = sankey["default"];
9077
9367
  export const ScatterChart = scatter["default"];
9078
9368
  export const SunburstChart = sunburst["default"];
9079
9369
  export const TreeMapChart = treemap["default"];
9080
- export const WeappAdapter = weapp/* default */.A;
9370
+ export const WeappAdapter = weapp["default"];
9081
9371
  export const debounce = utils/* debounce */.sg;
9082
9372
  export const deepMerge = utils/* deepMerge */.$N;
9083
9373
  export const detectPlatform = adapters/* detectPlatform */.li;