@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,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var colors = require('./colors-55265c91.js');
3
+ var colors = require('./colors-19a7242d.js');
4
4
  var echarts = require('echarts/core');
5
5
  var charts = require('echarts/charts');
6
6
  var components = require('echarts/components');
@@ -90,10 +90,11 @@ var PIE_HEIGHT_MODE = {
90
90
  VALUE: 'value'
91
91
  };
92
92
  var DEFAULT_HEIGHT_RANGE = {
93
- min: 20,
94
- max: 80
93
+ min: 10,
94
+ max: 25
95
95
  };
96
- var DEFAULT_3D_VIEW_ALPHA = 28;
96
+ var DEFAULT_3D_VIEW_DISTANCE = 120;
97
+ var DEFAULT_3D_VIEW_ALPHA = 55;
97
98
  var DEFAULT_INTERNAL_DIAMETER_RATIO = 0.6;
98
99
  var DEFAULT_ROSE_RADIUS_RANGE = [0.75, 1.15];
99
100
  var DEFAULT_LABEL_OPTIONS = {
@@ -111,6 +112,17 @@ var DEFAULT_LABEL_OPTIONS = {
111
112
  verticalGap: 8,
112
113
  radialOffset: 0.12
113
114
  };
115
+ var DEFAULT_TOOLTIP_STYLE = {
116
+ backgroundColor: '#fff',
117
+ borderColor: 'transparent',
118
+ borderWidth: 0,
119
+ padding: [8, 12],
120
+ textStyle: {
121
+ color: '#333',
122
+ fontSize: 12
123
+ },
124
+ extraCssText: 'box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); border-radius: 4px;'
125
+ };
114
126
 
115
127
  /**
116
128
  * 将输入值转为安全数字。
@@ -217,6 +229,9 @@ function buildPieChartData(data) {
217
229
  function replaceLabelTemplate(template, params) {
218
230
  return template.replace(/\{b\}/g, params.name).replace(/\{c\}/g, params.value).replace(/\{d\}/g, params.percent);
219
231
  }
232
+ function escapeTooltipHtml(value) {
233
+ return String(value).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
234
+ }
220
235
  function formatPieLabelText(formatter, params) {
221
236
  if (typeof formatter === 'function') {
222
237
  return formatter(params);
@@ -226,29 +241,65 @@ function formatPieLabelText(formatter, params) {
226
241
  }
227
242
  return "".concat(params.name, "\n").concat(params.percent, "%");
228
243
  }
244
+ function createFallbackTooltipMarker(color) {
245
+ var markerColor = escapeTooltipHtml(color || '#6B98F8');
246
+ return "<span style=\"display:inline-block;margin-right:4px;border-radius:50%;width:10px;height:10px;background-color:".concat(markerColor, ";\"></span>");
247
+ }
248
+ function formatPieTooltipContent(_ref) {
249
+ var marker = _ref.marker,
250
+ name = _ref.name,
251
+ value = _ref.value,
252
+ color = _ref.color;
253
+ var safeMarker = marker || createFallbackTooltipMarker(color);
254
+ return "".concat(safeMarker).concat(escapeTooltipHtml(name), ":").concat(escapeTooltipHtml(value));
255
+ }
256
+
257
+ /**
258
+ * 创建饼图统一 hover tooltip 样式。
259
+ * 默认呈现为白底阴影卡片,内容为“彩色圆点 + 名称:值”,贴近业务看板常见展示形态。
260
+ */
261
+ function createPieTooltipOption(formatter) {
262
+ return colors._objectSpread2(colors._objectSpread2({}, DEFAULT_TOOLTIP_STYLE), {}, {
263
+ formatter: formatter
264
+ });
265
+ }
266
+ function formatPie2DTooltip() {
267
+ var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
268
+ return formatPieTooltipContent({
269
+ marker: params.marker,
270
+ name: params.name === undefined ? '' : params.name,
271
+ value: params.value === undefined ? '' : params.value,
272
+ color: params.color
273
+ });
274
+ }
229
275
 
230
276
  /**
231
277
  * 格式化 3D 饼图默认 tooltip 文案。
232
278
  * surface 系列 hover 时拿到的 `params.value` 实际是参数方程采样值,
233
279
  * 不能直接当业务值展示,因此统一回退到扇区自身的 `pieData`。
234
280
  */
235
- function formatPieTooltipText(name, value, percent) {
236
- return "".concat(name, ": ").concat(value, " (").concat(percent, "%)");
281
+ function formatPie3DTooltip(params, pieData) {
282
+ return formatPieTooltipContent({
283
+ marker: params && params.marker,
284
+ name: pieData && pieData.name !== undefined ? pieData.name : '',
285
+ value: pieData && pieData.value !== undefined ? pieData.value : 0,
286
+ color: pieData && pieData.itemStyle && pieData.itemStyle.color
287
+ });
237
288
  }
238
289
 
239
290
  /**
240
291
  * 为单个 3D 扇区生成专用 tooltip。
241
292
  * 这样即使鼠标落在 surface 网格采样点上,展示的仍然是业务名称、原始值与百分比。
242
293
  */
243
- function createPie3DTooltip(pieData, totalValue) {
294
+ function createPie3DTooltip(pieData) {
244
295
  var value = toNumber(pieData && pieData.value, 0);
245
- var percent = totalValue > 0 ? Number((value / totalValue * 100).toFixed(2)) : 0;
246
296
  var name = pieData && pieData.name !== undefined ? pieData.name : '';
247
- return {
248
- formatter: function formatter() {
249
- return formatPieTooltipText(name, value, percent);
250
- }
251
- };
297
+ return createPieTooltipOption(function (params) {
298
+ return formatPie3DTooltip(params, colors._objectSpread2(colors._objectSpread2({}, pieData), {}, {
299
+ name: name,
300
+ value: value
301
+ }));
302
+ });
252
303
  }
253
304
  function multiplyMat4Vec4(matrix, vector) {
254
305
  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]];
@@ -457,11 +508,9 @@ function createHeightValues(values, mode, minHeight, maxHeight) {
457
508
  }
458
509
  return mapValueToRange(values, safeMinHeight, safeMaxHeight);
459
510
  }
460
- function createAdaptiveViewControl(showLabelLine, maxHeight) {
461
- var baseDistance = showLabelLine ? 175 : 180;
462
- var extraDistance = Math.max(0, maxHeight - 200) * 0.18;
511
+ function createDefaultViewControl() {
463
512
  return {
464
- distance: baseDistance + extraDistance,
513
+ distance: DEFAULT_3D_VIEW_DISTANCE,
465
514
  alpha: DEFAULT_3D_VIEW_ALPHA
466
515
  };
467
516
  }
@@ -598,9 +647,6 @@ function buildPie3DSeries(pieData) {
598
647
  var valueList = renderPieData.map(function (item) {
599
648
  return Math.max(0, toNumber(item.value, 0));
600
649
  });
601
- var totalValue = valueList.reduce(function (sum, value) {
602
- return sum + value;
603
- }, 0);
604
650
  var angleValueList = getAngleValueList(valueList);
605
651
  var totalAngleValue = angleValueList.reduce(function (sum, value) {
606
652
  return sum + value;
@@ -634,7 +680,7 @@ function buildPie3DSeries(pieData) {
634
680
  selected: false,
635
681
  hovered: false
636
682
  },
637
- tooltip: createPie3DTooltip(item, totalValue),
683
+ tooltip: createPie3DTooltip(item),
638
684
  itemStyle: colors._objectSpread2({}, item.itemStyle),
639
685
  parametricEquation: getParametricEquation(startRatio, endRatio, false, false, geometry)
640
686
  };
@@ -729,7 +775,7 @@ function createPie3DOption(input, variant) {
729
775
  hideZeroValueSlices: input.hideZeroValueSlices !== false
730
776
  };
731
777
  var pie3D = buildPie3DSeries(data, chartConfig);
732
- var viewControl = createAdaptiveViewControl(chartConfig.showLabelLine, safeMaxHeight);
778
+ var viewControl = createDefaultViewControl();
733
779
  return {
734
780
  xAxis3D: {
735
781
  min: -pie3D.axisLimit,
@@ -916,10 +962,9 @@ function buildPieOption() {
916
962
  });
917
963
  var baseOption = {
918
964
  color: colors.DEFAULT_COLORS,
919
- tooltip: {
920
- trigger: 'item',
921
- formatter: '{b}: {c} ({d}%)'
922
- },
965
+ tooltip: colors._objectSpread2({
966
+ trigger: 'item'
967
+ }, createPieTooltipOption(formatPie2DTooltip)),
923
968
  legend: {
924
969
  data: normalizedData.map(function (item) {
925
970
  return item.name;
@@ -948,33 +993,26 @@ function buildPieOption() {
948
993
  return colors.mergeChartOption(colors.mergeChartOption(baseOption, presetOption, variantOption), customOption);
949
994
  }
950
995
 
951
- var runtimePromise = null;
952
- var ECHARTS_GL_PACKAGE_NAME = 'echarts-gl';
953
- var MISSING_RUNTIME_MESSAGE = '使用 PieChart 3D 能力需要安装 echarts-gl,请执行 npm install echarts-gl。';
954
- var createMissingRuntimeError = function createMissingRuntimeError(error) {
955
- var runtimeError = new Error(MISSING_RUNTIME_MESSAGE);
956
- runtimeError.cause = error;
957
- return runtimeError;
958
- };
959
- var importRuntime = function importRuntime() {
960
- var dynamicImport = new Function('packageName', 'return import(packageName)');
961
- return dynamicImport(ECHARTS_GL_PACKAGE_NAME);
996
+ var SURFACE_SERIES_TYPE = 'series.surface';
997
+ var MISSING_RUNTIME_MESSAGE = "使用 PieChart 3D 能力前,请先在业务页面中执行 import '@xq-labs/data-ui-v2/pie-chart/3d-runtime'。";
998
+ var hasSurfaceSeriesRuntime = function hasSurfaceSeriesRuntime() {
999
+ return echarts.SeriesModel && (typeof echarts.SeriesModel.getClass === 'function' && !!echarts.SeriesModel.getClass('series', 'surface') || typeof echarts.SeriesModel.getClassesByMainType === 'function' && echarts.SeriesModel.getClassesByMainType('series').some(function (seriesClass) {
1000
+ return seriesClass && seriesClass.type === SURFACE_SERIES_TYPE;
1001
+ }));
962
1002
  };
963
1003
 
964
1004
  /**
965
- * 按需加载 echarts-gl 运行时。
1005
+ * 检测 PieChart 3D 运行时是否已经由业务项目接入。
966
1006
  *
967
- * 这里不能在模块顶层静态加载 echarts-gl,否则只使用 2D 饼图的业务方也会被迫安装。
968
- * 加载结果会被缓存,避免同一个页面内多个 3D 饼图重复触发运行时加载。
1007
+ * 方案 B 修订版下,组件库不再负责动态加载 `echarts-gl`,
1008
+ * 而是要求业务项目在使用 3D PieChart 的页面中显式执行桥接入口:
1009
+ * `import '@xq-labs/data-ui-v2/pie-chart/3d-runtime'`
969
1010
  */
970
1011
  function ensureEchartsGlRuntime() {
971
- if (!runtimePromise) {
972
- runtimePromise = importRuntime()["catch"](function (error) {
973
- runtimePromise = null;
974
- throw createMissingRuntimeError(error);
975
- });
1012
+ if (hasSurfaceSeriesRuntime()) {
1013
+ return Promise.resolve();
976
1014
  }
977
- return runtimePromise;
1015
+ return Promise.reject(new Error(MISSING_RUNTIME_MESSAGE));
978
1016
  }
979
1017
 
980
1018
  echarts__namespace.use([charts.PieChart, components.TooltipComponent, components.LegendComponent, components.GridComponent, components.TitleComponent, components.GraphicComponent, renderers.CanvasRenderer]);
@@ -1049,7 +1087,7 @@ var script = {
1049
1087
  */
1050
1088
  minHeight: {
1051
1089
  type: Number,
1052
- "default": 20
1090
+ "default": 10
1053
1091
  },
1054
1092
  /**
1055
1093
  * 3D 模式下的最大扇区高度。
@@ -1057,7 +1095,7 @@ var script = {
1057
1095
  */
1058
1096
  maxHeight: {
1059
1097
  type: Number,
1060
- "default": 80
1098
+ "default": 25
1061
1099
  },
1062
1100
  /**
1063
1101
  * 环图内径比例。
@@ -1160,13 +1198,13 @@ var script = {
1160
1198
  },
1161
1199
  /**
1162
1200
  * 判断当前是否进入 3D 饼图能力。
1163
- * 只有 3D 才需要加载 echarts-gl2D 场景不应触发任何 3D 运行时依赖。
1201
+ * 只有 3D 才需要 echarts-gl 桥接入口,2D 场景不应触发任何 3D 运行时依赖。
1164
1202
  */
1165
1203
  is3D: function is3D() {
1166
1204
  return this.dimension === '3d';
1167
1205
  },
1168
1206
  /**
1169
- * 标识 echarts-gl 是否已经加载完成。
1207
+ * 标识 echarts-gl 运行时是否已经注册完成。
1170
1208
  * 3D option 只有在运行时就绪后才会生成 surface 序列。
1171
1209
  */
1172
1210
  isEchartsGlReady: function isEchartsGlReady() {
@@ -1174,14 +1212,14 @@ var script = {
1174
1212
  },
1175
1213
  /**
1176
1214
  * 汇总外部 loading 与 3D 运行时加载状态。
1177
- * 这样 3D 首次加载 echarts-gl 时,底层 BaseChart 能保持 loading 态。
1215
+ * 这样 3D 首次检测运行时期间,底层 BaseChart 能保持 loading 态。
1178
1216
  */
1179
1217
  chartLoading: function chartLoading() {
1180
1218
  return this.loading || this.is3D && this.echartsGlStatus === 'loading';
1181
1219
  },
1182
1220
  /**
1183
1221
  * 汇总数据空态与 3D 运行时失败状态。
1184
- * 缺少 echarts-gl 时不让 BaseChart 继续渲染空 surface option。
1222
+ * 缺少 3D 桥接运行时时不让 BaseChart 继续渲染空 surface option。
1185
1223
  */
1186
1224
  chartEmpty: function chartEmpty() {
1187
1225
  return this.isEmpty || this.is3D && this.echartsGlStatus === 'failed';
@@ -1197,7 +1235,7 @@ var script = {
1197
1235
  if (this.is3D && this.echartsGlStatus === 'failed') {
1198
1236
  return {
1199
1237
  empty: colors._objectSpread2(colors._objectSpread2({}, emptyConfig), {}, {
1200
- text: this.echartsGlErrorMessage || '使用 3D 饼图需要安装 echarts-gl'
1238
+ text: this.echartsGlErrorMessage || "使用 PieChart 3D 能力前,请先在业务页面中执行 import '@xq-labs/data-ui-v2/pie-chart/3d-runtime'。"
1201
1239
  }),
1202
1240
  loading: colors._objectSpread2({}, loadingConfig)
1203
1241
  };
@@ -1237,7 +1275,7 @@ var script = {
1237
1275
  watch: {
1238
1276
  /**
1239
1277
  * dimension 是 2D/3D 分发的公开开关。
1240
- * 只有切到 3D 时才按需加载 echarts-gl,避免 2D 使用方被迫安装 3D 运行时。
1278
+ * 只有切到 3D 时才检测 3D 运行时,避免 2D 使用方被迫安装 3D 运行时。
1241
1279
  */
1242
1280
  dimension: {
1243
1281
  immediate: true,
@@ -1269,7 +1307,7 @@ var script = {
1269
1307
  this.$emit('ready', chart);
1270
1308
  },
1271
1309
  /**
1272
- * 在真正进入 3D 能力时按需加载 echarts-gl
1310
+ * 在真正进入 3D 能力时检测 echarts-gl 桥接入口是否已经注册。
1273
1311
  *
1274
1312
  * 返回 Promise 是为了让单测和后续业务扩展能准确等待状态变化;
1275
1313
  * 2D、已就绪、加载中三种场景会直接返回 resolved Promise。
@@ -1285,7 +1323,7 @@ var script = {
1285
1323
  _this.echartsGlStatus = 'ready';
1286
1324
  })["catch"](function (error) {
1287
1325
  _this.echartsGlStatus = 'failed';
1288
- _this.echartsGlErrorMessage = error && error.message ? error.message : '使用 3D 饼图需要安装 echarts-gl';
1326
+ _this.echartsGlErrorMessage = error && error.message ? error.message : "使用 PieChart 3D 能力前,请先在业务页面中执行 import '@xq-labs/data-ui-v2/pie-chart/3d-runtime'。";
1289
1327
  _this.$emit('runtime-error', error);
1290
1328
  });
1291
1329
  },
@@ -1323,7 +1361,7 @@ var script = {
1323
1361
  }
1324
1362
  };
1325
1363
 
1326
- 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";
1364
+ 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";
1327
1365
  withInstall.styleInject(css_248z);
1328
1366
 
1329
1367
  /* script */
@@ -1355,7 +1393,7 @@ __vue_render__._withStripped = true;
1355
1393
  /* style */
1356
1394
  var __vue_inject_styles__ = undefined;
1357
1395
  /* scoped */
1358
- var __vue_scope_id__ = "data-v-19bfc774";
1396
+ var __vue_scope_id__ = "data-v-7f129cbd";
1359
1397
  /* module identifier */
1360
1398
  var __vue_module_identifier__ = undefined;
1361
1399
  /* functional template */
@@ -5,7 +5,7 @@ var charts = require('echarts/charts');
5
5
  var components = require('echarts/components');
6
6
  var renderers = require('echarts/renderers');
7
7
  var withInstall = require('./with-install-4304a8ea.js');
8
- var colors = require('./colors-55265c91.js');
8
+ var colors = require('./colors-19a7242d.js');
9
9
 
10
10
  function _interopNamespaceDefault(e) {
11
11
  var n = Object.create(null);
@@ -1079,6 +1079,8 @@ function createCylinderBarLineOption(normalizedInput) {
1079
1079
  }
1080
1080
 
1081
1081
  var DEFAULT_VARIANT = 'flat';
1082
+ var DEFAULT_X_AXIS_SCROLL_VISIBLE_COUNT = 8;
1083
+ var DEFAULT_X_AXIS_SCROLL_GRID_BOTTOM = 56;
1082
1084
  var BAR_LINE_PUBLIC_VARIANTS = ['flat', 'cylinder', 'cube'];
1083
1085
 
1084
1086
  // 公开 variant 能力在此处收口:只允许 flat / cylinder / cube。
@@ -1124,6 +1126,93 @@ function createBaseOption(normalizedInput) {
1124
1126
  }
1125
1127
  };
1126
1128
  }
1129
+ function isValidNumber(value) {
1130
+ return Number.isFinite(Number(value));
1131
+ }
1132
+ function normalizePositiveInteger(value, fallback) {
1133
+ var normalizedValue = Number(value);
1134
+ if (!Number.isFinite(normalizedValue) || normalizedValue <= 0) {
1135
+ return fallback;
1136
+ }
1137
+ return Math.floor(normalizedValue);
1138
+ }
1139
+ function normalizeStartIndex(startIndex) {
1140
+ if (!isValidNumber(startIndex)) {
1141
+ return null;
1142
+ }
1143
+ var normalizedStartIndex = Math.floor(Number(startIndex));
1144
+ return normalizedStartIndex >= 0 ? normalizedStartIndex : null;
1145
+ }
1146
+ function toPercent(value, total) {
1147
+ return Number((value / total * 100).toFixed(2));
1148
+ }
1149
+
1150
+ /**
1151
+ * 归一化横轴滚动配置。
1152
+ * 该配置只服务 X 轴类目过多的场景,不扩展 Y 轴滚动,避免 API 语义变复杂。
1153
+ */
1154
+ function normalizeXAxisScrollConfig() {
1155
+ var xAxisScroll = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
1156
+ var scrollConfig = xAxisScroll && colors._typeof(xAxisScroll) === 'object' ? xAxisScroll : {};
1157
+ return {
1158
+ enabled: scrollConfig.enabled === true,
1159
+ visibleCount: normalizePositiveInteger(scrollConfig.visibleCount, DEFAULT_X_AXIS_SCROLL_VISIBLE_COUNT),
1160
+ startPosition: scrollConfig.startPosition === 'start' ? 'start' : 'end',
1161
+ startIndex: normalizeStartIndex(scrollConfig.startIndex),
1162
+ showSlider: scrollConfig.showSlider !== false,
1163
+ inside: scrollConfig.inside !== false
1164
+ };
1165
+ }
1166
+
1167
+ /**
1168
+ * 根据横轴类目数量生成 ECharts dataZoom。
1169
+ * 默认从末尾向前取 `visibleCount` 个类目,满足“最新数据优先展示”的看板诉求。
1170
+ */
1171
+ function createXAxisScrollOption() {
1172
+ var categories = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
1173
+ var xAxisScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
1174
+ var scrollConfig = normalizeXAxisScrollConfig(xAxisScroll);
1175
+ var totalCount = Array.isArray(categories) ? categories.length : 0;
1176
+ if (!scrollConfig.enabled || totalCount <= scrollConfig.visibleCount) {
1177
+ return {};
1178
+ }
1179
+ var windowSize = Math.min(scrollConfig.visibleCount, totalCount);
1180
+ var maxStartIndex = totalCount - windowSize;
1181
+ var resolvedStartIndex = scrollConfig.startIndex !== null ? Math.min(scrollConfig.startIndex, maxStartIndex) : scrollConfig.startPosition === 'start' ? 0 : maxStartIndex;
1182
+ var start = toPercent(resolvedStartIndex, totalCount);
1183
+ var end = toPercent(resolvedStartIndex + windowSize, totalCount);
1184
+ var dataZoom = [];
1185
+ if (scrollConfig.showSlider) {
1186
+ dataZoom.push({
1187
+ type: 'slider',
1188
+ xAxisIndex: 0,
1189
+ start: start,
1190
+ end: end,
1191
+ height: 14,
1192
+ bottom: 8,
1193
+ brushSelect: false
1194
+ });
1195
+ }
1196
+ if (scrollConfig.inside) {
1197
+ dataZoom.push({
1198
+ type: 'inside',
1199
+ xAxisIndex: 0,
1200
+ start: start,
1201
+ end: end,
1202
+ zoomLock: true
1203
+ });
1204
+ }
1205
+ if (dataZoom.length === 0) {
1206
+ return {};
1207
+ }
1208
+ return colors._objectSpread2(colors._objectSpread2({}, scrollConfig.showSlider ? {
1209
+ grid: {
1210
+ bottom: DEFAULT_X_AXIS_SCROLL_GRID_BOTTOM
1211
+ }
1212
+ } : {}), {}, {
1213
+ dataZoom: dataZoom
1214
+ });
1215
+ }
1127
1216
 
1128
1217
  /**
1129
1218
  * 构建 `BarLineChart` 最终 option。
@@ -1131,7 +1220,8 @@ function createBaseOption(normalizedInput) {
1131
1220
  * 1. 输入归一化
1132
1221
  * 2. preset 合并
1133
1222
  * 3. 变体分发
1134
- * 4. customOption 覆盖
1223
+ * 4. X 轴滚动配置合并
1224
+ * 5. customOption 覆盖
1135
1225
  */
1136
1226
  function buildBarLineOption() {
1137
1227
  var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
@@ -1144,6 +1234,7 @@ function buildBarLineOption() {
1144
1234
  variant = _ref$variant === void 0 ? 'flat' : _ref$variant,
1145
1235
  barWidth = _ref.barWidth,
1146
1236
  barGap = _ref.barGap,
1237
+ xAxisScroll = _ref.xAxisScroll,
1147
1238
  customOption = _ref.customOption;
1148
1239
  var normalizedInput = normalizeBarLineInput({
1149
1240
  data: data,
@@ -1159,7 +1250,8 @@ function buildBarLineOption() {
1159
1250
  barWidth: barWidth,
1160
1251
  barGap: barGap
1161
1252
  }));
1162
- return colors.mergeChartOption(colors.mergeChartOption(baseOption, presetOption, variantOption), customOption);
1253
+ var xAxisScrollOption = createXAxisScrollOption(normalizedInput.categories, xAxisScroll);
1254
+ return colors.mergeChartOption(colors.mergeChartOption(colors.mergeChartOption(baseOption, presetOption, variantOption), xAxisScrollOption), customOption);
1163
1255
  }
1164
1256
 
1165
1257
  //
@@ -1181,7 +1273,7 @@ function buildBarLineOption() {
1181
1273
  * 这里显式注册柱图、折线图、自定义系列以及笛卡尔坐标系常用组件,
1182
1274
  * 否则运行时虽然能生成 option,但对应主类型不会真正参与渲染。
1183
1275
  */
1184
- echarts__namespace.use([charts.BarChart, charts.LineChart, charts.CustomChart, components.TooltipComponent, components.LegendComponent, components.GridComponent, components.TitleComponent, renderers.CanvasRenderer]);
1276
+ echarts__namespace.use([charts.BarChart, charts.LineChart, charts.CustomChart, components.TooltipComponent, components.LegendComponent, components.GridComponent, components.TitleComponent, components.DataZoomComponent, renderers.CanvasRenderer]);
1185
1277
  var script = {
1186
1278
  name: 'BarLineChart',
1187
1279
  components: {
@@ -1268,6 +1360,22 @@ var script = {
1268
1360
  return {};
1269
1361
  }
1270
1362
  },
1363
+ /**
1364
+ * X 轴类目滚动配置。
1365
+ * 仅控制横轴,不扩展 Y 轴;适合月份、日期、地区等类目数量较多的看板场景。
1366
+ * 常用字段:
1367
+ * - enabled: 是否开启 X 轴滚动
1368
+ * - visibleCount: 初始窗口内展示的类目数量,默认按 8 个处理
1369
+ * - startPosition: 初始窗口位置,默认 end,即展示最新一段数据
1370
+ * - startIndex: 指定窗口起始索引;传入合法数字时优先级高于 startPosition
1371
+ * - showSlider / inside: 分别控制底部滚动条与图表内部滚轮/触控滚动
1372
+ */
1373
+ xAxisScroll: {
1374
+ type: Object,
1375
+ "default": function _default() {
1376
+ return {};
1377
+ }
1378
+ },
1271
1379
  /**
1272
1380
  * 图表 loading 状态。
1273
1381
  * 由 BaseChart 统一接管组件层遮罩式 loading UI。
@@ -1316,13 +1424,14 @@ var script = {
1316
1424
  preset: this.preset,
1317
1425
  barWidth: this.barWidth,
1318
1426
  barGap: this.barGap,
1427
+ xAxisScroll: this.xAxisScroll,
1319
1428
  customOption: this.customOption
1320
1429
  });
1321
1430
  }
1322
1431
  }
1323
1432
  };
1324
1433
 
1325
- 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";
1434
+ 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";
1326
1435
  withInstall.styleInject(css_248z);
1327
1436
 
1328
1437
  /* script */
@@ -1356,7 +1465,7 @@ __vue_render__._withStripped = true;
1356
1465
  /* style */
1357
1466
  var __vue_inject_styles__ = undefined;
1358
1467
  /* scoped */
1359
- var __vue_scope_id__ = "data-v-1ad2414e";
1468
+ var __vue_scope_id__ = "data-v-0c9a6292";
1360
1469
  /* module identifier */
1361
1470
  var __vue_module_identifier__ = undefined;
1362
1471
  /* functional template */
package/lib/index.js CHANGED
@@ -4,18 +4,20 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  require('../theme-chalk/index.css');
6
6
  var withInstall = require('./with-install-4304a8ea.js');
7
- var index$1 = require('./index-b9e0c40b.js');
8
- var index$2 = require('./index-7abf647e.js');
7
+ var index$1 = require('./index-cc49894a.js');
8
+ var index$2 = require('./index-a0ecafa1.js');
9
+ var index$3 = require('./index-6039f724.js');
9
10
  require('echarts/core');
10
11
  require('echarts/charts');
11
12
  require('echarts/components');
12
13
  require('echarts/renderers');
13
- require('./colors-55265c91.js');
14
+ require('./colors-19a7242d.js');
14
15
 
15
16
  withInstall.withInstall(withInstall.BaseChart);
16
17
  withInstall.withInstall(index$1.BarLineChart);
17
18
  withInstall.withInstall(index$2.PieChart);
18
- var components = [withInstall.BaseChart, index$1.BarLineChart, index$2.PieChart];
19
+ withInstall.withInstall(index$3.RadarChart);
20
+ var components = [withInstall.BaseChart, index$1.BarLineChart, index$2.PieChart, index$3.RadarChart];
19
21
 
20
22
  // 发布根入口复用组件清单,确保与 src/index.js 行为一致。
21
23
  var install = function install(Vue) {
@@ -30,5 +32,6 @@ var index = {
30
32
  exports.BaseChart = withInstall.BaseChart;
31
33
  exports.BarLineChart = index$1.BarLineChart;
32
34
  exports.PieChart = index$2.PieChart;
35
+ exports.RadarChart = index$3.RadarChart;
33
36
  exports.default = index;
34
37
  exports.install = install;
@@ -0,0 +1,27 @@
1
+ 'use strict';
2
+
3
+ var echarts = require('echarts/core');
4
+ var charts = require('echarts-gl/charts');
5
+ var components = require('echarts-gl/components');
6
+
7
+ function _interopNamespaceDefault(e) {
8
+ var n = Object.create(null);
9
+ if (e) {
10
+ Object.keys(e).forEach(function (k) {
11
+ if (k !== 'default') {
12
+ var d = Object.getOwnPropertyDescriptor(e, k);
13
+ Object.defineProperty(n, k, d.get ? d : {
14
+ enumerable: true,
15
+ get: function () { return e[k]; }
16
+ });
17
+ }
18
+ });
19
+ }
20
+ n.default = e;
21
+ return Object.freeze(n);
22
+ }
23
+
24
+ var echarts__namespace = /*#__PURE__*/_interopNamespaceDefault(echarts);
25
+
26
+ // PieChart 3D 只需要 surface 序列与 grid3D 坐标系,显式注册到组件库同一个 echarts/core 实例。
27
+ echarts__namespace.use([charts.SurfaceChart, components.Grid3DComponent]);
@@ -3,9 +3,9 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  require('../../theme-chalk/index.css');
6
- var index = require('../index-7abf647e.js');
6
+ var index = require('../index-a0ecafa1.js');
7
7
  var withInstall = require('../with-install-4304a8ea.js');
8
- require('../colors-55265c91.js');
8
+ require('../colors-19a7242d.js');
9
9
  require('echarts/core');
10
10
  require('echarts/charts');
11
11
  require('echarts/components');
@@ -0,0 +1,19 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ require('../../theme-chalk/index.css');
6
+ var index = require('../index-6039f724.js');
7
+ var withInstall = require('../with-install-4304a8ea.js');
8
+ require('echarts/core');
9
+ require('echarts/charts');
10
+ require('echarts/components');
11
+ require('echarts/renderers');
12
+ require('../colors-19a7242d.js');
13
+
14
+ var RadarChartComponent = withInstall.withInstall(index.RadarChart);
15
+ var install = RadarChartComponent.install;
16
+
17
+ exports.RadarChart = RadarChartComponent;
18
+ exports.default = RadarChartComponent;
19
+ exports.install = install;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xq-labs/data-ui-v2",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "main": "lib/index.js",
5
5
  "module": "es/index.js",
6
6
  "style": "theme-chalk/index.css",
@@ -10,6 +10,11 @@
10
10
  "import": "./es/index.js",
11
11
  "default": "./lib/index.js"
12
12
  },
13
+ "./pie-chart/3d-runtime": {
14
+ "require": "./lib/pie-chart/3d-runtime.js",
15
+ "import": "./pie-chart/3d-runtime.js",
16
+ "default": "./pie-chart/3d-runtime.js"
17
+ },
13
18
  "./lib/*": "./lib/*/index.js",
14
19
  "./es/*": "./es/*/index.js",
15
20
  "./theme-chalk/index.css": "./theme-chalk/index.css",
@@ -21,7 +26,11 @@
21
26
  },
22
27
  "sideEffects": [
23
28
  "*.css",
24
- "theme-chalk/index.css"
29
+ "theme-chalk/index.css",
30
+ "pie-chart/3d-runtime.js",
31
+ "src/entries/pie-chart-3d-runtime.js",
32
+ "lib/pie-chart/3d-runtime.js",
33
+ "es/pie-chart/3d-runtime.js"
25
34
  ],
26
35
  "engines": {
27
36
  "node": ">=14 <15"
@@ -39,6 +48,7 @@
39
48
  "files": [
40
49
  "lib",
41
50
  "es",
51
+ "pie-chart",
42
52
  "theme-chalk",
43
53
  "docs/api",
44
54
  "docs/examples",
@@ -0,0 +1 @@
1
+ import '../es/pie-chart/3d-runtime.js'