react-native-livechart 4.11.0 → 4.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/components/CrosshairLine.d.ts +12 -2
  2. package/dist/components/CrosshairLine.d.ts.map +1 -1
  3. package/dist/components/CrosshairOverlay.d.ts +12 -2
  4. package/dist/components/CrosshairOverlay.d.ts.map +1 -1
  5. package/dist/components/CustomReferenceLineOverlay.d.ts +15 -10
  6. package/dist/components/CustomReferenceLineOverlay.d.ts.map +1 -1
  7. package/dist/components/CustomTooltipOverlay.d.ts +5 -2
  8. package/dist/components/CustomTooltipOverlay.d.ts.map +1 -1
  9. package/dist/components/DotOverlay.d.ts +3 -5
  10. package/dist/components/DotOverlay.d.ts.map +1 -1
  11. package/dist/components/LiveChart.d.ts.map +1 -1
  12. package/dist/components/LiveChartSeries.d.ts.map +1 -1
  13. package/dist/components/PerSeriesTooltipOverlay.d.ts +21 -0
  14. package/dist/components/PerSeriesTooltipOverlay.d.ts.map +1 -0
  15. package/dist/components/ReferenceLineOverlay.d.ts +27 -6
  16. package/dist/components/ReferenceLineOverlay.d.ts.map +1 -1
  17. package/dist/components/YAxisOverlay.d.ts +8 -2
  18. package/dist/components/YAxisOverlay.d.ts.map +1 -1
  19. package/dist/core/liveIndicatorVisibility.d.ts +9 -0
  20. package/dist/core/liveIndicatorVisibility.d.ts.map +1 -0
  21. package/dist/core/resolveConfig.d.ts +45 -0
  22. package/dist/core/resolveConfig.d.ts.map +1 -1
  23. package/dist/draw/grid.d.ts +13 -0
  24. package/dist/draw/grid.d.ts.map +1 -1
  25. package/dist/hooks/crosshairSeries.d.ts +10 -2
  26. package/dist/hooks/crosshairSeries.d.ts.map +1 -1
  27. package/dist/hooks/crosshairShared.d.ts +55 -5
  28. package/dist/hooks/crosshairShared.d.ts.map +1 -1
  29. package/dist/hooks/delayedPanGuard.d.ts +66 -8
  30. package/dist/hooks/delayedPanGuard.d.ts.map +1 -1
  31. package/dist/hooks/useChartPaths.d.ts +5 -9
  32. package/dist/hooks/useChartPaths.d.ts.map +1 -1
  33. package/dist/hooks/useCrosshair.d.ts +13 -1
  34. package/dist/hooks/useCrosshair.d.ts.map +1 -1
  35. package/dist/hooks/useCrosshairSeries.d.ts +27 -3
  36. package/dist/hooks/useCrosshairSeries.d.ts.map +1 -1
  37. package/dist/hooks/useCrosshairVisibleOpacity.d.ts +8 -0
  38. package/dist/hooks/useCrosshairVisibleOpacity.d.ts.map +1 -0
  39. package/dist/hooks/useMomentum.d.ts +1 -1
  40. package/dist/hooks/useMomentum.d.ts.map +1 -1
  41. package/dist/hooks/usePanScroll.d.ts +15 -1
  42. package/dist/hooks/usePanScroll.d.ts.map +1 -1
  43. package/dist/hooks/useReferenceLine.d.ts +10 -1
  44. package/dist/hooks/useReferenceLine.d.ts.map +1 -1
  45. package/dist/index.d.ts +1 -1
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/math/lerp.d.ts.map +1 -1
  48. package/dist/math/momentum.d.ts +1 -1
  49. package/dist/math/momentum.d.ts.map +1 -1
  50. package/dist/math/referenceLines.d.ts +7 -0
  51. package/dist/math/referenceLines.d.ts.map +1 -1
  52. package/dist/types.d.ts +207 -18
  53. package/dist/types.d.ts.map +1 -1
  54. package/package.json +1 -1
  55. package/src/components/CrosshairLine.tsx +39 -8
  56. package/src/components/CrosshairOverlay.tsx +49 -15
  57. package/src/components/CustomReferenceLineOverlay.tsx +42 -13
  58. package/src/components/CustomTooltipOverlay.tsx +15 -3
  59. package/src/components/DotOverlay.tsx +24 -8
  60. package/src/components/LiveChart.tsx +182 -39
  61. package/src/components/LiveChartSeries.tsx +195 -16
  62. package/src/components/PerSeriesTooltipOverlay.tsx +290 -0
  63. package/src/components/ReferenceLineOverlay.tsx +288 -141
  64. package/src/components/YAxisOverlay.tsx +39 -10
  65. package/src/core/liveIndicatorVisibility.ts +25 -0
  66. package/src/core/resolveConfig.ts +115 -0
  67. package/src/draw/grid.ts +33 -0
  68. package/src/hooks/crosshairSeries.ts +262 -33
  69. package/src/hooks/crosshairShared.ts +117 -6
  70. package/src/hooks/delayedPanGuard.ts +111 -6
  71. package/src/hooks/useChartPaths.ts +25 -15
  72. package/src/hooks/useCrosshair.ts +103 -32
  73. package/src/hooks/useCrosshairSeries.ts +126 -11
  74. package/src/hooks/useCrosshairVisibleOpacity.ts +57 -0
  75. package/src/hooks/useMomentum.ts +8 -1
  76. package/src/hooks/usePanScroll.ts +46 -5
  77. package/src/hooks/useReferenceLine.ts +26 -1
  78. package/src/index.ts +1 -0
  79. package/src/math/lerp.ts +7 -0
  80. package/src/math/momentum.ts +22 -5
  81. package/src/math/referenceLines.ts +38 -0
  82. package/src/types.ts +215 -18
@@ -0,0 +1,290 @@
1
+ import {
2
+ Circle,
3
+ Group,
4
+ RoundedRect,
5
+ Text as SkiaText,
6
+ type SkFont,
7
+ } from "@shopify/react-native-skia";
8
+ import {
9
+ useDerivedValue,
10
+ type DerivedValue,
11
+ type SharedValue,
12
+ } from "react-native-reanimated";
13
+ import type { ResolvedPerSeriesTooltipConfig } from "../core/resolveConfig";
14
+ import type { TooltipLayout } from "../hooks/crosshairShared";
15
+ import type { LiveChartPalette } from "../types";
16
+
17
+ type TooltipLayoutValue =
18
+ | SharedValue<TooltipLayout>
19
+ | DerivedValue<TooltipLayout>;
20
+
21
+ function TimePill({
22
+ layout,
23
+ font,
24
+ palette,
25
+ config,
26
+ background,
27
+ color,
28
+ borderColor,
29
+ }: {
30
+ layout: TooltipLayoutValue;
31
+ font: SkFont;
32
+ palette: LiveChartPalette;
33
+ config: ResolvedPerSeriesTooltipConfig;
34
+ background?: string;
35
+ color?: string;
36
+ borderColor?: string;
37
+ }) {
38
+ const opacity = useDerivedValue(() =>
39
+ layout.value.perSeries?.timePill ? 1 : 0,
40
+ );
41
+ const x = useDerivedValue(
42
+ () => layout.value.perSeries?.timePill?.x ?? -400,
43
+ );
44
+ const y = useDerivedValue(
45
+ () => layout.value.perSeries?.timePill?.y ?? 0,
46
+ );
47
+ const w = useDerivedValue(
48
+ () => layout.value.perSeries?.timePill?.w ?? 0,
49
+ );
50
+ const h = useDerivedValue(
51
+ () => layout.value.perSeries?.timePill?.h ?? 0,
52
+ );
53
+ const text = useDerivedValue(
54
+ () => layout.value.perSeries?.timePill?.text ?? "",
55
+ );
56
+ const textX = useDerivedValue(
57
+ () => layout.value.perSeries?.timePill?.textX ?? -400,
58
+ );
59
+ const baselineY = useDerivedValue(
60
+ () => layout.value.perSeries?.timePill?.baselineY ?? 0,
61
+ );
62
+ const clip = useDerivedValue(() => ({
63
+ x: layout.value.perSeries?.timePill?.x ?? -400,
64
+ y: layout.value.perSeries?.timePill?.y ?? 0,
65
+ width: layout.value.perSeries?.timePill?.w ?? 0,
66
+ height: layout.value.perSeries?.timePill?.h ?? 0,
67
+ }));
68
+
69
+ return (
70
+ <Group opacity={opacity}>
71
+ <RoundedRect
72
+ x={x}
73
+ y={y}
74
+ width={w}
75
+ height={h}
76
+ r={config.timePillRadius}
77
+ color={background ?? palette.tooltipBg}
78
+ />
79
+ <RoundedRect
80
+ x={x}
81
+ y={y}
82
+ width={w}
83
+ height={h}
84
+ r={config.timePillRadius}
85
+ color={borderColor ?? palette.tooltipBorder}
86
+ style="stroke"
87
+ strokeWidth={1}
88
+ />
89
+ <Group clip={clip}>
90
+ <SkiaText
91
+ x={textX}
92
+ y={baselineY}
93
+ text={text}
94
+ font={font}
95
+ color={color ?? palette.tooltipText}
96
+ />
97
+ </Group>
98
+ </Group>
99
+ );
100
+ }
101
+
102
+ function SeriesPill({
103
+ index,
104
+ layout,
105
+ font,
106
+ palette,
107
+ config,
108
+ background,
109
+ labelColor,
110
+ valueColor,
111
+ borderColor,
112
+ }: {
113
+ index: number;
114
+ layout: TooltipLayoutValue;
115
+ font: SkFont;
116
+ palette: LiveChartPalette;
117
+ config: ResolvedPerSeriesTooltipConfig;
118
+ background?: string;
119
+ labelColor?: string;
120
+ valueColor?: string;
121
+ borderColor?: string;
122
+ }) {
123
+ const opacity = useDerivedValue(() => {
124
+ const pills = layout.value.perSeries?.pills;
125
+ return pills && index < pills.length ? 1 : 0;
126
+ });
127
+ const x = useDerivedValue(
128
+ () => layout.value.perSeries?.pills[index]?.x ?? -400,
129
+ );
130
+ const y = useDerivedValue(
131
+ () => layout.value.perSeries?.pills[index]?.y ?? 0,
132
+ );
133
+ const w = useDerivedValue(
134
+ () => layout.value.perSeries?.pills[index]?.w ?? 0,
135
+ );
136
+ const h = useDerivedValue(
137
+ () => layout.value.perSeries?.pills[index]?.h ?? 0,
138
+ );
139
+ const anchorX = useDerivedValue(
140
+ () => layout.value.perSeries?.pills[index]?.anchorX ?? -400,
141
+ );
142
+ const anchorY = useDerivedValue(
143
+ () => layout.value.perSeries?.pills[index]?.anchorY ?? -400,
144
+ );
145
+ const dotX = useDerivedValue(
146
+ () => layout.value.perSeries?.pills[index]?.dotX ?? -400,
147
+ );
148
+ const dotY = useDerivedValue(
149
+ () => layout.value.perSeries?.pills[index]?.dotY ?? -400,
150
+ );
151
+ const dotColor = useDerivedValue(
152
+ () => layout.value.perSeries?.pills[index]?.color ?? palette.tooltipText,
153
+ );
154
+ const label = useDerivedValue(
155
+ () => layout.value.perSeries?.pills[index]?.label ?? "",
156
+ );
157
+ const labelX = useDerivedValue(
158
+ () => layout.value.perSeries?.pills[index]?.labelX ?? -400,
159
+ );
160
+ const value = useDerivedValue(
161
+ () => layout.value.perSeries?.pills[index]?.value ?? "",
162
+ );
163
+ const valueX = useDerivedValue(
164
+ () => layout.value.perSeries?.pills[index]?.valueX ?? -400,
165
+ );
166
+ const baselineY = useDerivedValue(
167
+ () => layout.value.perSeries?.pills[index]?.baselineY ?? 0,
168
+ );
169
+ const clip = useDerivedValue(() => ({
170
+ x: layout.value.perSeries?.pills[index]?.x ?? -400,
171
+ y: layout.value.perSeries?.pills[index]?.y ?? 0,
172
+ width: layout.value.perSeries?.pills[index]?.w ?? 0,
173
+ height: layout.value.perSeries?.pills[index]?.h ?? 0,
174
+ }));
175
+
176
+ return (
177
+ <Group opacity={opacity}>
178
+ <Circle
179
+ cx={anchorX}
180
+ cy={anchorY}
181
+ r={config.intersectionDotSize / 2}
182
+ color={dotColor}
183
+ />
184
+ <RoundedRect
185
+ x={x}
186
+ y={y}
187
+ width={w}
188
+ height={h}
189
+ r={config.seriesPillRadius}
190
+ color={background ?? palette.tooltipBg}
191
+ />
192
+ <RoundedRect
193
+ x={x}
194
+ y={y}
195
+ width={w}
196
+ height={h}
197
+ r={config.seriesPillRadius}
198
+ color={borderColor ?? palette.tooltipBorder}
199
+ style="stroke"
200
+ strokeWidth={1}
201
+ />
202
+ <Group clip={clip}>
203
+ <Circle
204
+ cx={dotX}
205
+ cy={dotY}
206
+ r={config.seriesPillDotSize / 2}
207
+ color={dotColor}
208
+ />
209
+ <SkiaText
210
+ x={labelX}
211
+ y={baselineY}
212
+ text={label}
213
+ font={font}
214
+ color={labelColor ?? palette.tooltipText}
215
+ />
216
+ <SkiaText
217
+ x={valueX}
218
+ y={baselineY}
219
+ text={value}
220
+ font={font}
221
+ color={valueColor ?? labelColor ?? palette.tooltipText}
222
+ />
223
+ </Group>
224
+ </Group>
225
+ );
226
+ }
227
+
228
+ /** Skia-only per-series tooltip renderer; every position is SharedValue-driven. */
229
+ export function PerSeriesTooltipOverlay({
230
+ layout,
231
+ font,
232
+ palette,
233
+ config,
234
+ seriesCount,
235
+ opacity,
236
+ tooltipBackground,
237
+ tooltipColor,
238
+ tooltipBorderColor,
239
+ }: {
240
+ layout: TooltipLayoutValue;
241
+ font: SkFont;
242
+ palette: LiveChartPalette;
243
+ config: ResolvedPerSeriesTooltipConfig;
244
+ seriesCount: number;
245
+ /** Active crosshair opacity; idle `alwaysShow` pills stay fully visible. */
246
+ opacity?: SharedValue<number> | DerivedValue<number>;
247
+ tooltipBackground?: string;
248
+ tooltipColor?: string;
249
+ tooltipBorderColor?: string;
250
+ }) {
251
+ const timeBackground =
252
+ config.timePillBackground ?? tooltipBackground;
253
+ const timeColor = config.timePillColor ?? tooltipColor;
254
+ const timeBorder =
255
+ config.timePillBorderColor ?? tooltipBorderColor;
256
+ const seriesBackground =
257
+ config.seriesPillBackground ?? tooltipBackground;
258
+ const seriesLabelColor =
259
+ config.seriesPillLabelColor ?? tooltipColor;
260
+ const seriesBorder =
261
+ config.seriesPillBorderColor ?? tooltipBorderColor;
262
+
263
+ return (
264
+ <Group opacity={opacity}>
265
+ <TimePill
266
+ layout={layout}
267
+ font={font}
268
+ palette={palette}
269
+ config={config}
270
+ background={timeBackground}
271
+ color={timeColor}
272
+ borderColor={timeBorder}
273
+ />
274
+ {Array.from({ length: seriesCount }, (_, index) => (
275
+ <SeriesPill
276
+ key={index}
277
+ index={index}
278
+ layout={layout}
279
+ font={font}
280
+ palette={palette}
281
+ config={config}
282
+ background={seriesBackground}
283
+ labelColor={seriesLabelColor}
284
+ valueColor={config.seriesPillValueColor}
285
+ borderColor={seriesBorder}
286
+ />
287
+ ))}
288
+ </Group>
289
+ );
290
+ }