@tennisvisuals/scoring-visualizations 0.2.1

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 (158) hide show
  1. package/dist/__tests__/LiveEngine.test.d.ts +2 -0
  2. package/dist/__tests__/LiveEngine.test.d.ts.map +1 -0
  3. package/dist/__tests__/LiveEngine.test.js +142 -0
  4. package/dist/__tests__/LiveEngine.test.js.map +1 -0
  5. package/dist/__tests__/buildEpisodes.test.d.ts +2 -0
  6. package/dist/__tests__/buildEpisodes.test.d.ts.map +1 -0
  7. package/dist/__tests__/buildEpisodes.test.js +150 -0
  8. package/dist/__tests__/buildEpisodes.test.js.map +1 -0
  9. package/dist/__tests__/extractors.test.d.ts +2 -0
  10. package/dist/__tests__/extractors.test.d.ts.map +1 -0
  11. package/dist/__tests__/extractors.test.js +50 -0
  12. package/dist/__tests__/extractors.test.js.map +1 -0
  13. package/dist/__tests__/feedMatchUp.test.d.ts +2 -0
  14. package/dist/__tests__/feedMatchUp.test.d.ts.map +1 -0
  15. package/dist/__tests__/feedMatchUp.test.js +96 -0
  16. package/dist/__tests__/feedMatchUp.test.js.map +1 -0
  17. package/dist/engine/LiveEngine.d.ts +42 -0
  18. package/dist/engine/LiveEngine.d.ts.map +1 -0
  19. package/dist/engine/LiveEngine.js +82 -0
  20. package/dist/engine/LiveEngine.js.map +1 -0
  21. package/dist/engine/buildSetMap.d.ts +14 -0
  22. package/dist/engine/buildSetMap.d.ts.map +1 -0
  23. package/dist/engine/buildSetMap.js +42 -0
  24. package/dist/engine/buildSetMap.js.map +1 -0
  25. package/dist/engine/createPlaybackEngine.d.ts +34 -0
  26. package/dist/engine/createPlaybackEngine.d.ts.map +1 -0
  27. package/dist/engine/createPlaybackEngine.js +90 -0
  28. package/dist/engine/createPlaybackEngine.js.map +1 -0
  29. package/dist/engine/feedMatchUp.d.ts +82 -0
  30. package/dist/engine/feedMatchUp.d.ts.map +1 -0
  31. package/dist/engine/feedMatchUp.js +116 -0
  32. package/dist/engine/feedMatchUp.js.map +1 -0
  33. package/dist/episodes/buildEpisodes.d.ts +10 -0
  34. package/dist/episodes/buildEpisodes.d.ts.map +1 -0
  35. package/dist/episodes/buildEpisodes.js +166 -0
  36. package/dist/episodes/buildEpisodes.js.map +1 -0
  37. package/dist/episodes/types.d.ts +45 -0
  38. package/dist/episodes/types.d.ts.map +1 -0
  39. package/dist/episodes/types.js +2 -0
  40. package/dist/episodes/types.js.map +1 -0
  41. package/dist/index.d.ts +23 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +24 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/statistics/index.d.ts +3 -0
  46. package/dist/statistics/index.d.ts.map +1 -0
  47. package/dist/statistics/index.js +2 -0
  48. package/dist/statistics/index.js.map +1 -0
  49. package/dist/statistics/matchStatistics.d.ts +22 -0
  50. package/dist/statistics/matchStatistics.d.ts.map +1 -0
  51. package/dist/statistics/matchStatistics.js +59 -0
  52. package/dist/statistics/matchStatistics.js.map +1 -0
  53. package/dist/visualizations/coronaChart.d.ts +54 -0
  54. package/dist/visualizations/coronaChart.d.ts.map +1 -0
  55. package/dist/visualizations/coronaChart.js +254 -0
  56. package/dist/visualizations/coronaChart.js.map +1 -0
  57. package/dist/visualizations/data/mcpFixtures.json +13166 -0
  58. package/dist/visualizations/data/sampleGame.d.ts +37 -0
  59. package/dist/visualizations/data/sampleGame.d.ts.map +1 -0
  60. package/dist/visualizations/data/sampleGame.js +521 -0
  61. package/dist/visualizations/data/sampleGame.js.map +1 -0
  62. package/dist/visualizations/gameFish.d.ts +16 -0
  63. package/dist/visualizations/gameFish.d.ts.map +1 -0
  64. package/dist/visualizations/gameFish.js +692 -0
  65. package/dist/visualizations/gameFish.js.map +1 -0
  66. package/dist/visualizations/gameTree.d.ts +17 -0
  67. package/dist/visualizations/gameTree.d.ts.map +1 -0
  68. package/dist/visualizations/gameTree.js +837 -0
  69. package/dist/visualizations/gameTree.js.map +1 -0
  70. package/dist/visualizations/groupGames.d.ts +6 -0
  71. package/dist/visualizations/groupGames.d.ts.map +1 -0
  72. package/dist/visualizations/groupGames.js +35 -0
  73. package/dist/visualizations/groupGames.js.map +1 -0
  74. package/dist/visualizations/helpers/JsonViewer.d.ts +27 -0
  75. package/dist/visualizations/helpers/JsonViewer.d.ts.map +1 -0
  76. package/dist/visualizations/helpers/JsonViewer.js +276 -0
  77. package/dist/visualizations/helpers/JsonViewer.js.map +1 -0
  78. package/dist/visualizations/helpers/PlaybackControls.d.ts +12 -0
  79. package/dist/visualizations/helpers/PlaybackControls.d.ts.map +1 -0
  80. package/dist/visualizations/helpers/PlaybackControls.js +98 -0
  81. package/dist/visualizations/helpers/PlaybackControls.js.map +1 -0
  82. package/dist/visualizations/horizonChart.d.ts +59 -0
  83. package/dist/visualizations/horizonChart.d.ts.map +1 -0
  84. package/dist/visualizations/horizonChart.js +215 -0
  85. package/dist/visualizations/horizonChart.js.map +1 -0
  86. package/dist/visualizations/index.d.ts +21 -0
  87. package/dist/visualizations/index.d.ts.map +1 -0
  88. package/dist/visualizations/index.js +23 -0
  89. package/dist/visualizations/index.js.map +1 -0
  90. package/dist/visualizations/legacyRally.d.ts +3 -0
  91. package/dist/visualizations/legacyRally.d.ts.map +1 -0
  92. package/dist/visualizations/legacyRally.js +26 -0
  93. package/dist/visualizations/legacyRally.js.map +1 -0
  94. package/dist/visualizations/matchDashboard.d.ts +39 -0
  95. package/dist/visualizations/matchDashboard.d.ts.map +1 -0
  96. package/dist/visualizations/matchDashboard.js +235 -0
  97. package/dist/visualizations/matchDashboard.js.map +1 -0
  98. package/dist/visualizations/momentumChart.d.ts +12 -0
  99. package/dist/visualizations/momentumChart.d.ts.map +1 -0
  100. package/dist/visualizations/momentumChart.js +454 -0
  101. package/dist/visualizations/momentumChart.js.map +1 -0
  102. package/dist/visualizations/ptsChart.d.ts +14 -0
  103. package/dist/visualizations/ptsChart.d.ts.map +1 -0
  104. package/dist/visualizations/ptsChart.js +925 -0
  105. package/dist/visualizations/ptsChart.js.map +1 -0
  106. package/dist/visualizations/ptsHorizon.d.ts +83 -0
  107. package/dist/visualizations/ptsHorizon.d.ts.map +1 -0
  108. package/dist/visualizations/ptsHorizon.js +290 -0
  109. package/dist/visualizations/ptsHorizon.js.map +1 -0
  110. package/dist/visualizations/rallyTree.d.ts +78 -0
  111. package/dist/visualizations/rallyTree.d.ts.map +1 -0
  112. package/dist/visualizations/rallyTree.js +410 -0
  113. package/dist/visualizations/rallyTree.js.map +1 -0
  114. package/dist/visualizations/simpleChart.d.ts +6 -0
  115. package/dist/visualizations/simpleChart.d.ts.map +1 -0
  116. package/dist/visualizations/simpleChart.js +126 -0
  117. package/dist/visualizations/simpleChart.js.map +1 -0
  118. package/dist/visualizations/statView.d.ts +52 -0
  119. package/dist/visualizations/statView.d.ts.map +1 -0
  120. package/dist/visualizations/statView.js +200 -0
  121. package/dist/visualizations/statView.js.map +1 -0
  122. package/dist/visualizations/typeOf.d.ts +6 -0
  123. package/dist/visualizations/typeOf.d.ts.map +1 -0
  124. package/dist/visualizations/typeOf.js +18 -0
  125. package/dist/visualizations/typeOf.js.map +1 -0
  126. package/dist/visualizations/types/events.d.ts +92 -0
  127. package/dist/visualizations/types/events.d.ts.map +1 -0
  128. package/dist/visualizations/types/events.js +2 -0
  129. package/dist/visualizations/types/events.js.map +1 -0
  130. package/dist/visualizations/types/index.d.ts +79 -0
  131. package/dist/visualizations/types/index.d.ts.map +1 -0
  132. package/dist/visualizations/types/index.js +8 -0
  133. package/dist/visualizations/types/index.js.map +1 -0
  134. package/dist/visualizations/utils/arrays.d.ts +18 -0
  135. package/dist/visualizations/utils/arrays.d.ts.map +1 -0
  136. package/dist/visualizations/utils/arrays.js +46 -0
  137. package/dist/visualizations/utils/arrays.js.map +1 -0
  138. package/dist/visualizations/utils/colorUtils.d.ts +36 -0
  139. package/dist/visualizations/utils/colorUtils.d.ts.map +1 -0
  140. package/dist/visualizations/utils/colorUtils.js +112 -0
  141. package/dist/visualizations/utils/colorUtils.js.map +1 -0
  142. package/dist/visualizations/utils/generateId.d.ts +2 -0
  143. package/dist/visualizations/utils/generateId.d.ts.map +1 -0
  144. package/dist/visualizations/utils/generateId.js +3 -0
  145. package/dist/visualizations/utils/generateId.js.map +1 -0
  146. package/dist/visualizations/utils/keyWalk.d.ts +2 -0
  147. package/dist/visualizations/utils/keyWalk.d.ts.map +1 -0
  148. package/dist/visualizations/utils/keyWalk.js +19 -0
  149. package/dist/visualizations/utils/keyWalk.js.map +1 -0
  150. package/dist/visualizations/utils/math.d.ts +10 -0
  151. package/dist/visualizations/utils/math.d.ts.map +1 -0
  152. package/dist/visualizations/utils/math.js +14 -0
  153. package/dist/visualizations/utils/math.js.map +1 -0
  154. package/dist/visualizations/utils/setDev.d.ts +29 -0
  155. package/dist/visualizations/utils/setDev.d.ts.map +1 -0
  156. package/dist/visualizations/utils/setDev.js +35 -0
  157. package/dist/visualizations/utils/setDev.js.map +1 -0
  158. package/package.json +57 -0
@@ -0,0 +1,410 @@
1
+ /* eslint-disable */
2
+ // @ts-nocheck
3
+ /**
4
+ * Rally Tree - Migrated to D3 v7
5
+ * Displays rally length distribution in a tree-like format
6
+ * Shows how rally lengths are distributed by player and outcome
7
+ */
8
+ import { max, scaleLinear, area, curveLinear, curveBasis } from 'd3';
9
+ import tippy, { followCursor as followCursorPlugin } from 'tippy.js';
10
+ import { buildEpisodes } from '../episodes/buildEpisodes';
11
+ import { generateId } from './utils/generateId';
12
+ export function rallyTree() {
13
+ let points = [];
14
+ let ryl;
15
+ let max0, max1;
16
+ let maxRally;
17
+ let maxLimb, widthScale, barSpacing, barHeight;
18
+ let displayPct = true;
19
+ let barPadding = 1;
20
+ let cellPadding = 1;
21
+ const transitionTime = 1000;
22
+ let tippyInstances = [];
23
+ function destroyTooltips() {
24
+ tippyInstances.forEach((t) => t.destroy());
25
+ tippyInstances = [];
26
+ }
27
+ const options = {
28
+ id: generateId(),
29
+ width: 100,
30
+ height: 100,
31
+ margins: {
32
+ top: 0,
33
+ right: 0,
34
+ bottom: 0,
35
+ left: 0,
36
+ },
37
+ display: {
38
+ sizeToFit: false,
39
+ },
40
+ orientation: 'horizontal',
41
+ data: {
42
+ sort: false,
43
+ },
44
+ areas: {
45
+ colors: { 0: 'blue', 1: 'purple' },
46
+ interpolation: 'linear',
47
+ },
48
+ points: {
49
+ colors: {},
50
+ },
51
+ };
52
+ const events = {
53
+ pointbar: { mouseover: null, mouseout: null, click: null },
54
+ statbar: { click: null },
55
+ pctarea: { mouseover: null, mouseout: null },
56
+ update: { begin: null, end: null },
57
+ rallies: { none: null, display: null },
58
+ };
59
+ let rtroot;
60
+ let rttree;
61
+ let rtarea;
62
+ let parentNode = null;
63
+ function chart(selection) {
64
+ parentNode = selection.node();
65
+ const root = selection.append('div').attr('class', 'rallyRoot');
66
+ rtroot = root
67
+ .append('svg')
68
+ .attr('class', 'rallyTree')
69
+ .attr('height', options.orientation === 'horizontal' ? options.height : options.width)
70
+ .attr('width', options.orientation === 'horizontal' ? options.width : options.height);
71
+ rttree = rtroot.append('g').attr('class', 'rttree');
72
+ rtarea = rtroot.append('g').attr('class', 'rtarea');
73
+ chart.update = update;
74
+ }
75
+ function update(opts) {
76
+ destroyTooltips();
77
+ // Calculate max rally length using D3 v7 max
78
+ maxRally = max(points, (point) => {
79
+ if (point.rallyLength != null)
80
+ return point.rallyLength;
81
+ return 0;
82
+ }) || 0;
83
+ if (maxRally < 3) {
84
+ rtroot.selectAll('rect').remove();
85
+ rtarea.selectAll('path').remove();
86
+ rtarea.selectAll('line').remove();
87
+ return;
88
+ }
89
+ if (options.display.sizeToFit || (opts && opts.sizeToFit)) {
90
+ if (parentNode) {
91
+ const dims = parentNode.getBoundingClientRect();
92
+ if (dims.width > 0)
93
+ options.width = dims.width;
94
+ if (dims.height > 0)
95
+ options.height = dims.height;
96
+ }
97
+ options.width = Math.max(options.width, 100);
98
+ options.height = Math.max(options.height, 100);
99
+ }
100
+ if (points.length > 500) {
101
+ barPadding = 0;
102
+ cellPadding = 0;
103
+ }
104
+ else {
105
+ barPadding = 1;
106
+ cellPadding = 1;
107
+ }
108
+ // Track rally length counts
109
+ ryl = [[], []];
110
+ points.forEach((e, i) => {
111
+ e.i = i;
112
+ const rallyLen = e.rallyLength ?? 0;
113
+ if (ryl[e.winner][rallyLen]) {
114
+ ryl[e.winner][rallyLen] += 1;
115
+ }
116
+ else {
117
+ ryl[e.winner][rallyLen] = 1;
118
+ }
119
+ e.rl = [ryl[0][rallyLen] || 0, ryl[1][rallyLen] || 0];
120
+ });
121
+ rtroot
122
+ .transition()
123
+ .duration(transitionTime)
124
+ .attr('width', options.width)
125
+ .attr('height', options.height);
126
+ max0 = points.length ? (points.length === 1 ? points[0].rl[0] : max(points, (p) => p.rl[0])) : 0;
127
+ max1 = points.length ? (points.length === 1 ? points[0].rl[1] : max(points, (p) => p.rl[1])) : 0;
128
+ max0 = max0 || 0;
129
+ max1 = max1 || 0;
130
+ maxLimb = max0 + max1 + 1;
131
+ widthScale = (options.orientation === 'horizontal' ? options.width : options.height) / maxLimb;
132
+ barSpacing = (options.orientation === 'horizontal' ? options.height : options.width) / (maxRally + 1);
133
+ barHeight = barSpacing - barPadding;
134
+ // D3 v7: Use .join() instead of .enter().append().merge()
135
+ // Point bars
136
+ rttree.selectAll('rect.point-bar')
137
+ .data(points)
138
+ .join(
139
+ // Enter
140
+ enter => enter
141
+ .append('rect')
142
+ .attr('id', (d, i) => `cell_${options.id}_${i}`)
143
+ .attr('class', 'point-bar')
144
+ .attr('x', () => Math.random() * options.width)
145
+ .attr('y', () => Math.random() * options.height)
146
+ .attr('fill', (d) => options.points.colors[d.result || ''] || '#ccc')
147
+ .attr('width', () => (options.orientation === 'horizontal' ? widthScale - cellPadding : barHeight))
148
+ .attr('height', () => (options.orientation === 'horizontal' ? barHeight : widthScale - cellPadding))
149
+ .on('mouseover', events.pointbar.mouseover)
150
+ .on('mouseout', events.pointbar.mouseout)
151
+ .on('click', events.pointbar.click)
152
+ .call(enter => enter.transition()
153
+ .duration(transitionTime)
154
+ .style('opacity', 1)
155
+ .attr('x', (d) => calcX(d))
156
+ .attr('y', (d) => calcY(d))),
157
+ // Update
158
+ update => update
159
+ .call(update => update.transition()
160
+ .duration(transitionTime)
161
+ .attr('fill', (d) => options.points.colors[d.result || ''] || '#ccc')
162
+ .style('opacity', (d) => (d.hide ? 0 : 1))
163
+ .attr('x', (d) => calcX(d))
164
+ .attr('y', (d) => calcY(d))
165
+ .attr('width', () => (options.orientation === 'horizontal' ? widthScale - cellPadding : barHeight))
166
+ .attr('height', () => (options.orientation === 'horizontal' ? barHeight : widthScale - cellPadding))));
167
+ // Point bar tooltips
168
+ rttree.selectAll('rect.point-bar').each(function (d) {
169
+ const el = this;
170
+ const name = options.players?.[d.winner] ?? (d.winner === 0 ? 'Player 1' : 'Player 2');
171
+ const result = d.result || '';
172
+ const rally = d.rallyLength ?? 0;
173
+ tippyInstances.push(tippy(el, {
174
+ content: `${name}: ${result} (rally: ${rally})`,
175
+ allowHTML: false,
176
+ delay: [200, 0],
177
+ placement: 'top',
178
+ appendTo: document.body,
179
+ }));
180
+ });
181
+ // Win percentage areas
182
+ rtarea.selectAll('.pct-area')
183
+ .data([0, 1])
184
+ .join(enter => enter
185
+ .append('path')
186
+ .attr('id', (d) => `player${d}pctarea_${options.id}`)
187
+ .attr('class', 'pct-area')
188
+ .attr('opacity', 0)
189
+ .style('pointer-events', 'none'), update => update)
190
+ .attr('fill', (d) => options.areas.colors[d])
191
+ .attr('display', displayPct ? 'inline' : 'none')
192
+ .transition()
193
+ .delay(transitionTime)
194
+ .attr('opacity', displayPct ? 0.2 : 0)
195
+ .attr('d', (d) => calcArea(d));
196
+ // Center stat bar
197
+ rtarea.selectAll('rect.stat-bar')
198
+ .data([0])
199
+ .join(enter => enter
200
+ .append('rect')
201
+ .attr('class', 'stat-bar')
202
+ .style('opacity', 0.2)
203
+ .attr('fill', 'blue'))
204
+ .on('click', events.statbar.click)
205
+ .transition()
206
+ .duration(transitionTime)
207
+ .style('opacity', 0.2)
208
+ .attr('x', statbarX())
209
+ .attr('y', statbarY())
210
+ .attr('width', statbarWidth())
211
+ .attr('height', statbarHeight());
212
+ // Stat bar tooltip — shows rally length based on mouse position
213
+ const statBarEl = rtarea.select('rect.stat-bar').node();
214
+ if (statBarEl) {
215
+ const statTip = tippy(statBarEl, {
216
+ content: '',
217
+ followCursor: true,
218
+ plugins: [followCursorPlugin],
219
+ allowHTML: false,
220
+ placement: 'right',
221
+ appendTo: document.body,
222
+ });
223
+ tippyInstances.push(statTip);
224
+ statBarEl.addEventListener('mousemove', (event) => {
225
+ const rect = statBarEl.getBoundingClientRect();
226
+ let rallyLen;
227
+ if (options.orientation === 'horizontal') {
228
+ const relY = event.clientY - rect.top;
229
+ rallyLen = Math.floor((relY / rect.height) * (maxRally + 1));
230
+ }
231
+ else {
232
+ const relX = event.clientX - rect.left;
233
+ rallyLen = Math.floor((relX / rect.width) * (maxRally + 1));
234
+ }
235
+ rallyLen = Math.max(0, Math.min(rallyLen, maxRally));
236
+ statTip.setContent(`Rally length: ${rallyLen}`);
237
+ });
238
+ }
239
+ }
240
+ function rallyWinPct(player) {
241
+ // Cumulative win percentage: for each rally length, compute the odds
242
+ // that the player wins a point of AT LEAST that length. This matches
243
+ // the "Persistence of Server Advantage" methodology (Jeff Sackmann).
244
+ // Summing from each rally length onwards smooths the yo-yo effect
245
+ // inherent in per-length calculations.
246
+ const pct = [];
247
+ const maxLen = maxRally || 20;
248
+ for (let i = 0; i <= maxLen; i++) {
249
+ let cumPlayed = 0;
250
+ let cumWon = 0;
251
+ for (let j = i; j <= maxLen; j++) {
252
+ const p0 = ryl[0][j] || 0;
253
+ const p1 = ryl[1][j] || 0;
254
+ cumPlayed += p0 + p1;
255
+ cumWon += ryl[player][j] || 0;
256
+ }
257
+ pct.push(cumPlayed > 0 ? (cumWon / cumPlayed) * 100 : 0);
258
+ }
259
+ return pct;
260
+ }
261
+ function calcArea(player) {
262
+ // D3 v7: Use curveLinear/curveBasis directly
263
+ const curveType = options.areas.interpolation === 'linear' ? curveLinear : curveBasis;
264
+ const pct = rallyWinPct(player);
265
+ if (options.orientation === 'horizontal') {
266
+ const xScale = scaleLinear()
267
+ .range(player === 0 ? [max0 * widthScale, 0] : [(max0 + 1) * widthScale, options.width])
268
+ .domain([0, 100]);
269
+ const yScale = scaleLinear()
270
+ .range([0, options.height])
271
+ .domain([0, pct.length - 1]);
272
+ return area()
273
+ .curve(curveType)
274
+ .x1((d) => xScale(d))
275
+ .x0(player === 0 ? max0 * widthScale : (max0 + 1) * widthScale)
276
+ .y((d, i) => yScale(i))(pct);
277
+ }
278
+ else {
279
+ const yScale = scaleLinear()
280
+ .range(player === 0 ? [max0 * widthScale, 0] : [max0 * widthScale, options.height])
281
+ .domain([0, 100]);
282
+ const xScale = scaleLinear()
283
+ .range([0, options.width])
284
+ .domain([0, pct.length - 1]);
285
+ return area()
286
+ .curve(curveType)
287
+ .y1((d) => yScale(d))
288
+ .y0(player === 0 ? max0 * widthScale : max0 * widthScale)
289
+ .x((d, i) => xScale(i))(pct);
290
+ }
291
+ }
292
+ function calcX(d) {
293
+ const rallyLen = d.rallyLength ?? 0;
294
+ if (d.winner === 0) {
295
+ return options.orientation === 'horizontal'
296
+ ? max0 * widthScale - (d.rl[0] || 0) * widthScale
297
+ : rallyLen * barSpacing;
298
+ }
299
+ else {
300
+ return options.orientation === 'horizontal'
301
+ ? max0 * widthScale + (d.rl[1] || 0) * widthScale
302
+ : rallyLen * barSpacing;
303
+ }
304
+ }
305
+ function calcY(d) {
306
+ const rallyLen = d.rallyLength ?? 0;
307
+ if (d.winner === 0) {
308
+ return options.orientation === 'horizontal'
309
+ ? rallyLen * barSpacing
310
+ : max0 * widthScale - (d.rl[0] || 0) * widthScale;
311
+ }
312
+ else {
313
+ return options.orientation === 'horizontal'
314
+ ? rallyLen * barSpacing
315
+ : max0 * widthScale + (d.rl[1] || 0) * widthScale;
316
+ }
317
+ }
318
+ function statbarX() {
319
+ return options.orientation === 'horizontal' ? max0 * widthScale : 0;
320
+ }
321
+ function statbarY() {
322
+ return options.orientation === 'horizontal' ? 0 : max0 * widthScale;
323
+ }
324
+ function statbarWidth() {
325
+ return options.orientation === 'horizontal' ? widthScale - cellPadding : options.width;
326
+ }
327
+ function statbarHeight() {
328
+ return options.orientation === 'horizontal' ? options.height : widthScale - cellPadding;
329
+ }
330
+ // ACCESSORS
331
+ chart.options = function (values) {
332
+ if (!arguments.length)
333
+ return options;
334
+ const vKeys = Object.keys(values);
335
+ const oKeys = Object.keys(options);
336
+ for (let k = 0; k < vKeys.length; k++) {
337
+ if (oKeys.indexOf(vKeys[k]) >= 0) {
338
+ if (typeof options[vKeys[k]] === 'object') {
339
+ const sKeys = Object.keys(values[vKeys[k]]);
340
+ const osKeys = Object.keys(options[vKeys[k]]);
341
+ for (let sk = 0; sk < sKeys.length; sk++) {
342
+ if (osKeys.indexOf(sKeys[sk]) >= 0) {
343
+ options[vKeys[k]][sKeys[sk]] = values[vKeys[k]][sKeys[sk]];
344
+ }
345
+ }
346
+ }
347
+ else {
348
+ options[vKeys[k]] = values[vKeys[k]];
349
+ }
350
+ }
351
+ }
352
+ return chart;
353
+ };
354
+ chart.data = function (value) {
355
+ if (!arguments.length)
356
+ return points;
357
+ points = value || [];
358
+ return chart;
359
+ };
360
+ chart.matchUp = function (matchUpState) {
361
+ const episodes = buildEpisodes(matchUpState);
362
+ const pts = episodes.map((ep) => ({
363
+ winner: ep.point.winner,
364
+ result: ep.point.result,
365
+ rallyLength: ep.point.rallyLength ?? 2,
366
+ }));
367
+ // Extract player names if available
368
+ const sides = matchUpState?.sides;
369
+ if (Array.isArray(sides) && sides.length === 2) {
370
+ const getName = (side) => {
371
+ const participant = side?.participant;
372
+ if (participant?.participantName)
373
+ return participant.participantName;
374
+ const person = participant?.person;
375
+ if (person)
376
+ return [person.standardGivenName, person.standardFamilyName].filter(Boolean).join(' ');
377
+ return undefined;
378
+ };
379
+ const n0 = getName(sides[0]);
380
+ const n1 = getName(sides[1]);
381
+ if (n0 && n1)
382
+ options.players = [n0, n1];
383
+ }
384
+ chart.data(pts);
385
+ return chart;
386
+ };
387
+ chart.events = function (value) {
388
+ if (!arguments.length)
389
+ return events;
390
+ if (typeof value !== 'undefined') {
391
+ const vKeys = Object.keys(value);
392
+ const eKeys = Object.keys(events);
393
+ for (let k = 0; k < vKeys.length; k++) {
394
+ if (eKeys.indexOf(vKeys[k]) >= 0) {
395
+ const sKeys = Object.keys(value[vKeys[k]]);
396
+ const esKeys = Object.keys(events[vKeys[k]]);
397
+ for (let sk = 0; sk < sKeys.length; sk++) {
398
+ if (esKeys.indexOf(sKeys[sk]) >= 0) {
399
+ events[vKeys[k]][sKeys[sk]] = value[vKeys[k]][sKeys[sk]];
400
+ }
401
+ }
402
+ }
403
+ }
404
+ }
405
+ return chart;
406
+ };
407
+ chart.update = update;
408
+ return chart;
409
+ }
410
+ //# sourceMappingURL=rallyTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rallyTree.js","sourceRoot":"","sources":["../../src/visualizations/rallyTree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function simpleChart(target: any, data: any, playerNames?: [string, string]): void;
2
+ /**
3
+ * Companion function: render simpleChart directly from a ScoringEngine MatchUp.
4
+ */
5
+ export declare function simpleChartFromMatchUp(target: any, matchUp: any, playerNames?: [string, string]): void;
6
+ //# sourceMappingURL=simpleChart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simpleChart.d.ts","sourceRoot":"","sources":["../../src/visualizations/simpleChart.ts"],"names":[],"mappings":"AAKA,wBAAgB,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,QA8HjF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAKtG"}
@@ -0,0 +1,126 @@
1
+ /* eslint-disable */
2
+ // @ts-nocheck
3
+ import { select, scaleLinear, line, axisBottom, axisLeft } from 'd3';
4
+ import { extractRallyLengths } from '../engine/feedMatchUp';
5
+ export function simpleChart(target, data, playerNames) {
6
+ const dom_parent = select('#' + target);
7
+ if (!dom_parent.node())
8
+ return; // Element not yet in DOM
9
+ // let dims = dom_parent.node().getBoundingClientRect();
10
+ // let screen_width = dims.width;
11
+ // let screen_height = screen_width / 2;
12
+ const screen_width = window.innerWidth * 0.85;
13
+ const screen_height = screen_width / 2;
14
+ const min_points = 50;
15
+ const colors = ['blue', 'red'];
16
+ dom_parent.selectAll('svg').remove();
17
+ const svg = dom_parent.append('svg').attr('width', screen_width).attr('height', screen_height);
18
+ const margin = { top: 30, right: 20, bottom: 50, left: 55 };
19
+ const width = +svg.attr('width') - margin.left - margin.right;
20
+ const height = +svg.attr('height') - margin.top - margin.bottom;
21
+ const x = scaleLinear().range([0, width]);
22
+ const y = scaleLinear().range([height, 0]);
23
+ const lineGenerator = line()
24
+ .x(function (d) {
25
+ return x(d[0]);
26
+ })
27
+ .y(function (d) {
28
+ return y(d[1]);
29
+ });
30
+ // .curve(d3.curveStepAfter);
31
+ const chart = svg.append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')');
32
+ const maxY = Math.max(...data.map((p) => p.length));
33
+ x.domain([0, Math.max(...data.map((p) => Math.max(...p)), min_points)]);
34
+ y.domain([0, maxY]);
35
+ chart
36
+ .append('g')
37
+ .attr('transform', 'translate(0,' + height + ')')
38
+ .call(axisBottom(x));
39
+ chart
40
+ .append('g')
41
+ .call(axisLeft(y)
42
+ .ticks(Math.min(maxY, 4))
43
+ .tickFormat((d) => d));
44
+ // X-axis label
45
+ chart
46
+ .append('text')
47
+ .attr('text-anchor', 'middle')
48
+ .attr('x', width / 2)
49
+ .attr('y', height + 40)
50
+ .attr('font-size', '14px')
51
+ .attr('fill', '#333')
52
+ .text('Rally Length');
53
+ // Y-axis label
54
+ chart
55
+ .append('text')
56
+ .attr('text-anchor', 'middle')
57
+ .attr('transform', 'rotate(-90)')
58
+ .attr('x', -height / 2)
59
+ .attr('y', -40)
60
+ .attr('font-size', '14px')
61
+ .attr('fill', '#333')
62
+ .text('Points Won');
63
+ // Legend
64
+ const names = playerNames || ['Player 1', 'Player 2'];
65
+ const legend = chart.append('g').attr('transform', `translate(${width - 180}, 0)`);
66
+ [0, 1].forEach((i) => {
67
+ const g = legend.append('g').attr('transform', `translate(0, ${i * 20})`);
68
+ g.append('line').attr('x1', 0).attr('x2', 20).attr('y1', 0).attr('y2', 0)
69
+ .attr('stroke', colors[i]).attr('stroke-width', 3);
70
+ g.append('text').attr('x', 25).attr('y', 4).attr('font-size', '12px').attr('fill', '#333')
71
+ .text(names[i]);
72
+ });
73
+ drawLines(data);
74
+ appendCircles(data);
75
+ function lineData(points) {
76
+ points = points.map((point, index) => [point, index + 1]);
77
+ points.unshift([0, 0]);
78
+ return points;
79
+ }
80
+ function drawLines(players) {
81
+ players.forEach((points, index) => {
82
+ chart
83
+ .append('path')
84
+ .datum(lineData(points))
85
+ .attr('fill', 'none')
86
+ .attr('stroke', colors[index])
87
+ .attr('stroke-width', '5px')
88
+ .attr('shape-rendering', 'crispEdges')
89
+ .attr('d', lineGenerator);
90
+ });
91
+ }
92
+ function appendCircles(players) {
93
+ players.forEach((points, index) => {
94
+ const targetclass = '.datapoint' + index;
95
+ if (points.length < 10) {
96
+ // D3 v7: Use .join() instead of .enter().append()
97
+ chart
98
+ .selectAll(targetclass)
99
+ .data(lineData(points))
100
+ .join('circle')
101
+ .attr('class', targetclass.slice(1)) // Remove leading dot for class name
102
+ .attr('fill', '#FFFFFF')
103
+ .attr('stroke', colors[index])
104
+ .attr('stroke-width', '2px')
105
+ .attr('r', 3.5)
106
+ .attr('cx', function (d) {
107
+ return x(d[0]);
108
+ })
109
+ .attr('cy', function (d) {
110
+ return y(d[1]);
111
+ });
112
+ }
113
+ });
114
+ }
115
+ }
116
+ /**
117
+ * Companion function: render simpleChart directly from a ScoringEngine MatchUp.
118
+ */
119
+ export function simpleChartFromMatchUp(target, matchUp, playerNames) {
120
+ const dom_parent = select('#' + target);
121
+ if (!dom_parent.node())
122
+ return; // Element not yet in DOM
123
+ const data = extractRallyLengths(matchUp);
124
+ simpleChart(target, data, playerNames);
125
+ }
126
+ //# sourceMappingURL=simpleChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simpleChart.js","sourceRoot":"","sources":["../../src/visualizations/simpleChart.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * StatView — Match statistics bar chart (D3 v7)
3
+ *
4
+ * Renders an SVG "table" — one row per stat: name centered, player values
5
+ * on left/right, horizontal bars showing relative proportions.
6
+ *
7
+ * Ported from legacy statView.js to D3 v7 TypeScript.
8
+ */
9
+ import type { StatObject } from "tods-competition-factory";
10
+ interface StatViewOptions {
11
+ id: string;
12
+ width: number;
13
+ height: number;
14
+ rowHeight: number;
15
+ margins: {
16
+ top: number;
17
+ bottom: number;
18
+ left: number;
19
+ right: number;
20
+ };
21
+ display: {
22
+ sizeToFit: {
23
+ width: boolean;
24
+ height: boolean;
25
+ };
26
+ transitionTime: number;
27
+ };
28
+ colors: {
29
+ players: {
30
+ 0: string;
31
+ 1: string;
32
+ };
33
+ };
34
+ }
35
+ export declare function statView(): {
36
+ (selection: any): void;
37
+ options(values?: Record<string, any>): StatViewOptions | /*elided*/ any;
38
+ events(functions?: any): {
39
+ update: {
40
+ begin: (() => void) | null;
41
+ end: (() => void) | null;
42
+ };
43
+ } | /*elided*/ any;
44
+ data(value?: StatObject[]): StatObject[] | /*elided*/ any;
45
+ matchUp(matchUpState: any): /*elided*/ any;
46
+ update(opts?: any): void;
47
+ width(value?: number): number | /*elided*/ any;
48
+ height(value?: number): number | /*elided*/ any;
49
+ colors(playerColors?: [string, string]): string[] | /*elided*/ any;
50
+ };
51
+ export {};
52
+ //# sourceMappingURL=statView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statView.d.ts","sourceRoot":"","sources":["../../src/visualizations/statView.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAM3D,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,OAAO,EAAE;QACP,SAAS,EAAE;YAAE,KAAK,EAAE,OAAO,CAAC;YAAC,MAAM,EAAE,OAAO,CAAA;SAAE,CAAC;QAC/C,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,MAAM,EAAE;QAAE,OAAO,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CAC/C;AAUD,wBAAgB,QAAQ;gBA0BI,GAAG;qBAqIM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;uBAMjB,GAAG;;mBAhJrB,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI;iBACrB,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI;;;iBAqJL,UAAU,EAAE;0BAMH,GAAG;kBAMX,GAAG;kBAQH,MAAM;mBAML,MAAM;0BAMC,CAAC,MAAM,EAAE,MAAM,CAAC;EAQzD"}