stream-charts 1.2.0 → 2.0.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 (463) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +809 -1022
  3. package/changes.md +40 -0
  4. package/dist/app/charts/Chart.d.ts +35 -139
  5. package/dist/app/charts/Chart.d.ts.map +1 -0
  6. package/dist/app/charts/Chart.js +74 -65
  7. package/dist/app/charts/Chart.js.map +1 -1
  8. package/dist/app/charts/axes/AxesState.d.ts +26 -18
  9. package/dist/app/charts/axes/AxesState.d.ts.map +1 -0
  10. package/dist/app/charts/axes/AxesState.js +26 -24
  11. package/dist/app/charts/axes/AxesState.js.map +1 -1
  12. package/dist/app/charts/axes/AxisInterval.d.ts +44 -26
  13. package/dist/app/charts/axes/AxisInterval.d.ts.map +1 -0
  14. package/dist/app/charts/axes/AxisInterval.js +48 -29
  15. package/dist/app/charts/axes/AxisInterval.js.map +1 -1
  16. package/dist/app/charts/axes/BaseAxisRange.d.ts +46 -22
  17. package/dist/app/charts/axes/BaseAxisRange.d.ts.map +1 -0
  18. package/dist/app/charts/axes/BaseAxisRange.js +17 -12
  19. package/dist/app/charts/axes/BaseAxisRange.js.map +1 -1
  20. package/dist/app/charts/axes/ContinuousAxis.d.ts +47 -6
  21. package/dist/app/charts/axes/ContinuousAxis.d.ts.map +1 -0
  22. package/dist/app/charts/axes/ContinuousAxis.js +160 -27
  23. package/dist/app/charts/axes/ContinuousAxis.js.map +1 -1
  24. package/dist/app/charts/axes/ContinuousAxisRange.d.ts +29 -10
  25. package/dist/app/charts/axes/ContinuousAxisRange.d.ts.map +1 -0
  26. package/dist/app/charts/axes/ContinuousAxisRange.js +29 -11
  27. package/dist/app/charts/axes/ContinuousAxisRange.js.map +1 -1
  28. package/dist/app/charts/axes/EmptyAxis.d.ts +5 -2
  29. package/dist/app/charts/axes/EmptyAxis.d.ts.map +1 -0
  30. package/dist/app/charts/axes/EmptyAxis.js +30 -9
  31. package/dist/app/charts/axes/EmptyAxis.js.map +1 -1
  32. package/dist/app/charts/axes/OrdinalAxis.d.ts +5 -3
  33. package/dist/app/charts/axes/OrdinalAxis.d.ts.map +1 -0
  34. package/dist/app/charts/axes/OrdinalAxis.js +39 -16
  35. package/dist/app/charts/axes/OrdinalAxis.js.map +1 -1
  36. package/dist/app/charts/axes/OrdinalAxisRange.d.ts +76 -13
  37. package/dist/app/charts/axes/OrdinalAxisRange.d.ts.map +1 -0
  38. package/dist/app/charts/axes/OrdinalAxisRange.js +95 -16
  39. package/dist/app/charts/axes/OrdinalAxisRange.js.map +1 -1
  40. package/dist/app/charts/axes/autoScale.d.ts +111 -0
  41. package/dist/app/charts/axes/autoScale.d.ts.map +1 -0
  42. package/dist/app/charts/axes/autoScale.js +188 -0
  43. package/dist/app/charts/axes/autoScale.js.map +1 -0
  44. package/dist/app/charts/axes/axes.d.ts +273 -150
  45. package/dist/app/charts/axes/axes.d.ts.map +1 -0
  46. package/dist/app/charts/axes/axes.js +808 -583
  47. package/dist/app/charts/axes/axes.js.map +1 -1
  48. package/dist/app/charts/d3types.d.ts +40 -11
  49. package/dist/app/charts/d3types.d.ts.map +1 -0
  50. package/dist/app/charts/d3types.js +3 -0
  51. package/dist/app/charts/d3types.js.map +1 -1
  52. package/dist/app/charts/datasources/StreamingDataSource.d.ts +149 -0
  53. package/dist/app/charts/datasources/StreamingDataSource.d.ts.map +1 -0
  54. package/dist/app/charts/datasources/StreamingDataSource.js +110 -0
  55. package/dist/app/charts/datasources/StreamingDataSource.js.map +1 -0
  56. package/dist/app/charts/datasources/iteratesDataSource.d.ts +73 -0
  57. package/dist/app/charts/datasources/iteratesDataSource.d.ts.map +1 -0
  58. package/dist/app/charts/datasources/iteratesDataSource.js +87 -0
  59. package/dist/app/charts/datasources/iteratesDataSource.js.map +1 -0
  60. package/dist/app/charts/datasources/ordinalDataSource.d.ts +75 -0
  61. package/dist/app/charts/datasources/ordinalDataSource.d.ts.map +1 -0
  62. package/dist/app/charts/datasources/ordinalDataSource.js +135 -0
  63. package/dist/app/charts/datasources/ordinalDataSource.js.map +1 -0
  64. package/dist/app/charts/datasources/outlierDataSource.d.ts +53 -0
  65. package/dist/app/charts/datasources/outlierDataSource.d.ts.map +1 -0
  66. package/dist/app/charts/datasources/outlierDataSource.js +57 -0
  67. package/dist/app/charts/datasources/outlierDataSource.js.map +1 -0
  68. package/dist/app/charts/datasources/timeSeriesDataSource.d.ts +77 -0
  69. package/dist/app/charts/datasources/timeSeriesDataSource.d.ts.map +1 -0
  70. package/dist/app/charts/datasources/timeSeriesDataSource.js +85 -0
  71. package/dist/app/charts/datasources/timeSeriesDataSource.js.map +1 -0
  72. package/dist/app/charts/filters/regexFilter.d.ts +31 -4
  73. package/dist/app/charts/filters/regexFilter.d.ts.map +1 -0
  74. package/dist/app/charts/filters/regexFilter.js +38 -4
  75. package/dist/app/charts/filters/regexFilter.js.map +1 -1
  76. package/dist/app/charts/hooks/AxesProvider.d.ts +21 -0
  77. package/dist/app/charts/hooks/AxesProvider.d.ts.map +1 -0
  78. package/dist/app/charts/hooks/AxesProvider.js +213 -0
  79. package/dist/app/charts/hooks/AxesProvider.js.map +1 -0
  80. package/dist/app/charts/hooks/CanvasSurfaceProvider.d.ts +25 -0
  81. package/dist/app/charts/hooks/CanvasSurfaceProvider.d.ts.map +1 -0
  82. package/dist/app/charts/hooks/CanvasSurfaceProvider.js +76 -0
  83. package/dist/app/charts/hooks/CanvasSurfaceProvider.js.map +1 -0
  84. package/dist/app/charts/hooks/ChartProvider.d.ts +40 -0
  85. package/dist/app/charts/hooks/ChartProvider.d.ts.map +1 -0
  86. package/dist/app/charts/hooks/ChartProvider.js +33 -0
  87. package/dist/app/charts/hooks/ChartProvider.js.map +1 -0
  88. package/dist/app/charts/hooks/InteractionProvider.d.ts +23 -0
  89. package/dist/app/charts/hooks/InteractionProvider.d.ts.map +1 -0
  90. package/dist/app/charts/hooks/InteractionProvider.js +60 -0
  91. package/dist/app/charts/hooks/InteractionProvider.js.map +1 -0
  92. package/dist/app/charts/hooks/PlotDimensionsProvider.d.ts +16 -0
  93. package/dist/app/charts/hooks/PlotDimensionsProvider.d.ts.map +1 -0
  94. package/dist/app/charts/hooks/PlotDimensionsProvider.js +76 -0
  95. package/dist/app/charts/hooks/PlotDimensionsProvider.js.map +1 -0
  96. package/dist/app/charts/hooks/defaultAxesValues.d.ts +11 -0
  97. package/dist/app/charts/hooks/defaultAxesValues.d.ts.map +1 -0
  98. package/dist/app/charts/hooks/defaultAxesValues.js +36 -0
  99. package/dist/app/charts/hooks/defaultAxesValues.js.map +1 -0
  100. package/dist/app/charts/hooks/defaultMouseValues.d.ts +9 -0
  101. package/dist/app/charts/hooks/defaultMouseValues.d.ts.map +1 -0
  102. package/dist/app/charts/hooks/defaultMouseValues.js +23 -0
  103. package/dist/app/charts/hooks/defaultMouseValues.js.map +1 -0
  104. package/dist/app/charts/hooks/defaultPlotDimensions.d.ts +13 -0
  105. package/dist/app/charts/hooks/defaultPlotDimensions.d.ts.map +1 -0
  106. package/dist/app/charts/hooks/defaultPlotDimensions.js +23 -0
  107. package/dist/app/charts/hooks/defaultPlotDimensions.js.map +1 -0
  108. package/dist/app/charts/hooks/defaultTooltipValues.d.ts +9 -0
  109. package/dist/app/charts/hooks/defaultTooltipValues.d.ts.map +1 -0
  110. package/dist/app/charts/hooks/defaultTooltipValues.js +21 -0
  111. package/dist/app/charts/hooks/defaultTooltipValues.js.map +1 -0
  112. package/dist/app/charts/hooks/defaultUseChartValues.d.ts +14 -0
  113. package/dist/app/charts/hooks/defaultUseChartValues.d.ts.map +1 -0
  114. package/dist/app/charts/hooks/defaultUseChartValues.js +30 -0
  115. package/dist/app/charts/hooks/defaultUseChartValues.js.map +1 -0
  116. package/dist/app/charts/hooks/useAxes.d.ts +49 -36
  117. package/dist/app/charts/hooks/useAxes.d.ts.map +1 -0
  118. package/dist/app/charts/hooks/useAxes.js +16 -176
  119. package/dist/app/charts/hooks/useAxes.js.map +1 -1
  120. package/dist/app/charts/hooks/useCanvasSurface.d.ts +25 -0
  121. package/dist/app/charts/hooks/useCanvasSurface.d.ts.map +1 -0
  122. package/dist/app/charts/hooks/useCanvasSurface.js +18 -0
  123. package/dist/app/charts/hooks/useCanvasSurface.js.map +1 -0
  124. package/dist/app/charts/hooks/useChart.d.ts +30 -44
  125. package/dist/app/charts/hooks/useChart.d.ts.map +1 -0
  126. package/dist/app/charts/hooks/useChart.js +26 -48
  127. package/dist/app/charts/hooks/useChart.js.map +1 -1
  128. package/dist/app/charts/hooks/useDataSource.d.ts +68 -0
  129. package/dist/app/charts/hooks/useDataSource.d.ts.map +1 -0
  130. package/dist/app/charts/hooks/useDataSource.js +63 -0
  131. package/dist/app/charts/hooks/useDataSource.js.map +1 -0
  132. package/dist/app/charts/hooks/useHoveredSeries.d.ts +25 -0
  133. package/dist/app/charts/hooks/useHoveredSeries.d.ts.map +1 -0
  134. package/dist/app/charts/hooks/useHoveredSeries.js +15 -0
  135. package/dist/app/charts/hooks/useHoveredSeries.js.map +1 -0
  136. package/dist/app/charts/hooks/useMouse.d.ts +46 -22
  137. package/dist/app/charts/hooks/useMouse.d.ts.map +1 -0
  138. package/dist/app/charts/hooks/useMouse.js +12 -56
  139. package/dist/app/charts/hooks/useMouse.js.map +1 -1
  140. package/dist/app/charts/hooks/usePlotDimensions.d.ts +25 -13
  141. package/dist/app/charts/hooks/usePlotDimensions.d.ts.map +1 -0
  142. package/dist/app/charts/hooks/usePlotDimensions.js +6 -62
  143. package/dist/app/charts/hooks/usePlotDimensions.js.map +1 -1
  144. package/dist/app/charts/hooks/useTooltip.d.ts +24 -26
  145. package/dist/app/charts/hooks/useTooltip.d.ts.map +1 -0
  146. package/dist/app/charts/hooks/useTooltip.js +12 -42
  147. package/dist/app/charts/hooks/useTooltip.js.map +1 -1
  148. package/dist/app/charts/index.d.ts +66 -0
  149. package/dist/app/charts/index.d.ts.map +1 -0
  150. package/dist/app/charts/index.js +87 -0
  151. package/dist/app/charts/index.js.map +1 -0
  152. package/dist/app/charts/legends/Legend.d.ts +33 -12
  153. package/dist/app/charts/legends/Legend.d.ts.map +1 -0
  154. package/dist/app/charts/legends/Legend.js +138 -379
  155. package/dist/app/charts/legends/Legend.js.map +1 -1
  156. package/dist/app/charts/legends/constants.d.ts +19 -0
  157. package/dist/app/charts/legends/constants.d.ts.map +1 -0
  158. package/dist/app/charts/legends/constants.js +34 -0
  159. package/dist/app/charts/legends/constants.js.map +1 -0
  160. package/dist/app/charts/observables/ChartData.d.ts +1 -0
  161. package/dist/app/charts/observables/ChartData.d.ts.map +1 -0
  162. package/dist/app/charts/observables/iterates.d.ts +13 -7
  163. package/dist/app/charts/observables/iterates.d.ts.map +1 -0
  164. package/dist/app/charts/observables/iterates.js +42 -9
  165. package/dist/app/charts/observables/iterates.js.map +1 -1
  166. package/dist/app/charts/observables/ordinals.d.ts +70 -12
  167. package/dist/app/charts/observables/ordinals.d.ts.map +1 -0
  168. package/dist/app/charts/observables/ordinals.js +127 -48
  169. package/dist/app/charts/observables/ordinals.js.map +1 -1
  170. package/dist/app/charts/observables/outliers.d.ts +18 -0
  171. package/dist/app/charts/observables/outliers.d.ts.map +1 -0
  172. package/dist/app/charts/observables/outliers.js +2 -0
  173. package/dist/app/charts/observables/outliers.js.map +1 -0
  174. package/dist/app/charts/plots/BarPlot.d.ts +87 -13
  175. package/dist/app/charts/plots/BarPlot.d.ts.map +1 -0
  176. package/dist/app/charts/plots/BarPlot.js +603 -356
  177. package/dist/app/charts/plots/BarPlot.js.map +1 -1
  178. package/dist/app/charts/plots/OutlierPlot.d.ts +123 -0
  179. package/dist/app/charts/plots/OutlierPlot.d.ts.map +1 -0
  180. package/dist/app/charts/plots/OutlierPlot.js +430 -0
  181. package/dist/app/charts/plots/OutlierPlot.js.map +1 -0
  182. package/dist/app/charts/plots/PoincarePlot.d.ts +92 -14
  183. package/dist/app/charts/plots/PoincarePlot.d.ts.map +1 -0
  184. package/dist/app/charts/plots/PoincarePlot.js +523 -364
  185. package/dist/app/charts/plots/PoincarePlot.js.map +1 -1
  186. package/dist/app/charts/plots/RasterPlot.d.ts +31 -10
  187. package/dist/app/charts/plots/RasterPlot.d.ts.map +1 -0
  188. package/dist/app/charts/plots/RasterPlot.js +198 -306
  189. package/dist/app/charts/plots/RasterPlot.js.map +1 -1
  190. package/dist/app/charts/plots/ScatterPlot.d.ts +77 -21
  191. package/dist/app/charts/plots/ScatterPlot.d.ts.map +1 -0
  192. package/dist/app/charts/plots/ScatterPlot.js +359 -302
  193. package/dist/app/charts/plots/ScatterPlot.js.map +1 -1
  194. package/dist/app/charts/plots/autoScaleYAxes.d.ts +43 -0
  195. package/dist/app/charts/plots/autoScaleYAxes.d.ts.map +1 -0
  196. package/dist/app/charts/plots/autoScaleYAxes.js +71 -0
  197. package/dist/app/charts/plots/autoScaleYAxes.js.map +1 -0
  198. package/dist/app/charts/plots/colorizedLine.d.ts +61 -0
  199. package/dist/app/charts/plots/colorizedLine.d.ts.map +1 -0
  200. package/dist/app/charts/plots/colorizedLine.js +157 -0
  201. package/dist/app/charts/plots/colorizedLine.js.map +1 -0
  202. package/dist/app/charts/plots/constants.d.ts +7 -0
  203. package/dist/app/charts/plots/constants.d.ts.map +1 -0
  204. package/dist/app/charts/plots/constants.js +11 -0
  205. package/dist/app/charts/plots/constants.js.map +1 -0
  206. package/dist/app/charts/plots/hitTesting.d.ts +88 -0
  207. package/dist/app/charts/plots/hitTesting.d.ts.map +1 -0
  208. package/dist/app/charts/plots/hitTesting.js +136 -0
  209. package/dist/app/charts/plots/hitTesting.js.map +1 -0
  210. package/dist/app/charts/plots/plot.d.ts +52 -16
  211. package/dist/app/charts/plots/plot.d.ts.map +1 -0
  212. package/dist/app/charts/plots/plot.js +108 -35
  213. package/dist/app/charts/plots/plot.js.map +1 -1
  214. package/dist/app/charts/plots/useCanvasZoomPan.d.ts +119 -0
  215. package/dist/app/charts/plots/useCanvasZoomPan.d.ts.map +1 -0
  216. package/dist/app/charts/plots/useCanvasZoomPan.js +113 -0
  217. package/dist/app/charts/plots/useCanvasZoomPan.js.map +1 -0
  218. package/dist/app/charts/plots/useStreamingTimeAxes.d.ts +103 -0
  219. package/dist/app/charts/plots/useStreamingTimeAxes.d.ts.map +1 -0
  220. package/dist/app/charts/plots/useStreamingTimeAxes.js +257 -0
  221. package/dist/app/charts/plots/useStreamingTimeAxes.js.map +1 -0
  222. package/dist/app/charts/series/baseSeries.d.ts +60 -8
  223. package/dist/app/charts/series/baseSeries.d.ts.map +1 -0
  224. package/dist/app/charts/series/baseSeries.js +53 -8
  225. package/dist/app/charts/series/baseSeries.js.map +1 -1
  226. package/dist/app/charts/series/iterateSeries.d.ts +9 -8
  227. package/dist/app/charts/series/iterateSeries.d.ts.map +1 -0
  228. package/dist/app/charts/series/iterateSeries.js +7 -7
  229. package/dist/app/charts/series/iterateSeries.js.map +1 -1
  230. package/dist/app/charts/series/ordinalSeries.d.ts +27 -13
  231. package/dist/app/charts/series/ordinalSeries.d.ts.map +1 -0
  232. package/dist/app/charts/series/ordinalSeries.js +29 -15
  233. package/dist/app/charts/series/ordinalSeries.js.map +1 -1
  234. package/dist/app/charts/series/outlierSeries.d.ts +142 -0
  235. package/dist/app/charts/series/outlierSeries.d.ts.map +1 -0
  236. package/dist/app/charts/series/outlierSeries.js +82 -0
  237. package/dist/app/charts/series/outlierSeries.js.map +1 -0
  238. package/dist/app/charts/series/timeSeries.d.ts +13 -9
  239. package/dist/app/charts/series/timeSeries.d.ts.map +1 -0
  240. package/dist/app/charts/series/timeSeries.js +6 -3
  241. package/dist/app/charts/series/timeSeries.js.map +1 -1
  242. package/dist/app/charts/series/timeSeriesChartData.d.ts +18 -10
  243. package/dist/app/charts/series/timeSeriesChartData.d.ts.map +1 -0
  244. package/dist/app/charts/series/timeSeriesChartData.js +28 -14
  245. package/dist/app/charts/series/timeSeriesChartData.js.map +1 -1
  246. package/dist/app/charts/styling/barPlotStyle.d.ts +46 -2
  247. package/dist/app/charts/styling/barPlotStyle.d.ts.map +1 -0
  248. package/dist/app/charts/styling/barPlotStyle.js +37 -3
  249. package/dist/app/charts/styling/barPlotStyle.js.map +1 -1
  250. package/dist/app/charts/styling/canvasStyle.d.ts +53 -0
  251. package/dist/app/charts/styling/canvasStyle.d.ts.map +1 -0
  252. package/dist/app/charts/styling/canvasStyle.js +71 -0
  253. package/dist/app/charts/styling/canvasStyle.js.map +1 -0
  254. package/dist/app/charts/styling/margins.d.ts +21 -2
  255. package/dist/app/charts/styling/margins.d.ts.map +1 -0
  256. package/dist/app/charts/styling/margins.js +25 -4
  257. package/dist/app/charts/styling/margins.js.map +1 -1
  258. package/dist/app/charts/styling/svgStyle.d.ts +10 -56
  259. package/dist/app/charts/styling/svgStyle.d.ts.map +1 -0
  260. package/dist/app/charts/styling/svgStyle.js +3 -78
  261. package/dist/app/charts/styling/svgStyle.js.map +1 -1
  262. package/dist/app/charts/subscriptions/viewDrivers.d.ts +124 -0
  263. package/dist/app/charts/subscriptions/viewDrivers.d.ts.map +1 -0
  264. package/dist/app/charts/subscriptions/viewDrivers.js +338 -0
  265. package/dist/app/charts/subscriptions/viewDrivers.js.map +1 -0
  266. package/dist/app/charts/tooltips/BarPlotTooltipContent.d.ts +12 -78
  267. package/dist/app/charts/tooltips/BarPlotTooltipContent.d.ts.map +1 -0
  268. package/dist/app/charts/tooltips/BarPlotTooltipContent.js +65 -257
  269. package/dist/app/charts/tooltips/BarPlotTooltipContent.js.map +1 -1
  270. package/dist/app/charts/tooltips/DefaultOutlierTooltipContent.d.ts +9 -0
  271. package/dist/app/charts/tooltips/DefaultOutlierTooltipContent.d.ts.map +1 -0
  272. package/dist/app/charts/tooltips/DefaultOutlierTooltipContent.js +16 -0
  273. package/dist/app/charts/tooltips/DefaultOutlierTooltipContent.js.map +1 -0
  274. package/dist/app/charts/tooltips/OutlierPlotTooltipContent.d.ts +30 -0
  275. package/dist/app/charts/tooltips/OutlierPlotTooltipContent.d.ts.map +1 -0
  276. package/dist/app/charts/tooltips/OutlierPlotTooltipContent.js +26 -0
  277. package/dist/app/charts/tooltips/OutlierPlotTooltipContent.js.map +1 -0
  278. package/dist/app/charts/tooltips/PoincarePlotTooltipContent.d.ts +22 -72
  279. package/dist/app/charts/tooltips/PoincarePlotTooltipContent.d.ts.map +1 -0
  280. package/dist/app/charts/tooltips/PoincarePlotTooltipContent.js +104 -171
  281. package/dist/app/charts/tooltips/PoincarePlotTooltipContent.js.map +1 -1
  282. package/dist/app/charts/tooltips/RasterPlotTooltipContent.d.ts +32 -8
  283. package/dist/app/charts/tooltips/RasterPlotTooltipContent.d.ts.map +1 -0
  284. package/dist/app/charts/tooltips/RasterPlotTooltipContent.js +62 -115
  285. package/dist/app/charts/tooltips/RasterPlotTooltipContent.js.map +1 -1
  286. package/dist/app/charts/tooltips/ScatterPlotTooltipContent.d.ts +39 -12
  287. package/dist/app/charts/tooltips/ScatterPlotTooltipContent.d.ts.map +1 -0
  288. package/dist/app/charts/tooltips/ScatterPlotTooltipContent.js +162 -134
  289. package/dist/app/charts/tooltips/ScatterPlotTooltipContent.js.map +1 -1
  290. package/dist/app/charts/tooltips/Tooltip.d.ts +27 -32
  291. package/dist/app/charts/tooltips/Tooltip.d.ts.map +1 -0
  292. package/dist/app/charts/tooltips/Tooltip.js +37 -81
  293. package/dist/app/charts/tooltips/Tooltip.js.map +1 -1
  294. package/dist/app/charts/tooltips/TooltipContent.d.ts +81 -0
  295. package/dist/app/charts/tooltips/TooltipContent.d.ts.map +1 -0
  296. package/dist/app/charts/tooltips/TooltipContent.js +99 -0
  297. package/dist/app/charts/tooltips/TooltipContent.js.map +1 -0
  298. package/dist/app/charts/tooltips/tooltipUtils.d.ts +186 -36
  299. package/dist/app/charts/tooltips/tooltipUtils.d.ts.map +1 -0
  300. package/dist/app/charts/tooltips/tooltipUtils.js +277 -48
  301. package/dist/app/charts/tooltips/tooltipUtils.js.map +1 -1
  302. package/dist/app/charts/tooltips/useOutlierTooltip.d.ts +59 -0
  303. package/dist/app/charts/tooltips/useOutlierTooltip.d.ts.map +1 -0
  304. package/dist/app/charts/tooltips/useOutlierTooltip.js +16 -0
  305. package/dist/app/charts/tooltips/useOutlierTooltip.js.map +1 -0
  306. package/dist/app/charts/tooltips/useTooltipPlacement.d.ts +51 -0
  307. package/dist/app/charts/tooltips/useTooltipPlacement.d.ts.map +1 -0
  308. package/dist/app/charts/tooltips/useTooltipPlacement.js +52 -0
  309. package/dist/app/charts/tooltips/useTooltipPlacement.js.map +1 -0
  310. package/dist/app/charts/tooltips/useTooltipStyle.d.ts +11 -0
  311. package/dist/app/charts/tooltips/useTooltipStyle.d.ts.map +1 -0
  312. package/dist/app/charts/tooltips/useTooltipStyle.js +14 -0
  313. package/dist/app/charts/tooltips/useTooltipStyle.js.map +1 -0
  314. package/dist/app/charts/trackers/Tracker.d.ts +22 -6
  315. package/dist/app/charts/trackers/Tracker.d.ts.map +1 -0
  316. package/dist/app/charts/trackers/Tracker.js +36 -22
  317. package/dist/app/charts/trackers/Tracker.js.map +1 -1
  318. package/dist/app/charts/trackers/trackerUtils.d.ts +40 -18
  319. package/dist/app/charts/trackers/trackerUtils.d.ts.map +1 -0
  320. package/dist/app/charts/trackers/trackerUtils.js +213 -300
  321. package/dist/app/charts/trackers/trackerUtils.js.map +1 -1
  322. package/dist/app/charts/utils.d.ts +72 -33
  323. package/dist/app/charts/utils.d.ts.map +1 -0
  324. package/dist/app/charts/utils.js +87 -42
  325. package/dist/app/charts/utils.js.map +1 -1
  326. package/dist/index.d.ts +2 -45
  327. package/dist/index.d.ts.map +1 -0
  328. package/dist/index.js +2 -72
  329. package/dist/index.js.map +1 -1
  330. package/package.json +87 -46
  331. package/src/app/charts/Chart.tsx +132 -168
  332. package/src/app/charts/axes/AxesState.ts +27 -29
  333. package/src/app/charts/axes/AxisInterval.ts +57 -32
  334. package/src/app/charts/axes/BaseAxisRange.ts +47 -27
  335. package/src/app/charts/axes/ContinuousAxis.tsx +235 -39
  336. package/src/app/charts/axes/ContinuousAxisRange.ts +29 -11
  337. package/src/app/charts/axes/EmptyAxis.tsx +52 -17
  338. package/src/app/charts/axes/OrdinalAxis.tsx +54 -28
  339. package/src/app/charts/axes/OrdinalAxisRange.ts +96 -16
  340. package/src/app/charts/axes/autoScale.ts +244 -0
  341. package/src/app/charts/axes/axes.ts +954 -735
  342. package/src/app/charts/d3types.ts +42 -13
  343. package/src/app/charts/datasources/StreamingDataSource.ts +214 -0
  344. package/src/app/charts/datasources/iteratesDataSource.ts +122 -0
  345. package/src/app/charts/datasources/ordinalDataSource.ts +205 -0
  346. package/src/app/charts/datasources/outlierDataSource.ts +90 -0
  347. package/src/app/charts/datasources/timeSeriesDataSource.ts +133 -0
  348. package/src/app/charts/filters/regexFilter.ts +45 -5
  349. package/src/app/charts/hooks/AxesProvider.tsx +301 -0
  350. package/src/app/charts/hooks/CanvasSurfaceProvider.tsx +117 -0
  351. package/src/app/charts/hooks/ChartProvider.tsx +79 -0
  352. package/src/app/charts/hooks/InteractionProvider.tsx +88 -0
  353. package/src/app/charts/hooks/PlotDimensionsProvider.tsx +109 -0
  354. package/src/app/charts/hooks/defaultAxesValues.ts +40 -0
  355. package/src/app/charts/hooks/defaultMouseValues.ts +24 -0
  356. package/src/app/charts/hooks/defaultPlotDimensions.ts +27 -0
  357. package/src/app/charts/hooks/defaultTooltipValues.tsx +23 -0
  358. package/src/app/charts/hooks/defaultUseChartValues.tsx +36 -0
  359. package/src/app/charts/hooks/useAxes.tsx +60 -228
  360. package/src/app/charts/hooks/useCanvasSurface.tsx +35 -0
  361. package/src/app/charts/hooks/useChart.tsx +47 -106
  362. package/src/app/charts/hooks/useDataSource.tsx +106 -0
  363. package/src/app/charts/hooks/useHoveredSeries.tsx +33 -0
  364. package/src/app/charts/hooks/useMouse.tsx +58 -82
  365. package/src/app/charts/hooks/usePlotDimensions.tsx +25 -89
  366. package/src/app/charts/hooks/useTooltip.tsx +32 -63
  367. package/src/app/charts/index.ts +213 -0
  368. package/src/app/charts/legends/Legend.tsx +198 -479
  369. package/src/app/charts/legends/constants.ts +37 -0
  370. package/src/app/charts/observables/iterates.ts +32 -12
  371. package/src/app/charts/observables/ordinals.ts +141 -67
  372. package/src/app/charts/observables/outliers.ts +20 -0
  373. package/src/app/charts/plots/BarPlot.tsx +784 -666
  374. package/src/app/charts/plots/OutlierPlot.tsx +685 -0
  375. package/src/app/charts/plots/PoincarePlot.tsx +707 -489
  376. package/src/app/charts/plots/RasterPlot.tsx +253 -445
  377. package/src/app/charts/plots/ScatterPlot.tsx +480 -463
  378. package/src/app/charts/plots/autoScaleYAxes.ts +102 -0
  379. package/src/app/charts/plots/colorizedLine.ts +185 -0
  380. package/src/app/charts/plots/constants.ts +16 -0
  381. package/src/app/charts/plots/hitTesting.ts +198 -0
  382. package/src/app/charts/plots/plot.ts +138 -44
  383. package/src/app/charts/plots/useCanvasZoomPan.ts +240 -0
  384. package/src/app/charts/plots/useStreamingTimeAxes.ts +384 -0
  385. package/src/app/charts/series/baseSeries.ts +81 -14
  386. package/src/app/charts/series/iterateSeries.ts +8 -8
  387. package/src/app/charts/series/ordinalSeries.ts +35 -20
  388. package/src/app/charts/series/outlierSeries.ts +188 -0
  389. package/src/app/charts/series/timeSeries.ts +14 -12
  390. package/src/app/charts/series/timeSeriesChartData.ts +31 -17
  391. package/src/app/charts/styling/barPlotStyle.ts +48 -5
  392. package/src/app/charts/styling/canvasStyle.ts +86 -0
  393. package/src/app/charts/styling/margins.ts +28 -4
  394. package/src/app/charts/styling/svgStyle.ts +10 -91
  395. package/src/app/charts/subscriptions/viewDrivers.ts +447 -0
  396. package/src/app/charts/tooltips/BarPlotTooltipContent.tsx +156 -380
  397. package/src/app/charts/tooltips/DefaultOutlierTooltipContent.tsx +40 -0
  398. package/src/app/charts/tooltips/OutlierPlotTooltipContent.tsx +67 -0
  399. package/src/app/charts/tooltips/PoincarePlotTooltipContent.tsx +229 -292
  400. package/src/app/charts/tooltips/RasterPlotTooltipContent.tsx +164 -217
  401. package/src/app/charts/tooltips/ScatterPlotTooltipContent.tsx +373 -236
  402. package/src/app/charts/tooltips/Tooltip.tsx +58 -124
  403. package/src/app/charts/tooltips/TooltipContent.tsx +177 -0
  404. package/src/app/charts/tooltips/tooltipUtils.ts +359 -61
  405. package/src/app/charts/tooltips/useOutlierTooltip.tsx +68 -0
  406. package/src/app/charts/tooltips/useTooltipPlacement.ts +86 -0
  407. package/src/app/charts/tooltips/useTooltipStyle.ts +15 -0
  408. package/src/app/charts/trackers/Tracker.tsx +68 -33
  409. package/src/app/charts/trackers/trackerUtils.ts +263 -376
  410. package/src/app/charts/utils.ts +90 -48
  411. package/src/index.ts +2 -322
  412. package/dist/app/charts/axes/AxesState.test.d.ts +0 -1
  413. package/dist/app/charts/axes/AxesState.test.js +0 -30
  414. package/dist/app/charts/axes/AxesState.test.js.map +0 -1
  415. package/dist/app/charts/axes/AxisInterval.test.d.ts +0 -1
  416. package/dist/app/charts/axes/AxisInterval.test.js +0 -120
  417. package/dist/app/charts/axes/AxisInterval.test.js.map +0 -1
  418. package/dist/app/charts/axes/ContinuousAxisRange.test.d.ts +0 -1
  419. package/dist/app/charts/axes/ContinuousAxisRange.test.js +0 -47
  420. package/dist/app/charts/axes/ContinuousAxisRange.test.js.map +0 -1
  421. package/dist/app/charts/axes/OrdinalAxisRange.test.d.ts +0 -1
  422. package/dist/app/charts/axes/OrdinalAxisRange.test.js +0 -48
  423. package/dist/app/charts/axes/OrdinalAxisRange.test.js.map +0 -1
  424. package/dist/app/charts/filters/regexFilter.test.d.ts +0 -1
  425. package/dist/app/charts/filters/regexFilter.test.js +0 -11
  426. package/dist/app/charts/filters/regexFilter.test.js.map +0 -1
  427. package/dist/app/charts/hooks/useDataObservable.d.ts +0 -72
  428. package/dist/app/charts/hooks/useDataObservable.js +0 -74
  429. package/dist/app/charts/hooks/useDataObservable.js.map +0 -1
  430. package/dist/app/charts/hooks/useInitialData.d.ts +0 -36
  431. package/dist/app/charts/hooks/useInitialData.js +0 -28
  432. package/dist/app/charts/hooks/useInitialData.js.map +0 -1
  433. package/dist/app/charts/observables/iterates.test.d.ts +0 -1
  434. package/dist/app/charts/observables/iterates.test.js +0 -180
  435. package/dist/app/charts/observables/iterates.test.js.map +0 -1
  436. package/dist/app/charts/observables/ordinals.test.d.ts +0 -1
  437. package/dist/app/charts/observables/ordinals.test.js +0 -102
  438. package/dist/app/charts/observables/ordinals.test.js.map +0 -1
  439. package/dist/app/charts/series/datumSeries.test.d.ts +0 -1
  440. package/dist/app/charts/series/datumSeries.test.js +0 -50
  441. package/dist/app/charts/series/datumSeries.test.js.map +0 -1
  442. package/dist/app/charts/styling/margins.test.d.ts +0 -1
  443. package/dist/app/charts/styling/margins.test.js +0 -19
  444. package/dist/app/charts/styling/margins.test.js.map +0 -1
  445. package/dist/app/charts/subscriptions/subscription.test.d.ts +0 -1
  446. package/dist/app/charts/subscriptions/subscription.test.js +0 -395
  447. package/dist/app/charts/subscriptions/subscription.test.js.map +0 -1
  448. package/dist/app/charts/subscriptions/subscriptions.d.ts +0 -100
  449. package/dist/app/charts/subscriptions/subscriptions.js +0 -449
  450. package/dist/app/charts/subscriptions/subscriptions.js.map +0 -1
  451. package/src/app/charts/axes/AxesState.test.ts +0 -34
  452. package/src/app/charts/axes/AxisInterval.test.ts +0 -143
  453. package/src/app/charts/axes/ContinuousAxisRange.test.ts +0 -55
  454. package/src/app/charts/axes/OrdinalAxisRange.test.ts +0 -55
  455. package/src/app/charts/filters/regexFilter.test.ts +0 -13
  456. package/src/app/charts/hooks/useDataObservable.tsx +0 -170
  457. package/src/app/charts/hooks/useInitialData.tsx +0 -64
  458. package/src/app/charts/observables/iterates.test.ts +0 -201
  459. package/src/app/charts/observables/ordinals.test.ts +0 -135
  460. package/src/app/charts/series/datumSeries.test.ts +0 -60
  461. package/src/app/charts/styling/margins.test.ts +0 -22
  462. package/src/app/charts/subscriptions/subscription.test.ts +0 -499
  463. package/src/app/charts/subscriptions/subscriptions.ts +0 -635
@@ -1,70 +1,22 @@
1
- import {Dimensions, Margin} from "../styling/margins";
2
- import {categoryTooltipY, defaultTooltipStyle, TooltipDimensions, TooltipStyle, tooltipX} from "./tooltipUtils";
3
- import * as d3 from "d3";
4
- import {formatTime, formatValue} from "../utils";
5
- import {useEffect, useMemo} from "react";
6
- import {NoTooltipMetadata, useChart} from "../hooks/useChart";
7
- import {OrdinalStringAxis, SeriesLineStyle} from "../axes/axes";
1
+ import type {ReactElement} from "react";
2
+ import {
3
+ categoryTooltipY,
4
+ type RasterTooltipMetadata,
5
+ type Sparkline,
6
+ sparklineFor,
7
+ type SeriesStatistics,
8
+ seriesStatistics,
9
+ type TooltipStyle,
10
+ valueOrMissing
11
+ } from "./tooltipUtils";
12
+ import {TooltipContent} from "./TooltipContent";
13
+ import {formatNumber, formatTime, formatValue} from "../utils";
14
+ import {useChart} from "../hooks/useChart";
15
+ import type {OrdinalStringAxis, SeriesLineStyle} from "../axes/axes";
8
16
  import {usePlotDimensions} from "../hooks/usePlotDimensions";
9
- import {Datum} from "../series/timeSeries";
10
- import {TooltipData} from "../hooks/useTooltip";
17
+ import type {Datum} from "../series/timeSeries";
11
18
  import {ContinuousAxisRange} from "../axes/ContinuousAxisRange";
12
-
13
- /**
14
- # Want to write your own tooltip-content component?
15
-
16
- Here's how to write your own tooltip-content component.
17
-
18
- To create your own tooltip content `<MyTooltipContent/>` you must do the following:
19
- 1. Create a react component for your tooltip content (see for example, {@link ScatterPlotTooltipContent}
20
- as a reference.
21
- 2. Use the {@link useChart} hook to get the {@link registerTooltipContentProvider} registration function.
22
- 3. When your tooltip content component (`<MyTooltipContent/>`) mounts, use the {@link registerTooltipContentProvider}
23
- function to register your tooltip content provider.
24
- 4. When the chart dimensions, margin, container, etc, change, register your tooltip content provider
25
- again (you can register as many times as you like because it only uses the last content provider
26
- registered).
27
-
28
- That's it! A bit more details below.
29
-
30
- The {@link registerTooltipContentProvider} function from the {@link useChart} hook allows you to register
31
- one tooltip content provider. A second call to this function will cause the {@link useChart} hook to drop
32
- the first one in favor of the second one.
33
-
34
- The {@link registerTooltipContentProvider} function from the {@link useChart} hook accepts a higher-order
35
- function that allowing a closure on content/chart-specific data. Specifically, you must hand the
36
- {@link registerTooltipContentProvider} a function of the form:
37
-
38
- `(seriesName: string, time: number, series: TimeSeries, mouseCoords: [x: number, y: number]) => TooltipDimensions`
39
-
40
- Your function to add that actual content will be what this function calls whenever d3 fires a mouse-over
41
- event on one you the time-series in the chart.
42
-
43
- The code snippet below is from the `useEffect` call in the {@link ScatterPlotTooltipContent}.
44
- Note that the first four arguments to the {@link addTooltipContent} function are those provided by the {@link useChart} hook
45
- when a d3 mouse-over event occurs on one of your series. The additional six arguments are from the closure formed
46
- on the variables in your component. The `chartId`, `container`, `margin`, and `plotDimensions` are from the
47
- {@link useChart} hook called by the {@link ScatterPlotTooltipContent} component. The last two
48
- arguments, `defaultTooltipStyle` and `options` are specific to the {@link ScatterPlotTooltipContent}.
49
- For example, the `options` property is set by the caller of the {@link ScatterPlotTooltipContent}
50
- component.
51
-
52
- ```ts
53
- // register the tooltip content provider function with the chart hook (useChart) so that
54
- // it is visible to all children of the Chart (i.e. the <Tooltip>).
55
- registerTooltipContentProvider(
56
- (seriesName: string, time: number, series: TimeSeries, mouseCoords: [x: number, y: number]) =>
57
- addTooltipContent(
58
- seriesName, time, series, mouseCoords,
59
- chartId, container, margin, plotDimensions,
60
- defaultTooltipStyle, options
61
- )
62
- )
63
- ```
64
-
65
- This pattern allows you to supplement that `useChart` mouse-over callback with information specific to you component.
66
-
67
- */
19
+ import type {Series} from "../plots/plot";
68
20
 
69
21
  /**
70
22
  * Options for displaying the tooltip content. These options are specific to this
@@ -75,12 +27,12 @@ import {ContinuousAxisRange} from "../axes/ContinuousAxisRange";
75
27
  * formatters.x(x), formatters.y(y)
76
28
  * ```
77
29
  */
78
- interface TooltipOptions {
79
- formatters: {
80
- x: (value: number) => string,
81
- y: (value: number) => string,
82
- }
83
- }
30
+ // interface TooltipOptions {
31
+ // formatters: {
32
+ // x: (value: number) => string,
33
+ // y: (value: number) => string,
34
+ // }
35
+ // }
84
36
 
85
37
  /**
86
38
  * Properties for rendering the tooltip content. The properties are applied as
@@ -89,185 +41,180 @@ interface TooltipOptions {
89
41
  * series name
90
42
  * xFormatter, yFormatter
91
43
  * ```
44
+ * Below that, the spikes' statistics: the mean value and standard deviation (formatted by
45
+ * `yFormatter`), and the mean time between spikes (formatted by `intervalFormatter`).
92
46
  */
93
47
  export interface Props {
48
+ /** formats the spike's time */
94
49
  xFormatter?: (value: number) => string
50
+ /** formats the values (the spike's value, and the mean and standard deviation of the values) */
95
51
  yFormatter?: (value: number) => string
52
+ /**
53
+ * formats the mean time between spikes (a duration, in the times' units). Defaults to the
54
+ * `xFormatter`, so give it its own formatter when the times are formatted as something that isn't
55
+ * a duration, such as the time of day
56
+ */
57
+ intervalFormatter?: (interval: number) => string
58
+ /** the style of the tooltip */
96
59
  style?: Partial<TooltipStyle>
97
60
  }
98
61
 
62
+ // the size of the tooltip's sparkline (of the spikes' values over the window)
63
+ const SPARKLINE_WIDTH = 180
64
+ const SPARKLINE_HEIGHT = 36
65
+
66
+ /**
67
+ * The data needed to render the tooltip's content, captured when the mouse moves over an element
68
+ */
69
+ interface RasterTooltipContent {
70
+ seriesName: string
71
+ spikeTime: number
72
+ value: number
73
+ // statistics of the series' spikes in the window (the data the chart holds)
74
+ statistics: SeriesStatistics | undefined
75
+ // the spikes' values over the window, when there are enough of them to draw
76
+ sparkline: Sparkline | undefined
77
+ // the spike's row's axis (the tooltip is centered on the row)
78
+ axis: OrdinalStringAxis
79
+ }
80
+
99
81
  /**
100
- * Adds tooltip content that shows the series name and the (time, value) of the selected point.
82
+ * Adds tooltip content that shows the series name, the (time, value) of the selected spike, the
83
+ * statistics of the series' spikes in the window of data the chart holds (their count, the mean
84
+ * and standard deviation of their values, and the mean time between them), and a sparkline of
85
+ * their values over the window, with the selected spike marked.
101
86
  * ```
102
87
  * series name
103
88
  * time, value
89
+ * statistics
90
+ * sparkline
104
91
  * ```
105
92
  *
106
- * Registers the tooltip-content provider with the `ChartContext` so that when d3 fires a mouse-over
107
- * event on a series. The content provider is returns the {@link addTooltipContent} function
108
- * when called. And when called the {@link addTooltipContent} function adds the actual tooltip
109
- * content to the SVG element.
93
+ * Built on {@link TooltipContent}; put it inside a {@link Tooltip}.
110
94
  * @param props The properties describing the tooltip content
111
- * @return null
95
+ * @return The tooltip's portal, or `null` when nothing is being hovered
112
96
  */
113
- export function RasterPlotTooltipContent(props: Props): null {
114
- const {
115
- chartId,
116
- container,
117
- tooltip,
118
- axes
119
- } = useChart<Datum, SeriesLineStyle, NoTooltipMetadata, ContinuousAxisRange, OrdinalStringAxis>()
120
-
121
- const {registerTooltipContentProvider} = tooltip
122
-
123
- const {
124
- yAxesState,
125
- axisAssignmentsFor
126
- } = axes
127
-
97
+ export function RasterPlotTooltipContent(props: Props): ReactElement | null {
98
+ const {axes} = useChart<Datum, SeriesLineStyle, Partial<RasterTooltipMetadata>, ContinuousAxisRange, OrdinalStringAxis>()
99
+ const {yAxesState, axisAssignmentsFor} = axes
128
100
  const {margin, plotDimensions} = usePlotDimensions()
129
101
 
130
102
  const {
131
103
  xFormatter = formatTime,
132
104
  yFormatter = formatValue,
105
+ intervalFormatter = xFormatter,
133
106
  style,
134
107
  } = props
135
108
 
136
- const tooltipStyle = useMemo(() => ({...defaultTooltipStyle, ...style}), [style])
137
-
138
- // register the tooltip content provider, which when called on mouse-enter-series events
139
- // will render the tooltip container and then the tooltip content. recall that that the
140
- // tooltip content is generated in this plot (because this is the plot that holds all the
141
- // information needed to render it), and the container for the content is rendered by
142
- // the <Tooltip>, which this know nothing about.
143
- //
144
- // the 'registration function accepts a function of the form (seriesName, time, series) => TooltipDimensions.
145
- // and that function has a closure on the content-specific information needed to add the
146
- // actual content
147
- useEffect(
148
- () => {
149
- if (container) {
150
- // assemble the options for adding the tooltip
151
- const options: TooltipOptions = {
152
- formatters: {
153
- x: xFormatter,
154
- y: yFormatter,
109
+ return (
110
+ <TooltipContent<Datum, Partial<RasterTooltipMetadata>, RasterTooltipContent>
111
+ style={style}
112
+ capture={(seriesName, _time, tooltipData) => {
113
+ const yAxisId = axisAssignmentsFor(seriesName).yAxis
114
+ const axis = yAxesState
115
+ .axisFor(yAxisId)
116
+ .getOrThrow(() => new Error(`No assigned y-axis exists; axis_id: ${yAxisId}`))
117
+ return captureTooltipContent(seriesName, tooltipData.series[0], tooltipData.metadata.spikes, axis)
118
+ }}
119
+ // (vertically, the tooltip is centered on the spike's row, rather than placed below the mouse)
120
+ topFor={(content, height) =>
121
+ categoryTooltipY(content.seriesName, height, content.axis, margin, content.axis.scale.bandwidth(), plotDimensions)
122
+ }
123
+ >
124
+ {(tooltipContent, tooltipStyle) => <>
125
+ <div style={{fontSize: tooltipStyle.fontSize, fontWeight: tooltipStyle.fontWeight}}>
126
+ {tooltipContent.seriesName}
127
+ </div>
128
+ <div style={{fontSize: tooltipStyle.fontSize + 2, fontWeight: tooltipStyle.fontWeight + 150}}>
129
+ {xFormatter(tooltipContent.spikeTime)}, {yFormatter(tooltipContent.value)}
130
+ </div>
131
+ {/* the series' spikes over the window (the data the chart holds) */}
132
+ {tooltipContent.statistics !== undefined && tooltipContent.statistics.count > 0 &&
133
+ // (sized to its content, rather than the app's default full-width tables, so that
134
+ // the values sit next to their labels)
135
+ <table style={{fontSize: tooltipStyle.fontSize, borderCollapse: 'collapse', border: 'none', marginTop: 6, width: 'auto'}}>
136
+ <tbody>
137
+ {[
138
+ ['Spikes', formatNumber(tooltipContent.statistics.count, " ,.0f")],
139
+ ['Mean value', valueOrMissing(tooltipContent.statistics.meanValue, yFormatter)],
140
+ ['Std. deviation', valueOrMissing(tooltipContent.statistics.valueStandardDeviation, yFormatter)],
141
+ ['Mean interval', valueOrMissing(tooltipContent.statistics.meanInterval, intervalFormatter)],
142
+ ].map(([label, value]) => (
143
+ <tr key={label}>
144
+ <td style={{padding: '1px 12px 1px 0', textAlign: 'left', border: 'none'}}>{label}</td>
145
+ <td style={{padding: '1px 0', textAlign: 'right', border: 'none'}}>{value}</td>
146
+ </tr>
147
+ ))}
148
+ </tbody>
149
+ </table>
155
150
  }
156
- }
157
-
158
- // register the tooltip content provider function with the chart hook (useChart) so that
159
- // it is visible to all children of the Chart (i.e. the <Tooltip>).
160
- registerTooltipContentProvider(
161
- /**
162
- *
163
- * @param seriesName The name of the series
164
- * @param time The mouse time
165
- * @param tooltipData The tooltip data holding the series and metadata (data about the series)
166
- * @param mouseCoords The coordinates of the mouse
167
- * @return The tooltip contents
168
- */
169
- (seriesName: string, time: number, tooltipData: TooltipData<Datum, NoTooltipMetadata>, mouseCoords: [x: number, y: number]) => {
170
- const yAxisId = axisAssignmentsFor(seriesName).yAxis
171
- const assignedAxis = yAxesState
172
- .axisFor(yAxisId)
173
- // .getOrElse(undefined as unknown as OrdinalStringAxis)
174
- .getOrThrow(() => new Error(`No assigned y-axis exists; axis_id: ${yAxisId}`))
175
- return addTooltipContent(
176
- seriesName, time, tooltipData.series[0], mouseCoords,
177
- chartId, container, margin, plotDimensions, tooltipStyle,
178
- assignedAxis,
179
- options
180
- )
151
+ {/* the spikes' values over the window, with the hovered spike marked (the dot) */}
152
+ {tooltipContent.sparkline !== undefined &&
153
+ <svg
154
+ width={SPARKLINE_WIDTH}
155
+ height={SPARKLINE_HEIGHT}
156
+ style={{display: 'block', marginTop: 8}}
157
+ aria-hidden="true"
158
+ >
159
+ <path
160
+ d={tooltipContent.sparkline.path}
161
+ fill="none"
162
+ stroke={tooltipStyle.fontColor}
163
+ strokeWidth={1.25}
164
+ strokeLinejoin="round"
165
+ strokeLinecap="round"
166
+ />
167
+ {tooltipContent.sparkline.mark !== undefined &&
168
+ <circle
169
+ cx={tooltipContent.sparkline.mark[0]}
170
+ cy={tooltipContent.sparkline.mark[1]}
171
+ r={2.5}
172
+ fill={tooltipStyle.fontColor}
173
+ />
174
+ }
175
+ </svg>
181
176
  }
182
- )
183
- }
184
- },
185
- [
186
- chartId, container, margin, plotDimensions, registerTooltipContentProvider,
187
- xFormatter,
188
- yFormatter,
189
- tooltipStyle,
190
- yAxesState, axisAssignmentsFor
191
- ]
177
+ </>}
178
+ </TooltipContent>
192
179
  )
193
-
194
- return null
195
180
  }
196
181
 
197
182
  /**
198
- * Callback function that adds tooltip content and returns the tooltip width and text height
183
+ * Captures the data needed to render the tooltip content: the selected spike, and the statistics
184
+ * and sparkline of the series' spikes
199
185
  * @param seriesName The name of the series (i.e. the neuron ID)
200
- * @param time The time (x-coordinate value) corresponding to the mouse location
201
- * @param selected The selected datum (time, value)
202
- * @param mouseCoords The coordinates of the mouse when the event was fired (relative to the plot container)
203
- * @param chartId The ID of this chart
204
- * @param container The plot container (SVGSVGElement)
205
- * @param margin The plot margins
206
- * @param tooltipStyle The style properties for the tooltip
186
+ * @param selected The selected datum (time, value), or `undefined` (in which case there's no tooltip)
187
+ * @param spikes All the series' spikes in the window (for the statistics and the sparkline), when known
207
188
  * @param axis The category axis to which the time-series is associated
208
- * @param plotDimensions The dimensions of the plot
209
- * @param options The options passed through the the function that adds the tooltip content
210
- * @return The width and text height of the tooltip content
189
+ * @return The tooltip's content, or `undefined` when there's no selected spike
211
190
  */
212
- function addTooltipContent(
191
+ function captureTooltipContent(
213
192
  seriesName: string,
214
- time: number,
215
- selected: Datum,
216
- mouseCoords: [x: number, y: number],
217
- chartId: number,
218
- container: SVGSVGElement,
219
- margin: Margin,
220
- plotDimensions: Dimensions,
221
- tooltipStyle: TooltipStyle,
193
+ selected: Datum | undefined,
194
+ spikes: Series<Datum> | undefined,
222
195
  axis: OrdinalStringAxis,
223
- options: TooltipOptions
224
- ): TooltipDimensions {
225
- const {formatters} = options
226
- const [x, ] = mouseCoords
227
- const {time: spikeTime, value} = selected
228
-
229
- // display the neuron ID in the tooltip
230
- const header = d3.select<SVGSVGElement | null, any>(container)
231
- .append<SVGTextElement>("text")
232
- .attr('id', `tn${spikeTime}-${seriesName}-${chartId}`)
233
- .attr('class', 'tooltip')
234
- .attr('fill', tooltipStyle.fontColor)
235
- .attr('font-family', 'sans-serif')
236
- .attr('font-size', tooltipStyle.fontSize)
237
- .attr('font-weight', tooltipStyle.fontWeight)
238
- .text(() => seriesName)
239
-
240
- // display the time (ms) and spike strength (mV) in the tooltip
241
- const text = d3.select<SVGSVGElement | null, any>(container)
242
- .append<SVGTextElement>("text")
243
- .attr('id', `t${spikeTime}-${seriesName}-${chartId}`)
244
- .attr('class', 'tooltip')
245
- .attr('fill', tooltipStyle.fontColor)
246
- .attr('font-family', 'sans-serif')
247
- .attr('font-size', tooltipStyle.fontSize + 2)
248
- .attr('font-weight', tooltipStyle.fontWeight + 150)
249
- .text(() => `${formatters.x(spikeTime)}, ${formatters.y(value)}`)
250
-
251
- // calculate the max width and height of the text
252
- const tooltipWidth = Math.max(header.node()?.getBBox()?.width || 0, text.node()?.getBBox()?.width || 0);
253
- const headerTextHeight = header.node()?.getBBox()?.height || 0;
254
- const idHeight = text.node()?.getBBox()?.height || 0;
255
- const textHeight = headerTextHeight + idHeight;
256
-
257
- // set the header text location
258
- // const spikeHeight = plotDimensions.height / liveDataRef.current.size
259
- const xCoord = tooltipX(x, tooltipWidth, plotDimensions, tooltipStyle, margin)
260
- const yCoord = categoryTooltipY(seriesName, textHeight, axis, tooltipStyle, margin, axis.scale.bandwidth(), plotDimensions)
261
- const xTooltip = xCoord + tooltipStyle.paddingLeft
262
- const yTooltip = yCoord + tooltipStyle.paddingTop
263
- header
264
- .attr('x', () => xTooltip)
265
- .attr('y', () => yTooltip - idHeight + textHeight)
266
-
267
- // set the tooltip text (i.e. neuron ID) location
268
- text
269
- .attr('x', () => xTooltip)
270
- .attr('y', () => yTooltip + textHeight)
196
+ ): RasterTooltipContent | undefined {
197
+ // `selected` comes from the caller's `tooltipData.series[0]` -- this component is a public,
198
+ // independently-usable tooltip-content provider, and `TooltipData.series: Series<D>` permits
199
+ // an empty array, so guard here rather than relying on every caller to have already checked
200
+ // (RasterPlot.tsx's own mousemove handler does today, but that shouldn't be the only thing
201
+ // standing between an empty series and a destructuring crash below)
202
+ if (selected === undefined) return undefined
203
+
204
+ const {x: spikeTime, y} = selected
205
+
206
+ // the spikes' statistics, and their values over time, over the window (the data the chart holds)
207
+ const spikeValues: Array<{ time: number, value: number }> = []
208
+ if (spikes !== undefined) {
209
+ for (let i = 0; i < spikes.length; i++) spikeValues.push({time: spikes[i].x, value: spikes[i].y})
210
+ }
271
211
 
272
- return {x: xCoord, y: yCoord, contentWidth: tooltipWidth, contentHeight: textHeight}
212
+ return {
213
+ seriesName,
214
+ spikeTime,
215
+ value: y,
216
+ statistics: spikes !== undefined ? seriesStatistics(spikes) : undefined,
217
+ sparkline: sparklineFor(spikeValues, SPARKLINE_WIDTH, SPARKLINE_HEIGHT, 2, undefined, spikeTime),
218
+ axis,
219
+ }
273
220
  }