@ledgerhq/lumen-ui-rnative-visualization 0.1.13 → 0.1.15

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 (182) hide show
  1. package/dist/module/lib/Components/Axis/Axis.constants.js +21 -0
  2. package/dist/module/lib/Components/Axis/Axis.constants.js.map +1 -0
  3. package/dist/module/lib/Components/Axis/index.js +5 -0
  4. package/dist/module/lib/Components/Axis/index.js.map +1 -0
  5. package/dist/module/lib/Components/CartesianChart/CartesianChart.js +34 -22
  6. package/dist/module/lib/Components/CartesianChart/CartesianChart.js.map +1 -1
  7. package/dist/module/lib/Components/CartesianChart/context/useBuildChartContext.js +5 -4
  8. package/dist/module/lib/Components/CartesianChart/context/useBuildChartContext.js.map +1 -1
  9. package/dist/module/lib/Components/CartesianChart/context/useBuildChartContext.test.js +54 -0
  10. package/dist/module/lib/Components/CartesianChart/context/useBuildChartContext.test.js.map +1 -1
  11. package/dist/module/lib/Components/CartesianChart/utils.js +18 -8
  12. package/dist/module/lib/Components/CartesianChart/utils.js.map +1 -1
  13. package/dist/module/lib/Components/Line/utils.js +6 -1
  14. package/dist/module/lib/Components/Line/utils.js.map +1 -1
  15. package/dist/module/lib/Components/Line/utils.test.js +88 -0
  16. package/dist/module/lib/Components/Line/utils.test.js.map +1 -0
  17. package/dist/module/lib/Components/LineChart/LineChart.js +19 -31
  18. package/dist/module/lib/Components/LineChart/LineChart.js.map +1 -1
  19. package/dist/module/lib/Components/LineChart/LineChart.stories.js +38 -0
  20. package/dist/module/lib/Components/LineChart/LineChart.stories.js.map +1 -1
  21. package/dist/module/lib/Components/LineChart/LineChart.test.js +192 -0
  22. package/dist/module/lib/Components/LineChart/LineChart.test.js.map +1 -1
  23. package/dist/module/lib/Components/Point/Point.js +8 -2
  24. package/dist/module/lib/Components/Point/Point.js.map +1 -1
  25. package/dist/module/lib/Components/Point/constants.js +9 -0
  26. package/dist/module/lib/Components/Point/constants.js.map +1 -0
  27. package/dist/module/lib/Components/Point/pointContext/MagneticPointsProvider.js +35 -0
  28. package/dist/module/lib/Components/Point/pointContext/MagneticPointsProvider.js.map +1 -0
  29. package/dist/module/lib/Components/Point/pointContext/MagneticPointsProvider.test.js +153 -0
  30. package/dist/module/lib/Components/Point/pointContext/MagneticPointsProvider.test.js.map +1 -0
  31. package/dist/module/lib/Components/Point/pointContext/index.js +5 -0
  32. package/dist/module/lib/Components/Point/pointContext/index.js.map +1 -0
  33. package/dist/module/lib/Components/Point/pointContext/magneticPointsContext.js +10 -0
  34. package/dist/module/lib/Components/Point/pointContext/magneticPointsContext.js.map +1 -0
  35. package/dist/module/lib/Components/Point/utils.js +26 -6
  36. package/dist/module/lib/Components/Point/utils.js.map +1 -1
  37. package/dist/module/lib/Components/Point/utils.test.js +84 -2
  38. package/dist/module/lib/Components/Point/utils.test.js.map +1 -1
  39. package/dist/module/lib/Components/ReferenceLine/utils.js.map +1 -1
  40. package/dist/module/lib/Components/Scrubber/DefaultScrubberTooltip/ChartTooltipItem.js +52 -0
  41. package/dist/module/lib/Components/Scrubber/DefaultScrubberTooltip/ChartTooltipItem.js.map +1 -0
  42. package/dist/module/lib/Components/Scrubber/DefaultScrubberTooltip/DefaultScrubberTooltip.js +81 -0
  43. package/dist/module/lib/Components/Scrubber/DefaultScrubberTooltip/DefaultScrubberTooltip.js.map +1 -0
  44. package/dist/module/lib/Components/Scrubber/DefaultScrubberTooltip/DefaultScrubberTooltip.test.js +340 -0
  45. package/dist/module/lib/Components/Scrubber/DefaultScrubberTooltip/DefaultScrubberTooltip.test.js.map +1 -0
  46. package/dist/module/lib/Components/Scrubber/DefaultScrubberTooltip/constants.js +12 -0
  47. package/dist/module/lib/Components/Scrubber/DefaultScrubberTooltip/constants.js.map +1 -0
  48. package/dist/module/lib/Components/Scrubber/DefaultScrubberTooltip/utils.js +166 -0
  49. package/dist/module/lib/Components/Scrubber/DefaultScrubberTooltip/utils.js.map +1 -0
  50. package/dist/module/lib/Components/Scrubber/DefaultScrubberTooltip/utils.test.js +253 -0
  51. package/dist/module/lib/Components/Scrubber/DefaultScrubberTooltip/utils.test.js.map +1 -0
  52. package/dist/module/lib/Components/Scrubber/Scrubber.js +40 -21
  53. package/dist/module/lib/Components/Scrubber/Scrubber.js.map +1 -1
  54. package/dist/module/lib/Components/Scrubber/Scrubber.stories.js +80 -30
  55. package/dist/module/lib/Components/Scrubber/Scrubber.stories.js.map +1 -1
  56. package/dist/module/lib/Components/Scrubber/Scrubber.test.js +10 -5
  57. package/dist/module/lib/Components/Scrubber/Scrubber.test.js.map +1 -1
  58. package/dist/module/lib/Components/Scrubber/ScrubberProvider.js +81 -29
  59. package/dist/module/lib/Components/Scrubber/ScrubberProvider.js.map +1 -1
  60. package/dist/module/lib/Components/Scrubber/utils.js +64 -0
  61. package/dist/module/lib/Components/Scrubber/utils.js.map +1 -1
  62. package/dist/module/lib/Components/Scrubber/utils.test.js +128 -1
  63. package/dist/module/lib/Components/Scrubber/utils.test.js.map +1 -1
  64. package/dist/module/lib/utils/domain/domain.js.map +1 -1
  65. package/dist/module/lib/utils/scales/scales.js +13 -4
  66. package/dist/module/lib/utils/scales/scales.js.map +1 -1
  67. package/dist/module/lib/utils/scales/scales.test.js +29 -0
  68. package/dist/module/lib/utils/scales/scales.test.js.map +1 -1
  69. package/dist/module/lib/utils/ticks/ticks.js +13 -3
  70. package/dist/module/lib/utils/ticks/ticks.js.map +1 -1
  71. package/dist/module/lib/utils/ticks/ticks.test.js +34 -0
  72. package/dist/module/lib/utils/ticks/ticks.test.js.map +1 -1
  73. package/dist/typescript/src/lib/Components/Axis/Axis.constants.d.ts +5 -0
  74. package/dist/typescript/src/lib/Components/Axis/Axis.constants.d.ts.map +1 -0
  75. package/dist/typescript/src/lib/Components/Axis/Axis.types.d.ts +39 -0
  76. package/dist/typescript/src/lib/Components/Axis/Axis.types.d.ts.map +1 -1
  77. package/dist/typescript/src/lib/Components/Axis/index.d.ts +3 -0
  78. package/dist/typescript/src/lib/Components/Axis/index.d.ts.map +1 -0
  79. package/dist/typescript/src/lib/Components/CartesianChart/CartesianChart.d.ts +1 -1
  80. package/dist/typescript/src/lib/Components/CartesianChart/CartesianChart.d.ts.map +1 -1
  81. package/dist/typescript/src/lib/Components/CartesianChart/context/useBuildChartContext.d.ts +5 -4
  82. package/dist/typescript/src/lib/Components/CartesianChart/context/useBuildChartContext.d.ts.map +1 -1
  83. package/dist/typescript/src/lib/Components/CartesianChart/types.d.ts +11 -3
  84. package/dist/typescript/src/lib/Components/CartesianChart/types.d.ts.map +1 -1
  85. package/dist/typescript/src/lib/Components/CartesianChart/utils.d.ts +18 -8
  86. package/dist/typescript/src/lib/Components/CartesianChart/utils.d.ts.map +1 -1
  87. package/dist/typescript/src/lib/Components/Line/utils.d.ts +4 -0
  88. package/dist/typescript/src/lib/Components/Line/utils.d.ts.map +1 -1
  89. package/dist/typescript/src/lib/Components/LineChart/LineChart.d.ts +1 -1
  90. package/dist/typescript/src/lib/Components/LineChart/LineChart.d.ts.map +1 -1
  91. package/dist/typescript/src/lib/Components/LineChart/types.d.ts +10 -3
  92. package/dist/typescript/src/lib/Components/LineChart/types.d.ts.map +1 -1
  93. package/dist/typescript/src/lib/Components/Point/Point.d.ts +1 -1
  94. package/dist/typescript/src/lib/Components/Point/Point.d.ts.map +1 -1
  95. package/dist/typescript/src/lib/Components/Point/constants.d.ts +7 -0
  96. package/dist/typescript/src/lib/Components/Point/constants.d.ts.map +1 -0
  97. package/dist/typescript/src/lib/Components/Point/pointContext/MagneticPointsProvider.d.ts +7 -0
  98. package/dist/typescript/src/lib/Components/Point/pointContext/MagneticPointsProvider.d.ts.map +1 -0
  99. package/dist/typescript/src/lib/Components/Point/pointContext/index.d.ts +3 -0
  100. package/dist/typescript/src/lib/Components/Point/pointContext/index.d.ts.map +1 -0
  101. package/dist/typescript/src/lib/Components/Point/pointContext/magneticPointsContext.d.ts +13 -0
  102. package/dist/typescript/src/lib/Components/Point/pointContext/magneticPointsContext.d.ts.map +1 -0
  103. package/dist/typescript/src/lib/Components/Point/types.d.ts +7 -0
  104. package/dist/typescript/src/lib/Components/Point/types.d.ts.map +1 -1
  105. package/dist/typescript/src/lib/Components/Point/utils.d.ts +8 -6
  106. package/dist/typescript/src/lib/Components/Point/utils.d.ts.map +1 -1
  107. package/dist/typescript/src/lib/Components/ReferenceLine/utils.d.ts +3 -2
  108. package/dist/typescript/src/lib/Components/ReferenceLine/utils.d.ts.map +1 -1
  109. package/dist/typescript/src/lib/Components/Scrubber/DefaultScrubberTooltip/ChartTooltipItem.d.ts +9 -0
  110. package/dist/typescript/src/lib/Components/Scrubber/DefaultScrubberTooltip/ChartTooltipItem.d.ts.map +1 -0
  111. package/dist/typescript/src/lib/Components/Scrubber/DefaultScrubberTooltip/DefaultScrubberTooltip.d.ts +12 -0
  112. package/dist/typescript/src/lib/Components/Scrubber/DefaultScrubberTooltip/DefaultScrubberTooltip.d.ts.map +1 -0
  113. package/dist/typescript/src/lib/Components/Scrubber/DefaultScrubberTooltip/constants.d.ts +10 -0
  114. package/dist/typescript/src/lib/Components/Scrubber/DefaultScrubberTooltip/constants.d.ts.map +1 -0
  115. package/dist/typescript/src/lib/Components/Scrubber/DefaultScrubberTooltip/utils.d.ts +69 -0
  116. package/dist/typescript/src/lib/Components/Scrubber/DefaultScrubberTooltip/utils.d.ts.map +1 -0
  117. package/dist/typescript/src/lib/Components/Scrubber/Scrubber.d.ts +14 -2
  118. package/dist/typescript/src/lib/Components/Scrubber/Scrubber.d.ts.map +1 -1
  119. package/dist/typescript/src/lib/Components/Scrubber/ScrubberProvider.d.ts +1 -1
  120. package/dist/typescript/src/lib/Components/Scrubber/ScrubberProvider.d.ts.map +1 -1
  121. package/dist/typescript/src/lib/Components/Scrubber/index.d.ts +1 -1
  122. package/dist/typescript/src/lib/Components/Scrubber/index.d.ts.map +1 -1
  123. package/dist/typescript/src/lib/Components/Scrubber/types.d.ts +116 -4
  124. package/dist/typescript/src/lib/Components/Scrubber/types.d.ts.map +1 -1
  125. package/dist/typescript/src/lib/Components/Scrubber/utils.d.ts +33 -3
  126. package/dist/typescript/src/lib/Components/Scrubber/utils.d.ts.map +1 -1
  127. package/dist/typescript/src/lib/utils/domain/domain.d.ts +5 -4
  128. package/dist/typescript/src/lib/utils/domain/domain.d.ts.map +1 -1
  129. package/dist/typescript/src/lib/utils/index.d.ts +1 -1
  130. package/dist/typescript/src/lib/utils/index.d.ts.map +1 -1
  131. package/dist/typescript/src/lib/utils/scales/scales.d.ts +11 -5
  132. package/dist/typescript/src/lib/utils/scales/scales.d.ts.map +1 -1
  133. package/dist/typescript/src/lib/utils/ticks/ticks.d.ts +13 -5
  134. package/dist/typescript/src/lib/utils/ticks/ticks.d.ts.map +1 -1
  135. package/dist/typescript/src/lib/utils/types.d.ts +3 -28
  136. package/dist/typescript/src/lib/utils/types.d.ts.map +1 -1
  137. package/package.json +4 -4
  138. package/src/lib/Components/Axis/Axis.constants.ts +23 -0
  139. package/src/lib/Components/Axis/Axis.types.ts +40 -0
  140. package/src/lib/Components/Axis/index.ts +2 -0
  141. package/src/lib/Components/CartesianChart/CartesianChart.tsx +39 -24
  142. package/src/lib/Components/CartesianChart/context/useBuildChartContext.test.ts +56 -0
  143. package/src/lib/Components/CartesianChart/context/useBuildChartContext.ts +8 -8
  144. package/src/lib/Components/CartesianChart/types.ts +11 -3
  145. package/src/lib/Components/CartesianChart/utils.ts +18 -8
  146. package/src/lib/Components/Line/utils.test.ts +90 -0
  147. package/src/lib/Components/Line/utils.ts +6 -1
  148. package/src/lib/Components/LineChart/LineChart.stories.tsx +36 -0
  149. package/src/lib/Components/LineChart/LineChart.test.tsx +156 -0
  150. package/src/lib/Components/LineChart/LineChart.tsx +30 -40
  151. package/src/lib/Components/LineChart/types.ts +10 -3
  152. package/src/lib/Components/Point/Point.tsx +9 -3
  153. package/src/lib/Components/Point/constants.ts +6 -0
  154. package/src/lib/Components/Point/pointContext/MagneticPointsProvider.test.tsx +162 -0
  155. package/src/lib/Components/Point/pointContext/MagneticPointsProvider.tsx +45 -0
  156. package/src/lib/Components/Point/pointContext/index.ts +5 -0
  157. package/src/lib/Components/Point/pointContext/magneticPointsContext.ts +19 -0
  158. package/src/lib/Components/Point/types.ts +7 -0
  159. package/src/lib/Components/Point/utils.test.ts +95 -5
  160. package/src/lib/Components/Point/utils.ts +35 -7
  161. package/src/lib/Components/ReferenceLine/utils.ts +4 -7
  162. package/src/lib/Components/Scrubber/DefaultScrubberTooltip/ChartTooltipItem.tsx +54 -0
  163. package/src/lib/Components/Scrubber/DefaultScrubberTooltip/DefaultScrubberTooltip.test.tsx +259 -0
  164. package/src/lib/Components/Scrubber/DefaultScrubberTooltip/DefaultScrubberTooltip.tsx +105 -0
  165. package/src/lib/Components/Scrubber/DefaultScrubberTooltip/constants.ts +9 -0
  166. package/src/lib/Components/Scrubber/DefaultScrubberTooltip/utils.test.ts +264 -0
  167. package/src/lib/Components/Scrubber/DefaultScrubberTooltip/utils.ts +243 -0
  168. package/src/lib/Components/Scrubber/Scrubber.stories.tsx +104 -42
  169. package/src/lib/Components/Scrubber/Scrubber.test.tsx +7 -5
  170. package/src/lib/Components/Scrubber/Scrubber.tsx +47 -24
  171. package/src/lib/Components/Scrubber/ScrubberProvider.tsx +92 -28
  172. package/src/lib/Components/Scrubber/index.ts +10 -1
  173. package/src/lib/Components/Scrubber/types.ts +122 -4
  174. package/src/lib/Components/Scrubber/utils.test.ts +150 -0
  175. package/src/lib/Components/Scrubber/utils.ts +93 -3
  176. package/src/lib/utils/domain/domain.ts +6 -5
  177. package/src/lib/utils/index.ts +0 -2
  178. package/src/lib/utils/scales/scales.test.ts +19 -0
  179. package/src/lib/utils/scales/scales.ts +15 -9
  180. package/src/lib/utils/ticks/ticks.test.ts +45 -0
  181. package/src/lib/utils/ticks/ticks.ts +19 -9
  182. package/src/lib/utils/types.ts +3 -26
@@ -0,0 +1,340 @@
1
+ "use strict";
2
+
3
+ import { describe, expect, it, jest } from '@jest/globals';
4
+ import { ledgerLiveThemes } from '@ledgerhq/lumen-design-core';
5
+ import { ThemeProvider } from '@ledgerhq/lumen-ui-rnative';
6
+ import { render } from '@testing-library/react-native';
7
+ import { CartesianChart } from "../../CartesianChart/index.js";
8
+ import { ScrubberContextProvider } from "../context/index.js";
9
+ import { Scrubber } from "../Scrubber.js";
10
+ import { jsx as _jsx } from "react/jsx-runtime";
11
+ const sampleSeries = [{
12
+ id: 's1',
13
+ stroke: '#7B61FF',
14
+ data: [10, 20, 30, 40, 50]
15
+ }];
16
+ const Wrapper = ({
17
+ children
18
+ }) => /*#__PURE__*/_jsx(ThemeProvider, {
19
+ themes: ledgerLiveThemes,
20
+ colorScheme: "light",
21
+ children: children
22
+ });
23
+ const activeScrubberContext = {
24
+ enableScrubbing: true,
25
+ scrubberPosition: 2,
26
+ onScrubberPositionChange: () => undefined
27
+ };
28
+ const idleScrubberContext = {
29
+ enableScrubbing: true,
30
+ scrubberPosition: undefined,
31
+ onScrubberPositionChange: () => undefined
32
+ };
33
+ const renderTooltip = ({
34
+ scrubberProps = {
35
+ tooltip: () => ({
36
+ items: []
37
+ })
38
+ },
39
+ scrubberContext = activeScrubberContext,
40
+ width = 400,
41
+ height = 200
42
+ } = {}) => render(/*#__PURE__*/_jsx(Wrapper, {
43
+ children: /*#__PURE__*/_jsx(CartesianChart, {
44
+ series: sampleSeries,
45
+ width: width,
46
+ height: height,
47
+ children: /*#__PURE__*/_jsx(ScrubberContextProvider, {
48
+ value: scrubberContext,
49
+ children: /*#__PURE__*/_jsx(Scrubber, {
50
+ ...scrubberProps
51
+ })
52
+ })
53
+ })
54
+ }));
55
+ describe('DefaultScrubberTooltip', () => {
56
+ it('renders nothing when no scrubber position is active', () => {
57
+ const {
58
+ queryByTestId
59
+ } = renderTooltip({
60
+ scrubberProps: {
61
+ tooltip: () => ({
62
+ items: [{
63
+ label: 'Date',
64
+ value: 'Jan'
65
+ }]
66
+ })
67
+ },
68
+ scrubberContext: idleScrubberContext
69
+ });
70
+ expect(queryByTestId('chart-tooltip')).toBeNull();
71
+ });
72
+ it('renders nothing when items callback returns an empty array', () => {
73
+ const {
74
+ queryByTestId
75
+ } = renderTooltip({
76
+ scrubberProps: {
77
+ tooltip: () => ({
78
+ items: []
79
+ })
80
+ }
81
+ });
82
+ expect(queryByTestId('chart-tooltip')).toBeNull();
83
+ });
84
+ it('renders the tooltip group when scrubber is active and items are provided', () => {
85
+ const {
86
+ getByTestId
87
+ } = renderTooltip({
88
+ scrubberProps: {
89
+ tooltip: () => ({
90
+ items: [{
91
+ label: 'Date',
92
+ value: 'Jan'
93
+ }]
94
+ })
95
+ }
96
+ });
97
+ expect(getByTestId('chart-tooltip')).toBeTruthy();
98
+ });
99
+ it('renders the background rect', () => {
100
+ const {
101
+ getByTestId
102
+ } = renderTooltip({
103
+ scrubberProps: {
104
+ tooltip: () => ({
105
+ items: [{
106
+ label: 'Date',
107
+ value: 'Jan'
108
+ }]
109
+ })
110
+ }
111
+ });
112
+ expect(getByTestId('chart-tooltip-rect')).toBeTruthy();
113
+ });
114
+ it('renders item label and value text', () => {
115
+ const {
116
+ getByText
117
+ } = renderTooltip({
118
+ scrubberProps: {
119
+ tooltip: () => ({
120
+ items: [{
121
+ label: 'Date',
122
+ value: 'Jan'
123
+ }]
124
+ })
125
+ }
126
+ });
127
+ expect(getByText('Date')).toBeTruthy();
128
+ expect(getByText('Jan')).toBeTruthy();
129
+ });
130
+ it('renders multiple items', () => {
131
+ const {
132
+ getByText
133
+ } = renderTooltip({
134
+ scrubberProps: {
135
+ tooltip: () => ({
136
+ items: [{
137
+ label: 'Date',
138
+ value: 'Jan'
139
+ }, {
140
+ label: 'Price',
141
+ value: '$10'
142
+ }]
143
+ })
144
+ }
145
+ });
146
+ expect(getByText('Date')).toBeTruthy();
147
+ expect(getByText('Jan')).toBeTruthy();
148
+ expect(getByText('Price')).toBeTruthy();
149
+ expect(getByText('$10')).toBeTruthy();
150
+ });
151
+ it('passes the active data index to the tooltip callback', () => {
152
+ const tooltip = jest.fn().mockReturnValue({
153
+ items: [{
154
+ label: 'i',
155
+ value: '0'
156
+ }]
157
+ });
158
+ renderTooltip({
159
+ scrubberProps: {
160
+ tooltip
161
+ }
162
+ });
163
+ expect(tooltip).toHaveBeenCalledWith(activeScrubberContext.scrubberPosition);
164
+ });
165
+ it('suppresses the tooltip when items returns empty for the active index', () => {
166
+ const {
167
+ queryByTestId
168
+ } = renderTooltip({
169
+ scrubberProps: {
170
+ tooltip: () => ({
171
+ items: []
172
+ })
173
+ }
174
+ });
175
+ expect(queryByTestId('chart-tooltip')).toBeNull();
176
+ });
177
+ describe('positioning logic', () => {
178
+ const defaultTooltip = () => ({
179
+ items: [{
180
+ label: 'Date',
181
+ value: 'Jan'
182
+ }]
183
+ });
184
+ const scrubberAt = position => ({
185
+ enableScrubbing: true,
186
+ scrubberPosition: position,
187
+ onScrubberPositionChange: () => undefined
188
+ });
189
+ it('places tooltip to the right of the scrubber when mid-chart', () => {
190
+ const {
191
+ getByTestId
192
+ } = renderTooltip({
193
+ scrubberProps: {
194
+ tooltip: defaultTooltip
195
+ },
196
+ scrubberContext: scrubberAt(2)
197
+ });
198
+ expect(getByTestId('chart-tooltip-rect').props.x).toBe(260);
199
+ });
200
+ it('flips tooltip left when right side would overflow (index 3)', () => {
201
+ const {
202
+ getByTestId
203
+ } = renderTooltip({
204
+ scrubberProps: {
205
+ tooltip: () => ({
206
+ ...defaultTooltip(),
207
+ minWidth: 120
208
+ })
209
+ },
210
+ scrubberContext: scrubberAt(3)
211
+ });
212
+ expect(getByTestId('chart-tooltip-rect').props.x).toBe(220);
213
+ });
214
+ it('flips at the rightmost scrubber position (index 4)', () => {
215
+ const {
216
+ getByTestId
217
+ } = renderTooltip({
218
+ scrubberProps: {
219
+ tooltip: () => ({
220
+ ...defaultTooltip(),
221
+ minWidth: 120
222
+ })
223
+ },
224
+ scrubberContext: scrubberAt(4)
225
+ });
226
+ expect(getByTestId('chart-tooltip-rect').props.x).toBe(320);
227
+ });
228
+ it('custom offset shifts the no-flip tooltip position', () => {
229
+ const {
230
+ getByTestId
231
+ } = renderTooltip({
232
+ scrubberProps: {
233
+ tooltip: () => ({
234
+ ...defaultTooltip(),
235
+ offset: 20
236
+ })
237
+ },
238
+ scrubberContext: scrubberAt(2)
239
+ });
240
+ expect(getByTestId('chart-tooltip-rect').props.x).toBe(270);
241
+ });
242
+ it('wider minWidth can trigger a flip that the default width would not', () => {
243
+ const {
244
+ getByTestId
245
+ } = renderTooltip({
246
+ scrubberProps: {
247
+ tooltip: () => ({
248
+ ...defaultTooltip(),
249
+ minWidth: 200
250
+ })
251
+ },
252
+ scrubberContext: scrubberAt(2)
253
+ });
254
+ expect(getByTestId('chart-tooltip-rect').props.x).toBe(50);
255
+ });
256
+ });
257
+ describe('title in tooltip content', () => {
258
+ it('renders a static string title', () => {
259
+ const {
260
+ getByTestId,
261
+ getByText
262
+ } = renderTooltip({
263
+ scrubberProps: {
264
+ tooltip: () => ({
265
+ title: 'My Title',
266
+ items: [{
267
+ label: 'T',
268
+ value: 'V'
269
+ }]
270
+ })
271
+ }
272
+ });
273
+ expect(getByTestId('chart-tooltip-title')).toBeTruthy();
274
+ expect(getByText('My Title')).toBeTruthy();
275
+ });
276
+ it('renders the title returned by a callback', () => {
277
+ const {
278
+ getByTestId
279
+ } = renderTooltip({
280
+ scrubberProps: {
281
+ tooltip: () => ({
282
+ title: i => `Index ${i}`,
283
+ items: [{
284
+ label: 'T',
285
+ value: 'V'
286
+ }]
287
+ })
288
+ }
289
+ });
290
+ expect(getByTestId('chart-tooltip-title')).toBeTruthy();
291
+ });
292
+ it('passes the active data index to the title callback', () => {
293
+ const title = jest.fn().mockReturnValue('Title');
294
+ renderTooltip({
295
+ scrubberProps: {
296
+ tooltip: () => ({
297
+ title,
298
+ items: [{
299
+ label: 'T',
300
+ value: 'V'
301
+ }]
302
+ })
303
+ }
304
+ });
305
+ expect(title).toHaveBeenCalledWith(activeScrubberContext.scrubberPosition);
306
+ });
307
+ it('does not render a title element when title is undefined', () => {
308
+ const {
309
+ queryByTestId
310
+ } = renderTooltip({
311
+ scrubberProps: {
312
+ tooltip: () => ({
313
+ items: [{
314
+ label: 'T',
315
+ value: 'V'
316
+ }]
317
+ })
318
+ }
319
+ });
320
+ expect(queryByTestId('chart-tooltip-title')).toBeNull();
321
+ });
322
+ it('does not render a title element when title callback returns undefined', () => {
323
+ const {
324
+ queryByTestId
325
+ } = renderTooltip({
326
+ scrubberProps: {
327
+ tooltip: () => ({
328
+ title: () => undefined,
329
+ items: [{
330
+ label: 'T',
331
+ value: 'V'
332
+ }]
333
+ })
334
+ }
335
+ });
336
+ expect(queryByTestId('chart-tooltip-title')).toBeNull();
337
+ });
338
+ });
339
+ });
340
+ //# sourceMappingURL=DefaultScrubberTooltip.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["describe","expect","it","jest","ledgerLiveThemes","ThemeProvider","render","CartesianChart","ScrubberContextProvider","Scrubber","jsx","_jsx","sampleSeries","id","stroke","data","Wrapper","children","themes","colorScheme","activeScrubberContext","enableScrubbing","scrubberPosition","onScrubberPositionChange","undefined","idleScrubberContext","renderTooltip","scrubberProps","tooltip","items","scrubberContext","width","height","series","value","queryByTestId","label","toBeNull","getByTestId","toBeTruthy","getByText","fn","mockReturnValue","toHaveBeenCalledWith","defaultTooltip","scrubberAt","position","props","x","toBe","minWidth","offset","title","i"],"sourceRoot":"../../../../../../src","sources":["lib/Components/Scrubber/DefaultScrubberTooltip/DefaultScrubberTooltip.test.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ export const DEFAULT_OFFSET = 10;
4
+ export const DEFAULT_TOOLTIP_MIN_WIDTH = 80;
5
+ export const PADDING_X = 8;
6
+ export const PADDING_Y = 8;
7
+ export const ROW_HEIGHT = 16;
8
+ export const ROW_GAP = 6;
9
+ export const TITLE_GAP = 6;
10
+ export const BORDER_RADIUS = 4;
11
+ export const LABEL_VALUE_GAP = 12;
12
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DEFAULT_OFFSET","DEFAULT_TOOLTIP_MIN_WIDTH","PADDING_X","PADDING_Y","ROW_HEIGHT","ROW_GAP","TITLE_GAP","BORDER_RADIUS","LABEL_VALUE_GAP"],"sourceRoot":"../../../../../../src","sources":["lib/Components/Scrubber/DefaultScrubberTooltip/constants.ts"],"mappings":";;AAAA,OAAO,MAAMA,cAAc,GAAG,EAAE;AAChC,OAAO,MAAMC,yBAAyB,GAAG,EAAE;AAC3C,OAAO,MAAMC,SAAS,GAAG,CAAC;AAC1B,OAAO,MAAMC,SAAS,GAAG,CAAC;AAC1B,OAAO,MAAMC,UAAU,GAAG,EAAE;AAC5B,OAAO,MAAMC,OAAO,GAAG,CAAC;AACxB,OAAO,MAAMC,SAAS,GAAG,CAAC;AAC1B,OAAO,MAAMC,aAAa,GAAG,CAAC;AAC9B,OAAO,MAAMC,eAAe,GAAG,EAAE","ignoreList":[]}
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+
3
+ import { useEffect, useMemo, useRef, useState } from 'react';
4
+ import { LABEL_VALUE_GAP, PADDING_X, PADDING_Y, ROW_GAP, ROW_HEIGHT, TITLE_GAP } from "./constants.js";
5
+ export const safeGetBBoxWidth = async el => {
6
+ if (!el) return 0;
7
+ try {
8
+ const result = await el.getBBox();
9
+ return result?.width ?? 0;
10
+ } catch {
11
+ return 0;
12
+ }
13
+ };
14
+
15
+ /**
16
+ * Derive the auto-fit tooltip width from measured text widths,
17
+ * clamped to a minimum floor.
18
+ */
19
+ export const computeTooltipWidth = (widths, hasTitle, minWidth) => {
20
+ const titleWidth = widths && hasTitle ? widths.title : 0;
21
+ const rowWidths = widths ? widths.labels.map((lw, i) => lw + LABEL_VALUE_GAP + (widths.values[i] ?? 0)) : [];
22
+ const contentWidth = Math.max(titleWidth, ...rowWidths);
23
+ const fitWidth = contentWidth + PADDING_X * 2;
24
+ return Math.max(fitWidth, minWidth);
25
+ };
26
+
27
+ /**
28
+ * Compute the tooltip's horizontal position, flipping to the left
29
+ * of the scrubber line when it would overflow the drawing area.
30
+ * Also clamps from above to prevent overflow on the right edge.
31
+ */
32
+ export const computeTooltipX = (pixelX, offset, tooltipWidth, drawingArea) => {
33
+ const shouldFlip = pixelX + offset + tooltipWidth > drawingArea.x + drawingArea.width;
34
+ const preferredTooltipX = shouldFlip ? pixelX - offset - tooltipWidth : pixelX + offset;
35
+ const maxTooltipX = Math.max(drawingArea.x, drawingArea.x + drawingArea.width - tooltipWidth);
36
+ return Math.min(maxTooltipX, Math.max(drawingArea.x, preferredTooltipX));
37
+ };
38
+
39
+ /**
40
+ * Compute the total tooltip height from item count and title presence.
41
+ */
42
+ export const computeTooltipHeight = (itemCount, hasTitle) => {
43
+ const titleBlockHeight = hasTitle ? ROW_HEIGHT + TITLE_GAP : 0;
44
+ return PADDING_Y * 2 + titleBlockHeight + itemCount * ROW_HEIGHT + (itemCount - 1) * ROW_GAP;
45
+ };
46
+
47
+ /**
48
+ * Vertical offset where tooltip rows begin, accounting for title presence.
49
+ */
50
+ export const computeItemsBaseY = (drawingAreaY, hasTitle) => {
51
+ const titleBlockHeight = hasTitle ? ROW_HEIGHT + TITLE_GAP : 0;
52
+ return drawingAreaY + PADDING_Y + titleBlockHeight;
53
+ };
54
+ const waitForAnimationFrame = () => {
55
+ let id;
56
+ const promise = new Promise(resolve => {
57
+ id = requestAnimationFrame(() => resolve());
58
+ });
59
+ return {
60
+ promise,
61
+ cancel: () => cancelAnimationFrame(id)
62
+ };
63
+ };
64
+
65
+ /**
66
+ * Reads the rendered widths of all tooltip text elements via async `getBBox`.
67
+ * Defers until the next animation frame so layout has settled.
68
+ * Returns a cancel function so callers can abort the pending RAF.
69
+ */
70
+ export const measureWidths = (items, hasTitle, titleRef, labelRefs, valueRefs) => {
71
+ const raf = waitForAnimationFrame();
72
+ const promise = raf.promise.then(async () => {
73
+ const title = hasTitle ? await safeGetBBoxWidth(titleRef.current) : 0;
74
+ const labels = await Promise.all(items.map((_, i) => safeGetBBoxWidth(labelRefs.current[i])));
75
+ const values = await Promise.all(items.map((_, i) => safeGetBBoxWidth(valueRefs.current[i])));
76
+ return {
77
+ title,
78
+ labels,
79
+ values
80
+ };
81
+ });
82
+ return {
83
+ promise,
84
+ cancel: raf.cancel
85
+ };
86
+ };
87
+
88
+ /**
89
+ * Builds a stable string signature for the tooltip's content shape (labels,
90
+ * title, and item count). Used as the sole dependency of the measurement
91
+ * effect so re-measurement only happens when something that can change the
92
+ * tooltip's natural width actually changes — typically once per shape change,
93
+ * not on every scrub frame as value strings update.
94
+ */
95
+ const computeShapeSignature = (items, hasTitle, title) => {
96
+ let labels = '';
97
+ for (let i = 0; i < items.length; i++) {
98
+ if (i > 0) labels += '\u001F';
99
+ labels += String(items[i].label);
100
+ }
101
+ return `${hasTitle ? '1' : '0'}|${labels}|${title ?? ''}`;
102
+ };
103
+
104
+ /**
105
+ * Manages SVG text measurement for the tooltip via async `getBBox`.
106
+ *
107
+ * Uses `requestAnimationFrame` to defer measurement until after layout, with a
108
+ * cancellation flag to prevent stale state updates when items change rapidly.
109
+ *
110
+ * The effect's dependency is a shape signature (labels + title + count) rather
111
+ * than the raw `items` reference, so high-frequency value updates during a
112
+ * scrub do not trigger a fresh measurement chain. Value-width auto-fit is
113
+ * handled by `minWidth`; consumers that need pixel-perfect value fitting
114
+ * should set a `minWidth` large enough to cover the widest value.
115
+ */
116
+ export function useTooltipMeasurement(items, hasTitle, title) {
117
+ const titleRef = useRef(null);
118
+ const labelRefs = useRef([]);
119
+ const valueRefs = useRef([]);
120
+ const [widths, setWidths] = useState(null);
121
+ const shapeKey = computeShapeSignature(items, hasTitle, title);
122
+ const itemsRef = useRef(items);
123
+ itemsRef.current = items;
124
+ const hasTitleRef = useRef(hasTitle);
125
+ hasTitleRef.current = hasTitle;
126
+ useEffect(() => {
127
+ if (itemsRef.current.length === 0) return;
128
+ let cancelled = false;
129
+ const {
130
+ promise,
131
+ cancel
132
+ } = measureWidths(itemsRef.current, hasTitleRef.current, titleRef, labelRefs, valueRefs);
133
+ void promise.then(result => {
134
+ if (!cancelled) setWidths(result);
135
+ });
136
+ return () => {
137
+ cancelled = true;
138
+ cancel();
139
+ };
140
+ }, [shapeKey]);
141
+ return {
142
+ widths,
143
+ titleRef,
144
+ labelRefs,
145
+ valueRefs
146
+ };
147
+ }
148
+ /**
149
+ * Builds stable per-index ref-callback arrays that mutate the given refs in
150
+ * place. Recomputed only when `length` changes, so the same callback identity
151
+ * is passed to each `ChartTooltipItem` across scrub frames. This unlocks
152
+ * `React.memo` on `ChartTooltipItem` and avoids the per-frame detach /
153
+ * re-attach dance of inline arrow ref callbacks.
154
+ */
155
+ export const useBuildRefSetters = (refs, length) => {
156
+ return useMemo(() => {
157
+ const setters = new Array(length);
158
+ for (let i = 0; i < length; i++) {
159
+ setters[i] = el => {
160
+ refs.current[i] = el;
161
+ };
162
+ }
163
+ return setters;
164
+ }, [refs, length]);
165
+ };
166
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useEffect","useMemo","useRef","useState","LABEL_VALUE_GAP","PADDING_X","PADDING_Y","ROW_GAP","ROW_HEIGHT","TITLE_GAP","safeGetBBoxWidth","el","result","getBBox","width","computeTooltipWidth","widths","hasTitle","minWidth","titleWidth","title","rowWidths","labels","map","lw","i","values","contentWidth","Math","max","fitWidth","computeTooltipX","pixelX","offset","tooltipWidth","drawingArea","shouldFlip","x","preferredTooltipX","maxTooltipX","min","computeTooltipHeight","itemCount","titleBlockHeight","computeItemsBaseY","drawingAreaY","waitForAnimationFrame","id","promise","Promise","resolve","requestAnimationFrame","cancel","cancelAnimationFrame","measureWidths","items","titleRef","labelRefs","valueRefs","raf","then","current","all","_","computeShapeSignature","length","String","label","useTooltipMeasurement","setWidths","shapeKey","itemsRef","hasTitleRef","cancelled","useBuildRefSetters","refs","setters","Array"],"sourceRoot":"../../../../../../src","sources":["lib/Components/Scrubber/DefaultScrubberTooltip/utils.ts"],"mappings":"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","ignoreList":[]}