@xq-labs/data-ui-v2 0.2.1 → 0.3.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.
@@ -1,5 +1,6 @@
1
- import { _ as _objectSpread2, D as DEFAULT_COLORS, a as _toConsumableArray, m as mergeChartOption, i as isEmptyData } from './colors-ca059479.js';
1
+ import { _ as _objectSpread2, D as DEFAULT_COLORS, a as _toConsumableArray, m as mergeChartOption, i as isEmptyData } from './colors-ec0ad9ce.js';
2
2
  import * as echarts from 'echarts/core';
3
+ import { SeriesModel } from 'echarts/core';
3
4
  import { PieChart as PieChart$1 } from 'echarts/charts';
4
5
  import { TooltipComponent, LegendComponent, GridComponent, TitleComponent, GraphicComponent } from 'echarts/components';
5
6
  import { CanvasRenderer } from 'echarts/renderers';
@@ -69,10 +70,11 @@ var PIE_HEIGHT_MODE = {
69
70
  VALUE: 'value'
70
71
  };
71
72
  var DEFAULT_HEIGHT_RANGE = {
72
- min: 20,
73
- max: 80
73
+ min: 10,
74
+ max: 25
74
75
  };
75
- var DEFAULT_3D_VIEW_ALPHA = 28;
76
+ var DEFAULT_3D_VIEW_DISTANCE = 120;
77
+ var DEFAULT_3D_VIEW_ALPHA = 55;
76
78
  var DEFAULT_INTERNAL_DIAMETER_RATIO = 0.6;
77
79
  var DEFAULT_ROSE_RADIUS_RANGE = [0.75, 1.15];
78
80
  var DEFAULT_LABEL_OPTIONS = {
@@ -90,6 +92,17 @@ var DEFAULT_LABEL_OPTIONS = {
90
92
  verticalGap: 8,
91
93
  radialOffset: 0.12
92
94
  };
95
+ var DEFAULT_TOOLTIP_STYLE = {
96
+ backgroundColor: '#fff',
97
+ borderColor: 'transparent',
98
+ borderWidth: 0,
99
+ padding: [8, 12],
100
+ textStyle: {
101
+ color: '#333',
102
+ fontSize: 12
103
+ },
104
+ extraCssText: 'box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); border-radius: 4px;'
105
+ };
93
106
 
94
107
  /**
95
108
  * 将输入值转为安全数字。
@@ -196,6 +209,9 @@ function buildPieChartData(data) {
196
209
  function replaceLabelTemplate(template, params) {
197
210
  return template.replace(/\{b\}/g, params.name).replace(/\{c\}/g, params.value).replace(/\{d\}/g, params.percent);
198
211
  }
212
+ function escapeTooltipHtml(value) {
213
+ return String(value).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
214
+ }
199
215
  function formatPieLabelText(formatter, params) {
200
216
  if (typeof formatter === 'function') {
201
217
  return formatter(params);
@@ -205,29 +221,65 @@ function formatPieLabelText(formatter, params) {
205
221
  }
206
222
  return "".concat(params.name, "\n").concat(params.percent, "%");
207
223
  }
224
+ function createFallbackTooltipMarker(color) {
225
+ var markerColor = escapeTooltipHtml(color || '#6B98F8');
226
+ return "<span style=\"display:inline-block;margin-right:4px;border-radius:50%;width:10px;height:10px;background-color:".concat(markerColor, ";\"></span>");
227
+ }
228
+ function formatPieTooltipContent(_ref) {
229
+ var marker = _ref.marker,
230
+ name = _ref.name,
231
+ value = _ref.value,
232
+ color = _ref.color;
233
+ var safeMarker = marker || createFallbackTooltipMarker(color);
234
+ return "".concat(safeMarker).concat(escapeTooltipHtml(name), ":").concat(escapeTooltipHtml(value));
235
+ }
236
+
237
+ /**
238
+ * 创建饼图统一 hover tooltip 样式。
239
+ * 默认呈现为白底阴影卡片,内容为“彩色圆点 + 名称:值”,贴近业务看板常见展示形态。
240
+ */
241
+ function createPieTooltipOption(formatter) {
242
+ return _objectSpread2(_objectSpread2({}, DEFAULT_TOOLTIP_STYLE), {}, {
243
+ formatter: formatter
244
+ });
245
+ }
246
+ function formatPie2DTooltip() {
247
+ var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
248
+ return formatPieTooltipContent({
249
+ marker: params.marker,
250
+ name: params.name === undefined ? '' : params.name,
251
+ value: params.value === undefined ? '' : params.value,
252
+ color: params.color
253
+ });
254
+ }
208
255
 
209
256
  /**
210
257
  * 格式化 3D 饼图默认 tooltip 文案。
211
258
  * surface 系列 hover 时拿到的 `params.value` 实际是参数方程采样值,
212
259
  * 不能直接当业务值展示,因此统一回退到扇区自身的 `pieData`。
213
260
  */
214
- function formatPieTooltipText(name, value, percent) {
215
- return "".concat(name, ": ").concat(value, " (").concat(percent, "%)");
261
+ function formatPie3DTooltip(params, pieData) {
262
+ return formatPieTooltipContent({
263
+ marker: params && params.marker,
264
+ name: pieData && pieData.name !== undefined ? pieData.name : '',
265
+ value: pieData && pieData.value !== undefined ? pieData.value : 0,
266
+ color: pieData && pieData.itemStyle && pieData.itemStyle.color
267
+ });
216
268
  }
217
269
 
218
270
  /**
219
271
  * 为单个 3D 扇区生成专用 tooltip。
220
272
  * 这样即使鼠标落在 surface 网格采样点上,展示的仍然是业务名称、原始值与百分比。
221
273
  */
222
- function createPie3DTooltip(pieData, totalValue) {
274
+ function createPie3DTooltip(pieData) {
223
275
  var value = toNumber(pieData && pieData.value, 0);
224
- var percent = totalValue > 0 ? Number((value / totalValue * 100).toFixed(2)) : 0;
225
276
  var name = pieData && pieData.name !== undefined ? pieData.name : '';
226
- return {
227
- formatter: function formatter() {
228
- return formatPieTooltipText(name, value, percent);
229
- }
230
- };
277
+ return createPieTooltipOption(function (params) {
278
+ return formatPie3DTooltip(params, _objectSpread2(_objectSpread2({}, pieData), {}, {
279
+ name: name,
280
+ value: value
281
+ }));
282
+ });
231
283
  }
232
284
  function multiplyMat4Vec4(matrix, vector) {
233
285
  return [matrix[0] * vector[0] + matrix[4] * vector[1] + matrix[8] * vector[2] + matrix[12] * vector[3], matrix[1] * vector[0] + matrix[5] * vector[1] + matrix[9] * vector[2] + matrix[13] * vector[3], matrix[2] * vector[0] + matrix[6] * vector[1] + matrix[10] * vector[2] + matrix[14] * vector[3], matrix[3] * vector[0] + matrix[7] * vector[1] + matrix[11] * vector[2] + matrix[15] * vector[3]];
@@ -436,11 +488,9 @@ function createHeightValues(values, mode, minHeight, maxHeight) {
436
488
  }
437
489
  return mapValueToRange(values, safeMinHeight, safeMaxHeight);
438
490
  }
439
- function createAdaptiveViewControl(showLabelLine, maxHeight) {
440
- var baseDistance = showLabelLine ? 175 : 180;
441
- var extraDistance = Math.max(0, maxHeight - 200) * 0.18;
491
+ function createDefaultViewControl() {
442
492
  return {
443
- distance: baseDistance + extraDistance,
493
+ distance: DEFAULT_3D_VIEW_DISTANCE,
444
494
  alpha: DEFAULT_3D_VIEW_ALPHA
445
495
  };
446
496
  }
@@ -577,9 +627,6 @@ function buildPie3DSeries(pieData) {
577
627
  var valueList = renderPieData.map(function (item) {
578
628
  return Math.max(0, toNumber(item.value, 0));
579
629
  });
580
- var totalValue = valueList.reduce(function (sum, value) {
581
- return sum + value;
582
- }, 0);
583
630
  var angleValueList = getAngleValueList(valueList);
584
631
  var totalAngleValue = angleValueList.reduce(function (sum, value) {
585
632
  return sum + value;
@@ -613,7 +660,7 @@ function buildPie3DSeries(pieData) {
613
660
  selected: false,
614
661
  hovered: false
615
662
  },
616
- tooltip: createPie3DTooltip(item, totalValue),
663
+ tooltip: createPie3DTooltip(item),
617
664
  itemStyle: _objectSpread2({}, item.itemStyle),
618
665
  parametricEquation: getParametricEquation(startRatio, endRatio, false, false, geometry)
619
666
  };
@@ -708,7 +755,7 @@ function createPie3DOption(input, variant) {
708
755
  hideZeroValueSlices: input.hideZeroValueSlices !== false
709
756
  };
710
757
  var pie3D = buildPie3DSeries(data, chartConfig);
711
- var viewControl = createAdaptiveViewControl(chartConfig.showLabelLine, safeMaxHeight);
758
+ var viewControl = createDefaultViewControl();
712
759
  return {
713
760
  xAxis3D: {
714
761
  min: -pie3D.axisLimit,
@@ -895,10 +942,9 @@ function buildPieOption() {
895
942
  });
896
943
  var baseOption = {
897
944
  color: DEFAULT_COLORS,
898
- tooltip: {
899
- trigger: 'item',
900
- formatter: '{b}: {c} ({d}%)'
901
- },
945
+ tooltip: _objectSpread2({
946
+ trigger: 'item'
947
+ }, createPieTooltipOption(formatPie2DTooltip)),
902
948
  legend: {
903
949
  data: normalizedData.map(function (item) {
904
950
  return item.name;
@@ -927,33 +973,26 @@ function buildPieOption() {
927
973
  return mergeChartOption(mergeChartOption(baseOption, presetOption, variantOption), customOption);
928
974
  }
929
975
 
930
- var runtimePromise = null;
931
- var ECHARTS_GL_PACKAGE_NAME = 'echarts-gl';
932
- var MISSING_RUNTIME_MESSAGE = '使用 PieChart 3D 能力需要安装 echarts-gl,请执行 npm install echarts-gl。';
933
- var createMissingRuntimeError = function createMissingRuntimeError(error) {
934
- var runtimeError = new Error(MISSING_RUNTIME_MESSAGE);
935
- runtimeError.cause = error;
936
- return runtimeError;
937
- };
938
- var importRuntime = function importRuntime() {
939
- var dynamicImport = new Function('packageName', 'return import(packageName)');
940
- return dynamicImport(ECHARTS_GL_PACKAGE_NAME);
976
+ var SURFACE_SERIES_TYPE = 'series.surface';
977
+ var MISSING_RUNTIME_MESSAGE = "使用 PieChart 3D 能力前,请先在业务页面中执行 import '@xq-labs/data-ui-v2/pie-chart/3d-runtime'。";
978
+ var hasSurfaceSeriesRuntime = function hasSurfaceSeriesRuntime() {
979
+ return SeriesModel && (typeof SeriesModel.getClass === 'function' && !!SeriesModel.getClass('series', 'surface') || typeof SeriesModel.getClassesByMainType === 'function' && SeriesModel.getClassesByMainType('series').some(function (seriesClass) {
980
+ return seriesClass && seriesClass.type === SURFACE_SERIES_TYPE;
981
+ }));
941
982
  };
942
983
 
943
984
  /**
944
- * 按需加载 echarts-gl 运行时。
985
+ * 检测 PieChart 3D 运行时是否已经由业务项目接入。
945
986
  *
946
- * 这里不能在模块顶层静态加载 echarts-gl,否则只使用 2D 饼图的业务方也会被迫安装。
947
- * 加载结果会被缓存,避免同一个页面内多个 3D 饼图重复触发运行时加载。
987
+ * 方案 B 修订版下,组件库不再负责动态加载 `echarts-gl`,
988
+ * 而是要求业务项目在使用 3D PieChart 的页面中显式执行桥接入口:
989
+ * `import '@xq-labs/data-ui-v2/pie-chart/3d-runtime'`
948
990
  */
949
991
  function ensureEchartsGlRuntime() {
950
- if (!runtimePromise) {
951
- runtimePromise = importRuntime()["catch"](function (error) {
952
- runtimePromise = null;
953
- throw createMissingRuntimeError(error);
954
- });
992
+ if (hasSurfaceSeriesRuntime()) {
993
+ return Promise.resolve();
955
994
  }
956
- return runtimePromise;
995
+ return Promise.reject(new Error(MISSING_RUNTIME_MESSAGE));
957
996
  }
958
997
 
959
998
  echarts.use([PieChart$1, TooltipComponent, LegendComponent, GridComponent, TitleComponent, GraphicComponent, CanvasRenderer]);
@@ -1028,7 +1067,7 @@ var script = {
1028
1067
  */
1029
1068
  minHeight: {
1030
1069
  type: Number,
1031
- "default": 20
1070
+ "default": 10
1032
1071
  },
1033
1072
  /**
1034
1073
  * 3D 模式下的最大扇区高度。
@@ -1036,7 +1075,7 @@ var script = {
1036
1075
  */
1037
1076
  maxHeight: {
1038
1077
  type: Number,
1039
- "default": 80
1078
+ "default": 25
1040
1079
  },
1041
1080
  /**
1042
1081
  * 环图内径比例。
@@ -1139,13 +1178,13 @@ var script = {
1139
1178
  },
1140
1179
  /**
1141
1180
  * 判断当前是否进入 3D 饼图能力。
1142
- * 只有 3D 才需要加载 echarts-gl2D 场景不应触发任何 3D 运行时依赖。
1181
+ * 只有 3D 才需要 echarts-gl 桥接入口,2D 场景不应触发任何 3D 运行时依赖。
1143
1182
  */
1144
1183
  is3D: function is3D() {
1145
1184
  return this.dimension === '3d';
1146
1185
  },
1147
1186
  /**
1148
- * 标识 echarts-gl 是否已经加载完成。
1187
+ * 标识 echarts-gl 运行时是否已经注册完成。
1149
1188
  * 3D option 只有在运行时就绪后才会生成 surface 序列。
1150
1189
  */
1151
1190
  isEchartsGlReady: function isEchartsGlReady() {
@@ -1153,14 +1192,14 @@ var script = {
1153
1192
  },
1154
1193
  /**
1155
1194
  * 汇总外部 loading 与 3D 运行时加载状态。
1156
- * 这样 3D 首次加载 echarts-gl 时,底层 BaseChart 能保持 loading 态。
1195
+ * 这样 3D 首次检测运行时期间,底层 BaseChart 能保持 loading 态。
1157
1196
  */
1158
1197
  chartLoading: function chartLoading() {
1159
1198
  return this.loading || this.is3D && this.echartsGlStatus === 'loading';
1160
1199
  },
1161
1200
  /**
1162
1201
  * 汇总数据空态与 3D 运行时失败状态。
1163
- * 缺少 echarts-gl 时不让 BaseChart 继续渲染空 surface option。
1202
+ * 缺少 3D 桥接运行时时不让 BaseChart 继续渲染空 surface option。
1164
1203
  */
1165
1204
  chartEmpty: function chartEmpty() {
1166
1205
  return this.isEmpty || this.is3D && this.echartsGlStatus === 'failed';
@@ -1176,7 +1215,7 @@ var script = {
1176
1215
  if (this.is3D && this.echartsGlStatus === 'failed') {
1177
1216
  return {
1178
1217
  empty: _objectSpread2(_objectSpread2({}, emptyConfig), {}, {
1179
- text: this.echartsGlErrorMessage || '使用 3D 饼图需要安装 echarts-gl'
1218
+ text: this.echartsGlErrorMessage || "使用 PieChart 3D 能力前,请先在业务页面中执行 import '@xq-labs/data-ui-v2/pie-chart/3d-runtime'。"
1180
1219
  }),
1181
1220
  loading: _objectSpread2({}, loadingConfig)
1182
1221
  };
@@ -1216,7 +1255,7 @@ var script = {
1216
1255
  watch: {
1217
1256
  /**
1218
1257
  * dimension 是 2D/3D 分发的公开开关。
1219
- * 只有切到 3D 时才按需加载 echarts-gl,避免 2D 使用方被迫安装 3D 运行时。
1258
+ * 只有切到 3D 时才检测 3D 运行时,避免 2D 使用方被迫安装 3D 运行时。
1220
1259
  */
1221
1260
  dimension: {
1222
1261
  immediate: true,
@@ -1248,7 +1287,7 @@ var script = {
1248
1287
  this.$emit('ready', chart);
1249
1288
  },
1250
1289
  /**
1251
- * 在真正进入 3D 能力时按需加载 echarts-gl
1290
+ * 在真正进入 3D 能力时检测 echarts-gl 桥接入口是否已经注册。
1252
1291
  *
1253
1292
  * 返回 Promise 是为了让单测和后续业务扩展能准确等待状态变化;
1254
1293
  * 2D、已就绪、加载中三种场景会直接返回 resolved Promise。
@@ -1264,7 +1303,7 @@ var script = {
1264
1303
  _this.echartsGlStatus = 'ready';
1265
1304
  })["catch"](function (error) {
1266
1305
  _this.echartsGlStatus = 'failed';
1267
- _this.echartsGlErrorMessage = error && error.message ? error.message : '使用 3D 饼图需要安装 echarts-gl';
1306
+ _this.echartsGlErrorMessage = error && error.message ? error.message : "使用 PieChart 3D 能力前,请先在业务页面中执行 import '@xq-labs/data-ui-v2/pie-chart/3d-runtime'。";
1268
1307
  _this.$emit('runtime-error', error);
1269
1308
  });
1270
1309
  },
@@ -1302,7 +1341,7 @@ var script = {
1302
1341
  }
1303
1342
  };
1304
1343
 
1305
- var css_248z = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
1344
+ var css_248z = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
1306
1345
  styleInject(css_248z);
1307
1346
 
1308
1347
  /* script */
@@ -1334,7 +1373,7 @@ __vue_render__._withStripped = true;
1334
1373
  /* style */
1335
1374
  var __vue_inject_styles__ = undefined;
1336
1375
  /* scoped */
1337
- var __vue_scope_id__ = "data-v-19bfc774";
1376
+ var __vue_scope_id__ = "data-v-7f129cbd";
1338
1377
  /* module identifier */
1339
1378
  var __vue_module_identifier__ = undefined;
1340
1379
  /* functional template */
@@ -1,10 +1,10 @@
1
1
  import * as echarts from 'echarts/core';
2
2
  import { graphic } from 'echarts/core';
3
3
  import { BarChart, LineChart, CustomChart } from 'echarts/charts';
4
- import { TooltipComponent, LegendComponent, GridComponent, TitleComponent } from 'echarts/components';
4
+ import { TooltipComponent, LegendComponent, GridComponent, TitleComponent, DataZoomComponent } from 'echarts/components';
5
5
  import { CanvasRenderer } from 'echarts/renderers';
6
6
  import { B as BaseChart, s as styleInject, n as normalizeComponent } from './with-install-e405b463.js';
7
- import { _ as _objectSpread2, D as DEFAULT_COLORS, a as _toConsumableArray, m as mergeChartOption, i as isEmptyData } from './colors-ca059479.js';
7
+ import { _ as _objectSpread2, D as DEFAULT_COLORS, a as _toConsumableArray, m as mergeChartOption, b as _typeof, i as isEmptyData } from './colors-ec0ad9ce.js';
8
8
 
9
9
  var DEFAULT_SERIES = {
10
10
  key: 'value',
@@ -1059,6 +1059,8 @@ function createCylinderBarLineOption(normalizedInput) {
1059
1059
  }
1060
1060
 
1061
1061
  var DEFAULT_VARIANT = 'flat';
1062
+ var DEFAULT_X_AXIS_SCROLL_VISIBLE_COUNT = 8;
1063
+ var DEFAULT_X_AXIS_SCROLL_GRID_BOTTOM = 56;
1062
1064
  var BAR_LINE_PUBLIC_VARIANTS = ['flat', 'cylinder', 'cube'];
1063
1065
 
1064
1066
  // 公开 variant 能力在此处收口:只允许 flat / cylinder / cube。
@@ -1104,6 +1106,93 @@ function createBaseOption(normalizedInput) {
1104
1106
  }
1105
1107
  };
1106
1108
  }
1109
+ function isValidNumber(value) {
1110
+ return Number.isFinite(Number(value));
1111
+ }
1112
+ function normalizePositiveInteger(value, fallback) {
1113
+ var normalizedValue = Number(value);
1114
+ if (!Number.isFinite(normalizedValue) || normalizedValue <= 0) {
1115
+ return fallback;
1116
+ }
1117
+ return Math.floor(normalizedValue);
1118
+ }
1119
+ function normalizeStartIndex(startIndex) {
1120
+ if (!isValidNumber(startIndex)) {
1121
+ return null;
1122
+ }
1123
+ var normalizedStartIndex = Math.floor(Number(startIndex));
1124
+ return normalizedStartIndex >= 0 ? normalizedStartIndex : null;
1125
+ }
1126
+ function toPercent(value, total) {
1127
+ return Number((value / total * 100).toFixed(2));
1128
+ }
1129
+
1130
+ /**
1131
+ * 归一化横轴滚动配置。
1132
+ * 该配置只服务 X 轴类目过多的场景,不扩展 Y 轴滚动,避免 API 语义变复杂。
1133
+ */
1134
+ function normalizeXAxisScrollConfig() {
1135
+ var xAxisScroll = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
1136
+ var scrollConfig = xAxisScroll && _typeof(xAxisScroll) === 'object' ? xAxisScroll : {};
1137
+ return {
1138
+ enabled: scrollConfig.enabled === true,
1139
+ visibleCount: normalizePositiveInteger(scrollConfig.visibleCount, DEFAULT_X_AXIS_SCROLL_VISIBLE_COUNT),
1140
+ startPosition: scrollConfig.startPosition === 'start' ? 'start' : 'end',
1141
+ startIndex: normalizeStartIndex(scrollConfig.startIndex),
1142
+ showSlider: scrollConfig.showSlider !== false,
1143
+ inside: scrollConfig.inside !== false
1144
+ };
1145
+ }
1146
+
1147
+ /**
1148
+ * 根据横轴类目数量生成 ECharts dataZoom。
1149
+ * 默认从末尾向前取 `visibleCount` 个类目,满足“最新数据优先展示”的看板诉求。
1150
+ */
1151
+ function createXAxisScrollOption() {
1152
+ var categories = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
1153
+ var xAxisScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1154
+ var scrollConfig = normalizeXAxisScrollConfig(xAxisScroll);
1155
+ var totalCount = Array.isArray(categories) ? categories.length : 0;
1156
+ if (!scrollConfig.enabled || totalCount <= scrollConfig.visibleCount) {
1157
+ return {};
1158
+ }
1159
+ var windowSize = Math.min(scrollConfig.visibleCount, totalCount);
1160
+ var maxStartIndex = totalCount - windowSize;
1161
+ var resolvedStartIndex = scrollConfig.startIndex !== null ? Math.min(scrollConfig.startIndex, maxStartIndex) : scrollConfig.startPosition === 'start' ? 0 : maxStartIndex;
1162
+ var start = toPercent(resolvedStartIndex, totalCount);
1163
+ var end = toPercent(resolvedStartIndex + windowSize, totalCount);
1164
+ var dataZoom = [];
1165
+ if (scrollConfig.showSlider) {
1166
+ dataZoom.push({
1167
+ type: 'slider',
1168
+ xAxisIndex: 0,
1169
+ start: start,
1170
+ end: end,
1171
+ height: 14,
1172
+ bottom: 8,
1173
+ brushSelect: false
1174
+ });
1175
+ }
1176
+ if (scrollConfig.inside) {
1177
+ dataZoom.push({
1178
+ type: 'inside',
1179
+ xAxisIndex: 0,
1180
+ start: start,
1181
+ end: end,
1182
+ zoomLock: true
1183
+ });
1184
+ }
1185
+ if (dataZoom.length === 0) {
1186
+ return {};
1187
+ }
1188
+ return _objectSpread2(_objectSpread2({}, scrollConfig.showSlider ? {
1189
+ grid: {
1190
+ bottom: DEFAULT_X_AXIS_SCROLL_GRID_BOTTOM
1191
+ }
1192
+ } : {}), {}, {
1193
+ dataZoom: dataZoom
1194
+ });
1195
+ }
1107
1196
 
1108
1197
  /**
1109
1198
  * 构建 `BarLineChart` 最终 option。
@@ -1111,7 +1200,8 @@ function createBaseOption(normalizedInput) {
1111
1200
  * 1. 输入归一化
1112
1201
  * 2. preset 合并
1113
1202
  * 3. 变体分发
1114
- * 4. customOption 覆盖
1203
+ * 4. X 轴滚动配置合并
1204
+ * 5. customOption 覆盖
1115
1205
  */
1116
1206
  function buildBarLineOption() {
1117
1207
  var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
@@ -1124,6 +1214,7 @@ function buildBarLineOption() {
1124
1214
  variant = _ref$variant === void 0 ? 'flat' : _ref$variant,
1125
1215
  barWidth = _ref.barWidth,
1126
1216
  barGap = _ref.barGap,
1217
+ xAxisScroll = _ref.xAxisScroll,
1127
1218
  customOption = _ref.customOption;
1128
1219
  var normalizedInput = normalizeBarLineInput({
1129
1220
  data: data,
@@ -1139,7 +1230,8 @@ function buildBarLineOption() {
1139
1230
  barWidth: barWidth,
1140
1231
  barGap: barGap
1141
1232
  }));
1142
- return mergeChartOption(mergeChartOption(baseOption, presetOption, variantOption), customOption);
1233
+ var xAxisScrollOption = createXAxisScrollOption(normalizedInput.categories, xAxisScroll);
1234
+ return mergeChartOption(mergeChartOption(mergeChartOption(baseOption, presetOption, variantOption), xAxisScrollOption), customOption);
1143
1235
  }
1144
1236
 
1145
1237
  //
@@ -1161,7 +1253,7 @@ function buildBarLineOption() {
1161
1253
  * 这里显式注册柱图、折线图、自定义系列以及笛卡尔坐标系常用组件,
1162
1254
  * 否则运行时虽然能生成 option,但对应主类型不会真正参与渲染。
1163
1255
  */
1164
- echarts.use([BarChart, LineChart, CustomChart, TooltipComponent, LegendComponent, GridComponent, TitleComponent, CanvasRenderer]);
1256
+ echarts.use([BarChart, LineChart, CustomChart, TooltipComponent, LegendComponent, GridComponent, TitleComponent, DataZoomComponent, CanvasRenderer]);
1165
1257
  var script = {
1166
1258
  name: 'BarLineChart',
1167
1259
  components: {
@@ -1248,6 +1340,22 @@ var script = {
1248
1340
  return {};
1249
1341
  }
1250
1342
  },
1343
+ /**
1344
+ * X 轴类目滚动配置。
1345
+ * 仅控制横轴,不扩展 Y 轴;适合月份、日期、地区等类目数量较多的看板场景。
1346
+ * 常用字段:
1347
+ * - enabled: 是否开启 X 轴滚动
1348
+ * - visibleCount: 初始窗口内展示的类目数量,默认按 8 个处理
1349
+ * - startPosition: 初始窗口位置,默认 end,即展示最新一段数据
1350
+ * - startIndex: 指定窗口起始索引;传入合法数字时优先级高于 startPosition
1351
+ * - showSlider / inside: 分别控制底部滚动条与图表内部滚轮/触控滚动
1352
+ */
1353
+ xAxisScroll: {
1354
+ type: Object,
1355
+ "default": function _default() {
1356
+ return {};
1357
+ }
1358
+ },
1251
1359
  /**
1252
1360
  * 图表 loading 状态。
1253
1361
  * 由 BaseChart 统一接管组件层遮罩式 loading UI。
@@ -1296,13 +1404,14 @@ var script = {
1296
1404
  preset: this.preset,
1297
1405
  barWidth: this.barWidth,
1298
1406
  barGap: this.barGap,
1407
+ xAxisScroll: this.xAxisScroll,
1299
1408
  customOption: this.customOption
1300
1409
  });
1301
1410
  }
1302
1411
  }
1303
1412
  };
1304
1413
 
1305
- var css_248z = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
1414
+ var css_248z = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
1306
1415
  styleInject(css_248z);
1307
1416
 
1308
1417
  /* script */
@@ -1336,7 +1445,7 @@ __vue_render__._withStripped = true;
1336
1445
  /* style */
1337
1446
  var __vue_inject_styles__ = undefined;
1338
1447
  /* scoped */
1339
- var __vue_scope_id__ = "data-v-1ad2414e";
1448
+ var __vue_scope_id__ = "data-v-0c9a6292";
1340
1449
  /* module identifier */
1341
1450
  var __vue_module_identifier__ = undefined;
1342
1451
  /* functional template */
package/es/index.js CHANGED
@@ -1,17 +1,19 @@
1
1
  import '../theme-chalk/index.css';
2
2
  import { w as withInstall, B as BaseChart } from './with-install-e405b463.js';
3
- import { B as BarLineChart } from './index-017ccf86.js';
4
- import { P as PieChart } from './index-d151eeca.js';
3
+ import { B as BarLineChart } from './index-d01ce220.js';
4
+ import { P as PieChart } from './index-78b6b881.js';
5
+ import { R as RadarChart } from './index-788e473f.js';
5
6
  import 'echarts/core';
6
7
  import 'echarts/charts';
7
8
  import 'echarts/components';
8
9
  import 'echarts/renderers';
9
- import './colors-ca059479.js';
10
+ import './colors-ec0ad9ce.js';
10
11
 
11
12
  withInstall(BaseChart);
12
13
  withInstall(BarLineChart);
13
14
  withInstall(PieChart);
14
- var components = [BaseChart, BarLineChart, PieChart];
15
+ withInstall(RadarChart);
16
+ var components = [BaseChart, BarLineChart, PieChart, RadarChart];
15
17
 
16
18
  // 发布根入口复用组件清单,确保与 src/index.js 行为一致。
17
19
  var install = function install(Vue) {
@@ -23,4 +25,4 @@ var index = {
23
25
  install: install
24
26
  };
25
27
 
26
- export { BarLineChart, BaseChart, PieChart, index as default, install };
28
+ export { BarLineChart, BaseChart, PieChart, RadarChart, index as default, install };
@@ -0,0 +1,6 @@
1
+ import * as echarts from 'echarts/core';
2
+ import { SurfaceChart } from 'echarts-gl/charts';
3
+ import { Grid3DComponent } from 'echarts-gl/components';
4
+
5
+ // PieChart 3D 只需要 surface 序列与 grid3D 坐标系,显式注册到组件库同一个 echarts/core 实例。
6
+ echarts.use([SurfaceChart, Grid3DComponent]);
@@ -1,7 +1,7 @@
1
1
  import '../../theme-chalk/index.css';
2
- import { P as PieChart } from '../index-d151eeca.js';
2
+ import { P as PieChart } from '../index-78b6b881.js';
3
3
  import { w as withInstall } from '../with-install-e405b463.js';
4
- import '../colors-ca059479.js';
4
+ import '../colors-ec0ad9ce.js';
5
5
  import 'echarts/core';
6
6
  import 'echarts/charts';
7
7
  import 'echarts/components';
@@ -0,0 +1,13 @@
1
+ import '../../theme-chalk/index.css';
2
+ import { R as RadarChart } from '../index-788e473f.js';
3
+ import { w as withInstall } from '../with-install-e405b463.js';
4
+ import 'echarts/core';
5
+ import 'echarts/charts';
6
+ import 'echarts/components';
7
+ import 'echarts/renderers';
8
+ import '../colors-ec0ad9ce.js';
9
+
10
+ var RadarChartComponent = withInstall(RadarChart);
11
+ var install = RadarChartComponent.install;
12
+
13
+ export { RadarChartComponent as RadarChart, RadarChartComponent as default, install };
@@ -3,13 +3,13 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  require('../../theme-chalk/index.css');
6
- var index = require('../index-b9e0c40b.js');
6
+ var index = require('../index-cc49894a.js');
7
7
  var withInstall = require('../with-install-4304a8ea.js');
8
8
  require('echarts/core');
9
9
  require('echarts/charts');
10
10
  require('echarts/components');
11
11
  require('echarts/renderers');
12
- require('../colors-55265c91.js');
12
+ require('../colors-19a7242d.js');
13
13
 
14
14
  var BarLineChartComponent = withInstall.withInstall(index.BarLineChart);
15
15
  var install = BarLineChartComponent.install;
@@ -64,6 +64,15 @@ function _toPropertyKey(t) {
64
64
  var i = _toPrimitive(t, "string");
65
65
  return "symbol" == typeof i ? i : i + "";
66
66
  }
67
+ function _typeof(o) {
68
+ "@babel/helpers - typeof";
69
+
70
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
71
+ return typeof o;
72
+ } : function (o) {
73
+ return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
74
+ }, _typeof(o);
75
+ }
67
76
  function _unsupportedIterableToArray(r, a) {
68
77
  if (r) {
69
78
  if ("string" == typeof r) return _arrayLikeToArray(r, a);
@@ -117,5 +126,6 @@ var DEFAULT_COLORS = ['#8979ff', '#ff928a', '#3cc3df', '#ffae4c', '#5c7cfa', '#5
117
126
  exports.DEFAULT_COLORS = DEFAULT_COLORS;
118
127
  exports._objectSpread2 = _objectSpread2;
119
128
  exports._toConsumableArray = _toConsumableArray;
129
+ exports._typeof = _typeof;
120
130
  exports.isEmptyData = isEmptyData;
121
131
  exports.mergeChartOption = mergeChartOption;