@coinbase/cds-mobile-visualization 3.4.0-beta.9 → 3.4.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 (167) hide show
  1. package/CHANGELOG.md +132 -0
  2. package/dts/chart/CartesianChart.d.ts +92 -7
  3. package/dts/chart/CartesianChart.d.ts.map +1 -1
  4. package/dts/chart/ChartContextBridge.d.ts.map +1 -1
  5. package/dts/chart/ChartProvider.d.ts +3 -0
  6. package/dts/chart/ChartProvider.d.ts.map +1 -1
  7. package/dts/chart/Path.d.ts +36 -13
  8. package/dts/chart/Path.d.ts.map +1 -1
  9. package/dts/chart/PeriodSelector.d.ts +20 -5
  10. package/dts/chart/PeriodSelector.d.ts.map +1 -1
  11. package/dts/chart/area/Area.d.ts +14 -11
  12. package/dts/chart/area/Area.d.ts.map +1 -1
  13. package/dts/chart/area/AreaChart.d.ts +33 -9
  14. package/dts/chart/area/AreaChart.d.ts.map +1 -1
  15. package/dts/chart/area/DottedArea.d.ts.map +1 -1
  16. package/dts/chart/area/GradientArea.d.ts.map +1 -1
  17. package/dts/chart/area/SolidArea.d.ts.map +1 -1
  18. package/dts/chart/axis/Axis.d.ts +22 -42
  19. package/dts/chart/axis/Axis.d.ts.map +1 -1
  20. package/dts/chart/axis/XAxis.d.ts +6 -0
  21. package/dts/chart/axis/XAxis.d.ts.map +1 -1
  22. package/dts/chart/axis/YAxis.d.ts +1 -0
  23. package/dts/chart/axis/YAxis.d.ts.map +1 -1
  24. package/dts/chart/bar/Bar.d.ts +51 -51
  25. package/dts/chart/bar/Bar.d.ts.map +1 -1
  26. package/dts/chart/bar/BarChart.d.ts +56 -11
  27. package/dts/chart/bar/BarChart.d.ts.map +1 -1
  28. package/dts/chart/bar/BarPlot.d.ts +2 -1
  29. package/dts/chart/bar/BarPlot.d.ts.map +1 -1
  30. package/dts/chart/bar/BarStack.d.ts +45 -20
  31. package/dts/chart/bar/BarStack.d.ts.map +1 -1
  32. package/dts/chart/bar/BarStackGroup.d.ts +2 -1
  33. package/dts/chart/bar/BarStackGroup.d.ts.map +1 -1
  34. package/dts/chart/bar/DefaultBar.d.ts.map +1 -1
  35. package/dts/chart/bar/DefaultBarStack.d.ts.map +1 -1
  36. package/dts/chart/gradient/Gradient.d.ts +5 -0
  37. package/dts/chart/gradient/Gradient.d.ts.map +1 -1
  38. package/dts/chart/index.d.ts +1 -0
  39. package/dts/chart/index.d.ts.map +1 -1
  40. package/dts/chart/legend/DefaultLegendEntry.d.ts +5 -0
  41. package/dts/chart/legend/DefaultLegendEntry.d.ts.map +1 -0
  42. package/dts/chart/legend/DefaultLegendShape.d.ts +5 -0
  43. package/dts/chart/legend/DefaultLegendShape.d.ts.map +1 -0
  44. package/dts/chart/legend/Legend.d.ts +168 -0
  45. package/dts/chart/legend/Legend.d.ts.map +1 -0
  46. package/dts/chart/legend/index.d.ts +4 -0
  47. package/dts/chart/legend/index.d.ts.map +1 -0
  48. package/dts/chart/line/DottedLine.d.ts.map +1 -1
  49. package/dts/chart/line/Line.d.ts +23 -19
  50. package/dts/chart/line/Line.d.ts.map +1 -1
  51. package/dts/chart/line/LineChart.d.ts +26 -9
  52. package/dts/chart/line/LineChart.d.ts.map +1 -1
  53. package/dts/chart/line/ReferenceLine.d.ts +1 -0
  54. package/dts/chart/line/ReferenceLine.d.ts.map +1 -1
  55. package/dts/chart/line/SolidLine.d.ts.map +1 -1
  56. package/dts/chart/point/Point.d.ts +26 -2
  57. package/dts/chart/point/Point.d.ts.map +1 -1
  58. package/dts/chart/scrubber/DefaultScrubberBeacon.d.ts +32 -2
  59. package/dts/chart/scrubber/DefaultScrubberBeacon.d.ts.map +1 -1
  60. package/dts/chart/scrubber/DefaultScrubberLabel.d.ts +2 -1
  61. package/dts/chart/scrubber/DefaultScrubberLabel.d.ts.map +1 -1
  62. package/dts/chart/scrubber/Scrubber.d.ts +86 -17
  63. package/dts/chart/scrubber/Scrubber.d.ts.map +1 -1
  64. package/dts/chart/scrubber/ScrubberAccessibilityView.d.ts +12 -0
  65. package/dts/chart/scrubber/ScrubberAccessibilityView.d.ts.map +1 -0
  66. package/dts/chart/scrubber/ScrubberBeaconGroup.d.ts +10 -0
  67. package/dts/chart/scrubber/ScrubberBeaconGroup.d.ts.map +1 -1
  68. package/dts/chart/scrubber/ScrubberBeaconLabelGroup.d.ts +16 -1
  69. package/dts/chart/scrubber/ScrubberBeaconLabelGroup.d.ts.map +1 -1
  70. package/dts/chart/scrubber/ScrubberProvider.d.ts.map +1 -1
  71. package/dts/chart/utils/axis.d.ts +45 -10
  72. package/dts/chart/utils/axis.d.ts.map +1 -1
  73. package/dts/chart/utils/bar.d.ts +190 -0
  74. package/dts/chart/utils/bar.d.ts.map +1 -1
  75. package/dts/chart/utils/chart.d.ts +32 -0
  76. package/dts/chart/utils/chart.d.ts.map +1 -1
  77. package/dts/chart/utils/context.d.ts +21 -6
  78. package/dts/chart/utils/context.d.ts.map +1 -1
  79. package/dts/chart/utils/gradient.d.ts +3 -1
  80. package/dts/chart/utils/gradient.d.ts.map +1 -1
  81. package/dts/chart/utils/path.d.ts +26 -0
  82. package/dts/chart/utils/path.d.ts.map +1 -1
  83. package/dts/chart/utils/point.d.ts +24 -12
  84. package/dts/chart/utils/point.d.ts.map +1 -1
  85. package/dts/chart/utils/scale.d.ts +11 -0
  86. package/dts/chart/utils/scale.d.ts.map +1 -1
  87. package/dts/chart/utils/scrubber.d.ts +2 -1
  88. package/dts/chart/utils/scrubber.d.ts.map +1 -1
  89. package/dts/chart/utils/transition.d.ts +63 -22
  90. package/dts/chart/utils/transition.d.ts.map +1 -1
  91. package/dts/sparkline/Sparkline.d.ts +2 -1
  92. package/dts/sparkline/Sparkline.d.ts.map +1 -1
  93. package/dts/sparkline/SparklineArea.d.ts +2 -1
  94. package/dts/sparkline/SparklineArea.d.ts.map +1 -1
  95. package/dts/sparkline/SparklineGradient.d.ts +2 -1
  96. package/dts/sparkline/SparklineGradient.d.ts.map +1 -1
  97. package/dts/sparkline/sparkline-interactive/SparklineInteractive.d.ts +2 -1
  98. package/dts/sparkline/sparkline-interactive/SparklineInteractive.d.ts.map +1 -1
  99. package/esm/chart/CartesianChart.js +176 -82
  100. package/esm/chart/ChartContextBridge.js +14 -3
  101. package/esm/chart/ChartProvider.js +2 -2
  102. package/esm/chart/Path.js +34 -29
  103. package/esm/chart/PeriodSelector.js +5 -1
  104. package/esm/chart/__stories__/CartesianChart.stories.js +16 -80
  105. package/esm/chart/__stories__/ChartAccessibility.stories.js +721 -0
  106. package/esm/chart/__stories__/ChartTransitions.stories.js +625 -0
  107. package/esm/chart/__stories__/PeriodSelector.stories.js +99 -1
  108. package/esm/chart/area/Area.js +21 -9
  109. package/esm/chart/area/AreaChart.js +18 -13
  110. package/esm/chart/area/DottedArea.js +28 -18
  111. package/esm/chart/area/GradientArea.js +14 -7
  112. package/esm/chart/area/SolidArea.js +6 -2
  113. package/esm/chart/area/__stories__/AreaChart.stories.js +47 -5
  114. package/esm/chart/axis/Axis.js +5 -41
  115. package/esm/chart/axis/XAxis.js +116 -47
  116. package/esm/chart/axis/YAxis.js +105 -26
  117. package/esm/chart/axis/__stories__/Axis.stories.js +324 -48
  118. package/esm/chart/bar/Bar.js +17 -15
  119. package/esm/chart/bar/BarChart.js +38 -33
  120. package/esm/chart/bar/BarPlot.js +40 -45
  121. package/esm/chart/bar/BarStack.js +92 -475
  122. package/esm/chart/bar/BarStackGroup.js +37 -27
  123. package/esm/chart/bar/DefaultBar.js +27 -18
  124. package/esm/chart/bar/DefaultBarStack.js +25 -9
  125. package/esm/chart/bar/__stories__/BarChart.stories.js +728 -54
  126. package/esm/chart/gradient/Gradient.js +2 -1
  127. package/esm/chart/index.js +1 -0
  128. package/esm/chart/legend/DefaultLegendEntry.js +42 -0
  129. package/esm/chart/legend/DefaultLegendShape.js +64 -0
  130. package/esm/chart/legend/Legend.js +59 -0
  131. package/esm/chart/legend/__stories__/Legend.stories.js +574 -0
  132. package/esm/chart/legend/index.js +3 -0
  133. package/esm/chart/line/DottedLine.js +6 -2
  134. package/esm/chart/line/Line.js +42 -38
  135. package/esm/chart/line/LineChart.js +36 -12
  136. package/esm/chart/line/SolidLine.js +6 -2
  137. package/esm/chart/line/__stories__/LineChart.stories.js +236 -590
  138. package/esm/chart/line/__stories__/ReferenceLine.stories.js +95 -1
  139. package/esm/chart/point/Point.js +35 -36
  140. package/esm/chart/scrubber/DefaultScrubberBeacon.js +41 -38
  141. package/esm/chart/scrubber/DefaultScrubberLabel.js +26 -10
  142. package/esm/chart/scrubber/Scrubber.js +67 -35
  143. package/esm/chart/scrubber/ScrubberAccessibilityView.js +177 -0
  144. package/esm/chart/scrubber/ScrubberBeaconGroup.js +30 -22
  145. package/esm/chart/scrubber/ScrubberBeaconLabelGroup.js +35 -8
  146. package/esm/chart/scrubber/ScrubberProvider.js +29 -24
  147. package/esm/chart/scrubber/__stories__/Scrubber.stories.js +946 -0
  148. package/esm/chart/utils/axis.js +88 -44
  149. package/esm/chart/utils/bar.js +820 -0
  150. package/esm/chart/utils/chart.js +34 -7
  151. package/esm/chart/utils/context.js +7 -0
  152. package/esm/chart/utils/gradient.js +8 -4
  153. package/esm/chart/utils/path.js +91 -61
  154. package/esm/chart/utils/point.js +92 -39
  155. package/esm/chart/utils/scale.js +13 -2
  156. package/esm/chart/utils/scrubber.js +12 -5
  157. package/esm/chart/utils/transition.js +108 -60
  158. package/esm/sparkline/Sparkline.js +2 -1
  159. package/esm/sparkline/SparklineArea.js +2 -1
  160. package/esm/sparkline/SparklineGradient.js +2 -1
  161. package/esm/sparkline/__figma__/Sparkline.figma.js +1 -1
  162. package/esm/sparkline/sparkline-interactive/SparklineInteractive.js +2 -1
  163. package/esm/sparkline/sparkline-interactive/__figma__/SparklineInteractive.figma.js +1 -1
  164. package/esm/sparkline/sparkline-interactive-header/__figma__/SparklineInteractiveHeader.figma.js +1 -1
  165. package/esm/sparkline/sparkline-interactive-header/__stories__/SparklineInteractiveHeader.stories.js +2 -0
  166. package/package.json +5 -6
  167. package/esm/chart/__stories__/Chart.stories.js +0 -77
@@ -0,0 +1,625 @@
1
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
+ import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
+ import { Button } from '@coinbase/cds-mobile/buttons/Button';
4
+ import { IconButton } from '@coinbase/cds-mobile/buttons/IconButton';
5
+ import { ExampleScreen } from '@coinbase/cds-mobile/examples/ExampleScreen';
6
+ import { Box, HStack, VStack } from '@coinbase/cds-mobile/layout';
7
+ import { Text } from '@coinbase/cds-mobile/typography';
8
+ import { AreaChart } from '../area/AreaChart';
9
+ import { BarChart } from '../bar/BarChart';
10
+ import { CartesianChart } from '../CartesianChart';
11
+ import { Line } from '../line/Line';
12
+ import { Scrubber } from '../scrubber';
13
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
14
+ const dataCount = 15;
15
+ const updateInterval = 2500;
16
+ const rapidUpdateInterval = 800;
17
+ function generateNextValue(previousValue) {
18
+ const step = Math.random() * 30 - 15;
19
+ return Math.max(0, Math.min(100, previousValue + step));
20
+ }
21
+ function generateInitialData() {
22
+ const data = [50];
23
+ for (let i = 1; i < dataCount; i++) {
24
+ data.push(generateNextValue(data[i - 1]));
25
+ }
26
+ return data;
27
+ }
28
+
29
+ // Transition presets
30
+ const enterOnly = {
31
+ update: null
32
+ };
33
+ const updateOnly = {
34
+ enter: null
35
+ };
36
+ const bothDisabled = {
37
+ enter: null,
38
+ update: null
39
+ };
40
+ const customEnterUpdate = {
41
+ enter: {
42
+ type: 'timing',
43
+ duration: 1500
44
+ },
45
+ update: {
46
+ type: 'spring',
47
+ stiffness: 400,
48
+ damping: 30
49
+ }
50
+ };
51
+ const customEnterUpdateBeacon = {
52
+ enter: {
53
+ type: 'timing',
54
+ duration: 500,
55
+ delay: 1000
56
+ },
57
+ update: {
58
+ type: 'spring',
59
+ stiffness: 400,
60
+ damping: 30
61
+ }
62
+ };
63
+ const slowSpringBoth = {
64
+ enter: {
65
+ type: 'spring',
66
+ stiffness: 100,
67
+ damping: 10
68
+ },
69
+ update: {
70
+ type: 'spring',
71
+ stiffness: 100,
72
+ damping: 10
73
+ }
74
+ };
75
+ const staggeredBoth = {
76
+ enter: {
77
+ type: 'timing',
78
+ duration: 750,
79
+ staggerDelay: 250
80
+ },
81
+ update: {
82
+ type: 'spring',
83
+ stiffness: 300,
84
+ damping: 20,
85
+ staggerDelay: 150
86
+ }
87
+ };
88
+ const slowTimingBoth = {
89
+ enter: {
90
+ type: 'timing',
91
+ duration: 2000
92
+ },
93
+ update: {
94
+ type: 'timing',
95
+ duration: 2000
96
+ }
97
+ };
98
+
99
+ // --- Reusable Chart Components ---
100
+
101
+ const TransitionLineChart = /*#__PURE__*/memo(_ref => {
102
+ let {
103
+ data,
104
+ transitions,
105
+ scrubberTransitions,
106
+ animate: animateProp,
107
+ idlePulse,
108
+ scrubberRef,
109
+ enableScrubbing = true,
110
+ points
111
+ } = _ref;
112
+ return /*#__PURE__*/_jsxs(CartesianChart, {
113
+ animate: animateProp,
114
+ enableScrubbing: enableScrubbing,
115
+ height: 200,
116
+ inset: {
117
+ top: 16,
118
+ bottom: 16,
119
+ left: 16,
120
+ right: 16
121
+ },
122
+ series: [{
123
+ id: 'values',
124
+ data
125
+ }],
126
+ children: [/*#__PURE__*/_jsx(Line, {
127
+ points: points,
128
+ seriesId: "values",
129
+ strokeWidth: 3,
130
+ transitions: transitions
131
+ }), enableScrubbing && /*#__PURE__*/_jsx(Scrubber, {
132
+ ref: scrubberRef,
133
+ hideOverlay: true,
134
+ idlePulse: idlePulse,
135
+ transitions: scrubberTransitions != null ? scrubberTransitions : transitions
136
+ })]
137
+ });
138
+ });
139
+ const TransitionAreaChart = /*#__PURE__*/memo(_ref2 => {
140
+ let {
141
+ data,
142
+ transitions,
143
+ idlePulse,
144
+ scrubberRef
145
+ } = _ref2;
146
+ return /*#__PURE__*/_jsx(AreaChart, {
147
+ enableScrubbing: true,
148
+ showLines: true,
149
+ height: 200,
150
+ inset: {
151
+ top: 16,
152
+ bottom: 16,
153
+ left: 16,
154
+ right: 16
155
+ },
156
+ series: [{
157
+ id: 'values',
158
+ data
159
+ }],
160
+ transitions: transitions,
161
+ children: /*#__PURE__*/_jsx(Scrubber, {
162
+ ref: scrubberRef,
163
+ hideOverlay: true,
164
+ idlePulse: idlePulse,
165
+ transitions: transitions
166
+ })
167
+ });
168
+ });
169
+ const MultiLineChart = /*#__PURE__*/memo(_ref3 => {
170
+ let {
171
+ data1,
172
+ data2,
173
+ transitions
174
+ } = _ref3;
175
+ return /*#__PURE__*/_jsxs(CartesianChart, {
176
+ enableScrubbing: true,
177
+ height: 200,
178
+ inset: {
179
+ top: 16,
180
+ bottom: 16,
181
+ left: 16,
182
+ right: 16
183
+ },
184
+ series: [{
185
+ id: 'series1',
186
+ data: data1,
187
+ label: 'Series 1'
188
+ }, {
189
+ id: 'series2',
190
+ data: data2,
191
+ label: 'Series 2'
192
+ }],
193
+ children: [/*#__PURE__*/_jsx(Line, {
194
+ seriesId: "series1",
195
+ strokeWidth: 3,
196
+ transitions: transitions
197
+ }), /*#__PURE__*/_jsx(Line, {
198
+ seriesId: "series2",
199
+ strokeWidth: 3,
200
+ transitions: transitions
201
+ }), /*#__PURE__*/_jsx(Scrubber, {
202
+ hideOverlay: true,
203
+ idlePulse: true,
204
+ transitions: transitions
205
+ })]
206
+ });
207
+ });
208
+
209
+ // --- Self-contained Example Wrappers ---
210
+
211
+ function LineExample(_ref4) {
212
+ let {
213
+ transitions,
214
+ scrubberTransitions,
215
+ pointTransitions,
216
+ animate,
217
+ idlePulse,
218
+ resettable = true,
219
+ imperative = false,
220
+ points
221
+ } = _ref4;
222
+ const scrubberRef = useRef(null);
223
+ const [data, setData] = useState(generateInitialData);
224
+ const [resetKey, setResetKey] = useState(0);
225
+ const handleReset = useCallback(() => setResetKey(k => k + 1), []);
226
+ useEffect(() => {
227
+ const intervalId = setInterval(() => {
228
+ var _scrubberRef$current;
229
+ setData(current => {
230
+ const last = current[current.length - 1];
231
+ return [...current.slice(1), generateNextValue(last)];
232
+ });
233
+ if (imperative) (_scrubberRef$current = scrubberRef.current) == null || _scrubberRef$current.pulse();
234
+ }, updateInterval);
235
+ return () => clearInterval(intervalId);
236
+ }, [imperative]);
237
+ const pointFunction = props => _extends({}, props, {
238
+ transitions: pointTransitions
239
+ });
240
+ const pointProps = points ? pointFunction : false;
241
+ return /*#__PURE__*/_jsxs(VStack, {
242
+ gap: 2,
243
+ children: [/*#__PURE__*/_jsx(TransitionLineChart, {
244
+ animate: animate,
245
+ data: data,
246
+ idlePulse: idlePulse,
247
+ points: pointProps,
248
+ scrubberRef: imperative ? scrubberRef : undefined,
249
+ scrubberTransitions: scrubberTransitions,
250
+ transitions: transitions
251
+ }, resetKey), resettable && /*#__PURE__*/_jsx(Box, {
252
+ paddingX: 2,
253
+ children: /*#__PURE__*/_jsx(Button, {
254
+ compact: true,
255
+ onPress: handleReset,
256
+ variant: "secondary",
257
+ children: "Reset"
258
+ })
259
+ })]
260
+ });
261
+ }
262
+ function AreaExample(_ref5) {
263
+ let {
264
+ transitions,
265
+ idlePulse,
266
+ resettable = true,
267
+ imperative = false
268
+ } = _ref5;
269
+ const scrubberRef = useRef(null);
270
+ const [data, setData] = useState(generateInitialData);
271
+ const [resetKey, setResetKey] = useState(0);
272
+ const handleReset = useCallback(() => setResetKey(k => k + 1), []);
273
+ useEffect(() => {
274
+ const intervalId = setInterval(() => {
275
+ var _scrubberRef$current2;
276
+ setData(current => {
277
+ const last = current[current.length - 1];
278
+ return [...current.slice(1), generateNextValue(last)];
279
+ });
280
+ if (imperative) (_scrubberRef$current2 = scrubberRef.current) == null || _scrubberRef$current2.pulse();
281
+ }, updateInterval);
282
+ return () => clearInterval(intervalId);
283
+ }, [imperative]);
284
+ return /*#__PURE__*/_jsxs(VStack, {
285
+ gap: 2,
286
+ children: [/*#__PURE__*/_jsx(TransitionAreaChart, {
287
+ data: data,
288
+ idlePulse: idlePulse,
289
+ scrubberRef: imperative ? scrubberRef : undefined,
290
+ transitions: transitions
291
+ }, resetKey), resettable && /*#__PURE__*/_jsx(Box, {
292
+ paddingX: 2,
293
+ children: /*#__PURE__*/_jsx(Button, {
294
+ compact: true,
295
+ onPress: handleReset,
296
+ variant: "secondary",
297
+ children: "Reset"
298
+ })
299
+ })]
300
+ });
301
+ }
302
+
303
+ // --- Bar Chart Components ---
304
+
305
+ const barCategories = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
306
+ function generateBarData() {
307
+ return barCategories.map(() => Math.round(Math.random() * 80 + 10));
308
+ }
309
+ const barChartProps = {
310
+ showXAxis: true,
311
+ enableScrubbing: true,
312
+ height: 200,
313
+ xAxis: {
314
+ data: barCategories
315
+ },
316
+ yAxis: {
317
+ domain: {
318
+ min: 0,
319
+ max: 100
320
+ }
321
+ }
322
+ };
323
+ const TransitionBarChart = /*#__PURE__*/memo(_ref6 => {
324
+ let {
325
+ data,
326
+ transitions
327
+ } = _ref6;
328
+ return /*#__PURE__*/_jsx(BarChart, _extends({}, barChartProps, {
329
+ series: [{
330
+ id: 'values',
331
+ data
332
+ }],
333
+ transitions: transitions,
334
+ children: /*#__PURE__*/_jsx(Scrubber, {
335
+ hideOverlay: true,
336
+ seriesIds: [],
337
+ transitions: transitions
338
+ })
339
+ }));
340
+ });
341
+ function BarExample(_ref7) {
342
+ let {
343
+ transitions,
344
+ resettable = true
345
+ } = _ref7;
346
+ const [data, setData] = useState(generateBarData);
347
+ const [resetKey, setResetKey] = useState(0);
348
+ const handleReset = useCallback(() => setResetKey(k => k + 1), []);
349
+ useEffect(() => {
350
+ const intervalId = setInterval(() => {
351
+ setData(generateBarData());
352
+ }, updateInterval);
353
+ return () => clearInterval(intervalId);
354
+ }, []);
355
+ return /*#__PURE__*/_jsxs(VStack, {
356
+ gap: 2,
357
+ children: [/*#__PURE__*/_jsx(TransitionBarChart, {
358
+ data: data,
359
+ transitions: transitions
360
+ }, resetKey), resettable && /*#__PURE__*/_jsx(Box, {
361
+ paddingX: 2,
362
+ children: /*#__PURE__*/_jsx(Button, {
363
+ compact: true,
364
+ onPress: handleReset,
365
+ variant: "secondary",
366
+ children: "Reset"
367
+ })
368
+ })]
369
+ });
370
+ }
371
+ function RapidLineExample(_ref8) {
372
+ let {
373
+ transitions
374
+ } = _ref8;
375
+ const [data, setData] = useState(generateInitialData);
376
+ const [resetKey, setResetKey] = useState(0);
377
+ const handleReset = useCallback(() => setResetKey(k => k + 1), []);
378
+ useEffect(() => {
379
+ const intervalId = setInterval(() => {
380
+ setData(current => {
381
+ const last = current[current.length - 1];
382
+ return [...current.slice(1), generateNextValue(last)];
383
+ });
384
+ }, rapidUpdateInterval);
385
+ return () => clearInterval(intervalId);
386
+ }, []);
387
+ return /*#__PURE__*/_jsxs(VStack, {
388
+ gap: 2,
389
+ children: [/*#__PURE__*/_jsx(TransitionLineChart, {
390
+ data: data,
391
+ transitions: transitions
392
+ }, resetKey), /*#__PURE__*/_jsx(Box, {
393
+ paddingX: 2,
394
+ children: /*#__PURE__*/_jsx(Button, {
395
+ compact: true,
396
+ onPress: handleReset,
397
+ variant: "secondary",
398
+ children: "Reset"
399
+ })
400
+ })]
401
+ });
402
+ }
403
+ function RapidBarExample(_ref9) {
404
+ let {
405
+ transitions
406
+ } = _ref9;
407
+ const [data, setData] = useState(generateBarData);
408
+ const [resetKey, setResetKey] = useState(0);
409
+ const handleReset = useCallback(() => setResetKey(k => k + 1), []);
410
+ useEffect(() => {
411
+ const intervalId = setInterval(() => {
412
+ setData(generateBarData());
413
+ }, rapidUpdateInterval);
414
+ return () => clearInterval(intervalId);
415
+ }, []);
416
+ return /*#__PURE__*/_jsxs(VStack, {
417
+ gap: 2,
418
+ children: [/*#__PURE__*/_jsx(TransitionBarChart, {
419
+ data: data,
420
+ transitions: transitions
421
+ }, resetKey), /*#__PURE__*/_jsx(Box, {
422
+ paddingX: 2,
423
+ children: /*#__PURE__*/_jsx(Button, {
424
+ compact: true,
425
+ onPress: handleReset,
426
+ variant: "secondary",
427
+ children: "Reset"
428
+ })
429
+ })]
430
+ });
431
+ }
432
+ function MultiLineExample(_ref0) {
433
+ let {
434
+ transitions
435
+ } = _ref0;
436
+ const [data1, setData1] = useState(generateInitialData);
437
+ const [data2, setData2] = useState(generateInitialData);
438
+ const [resetKey, setResetKey] = useState(0);
439
+ const handleReset = useCallback(() => setResetKey(k => k + 1), []);
440
+ useEffect(() => {
441
+ const intervalId = setInterval(() => {
442
+ setData1(current => {
443
+ const last = current[current.length - 1];
444
+ return [...current.slice(1), generateNextValue(last)];
445
+ });
446
+ setData2(current => {
447
+ const last = current[current.length - 1];
448
+ return [...current.slice(1), generateNextValue(last)];
449
+ });
450
+ }, updateInterval);
451
+ return () => clearInterval(intervalId);
452
+ }, []);
453
+ return /*#__PURE__*/_jsxs(VStack, {
454
+ gap: 2,
455
+ children: [/*#__PURE__*/_jsx(MultiLineChart, {
456
+ data1: data1,
457
+ data2: data2,
458
+ transitions: transitions
459
+ }, resetKey), /*#__PURE__*/_jsx(Box, {
460
+ paddingX: 2,
461
+ children: /*#__PURE__*/_jsx(Button, {
462
+ compact: true,
463
+ onPress: handleReset,
464
+ variant: "secondary",
465
+ children: "Reset"
466
+ })
467
+ })]
468
+ });
469
+ }
470
+
471
+ // --- Main Navigator ---
472
+
473
+ function ExampleNavigator() {
474
+ const [currentIndex, setCurrentIndex] = useState(0);
475
+ const examples = useMemo(() => [{
476
+ category: 'Line',
477
+ title: 'Enter Only',
478
+ component: /*#__PURE__*/_jsx(LineExample, {
479
+ idlePulse: true,
480
+ transitions: enterOnly
481
+ })
482
+ }, {
483
+ category: 'Line',
484
+ title: 'Update Only',
485
+ component: /*#__PURE__*/_jsx(LineExample, {
486
+ idlePulse: true,
487
+ points: true,
488
+ pointTransitions: updateOnly,
489
+ transitions: updateOnly
490
+ })
491
+ }, {
492
+ category: 'Line',
493
+ title: 'Both Disabled',
494
+ component: /*#__PURE__*/_jsx(LineExample, {
495
+ transitions: bothDisabled
496
+ })
497
+ }, {
498
+ category: 'Line',
499
+ title: 'Custom 2',
500
+ component: /*#__PURE__*/_jsx(LineExample, {
501
+ points: true,
502
+ pointTransitions: customEnterUpdateBeacon,
503
+ scrubberTransitions: customEnterUpdateBeacon,
504
+ transitions: customEnterUpdate
505
+ })
506
+ }, {
507
+ category: 'Line',
508
+ title: 'Imperative Pulse',
509
+ component: /*#__PURE__*/_jsx(LineExample, {
510
+ imperative: true,
511
+ resettable: false,
512
+ transitions: updateOnly
513
+ })
514
+ }, {
515
+ category: 'Multi-Line',
516
+ title: 'Update Only',
517
+ component: /*#__PURE__*/_jsx(MultiLineExample, {
518
+ transitions: updateOnly
519
+ })
520
+ }, {
521
+ category: 'Area',
522
+ title: 'Both Disabled',
523
+ component: /*#__PURE__*/_jsx(AreaExample, {
524
+ transitions: bothDisabled
525
+ })
526
+ }, {
527
+ category: 'Area',
528
+ title: 'Imperative Pulse',
529
+ component: /*#__PURE__*/_jsx(AreaExample, {
530
+ imperative: true,
531
+ resettable: false,
532
+ transitions: updateOnly
533
+ })
534
+ }, {
535
+ category: 'Bar',
536
+ title: 'Enter Only',
537
+ component: /*#__PURE__*/_jsx(BarExample, {
538
+ transitions: enterOnly
539
+ })
540
+ }, {
541
+ category: 'Bar',
542
+ title: 'Update Only',
543
+ component: /*#__PURE__*/_jsx(BarExample, {
544
+ transitions: updateOnly
545
+ })
546
+ }, {
547
+ category: 'Bar',
548
+ title: 'Both Disabled',
549
+ component: /*#__PURE__*/_jsx(BarExample, {
550
+ transitions: bothDisabled
551
+ })
552
+ }, {
553
+ category: 'Bar',
554
+ title: 'Slow Spring Both',
555
+ component: /*#__PURE__*/_jsx(BarExample, {
556
+ transitions: slowSpringBoth
557
+ })
558
+ }, {
559
+ category: 'Bar',
560
+ title: 'Staggered Both',
561
+ component: /*#__PURE__*/_jsx(BarExample, {
562
+ transitions: staggeredBoth
563
+ })
564
+ }, {
565
+ category: 'Line',
566
+ title: 'Rapid Interrupts',
567
+ component: /*#__PURE__*/_jsx(RapidLineExample, {
568
+ transitions: slowTimingBoth
569
+ })
570
+ }, {
571
+ category: 'Bar',
572
+ title: 'Rapid Interrupts',
573
+ component: /*#__PURE__*/_jsx(RapidBarExample, {
574
+ transitions: slowTimingBoth
575
+ })
576
+ }], []);
577
+ const currentExample = examples[currentIndex];
578
+ const handlePrevious = useCallback(() => {
579
+ setCurrentIndex(prev => (prev - 1 + examples.length) % examples.length);
580
+ }, [examples.length]);
581
+ const handleNext = useCallback(() => {
582
+ setCurrentIndex(prev => (prev + 1) % examples.length);
583
+ }, [examples.length]);
584
+ return /*#__PURE__*/_jsx(ExampleScreen, {
585
+ paddingX: 0,
586
+ children: /*#__PURE__*/_jsxs(VStack, {
587
+ gap: 4,
588
+ children: [/*#__PURE__*/_jsxs(HStack, {
589
+ alignItems: "center",
590
+ justifyContent: "space-between",
591
+ paddingX: 1,
592
+ children: [/*#__PURE__*/_jsx(IconButton, {
593
+ accessibilityHint: "Navigate to previous example",
594
+ accessibilityLabel: "Previous",
595
+ name: "arrowLeft",
596
+ onPress: handlePrevious,
597
+ variant: "secondary"
598
+ }), /*#__PURE__*/_jsxs(VStack, {
599
+ alignItems: "center",
600
+ children: [/*#__PURE__*/_jsx(Text, {
601
+ color: "fgMuted",
602
+ font: "label2",
603
+ children: currentExample.category
604
+ }), /*#__PURE__*/_jsx(Text, {
605
+ font: "title3",
606
+ children: currentExample.title
607
+ }), /*#__PURE__*/_jsxs(Text, {
608
+ color: "fgMuted",
609
+ font: "label1",
610
+ children: [currentIndex + 1, " / ", examples.length]
611
+ })]
612
+ }), /*#__PURE__*/_jsx(IconButton, {
613
+ accessibilityHint: "Navigate to next example",
614
+ accessibilityLabel: "Next",
615
+ name: "arrowRight",
616
+ onPress: handleNext,
617
+ variant: "secondary"
618
+ })]
619
+ }), /*#__PURE__*/_jsx(Box, {
620
+ children: currentExample.component
621
+ }, currentIndex)]
622
+ })
623
+ });
624
+ }
625
+ export default ExampleNavigator;