react-native-metrify 0.1.0-alpha.1 → 0.1.0-alpha.2

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 (100) hide show
  1. package/package.json +1 -2
  2. package/src/core/animation/index.ts +0 -113
  3. package/src/core/animation/index.web.ts +0 -112
  4. package/src/core/hooks/index.ts +0 -66
  5. package/src/core/index.ts +0 -26
  6. package/src/core/layout/index.ts +0 -101
  7. package/src/core/math/index.ts +0 -72
  8. package/src/core/package.json +0 -13
  9. package/src/core/theme/ThemeProvider.tsx +0 -36
  10. package/src/core/theme/index.ts +0 -5
  11. package/src/core/theme/themes.ts +0 -132
  12. package/src/core/types/index.ts +0 -164
  13. package/src/core/utils/responsive.ts +0 -203
  14. package/src/core/utils/time.ts +0 -100
  15. package/src/index.ts +0 -13
  16. package/src/renderer-svg/adapters/index.ts +0 -84
  17. package/src/renderer-svg/index.ts +0 -8
  18. package/src/renderer-svg/package.json +0 -17
  19. package/src/renderer-svg/paths/arc.ts +0 -93
  20. package/src/renderer-svg/paths/index.ts +0 -6
  21. package/src/renderer-svg/paths/line.ts +0 -83
  22. package/src/renderer-svg/paths/rect.ts +0 -80
  23. package/src/renderer-svg/primitives/AnimatedCircle.tsx +0 -48
  24. package/src/renderer-svg/primitives/AnimatedPath.tsx +0 -48
  25. package/src/renderer-svg/primitives/Text.tsx +0 -73
  26. package/src/renderer-svg/primitives/index.ts +0 -6
  27. package/src/widgets/AreaChart/AreaChart.tsx +0 -213
  28. package/src/widgets/AreaChart/index.ts +0 -2
  29. package/src/widgets/AreaChart/types.ts +0 -34
  30. package/src/widgets/BarChart/BarChart.tsx +0 -249
  31. package/src/widgets/BarChart/index.ts +0 -10
  32. package/src/widgets/BarChart/types.ts +0 -27
  33. package/src/widgets/BoxPlot/BoxPlot.tsx +0 -252
  34. package/src/widgets/BoxPlot/index.ts +0 -2
  35. package/src/widgets/BoxPlot/types.ts +0 -27
  36. package/src/widgets/BubbleChart/BubbleChart.tsx +0 -175
  37. package/src/widgets/BubbleChart/index.ts +0 -2
  38. package/src/widgets/BubbleChart/types.ts +0 -33
  39. package/src/widgets/CandlestickChart/CandlestickChart.tsx +0 -204
  40. package/src/widgets/CandlestickChart/index.ts +0 -2
  41. package/src/widgets/CandlestickChart/types.ts +0 -29
  42. package/src/widgets/FunnelChart/FunnelChart.tsx +0 -172
  43. package/src/widgets/FunnelChart/index.ts +0 -2
  44. package/src/widgets/FunnelChart/types.ts +0 -22
  45. package/src/widgets/Gauge/Gauge.tsx +0 -235
  46. package/src/widgets/Gauge/index.ts +0 -5
  47. package/src/widgets/Gauge/types.ts +0 -19
  48. package/src/widgets/GroupedBarChart/GroupedBarChart.tsx +0 -190
  49. package/src/widgets/GroupedBarChart/index.ts +0 -2
  50. package/src/widgets/GroupedBarChart/types.ts +0 -30
  51. package/src/widgets/Heatmap/Heatmap.tsx +0 -216
  52. package/src/widgets/Heatmap/index.ts +0 -2
  53. package/src/widgets/Heatmap/types.ts +0 -27
  54. package/src/widgets/Histogram/Histogram.tsx +0 -173
  55. package/src/widgets/Histogram/index.ts +0 -2
  56. package/src/widgets/Histogram/types.ts +0 -18
  57. package/src/widgets/HorizontalBarChart/HorizontalBarChart.tsx +0 -125
  58. package/src/widgets/HorizontalBarChart/index.ts +0 -2
  59. package/src/widgets/HorizontalBarChart/types.ts +0 -23
  60. package/src/widgets/KPI/KPI.tsx +0 -222
  61. package/src/widgets/KPI/index.ts +0 -5
  62. package/src/widgets/KPI/types.ts +0 -19
  63. package/src/widgets/LineChart/LineChart.tsx +0 -364
  64. package/src/widgets/LineChart/index.ts +0 -10
  65. package/src/widgets/LineChart/types.ts +0 -34
  66. package/src/widgets/MultiLineSparkline/MultiLineSparkline.tsx +0 -234
  67. package/src/widgets/MultiLineSparkline/index.ts +0 -10
  68. package/src/widgets/MultiLineSparkline/types.ts +0 -25
  69. package/src/widgets/PieChart/PieChart.tsx +0 -275
  70. package/src/widgets/PieChart/index.ts +0 -10
  71. package/src/widgets/PieChart/types.ts +0 -26
  72. package/src/widgets/Progress/Progress.tsx +0 -201
  73. package/src/widgets/Progress/index.ts +0 -5
  74. package/src/widgets/Progress/types.ts +0 -19
  75. package/src/widgets/RadarChart/RadarChart.tsx +0 -213
  76. package/src/widgets/RadarChart/index.ts +0 -2
  77. package/src/widgets/RadarChart/types.ts +0 -29
  78. package/src/widgets/SankeyDiagram/SankeyDiagram.tsx +0 -272
  79. package/src/widgets/SankeyDiagram/index.ts +0 -2
  80. package/src/widgets/SankeyDiagram/types.ts +0 -29
  81. package/src/widgets/ScatterPlot/ScatterPlot.tsx +0 -167
  82. package/src/widgets/ScatterPlot/index.ts +0 -2
  83. package/src/widgets/ScatterPlot/types.ts +0 -32
  84. package/src/widgets/Sparkline/Sparkline.tsx +0 -203
  85. package/src/widgets/Sparkline/index.ts +0 -5
  86. package/src/widgets/Sparkline/types.ts +0 -18
  87. package/src/widgets/StackedBarChart/StackedBarChart.tsx +0 -181
  88. package/src/widgets/StackedBarChart/index.ts +0 -2
  89. package/src/widgets/StackedBarChart/types.ts +0 -29
  90. package/src/widgets/SunburstChart/SunburstChart.tsx +0 -176
  91. package/src/widgets/SunburstChart/index.ts +0 -2
  92. package/src/widgets/SunburstChart/types.ts +0 -22
  93. package/src/widgets/Treemap/Treemap.tsx +0 -191
  94. package/src/widgets/Treemap/index.ts +0 -2
  95. package/src/widgets/Treemap/types.ts +0 -23
  96. package/src/widgets/WaterfallChart/WaterfallChart.tsx +0 -226
  97. package/src/widgets/WaterfallChart/index.ts +0 -2
  98. package/src/widgets/WaterfallChart/types.ts +0 -26
  99. package/src/widgets/index.ts +0 -40
  100. package/src/widgets/package.json +0 -18
@@ -1,364 +0,0 @@
1
- /**
2
- * LineChart Widget - Full line chart with X and Y axes
3
- */
4
- import React, { memo, useMemo } from 'react';
5
- import { View, Text as RNText, StyleSheet } from 'react-native';
6
- import Svg, { Line as SvgLine } from 'react-native-svg';
7
- import {
8
- useWidgetDimensions,
9
- useWidgetTheme,
10
- normalize,
11
- formatTimeLabel,
12
- reduceLabels,
13
- } from '../../core';
14
- import {
15
- createLinePath,
16
- AnimatedPath,
17
- Text,
18
- } from '../../renderer-svg';
19
- import { LineChartWidgetProps } from './types';
20
-
21
- /**
22
- * LineChart Widget Component
23
- */
24
- export const LineChart = memo<LineChartWidgetProps>(({
25
- data: widgetData,
26
- width,
27
- height,
28
- loading = false,
29
- theme: themeOverride,
30
- showXAxis = true,
31
- showYAxis = true,
32
- showGrid = true,
33
- showLegend = true,
34
- maxXLabels = 6,
35
- maxYLabels = 5,
36
- curveType = 'linear',
37
- testID,
38
- }) => {
39
- const theme = useWidgetTheme(themeOverride);
40
- const dimensions = useWidgetDimensions(width, height, 350, 250);
41
-
42
- // Handle states
43
- if (loading) {
44
- return (
45
- <View
46
- style={[
47
- styles.container,
48
- {
49
- width: dimensions.width,
50
- height: dimensions.height,
51
- backgroundColor: theme.colors.surface,
52
- borderRadius: theme.radius.md,
53
- },
54
- ]}
55
- testID={`${testID}-loading`}
56
- >
57
- <RNText style={[styles.loadingText, { color: theme.colors.textSecondary }]}>
58
- Loading...
59
- </RNText>
60
- </View>
61
- );
62
- }
63
-
64
- if (!widgetData || !widgetData.series || widgetData.series.length === 0) {
65
- return (
66
- <View
67
- style={[
68
- styles.container,
69
- {
70
- width: dimensions.width,
71
- height: dimensions.height,
72
- backgroundColor: theme.colors.surface,
73
- borderRadius: theme.radius.md,
74
- },
75
- ]}
76
- testID={`${testID}-empty`}
77
- >
78
- <RNText style={[styles.emptyText, { color: theme.colors.textSecondary }]}>
79
- No data
80
- </RNText>
81
- </View>
82
- );
83
- }
84
-
85
- const { series, title, xAxisLabel, yAxisLabel, timeInterval } = widgetData;
86
-
87
- // Calculate chart dimensions
88
- const padding = theme.spacing.md;
89
- const titleHeight = title ? theme.fontScale.md + theme.spacing.sm : 0;
90
- const legendHeight = showLegend ? 30 : 0;
91
- const xAxisHeight = showXAxis ? 30 : 0;
92
- const yAxisWidth = showYAxis ? 40 : 0;
93
-
94
- const chartWidth = dimensions.width - padding * 2 - yAxisWidth;
95
- const chartHeight = dimensions.height - padding * 2 - titleHeight - legendHeight - xAxisHeight;
96
-
97
- // Find global min/max for all series
98
- const { globalMinY, globalMaxY, xLabels } = useMemo(() => {
99
- let minY = Infinity;
100
- let maxY = -Infinity;
101
- const allXValues: (number | Date)[] = [];
102
-
103
- series.forEach(s => {
104
- s.data.forEach(point => {
105
- if (point.y < minY) minY = point.y;
106
- if (point.y > maxY) maxY = point.y;
107
- allXValues.push(point.x);
108
- });
109
- });
110
-
111
- // Generate X-axis labels
112
- const labels = allXValues.map((x, idx) => {
113
- if (x instanceof Date) {
114
- return timeInterval ? formatTimeLabel(x, timeInterval) : x.toLocaleDateString();
115
- }
116
- return x.toString();
117
- });
118
-
119
- return {
120
- globalMinY: minY,
121
- globalMaxY: maxY,
122
- xLabels: labels,
123
- };
124
- }, [series, timeInterval]);
125
-
126
- // Y-axis labels
127
- const yAxisLabels = useMemo(() => {
128
- const range = globalMaxY - globalMinY;
129
- const step = range / (maxYLabels - 1);
130
- return Array.from({ length: maxYLabels }, (_, i) => ({
131
- value: globalMinY + i * step,
132
- y: chartHeight - (i * chartHeight) / (maxYLabels - 1),
133
- }));
134
- }, [globalMinY, globalMaxY, maxYLabels, chartHeight]);
135
-
136
- // X-axis labels (reduced to fit)
137
- const xAxisLabelsReduced = useMemo(() => {
138
- return reduceLabels(xLabels, maxXLabels);
139
- }, [xLabels, maxXLabels]);
140
-
141
- // Generate paths for each series
142
- const seriesPaths = useMemo(() => {
143
- return series.map(s => {
144
- const points = s.data.map((point, index) => {
145
- const x = (index / (s.data.length - 1 || 1)) * chartWidth;
146
- const normalizedY = normalize(point.y, globalMinY, globalMaxY);
147
- const y = chartHeight - normalizedY * chartHeight;
148
- return { x, y };
149
- });
150
-
151
- return {
152
- path: createLinePath(points),
153
- color: s.color,
154
- strokeWidth: s.strokeWidth || 2,
155
- label: s.label,
156
- };
157
- });
158
- }, [series, chartWidth, chartHeight, globalMinY, globalMaxY]);
159
-
160
- return (
161
- <View
162
- style={[
163
- styles.wrapper,
164
- {
165
- width: dimensions.width,
166
- height: dimensions.height,
167
- backgroundColor: theme.colors.surface,
168
- borderRadius: theme.radius.md,
169
- padding,
170
- },
171
- ]}
172
- testID={testID}
173
- >
174
- {/* Title */}
175
- {title && (
176
- <RNText
177
- style={[
178
- styles.title,
179
- {
180
- color: theme.colors.text,
181
- fontSize: theme.fontScale.md,
182
- fontWeight: 'bold',
183
- marginBottom: theme.spacing.sm,
184
- },
185
- ]}
186
- >
187
- {title}
188
- </RNText>
189
- )}
190
-
191
- {/* Chart */}
192
- <View style={styles.chartRow}>
193
- {/* Y-Axis */}
194
- {showYAxis && (
195
- <View style={[styles.yAxis, { width: yAxisWidth }]}>
196
- {yAxisLabels.map((label, index) => (
197
- <RNText
198
- key={`y-${index}`}
199
- style={[
200
- styles.yAxisLabel,
201
- {
202
- color: theme.colors.textSecondary,
203
- fontSize: theme.fontScale.xs,
204
- top: label.y - 6,
205
- },
206
- ]}
207
- >
208
- {label.value.toFixed(0)}
209
- </RNText>
210
- ))}
211
- </View>
212
- )}
213
-
214
- {/* Chart SVG */}
215
- <View>
216
- <Svg width={chartWidth} height={chartHeight}>
217
- {/* Grid lines */}
218
- {showGrid && yAxisLabels.map((label, index) => (
219
- <SvgLine
220
- key={`grid-${index}`}
221
- x1={0}
222
- y1={label.y}
223
- x2={chartWidth}
224
- y2={label.y}
225
- stroke={theme.colors.borderLight}
226
- strokeWidth={1}
227
- />
228
- ))}
229
-
230
- {/* Line series */}
231
- {seriesPaths.map((series, index) => (
232
- <AnimatedPath
233
- key={`series-${index}`}
234
- d={series.path}
235
- stroke={series.color}
236
- strokeWidth={series.strokeWidth}
237
- strokeLinecap="round"
238
- strokeLinejoin="round"
239
- fill="transparent"
240
- />
241
- ))}
242
- </Svg>
243
-
244
- {/* X-Axis */}
245
- {showXAxis && (
246
- <View style={[styles.xAxis, { width: chartWidth }]}>
247
- {xAxisLabelsReduced.map((item, index) => (
248
- <RNText
249
- key={`x-${index}`}
250
- style={[
251
- styles.xAxisLabel,
252
- {
253
- color: theme.colors.textSecondary,
254
- fontSize: theme.fontScale.xs,
255
- left: (item.index / (xLabels.length - 1 || 1)) * chartWidth - 20,
256
- },
257
- ]}
258
- >
259
- {item.label}
260
- </RNText>
261
- ))}
262
- </View>
263
- )}
264
- </View>
265
- </View>
266
-
267
- {/* Legend */}
268
- {showLegend && (
269
- <View style={styles.legend}>
270
- {seriesPaths.map((series, index) => (
271
- series.label && (
272
- <View key={`legend-${index}`} style={styles.legendItem}>
273
- <View
274
- style={[
275
- styles.legendColor,
276
- { backgroundColor: series.color },
277
- ]}
278
- />
279
- <RNText
280
- style={[
281
- styles.legendText,
282
- {
283
- color: theme.colors.textSecondary,
284
- fontSize: theme.fontScale.xs,
285
- },
286
- ]}
287
- >
288
- {series.label}
289
- </RNText>
290
- </View>
291
- )
292
- ))}
293
- </View>
294
- )}
295
- </View>
296
- );
297
- });
298
-
299
- LineChart.displayName = 'LineChart';
300
-
301
- const styles = StyleSheet.create({
302
- wrapper: {
303
- justifyContent: 'flex-start',
304
- alignItems: 'flex-start',
305
- },
306
- container: {
307
- justifyContent: 'center',
308
- alignItems: 'center',
309
- },
310
- loadingText: {
311
- fontSize: 16,
312
- },
313
- emptyText: {
314
- fontSize: 16,
315
- },
316
- title: {
317
- textAlign: 'center',
318
- width: '100%',
319
- },
320
- chartRow: {
321
- flexDirection: 'row',
322
- alignItems: 'flex-start',
323
- },
324
- yAxis: {
325
- position: 'relative',
326
- marginRight: 8,
327
- },
328
- yAxisLabel: {
329
- position: 'absolute',
330
- right: 0,
331
- textAlign: 'right',
332
- },
333
- xAxis: {
334
- position: 'relative',
335
- height: 30,
336
- marginTop: 4,
337
- },
338
- xAxisLabel: {
339
- position: 'absolute',
340
- width: 40,
341
- textAlign: 'center',
342
- },
343
- legend: {
344
- flexDirection: 'row',
345
- flexWrap: 'wrap',
346
- justifyContent: 'center',
347
- marginTop: 12,
348
- gap: 12,
349
- },
350
- legendItem: {
351
- flexDirection: 'row',
352
- alignItems: 'center',
353
- gap: 6,
354
- },
355
- legendColor: {
356
- width: 12,
357
- height: 12,
358
- borderRadius: 2,
359
- },
360
- legendText: {
361
- textTransform: 'uppercase',
362
- letterSpacing: 0.5,
363
- },
364
- });
@@ -1,10 +0,0 @@
1
- /**
2
- * LineChart Widget exports
3
- */
4
- export { LineChart } from './LineChart';
5
- export type {
6
- LineChartWidgetProps,
7
- LineChartData,
8
- LineChartSeries,
9
- LineChartDataPoint
10
- } from './types';
@@ -1,34 +0,0 @@
1
- /**
2
- * LineChart Widget types - Full line chart with axes
3
- */
4
- import { BaseWidgetProps, TimeInterval } from '../../core';
5
-
6
- export interface LineChartDataPoint {
7
- x: number | Date;
8
- y: number;
9
- }
10
-
11
- export interface LineChartSeries {
12
- data: LineChartDataPoint[];
13
- color: string;
14
- label?: string;
15
- strokeWidth?: number;
16
- }
17
-
18
- export interface LineChartData {
19
- series: LineChartSeries[];
20
- title?: string;
21
- xAxisLabel?: string;
22
- yAxisLabel?: string;
23
- timeInterval?: TimeInterval;
24
- }
25
-
26
- export interface LineChartWidgetProps extends BaseWidgetProps<LineChartData> {
27
- showXAxis?: boolean;
28
- showYAxis?: boolean;
29
- showGrid?: boolean;
30
- showLegend?: boolean;
31
- maxXLabels?: number;
32
- maxYLabels?: number;
33
- curveType?: 'linear' | 'smooth';
34
- }
@@ -1,234 +0,0 @@
1
- /**
2
- * MultiLineSparkline Widget - Multiple trends on same chart
3
- */
4
- import React, { memo, useMemo } from 'react';
5
- import { View, Text as RNText, StyleSheet } from 'react-native';
6
- import Svg from 'react-native-svg';
7
- import {
8
- useWidgetDimensions,
9
- useWidgetTheme,
10
- useWidgetPadding,
11
- useInnerDimensions,
12
- } from '../../core';
13
- import {
14
- createLinePath,
15
- AnimatedPath,
16
- dataToPoints,
17
- } from '../../renderer-svg';
18
- import { MultiLineSparklineWidgetProps } from './types';
19
-
20
- const MAX_DATA_POINTS = 100;
21
-
22
- /**
23
- * MultiLineSparkline Widget Component
24
- */
25
- export const MultiLineSparkline = memo<MultiLineSparklineWidgetProps>(({
26
- data: widgetData,
27
- width,
28
- height,
29
- loading = false,
30
- theme: themeOverride,
31
- style = 'line',
32
- showLegend = true,
33
- maxDataPoints = MAX_DATA_POINTS,
34
- minHeight = 120,
35
- testID,
36
- }) => {
37
- const theme = useWidgetTheme(themeOverride);
38
- const dimensions = useWidgetDimensions(width, height, 300, minHeight);
39
- const padding = useWidgetPadding(theme);
40
-
41
- // Calculate inner dimensions
42
- const legendHeight = showLegend ? 30 : 0;
43
- const svgHeight = dimensions.height - legendHeight - padding.vertical;
44
-
45
- const innerDimensions = useInnerDimensions(
46
- dimensions.width,
47
- svgHeight,
48
- padding
49
- );
50
-
51
- // Handle states
52
- if (loading) {
53
- return (
54
- <View
55
- style={[
56
- styles.container,
57
- {
58
- width: dimensions.width,
59
- height: dimensions.height,
60
- backgroundColor: theme.colors.surface,
61
- borderRadius: theme.radius.md,
62
- },
63
- ]}
64
- testID={`${testID}-loading`}
65
- >
66
- <RNText style={[styles.loadingText, { color: theme.colors.textSecondary }]}>
67
- Loading...
68
- </RNText>
69
- </View>
70
- );
71
- }
72
-
73
- if (!widgetData || !widgetData.series || widgetData.series.length === 0) {
74
- return (
75
- <View
76
- style={[
77
- styles.container,
78
- {
79
- width: dimensions.width,
80
- height: dimensions.height,
81
- backgroundColor: theme.colors.surface,
82
- borderRadius: theme.radius.md,
83
- },
84
- ]}
85
- testID={`${testID}-empty`}
86
- >
87
- <RNText style={[styles.emptyText, { color: theme.colors.textSecondary }]}>
88
- No data
89
- </RNText>
90
- </View>
91
- );
92
- }
93
-
94
- const { series } = widgetData;
95
-
96
- // Find global min/max across all series for consistent scaling
97
- const { globalMin, globalMax } = useMemo(() => {
98
- let min = Infinity;
99
- let max = -Infinity;
100
-
101
- series.forEach(s => {
102
- const seriesMin = Math.min(...s.data);
103
- const seriesMax = Math.max(...s.data);
104
- if (seriesMin < min) min = seriesMin;
105
- if (seriesMax > max) max = seriesMax;
106
- });
107
-
108
- return { globalMin: min, globalMax: max };
109
- }, [series]);
110
-
111
- // Generate paths for each series
112
- const seriesPaths = useMemo(() => {
113
- return series.map(s => {
114
- // Cap data points if needed
115
- const cappedData = s.data.length > maxDataPoints
116
- ? s.data.filter((_, idx) => idx % Math.ceil(s.data.length / maxDataPoints) === 0)
117
- : s.data;
118
-
119
- // Normalize all series to same scale
120
- const normalizedData = cappedData.map(val =>
121
- ((val - globalMin) / (globalMax - globalMin || 1)) * 100
122
- );
123
-
124
- const points = dataToPoints(
125
- normalizedData,
126
- innerDimensions.width,
127
- innerDimensions.height,
128
- theme.spacing.xs
129
- );
130
-
131
- return {
132
- path: createLinePath(points),
133
- color: s.color,
134
- strokeWidth: s.strokeWidth || 2,
135
- label: s.label,
136
- };
137
- });
138
- }, [series, maxDataPoints, innerDimensions, theme.spacing.xs, globalMin, globalMax]);
139
-
140
- return (
141
- <View
142
- style={[
143
- styles.container,
144
- {
145
- width: dimensions.width,
146
- height: dimensions.height,
147
- backgroundColor: theme.colors.surface,
148
- borderRadius: theme.radius.md,
149
- padding: theme.spacing.md,
150
- },
151
- ]}
152
- testID={testID}
153
- >
154
- <Svg width={dimensions.width - theme.spacing.md * 2} height={svgHeight - theme.spacing.md}>
155
- {seriesPaths.map((series, index) => (
156
- <AnimatedPath
157
- key={`series-${index}`}
158
- d={series.path}
159
- stroke={series.color}
160
- strokeWidth={series.strokeWidth}
161
- strokeLinecap="round"
162
- strokeLinejoin="round"
163
- fill="transparent"
164
- />
165
- ))}
166
- </Svg>
167
-
168
- {/* Legend */}
169
- {showLegend && (
170
- <View style={styles.legend}>
171
- {seriesPaths.map((series, index) => (
172
- series.label && (
173
- <View key={`legend-${index}`} style={styles.legendItem}>
174
- <View
175
- style={[
176
- styles.legendColor,
177
- { backgroundColor: series.color },
178
- ]}
179
- />
180
- <RNText
181
- style={[
182
- styles.legendText,
183
- {
184
- color: theme.colors.textSecondary,
185
- fontSize: theme.fontScale.xs,
186
- },
187
- ]}
188
- >
189
- {series.label}
190
- </RNText>
191
- </View>
192
- )
193
- ))}
194
- </View>
195
- )}
196
- </View>
197
- );
198
- });
199
-
200
- MultiLineSparkline.displayName = 'MultiLineSparkline';
201
-
202
- const styles = StyleSheet.create({
203
- container: {
204
- justifyContent: 'center',
205
- alignItems: 'center',
206
- },
207
- loadingText: {
208
- fontSize: 16,
209
- },
210
- emptyText: {
211
- fontSize: 16,
212
- },
213
- legend: {
214
- flexDirection: 'row',
215
- flexWrap: 'wrap',
216
- justifyContent: 'center',
217
- marginTop: 8,
218
- gap: 12,
219
- },
220
- legendItem: {
221
- flexDirection: 'row',
222
- alignItems: 'center',
223
- gap: 6,
224
- },
225
- legendColor: {
226
- width: 12,
227
- height: 12,
228
- borderRadius: 2,
229
- },
230
- legendText: {
231
- textTransform: 'uppercase',
232
- letterSpacing: 0.5,
233
- },
234
- });
@@ -1,10 +0,0 @@
1
- /**
2
- * MultiLineSparkline Widget exports
3
- */
4
- export { MultiLineSparkline } from './MultiLineSparkline';
5
- export type {
6
- MultiLineSparklineWidgetProps,
7
- MultiLineSparklineData,
8
- SparklineSeries,
9
- SparklineRenderStyle
10
- } from './types';
@@ -1,25 +0,0 @@
1
- /**
2
- * MultiLineSparkline Widget types
3
- */
4
- import { BaseWidgetProps } from '../../core/types';
5
-
6
- export interface SparklineSeries {
7
- data: number[];
8
- color: string;
9
- label?: string;
10
- strokeWidth?: number;
11
- }
12
-
13
- export interface MultiLineSparklineData {
14
- series: SparklineSeries[];
15
- labels?: string[];
16
- }
17
-
18
- export type SparklineRenderStyle = 'line' | 'area';
19
-
20
- export interface MultiLineSparklineWidgetProps extends BaseWidgetProps<MultiLineSparklineData> {
21
- style?: SparklineRenderStyle;
22
- showLegend?: boolean;
23
- maxDataPoints?: number;
24
- minHeight?: number;
25
- }