@beppla/tapas-ui 1.4.30 → 1.4.31

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 (39) hide show
  1. package/commonjs/PieChart/BACKWARD_COMPATIBILITY.md +157 -0
  2. package/commonjs/PieChart/BUGFIX_EMPTY_DATA.md +86 -0
  3. package/commonjs/PieChart/GroupedLegend.js +240 -0
  4. package/commonjs/PieChart/GroupedLegend.js.map +1 -0
  5. package/commonjs/PieChart/IMPLEMENTATION_SUMMARY.md +306 -0
  6. package/commonjs/PieChart/NestedPieChart.README.md +421 -0
  7. package/commonjs/PieChart/NestedPieChart.js +567 -0
  8. package/commonjs/PieChart/NestedPieChart.js.map +1 -0
  9. package/commonjs/PieChart/NestedPieChart.types.js +2 -0
  10. package/commonjs/PieChart/NestedPieChart.types.js.map +1 -0
  11. package/commonjs/PieChart/NestedPieChart.utils.js +360 -0
  12. package/commonjs/PieChart/NestedPieChart.utils.js.map +1 -0
  13. package/commonjs/PieChart/index.js +8 -0
  14. package/commonjs/PieChart/index.js.map +1 -1
  15. package/module/PieChart/BACKWARD_COMPATIBILITY.md +157 -0
  16. package/module/PieChart/BUGFIX_EMPTY_DATA.md +86 -0
  17. package/module/PieChart/GroupedLegend.js +234 -0
  18. package/module/PieChart/GroupedLegend.js.map +1 -0
  19. package/module/PieChart/IMPLEMENTATION_SUMMARY.md +306 -0
  20. package/module/PieChart/NestedPieChart.README.md +421 -0
  21. package/module/PieChart/NestedPieChart.js +563 -0
  22. package/module/PieChart/NestedPieChart.js.map +1 -0
  23. package/module/PieChart/NestedPieChart.types.js +2 -0
  24. package/module/PieChart/NestedPieChart.types.js.map +1 -0
  25. package/module/PieChart/NestedPieChart.utils.js +343 -0
  26. package/module/PieChart/NestedPieChart.utils.js.map +1 -0
  27. package/module/PieChart/index.js +1 -0
  28. package/module/PieChart/index.js.map +1 -1
  29. package/package.json +1 -1
  30. package/typescript/PieChart/GroupedLegend.d.ts +26 -0
  31. package/typescript/PieChart/GroupedLegend.d.ts.map +1 -0
  32. package/typescript/PieChart/NestedPieChart.d.ts +12 -0
  33. package/typescript/PieChart/NestedPieChart.d.ts.map +1 -0
  34. package/typescript/PieChart/NestedPieChart.types.d.ts +117 -0
  35. package/typescript/PieChart/NestedPieChart.types.d.ts.map +1 -0
  36. package/typescript/PieChart/NestedPieChart.utils.d.ts +57 -0
  37. package/typescript/PieChart/NestedPieChart.utils.d.ts.map +1 -0
  38. package/typescript/PieChart/index.d.ts +2 -0
  39. package/typescript/PieChart/index.d.ts.map +1 -1
@@ -0,0 +1,360 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.buildLegendGroupData = buildLegendGroupData;
7
+ exports.cleanData = cleanData;
8
+ exports.defaultFormatValue = exports.defaultFormatPercent = void 0;
9
+ exports.flatToTree = flatToTree;
10
+ exports.formatEuro = void 0;
11
+ exports.generateColorMap = generateColorMap;
12
+ exports.generateColorShades = generateColorShades;
13
+ exports.isTreeData = isTreeData;
14
+ exports.processData = processData;
15
+ exports.sortLegendGroups = sortLegendGroups;
16
+ exports.sortLegendItems = sortLegendItems;
17
+ /**
18
+ * NestedPieChart 工具函数
19
+ * 数据处理、配色生成、格式化等
20
+ */
21
+
22
+ /**
23
+ * 判断是否为树形数据
24
+ */
25
+ function isTreeData(data) {
26
+ if (!data || data.length === 0) return false;
27
+ const firstItem = data[0];
28
+ if (!firstItem) return false;
29
+ return 'children' in firstItem || !('groupKey' in firstItem);
30
+ }
31
+
32
+ /**
33
+ * 将扁平数据转换为树形数据
34
+ */
35
+ function flatToTree(flatData) {
36
+ const groupMap = new Map();
37
+ flatData.forEach(item => {
38
+ if (!groupMap.has(item.groupKey)) {
39
+ groupMap.set(item.groupKey, {
40
+ key: item.groupKey,
41
+ label: item.groupLabel,
42
+ children: [],
43
+ metadata: {}
44
+ });
45
+ }
46
+ const group = groupMap.get(item.groupKey);
47
+ group.children.push({
48
+ key: item.key,
49
+ label: item.label,
50
+ value: item.value,
51
+ color: item.color,
52
+ metadata: item.metadata
53
+ });
54
+ });
55
+ return Array.from(groupMap.values());
56
+ }
57
+
58
+ /**
59
+ * 过滤0值并去重合并
60
+ */
61
+ function cleanData(data) {
62
+ const keyMap = new Map();
63
+ data.forEach(node => {
64
+ // 递归处理子节点
65
+ const cleanedChildren = node.children ? cleanData(node.children) : undefined;
66
+
67
+ // 计算节点值(如果有子节点则汇总)
68
+ const nodeValue = cleanedChildren && cleanedChildren.length > 0 ? cleanedChildren.reduce((sum, child) => sum + (child.value || 0), 0) : node.value || 0;
69
+
70
+ // 过滤0值
71
+ if (nodeValue === 0) return;
72
+
73
+ // 去重合并
74
+ if (keyMap.has(node.key)) {
75
+ const existing = keyMap.get(node.key);
76
+ existing.value = (existing.value || 0) + nodeValue;
77
+ if (cleanedChildren) {
78
+ existing.children = [...(existing.children || []), ...cleanedChildren];
79
+ }
80
+ } else {
81
+ keyMap.set(node.key, {
82
+ ...node,
83
+ value: nodeValue,
84
+ children: cleanedChildren
85
+ });
86
+ }
87
+ });
88
+ return Array.from(keyMap.values());
89
+ }
90
+
91
+ /**
92
+ * 颜色工具:RGB <-> HSL 转换
93
+ */
94
+ function rgbToHsl(r, g, b) {
95
+ r /= 255;
96
+ g /= 255;
97
+ b /= 255;
98
+ const max = Math.max(r, g, b);
99
+ const min = Math.min(r, g, b);
100
+ let h = 0,
101
+ s = 0;
102
+ const l = (max + min) / 2;
103
+ if (max !== min) {
104
+ const d = max - min;
105
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
106
+ switch (max) {
107
+ case r:
108
+ h = ((g - b) / d + (g < b ? 6 : 0)) / 6;
109
+ break;
110
+ case g:
111
+ h = ((b - r) / d + 2) / 6;
112
+ break;
113
+ case b:
114
+ h = ((r - g) / d + 4) / 6;
115
+ break;
116
+ }
117
+ }
118
+ return [h * 360, s * 100, l * 100];
119
+ }
120
+ function hslToRgb(h, s, l) {
121
+ h /= 360;
122
+ s /= 100;
123
+ l /= 100;
124
+ let r, g, b;
125
+ if (s === 0) {
126
+ r = g = b = l;
127
+ } else {
128
+ const hue2rgb = (p, q, t) => {
129
+ if (t < 0) t += 1;
130
+ if (t > 1) t -= 1;
131
+ if (t < 1 / 6) return p + (q - p) * 6 * t;
132
+ if (t < 1 / 2) return q;
133
+ if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
134
+ return p;
135
+ };
136
+ const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
137
+ const p = 2 * l - q;
138
+ r = hue2rgb(p, q, h + 1 / 3);
139
+ g = hue2rgb(p, q, h);
140
+ b = hue2rgb(p, q, h - 1 / 3);
141
+ }
142
+ return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
143
+ }
144
+ function hexToRgb(hex) {
145
+ const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
146
+ return result && result[1] && result[2] && result[3] ? [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)] : [0, 0, 0];
147
+ }
148
+ function rgbToHex(r, g, b) {
149
+ return '#' + [r, g, b].map(x => {
150
+ const hex = x.toString(16);
151
+ return hex.length === 1 ? '0' + hex : hex;
152
+ }).join('');
153
+ }
154
+
155
+ /**
156
+ * 生成渐变色系列(同色系,明度/饱和度渐变)
157
+ */
158
+ function generateColorShades(baseColor, count, _minColorDiff = 0.1) {
159
+ if (count <= 1) return [baseColor];
160
+ const [r, g, b] = hexToRgb(baseColor);
161
+ const [h, s, l] = rgbToHsl(r, g, b);
162
+ const colors = [];
163
+
164
+ // 策略:固定色相,调整饱和度和明度
165
+ // 为避免颜色过淡或过深,限制明度范围
166
+ const minL = Math.max(30, l - 25);
167
+ const maxL = Math.min(85, l + 25);
168
+ const lStep = (maxL - minL) / (count - 1);
169
+
170
+ // 同时调整饱和度,避免灰蒙蒙
171
+ const minS = Math.max(40, s - 20);
172
+ const maxS = Math.min(100, s + 20);
173
+ const sStep = (maxS - minS) / (count - 1);
174
+ for (let i = 0; i < count; i++) {
175
+ const newL = minL + lStep * i;
176
+ const newS = minS + sStep * (count - 1 - i); // 反向:越深饱和度越高
177
+ const [newR, newG, newB] = hslToRgb(h, newS, newL);
178
+ colors.push(rgbToHex(newR, newG, newB));
179
+ }
180
+ return colors;
181
+ }
182
+
183
+ /**
184
+ * 生成配色方案
185
+ */
186
+ function generateColorMap(data, strategy, defaultColors) {
187
+ const colorMap = new Map();
188
+ const baseColors = strategy.baseColors || {};
189
+ data.forEach((node, index) => {
190
+ // 大类颜色
191
+ const baseColor = baseColors[node.key] || node.color || defaultColors[index % defaultColors.length];
192
+ if (baseColor) {
193
+ colorMap.set(node.key, baseColor);
194
+ }
195
+
196
+ // 子类渐变色
197
+ if (node.children && node.children.length > 0 && strategy.autoGenerate !== false && baseColor) {
198
+ const childrenColors = generateColorShades(baseColor, node.children.length, strategy.minColorDiff);
199
+ node.children.forEach((child, childIndex) => {
200
+ if (!child.color) {
201
+ const childColor = childrenColors[childIndex];
202
+ if (childColor) {
203
+ colorMap.set(child.key, childColor);
204
+ }
205
+ } else {
206
+ colorMap.set(child.key, child.color);
207
+ }
208
+ });
209
+ }
210
+ });
211
+ return colorMap;
212
+ }
213
+
214
+ /**
215
+ * 处理数据:计算值、百分比、路径等
216
+ */
217
+ function processData(data, colorMap, parentKey, parentPath = [], level = 0) {
218
+ let total = 0;
219
+ const processed = [];
220
+ data.forEach(node => {
221
+ const path = [...parentPath, node.key];
222
+ const nodeValue = node.value || 0;
223
+
224
+ // 递归处理子节点
225
+ let childrenProcessed = [];
226
+ let childrenTotal = 0;
227
+ if (node.children && node.children.length > 0) {
228
+ const result = processData(node.children, colorMap, node.key, path, level + 1);
229
+ childrenProcessed = result.processed;
230
+ childrenTotal = result.total;
231
+ }
232
+
233
+ // 如果有子节点,使用子节点汇总值;否则使用自身值
234
+ const finalValue = childrenTotal > 0 ? childrenTotal : nodeValue;
235
+ if (finalValue > 0) {
236
+ processed.push({
237
+ key: node.key,
238
+ label: node.label,
239
+ value: finalValue,
240
+ percent: 0,
241
+ // 稍后计算
242
+ color: colorMap.get(node.key) || '#999',
243
+ level,
244
+ parentKey,
245
+ path,
246
+ children: childrenProcessed.length > 0 ? childrenProcessed : undefined,
247
+ metadata: node.metadata
248
+ });
249
+ total += finalValue;
250
+ }
251
+ });
252
+
253
+ // 计算百分比
254
+ processed.forEach(item => {
255
+ item.percent = total > 0 ? item.value / total * 100 : 0;
256
+ if (item.children) {
257
+ const childTotal = item.children.reduce((sum, child) => sum + child.value, 0);
258
+ item.children.forEach(child => {
259
+ child.percent = childTotal > 0 ? child.value / childTotal * 100 : 0;
260
+ });
261
+ }
262
+ });
263
+ return {
264
+ processed,
265
+ total
266
+ };
267
+ }
268
+
269
+ /**
270
+ * 排序函数 - 图例项
271
+ */
272
+ function sortLegendItems(data, strategy) {
273
+ const sorted = [...data];
274
+ switch (strategy) {
275
+ case 'value-desc':
276
+ return sorted.sort((a, b) => b.value - a.value);
277
+ case 'value-asc':
278
+ return sorted.sort((a, b) => a.value - b.value);
279
+ case 'label-asc':
280
+ return sorted.sort((a, b) => a.label.localeCompare(b.label));
281
+ case 'label-desc':
282
+ return sorted.sort((a, b) => b.label.localeCompare(a.label));
283
+ default:
284
+ return sorted;
285
+ }
286
+ }
287
+
288
+ /**
289
+ * 排序函数 - 图例分组
290
+ */
291
+ function sortLegendGroups(data, strategy) {
292
+ const sorted = [...data];
293
+ switch (strategy) {
294
+ case 'value-desc':
295
+ return sorted.sort((a, b) => b.groupValue - a.groupValue);
296
+ case 'value-asc':
297
+ return sorted.sort((a, b) => a.groupValue - b.groupValue);
298
+ case 'label-asc':
299
+ return sorted.sort((a, b) => a.groupLabel.localeCompare(b.groupLabel));
300
+ case 'label-desc':
301
+ return sorted.sort((a, b) => b.groupLabel.localeCompare(a.groupLabel));
302
+ default:
303
+ return sorted;
304
+ }
305
+ }
306
+
307
+ /**
308
+ * 构建分组图例数据
309
+ */
310
+ function buildLegendGroupData(processed, groupSortStrategy = 'none', itemSortStrategy = 'none', defaultExpanded = true) {
311
+ const groups = processed.map(parent => {
312
+ const items = parent.children ? parent.children.map(child => ({
313
+ key: child.key,
314
+ label: child.label,
315
+ value: child.value,
316
+ percent: child.percent,
317
+ color: child.color,
318
+ metadata: child.metadata
319
+ })) : [];
320
+ const sortedItems = sortLegendItems(items, itemSortStrategy);
321
+ return {
322
+ groupKey: parent.key,
323
+ groupLabel: parent.label,
324
+ groupValue: parent.value,
325
+ groupPercent: parent.percent,
326
+ groupColor: parent.color,
327
+ items: sortedItems,
328
+ isExpanded: defaultExpanded,
329
+ metadata: parent.metadata
330
+ };
331
+ });
332
+ return sortLegendGroups(groups, groupSortStrategy);
333
+ }
334
+
335
+ /**
336
+ * 默认格式化函数
337
+ */
338
+ const defaultFormatValue = value => {
339
+ return new Intl.NumberFormat('en-US', {
340
+ minimumFractionDigits: 2,
341
+ maximumFractionDigits: 2
342
+ }).format(value);
343
+ };
344
+ exports.defaultFormatValue = defaultFormatValue;
345
+ const defaultFormatPercent = percent => {
346
+ return `${percent.toFixed(1)}%`;
347
+ };
348
+
349
+ /**
350
+ * 默认货币格式化(欧元)
351
+ */
352
+ exports.defaultFormatPercent = defaultFormatPercent;
353
+ const formatEuro = value => {
354
+ return new Intl.NumberFormat('de-DE', {
355
+ style: 'currency',
356
+ currency: 'EUR'
357
+ }).format(value);
358
+ };
359
+ exports.formatEuro = formatEuro;
360
+ //# sourceMappingURL=NestedPieChart.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["isTreeData","data","length","firstItem","flatToTree","flatData","groupMap","Map","forEach","item","has","groupKey","set","key","label","groupLabel","children","metadata","group","get","push","value","color","Array","from","values","cleanData","keyMap","node","cleanedChildren","undefined","nodeValue","reduce","sum","child","existing","rgbToHsl","r","g","b","max","Math","min","h","s","l","d","hslToRgb","hue2rgb","p","q","t","round","hexToRgb","hex","result","exec","parseInt","rgbToHex","map","x","toString","join","generateColorShades","baseColor","count","_minColorDiff","colors","minL","maxL","lStep","minS","maxS","sStep","i","newL","newS","newR","newG","newB","generateColorMap","strategy","defaultColors","colorMap","baseColors","index","autoGenerate","childrenColors","minColorDiff","childIndex","childColor","processData","parentKey","parentPath","level","total","processed","path","childrenProcessed","childrenTotal","finalValue","percent","childTotal","sortLegendItems","sorted","sort","a","localeCompare","sortLegendGroups","groupValue","buildLegendGroupData","groupSortStrategy","itemSortStrategy","defaultExpanded","groups","parent","items","sortedItems","groupPercent","groupColor","isExpanded","defaultFormatValue","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","format","exports","defaultFormatPercent","toFixed","formatEuro","style","currency"],"sourceRoot":"../../../components","sources":["PieChart/NestedPieChart.utils.ts"],"mappings":"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","ignoreList":[]}
@@ -3,6 +3,12 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ Object.defineProperty(exports, "NestedPieChart", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _NestedPieChart.default;
10
+ }
11
+ });
6
12
  Object.defineProperty(exports, "PieChart", {
7
13
  enumerable: true,
8
14
  get: function () {
@@ -10,4 +16,6 @@ Object.defineProperty(exports, "PieChart", {
10
16
  }
11
17
  });
12
18
  var _PieChart = require("./PieChart");
19
+ var _NestedPieChart = _interopRequireDefault(require("./NestedPieChart"));
20
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_PieChart","require"],"sourceRoot":"../../../components","sources":["PieChart/index.tsx"],"mappings":";;;;;;;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA","ignoreList":[]}
1
+ {"version":3,"names":["_PieChart","require","_NestedPieChart","_interopRequireDefault","e","__esModule","default"],"sourceRoot":"../../../components","sources":["PieChart/index.tsx"],"mappings":";;;;;;;;;;;;;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AAGA,IAAAC,eAAA,GAAAC,sBAAA,CAAAF,OAAA;AAA6D,SAAAE,uBAAAC,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA","ignoreList":[]}
@@ -0,0 +1,157 @@
1
+ # 向下兼容性说明
2
+
3
+ ## ✅ 完全向下兼容
4
+
5
+ NestedPieChart 的添加**不会影响**现有的 PieChart 组件及其使用:
6
+
7
+ ### 1. 独立导出
8
+
9
+ ```typescript
10
+ // 现有组件 - 完全不受影响
11
+ export { PieChart } from './PieChart';
12
+ export type { PieChartProps, PieChartData } from './PieChart';
13
+
14
+ // 新增组件 - 独立导出
15
+ export { default as NestedPieChart } from './NestedPieChart';
16
+ export type {
17
+ NestedPieChartProps,
18
+ NestedPieChartNode,
19
+ // ... 其他类型
20
+ } from './NestedPieChart.types';
21
+ ```
22
+
23
+ ### 2. 现有代码无需更改
24
+
25
+ **旧代码继续正常工作:**
26
+ ```tsx
27
+ // 这些代码完全不受影响
28
+ import { PieChart } from '@beppla/tapas-ui';
29
+
30
+ <PieChart
31
+ data={[
32
+ { value: 100, label: 'A' },
33
+ { value: 200, label: 'B' }
34
+ ]}
35
+ />
36
+ ```
37
+
38
+ **新功能可选使用:**
39
+ ```tsx
40
+ // 只有需要多层级时才使用新组件
41
+ import { NestedPieChart } from '@beppla/tapas-ui';
42
+
43
+ <NestedPieChart
44
+ data={nestedData}
45
+ />
46
+ ```
47
+
48
+ ### 3. 文件结构
49
+
50
+ ```
51
+ components/PieChart/
52
+ ├── PieChart.tsx # 原有 - 未修改
53
+ ├── __tests__/PieChart.test.tsx # 原有 - 未修改
54
+ ├── NestedPieChart.tsx # 新增
55
+ ├── NestedPieChart.types.ts # 新增
56
+ ├── NestedPieChart.utils.ts # 新增
57
+ ├── GroupedLegend.tsx # 新增
58
+ ├── __tests__/NestedPieChart.test.tsx # 新增
59
+ └── index.tsx # 更新 - 仅添加导出
60
+ ```
61
+
62
+ ### 4. 依赖关系
63
+
64
+ - NestedPieChart **不依赖** PieChart
65
+ - PieChart **不依赖** NestedPieChart
66
+ - 两者**完全独立**,互不影响
67
+
68
+ ### 5. 包大小影响
69
+
70
+ - **Tree-shaking 支持**:如果不使用 NestedPieChart,它不会被打包
71
+ - **按需导入**:
72
+ ```tsx
73
+ // 只导入 PieChart - NestedPieChart 不会被打包
74
+ import { PieChart } from '@beppla/tapas-ui';
75
+
76
+ // 只导入 NestedPieChart - PieChart 不会被打包
77
+ import { NestedPieChart } from '@beppla/tapas-ui';
78
+ ```
79
+
80
+ ### 6. API 兼容性
81
+
82
+ | 特性 | PieChart | NestedPieChart | 说明 |
83
+ |------|----------|----------------|------|
84
+ | 单层数据 | ✅ | ✅ | NestedPieChart 支持降级 |
85
+ | 多层数据 | ❌ | ✅ | 新功能 |
86
+ | Web 支持 | ✅ | ✅ | 完全支持 |
87
+ | RN 支持 | ✅ | ⚠️ | 降级提示 |
88
+ | Props 冲突 | N/A | ❌ | 无冲突 |
89
+
90
+ ### 7. 版本策略
91
+
92
+ 这是一个**小版本(minor)**更新:
93
+ - ✅ 添加新功能
94
+ - ✅ 完全向下兼容
95
+ - ❌ 无破坏性变更
96
+ - ❌ 无 API 修改
97
+
98
+ 符合语义化版本规范(Semver)。
99
+
100
+ ### 8. 迁移路径(可选)
101
+
102
+ 如果要从 PieChart 迁移到 NestedPieChart:
103
+
104
+ **不需要迁移:**
105
+ - 单层数据继续使用 PieChart 即可
106
+
107
+ **需要迁移:**
108
+ - 只有需要多层级功能时才考虑
109
+ - 数据结构需要调整为树形或扁平+groupKey
110
+
111
+ **迁移示例:**
112
+ ```tsx
113
+ // 旧代码 (PieChart - 单层)
114
+ <PieChart data={[
115
+ { value: 100, label: 'A' },
116
+ { value: 200, label: 'B' }
117
+ ]} />
118
+
119
+ // 新代码 (NestedPieChart - 多层)
120
+ <NestedPieChart data={[
121
+ {
122
+ key: 'group-a',
123
+ label: 'Group A',
124
+ children: [
125
+ { key: 'a1', label: 'A1', value: 50 },
126
+ { key: 'a2', label: 'A2', value: 50 }
127
+ ]
128
+ }
129
+ ]} />
130
+ ```
131
+
132
+ ### 9. TypeScript 类型安全
133
+
134
+ - 所有新类型都独立导出
135
+ - 不会与现有类型冲突
136
+ - 完整的类型推导支持
137
+
138
+ ### 10. 测试覆盖
139
+
140
+ - PieChart 的测试不受影响
141
+ - NestedPieChart 有独立的测试套件
142
+ - 无测试冲突
143
+
144
+ ## 🎯 总结
145
+
146
+ **NestedPieChart 是一个完全独立的新组件:**
147
+
148
+ ✅ 不修改现有组件
149
+ ✅ 不修改现有 API
150
+ ✅ 不影响现有使用
151
+ ✅ 不增加包大小(未使用时)
152
+ ✅ 可选使用,渐进增强
153
+
154
+ **建议:**
155
+ - 现有项目无需任何修改
156
+ - 新需求可使用 NestedPieChart
157
+ - 两者可共存使用
@@ -0,0 +1,86 @@
1
+ # 问题修复:Empty Data 报错
2
+
3
+ ## 🐛 问题描述
4
+
5
+ 在 Storybook 中查看 `Empty Data` story 时出现错误:
6
+ ```
7
+ Cannot read properties of undefined (reading 'fonts')
8
+ ```
9
+
10
+ ## 🔍 根本原因
11
+
12
+ NestedPieChart 组件在空数据情况下使用了 `Text` 组件(来自 `@rneui/themed`),该组件依赖主题上下文中的 `theme.fonts` 配置。但在某些 Storybook 场景下可能缺少完整的主题提供者(ThemeProvider)。
13
+
14
+ ## ✅ 解决方案
15
+
16
+ 将空数据提示从 React Native 的 `Text` 组件改为纯 HTML `div`,因为:
17
+
18
+ 1. **NestedPieChart 是 Web 专用组件**(使用 Recharts)
19
+ 2. **不需要 RN 的 Text 组件**来显示空状态
20
+ 3. **避免主题依赖**,使组件更加独立和健壮
21
+
22
+ ### 修改内容
23
+
24
+ **修改前:**
25
+ ```tsx
26
+ import RNText from '../Text/Text';
27
+
28
+ // 空数据处理
29
+ if (!processedData || processedData.length === 0 || total === 0) {
30
+ return (
31
+ <View style={[styles.container, { height }, style]} testID={testID}>
32
+ <RNText style={styles.emptyText}>{emptyText}</RNText>
33
+ </View>
34
+ );
35
+ }
36
+ ```
37
+
38
+ **修改后:**
39
+ ```tsx
40
+ // 移除 RNText 导入
41
+
42
+ // 空数据处理
43
+ if (!processedData || processedData.length === 0 || total === 0) {
44
+ return (
45
+ <View style={[styles.container, { height }, style]} testID={testID}>
46
+ <div style={{
47
+ display: 'flex',
48
+ alignItems: 'center',
49
+ justifyContent: 'center',
50
+ height: '100%',
51
+ color: '#999',
52
+ fontSize: 14,
53
+ }}>
54
+ {emptyText}
55
+ </div>
56
+ </View>
57
+ );
58
+ }
59
+ ```
60
+
61
+ 同样的修改也应用到了 RN 端降级提示。
62
+
63
+ ## 🎯 修复结果
64
+
65
+ - ✅ Empty Data story 正常渲染
66
+ - ✅ 无主题依赖错误
67
+ - ✅ ESLint 检查通过
68
+ - ✅ 组件更加独立和健壮
69
+
70
+ ## 📝 注意事项
71
+
72
+ 由于 NestedPieChart 是 **Web 专用组件**(Platform.OS === 'web' && RechartsPieChart),使用纯 HTML 元素完全合理且推荐。组件已经在顶部添加了 eslint-disable 注释来处理 Web 专用代码。
73
+
74
+ ## 🧪 验证
75
+
76
+ 在 Storybook 中访问:
77
+ - `Empty Data` story - 现在应该正常显示 "No sales data available"
78
+ - 所有其他 stories - 不受影响,正常工作
79
+
80
+ ## 🔄 后续
81
+
82
+ 如果将来需要在 React Native 端实现完整功能,可以考虑:
83
+ 1. 条件渲染:Web 端用 div,RN 端用 Text
84
+ 2. 或者确保 ThemeProvider 包裹所有组件使用场景
85
+
86
+ 但目前的解决方案对于 Web 专用组件来说是最佳实践。