@cdc/chart 4.26.7 → 4.26.10

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 (255) hide show
  1. package/CONFIG.md +502 -368
  2. package/dist/cdcchart-CYc-Kayd.es.js +22488 -0
  3. package/dist/cdcchart-DCKn8NmI.es.js +20695 -0
  4. package/dist/cdcchart-Dyui9nk_.es.js +45828 -0
  5. package/dist/cdcchart.js +4 -97406
  6. package/examples/__data__/vega-remote-data.json +6 -0
  7. package/examples/dendrogram.json +18 -0
  8. package/examples/feature/bar/bar-chart-race-annual-change.json +68 -0
  9. package/examples/feature/heatmap/average-age-categorical.json +2 -2
  10. package/examples/feature/heatmap/calendar-heatmap.json +2 -2
  11. package/examples/feature/heatmap/cell-values-bottom-axis.json +2 -2
  12. package/examples/feature/heatmap/sparse-aggregation.json +2 -2
  13. package/examples/feature/line/line-chart-race.json +50 -0
  14. package/examples/feature/sankey/sankey-example-data.json +40 -1441
  15. package/examples/feature/sankey/sankey_chart_data.csv +9 -20
  16. package/examples/network.json +31 -0
  17. package/examples/private/box-plot.json +573 -0
  18. package/examples/private/custom-color-issue.json +625 -0
  19. package/examples/private/custom-colors.json +522 -0
  20. package/examples/private/cutoff.json +10750 -0
  21. package/examples/private/overlay-legend.json +485 -0
  22. package/examples/private/pie-test.json +469 -0
  23. package/examples/vega-remote.json +22 -0
  24. package/package.json +11 -5
  25. package/src/CdcChartComponent.tsx +405 -208
  26. package/src/_stories/Chart.BarRace.stories.tsx +443 -0
  27. package/src/_stories/Chart.BoxPlotNumericSort.stories.tsx +189 -0
  28. package/src/_stories/Chart.BoxPlotStatsParity.stories.tsx +207 -0
  29. package/src/_stories/Chart.ColorDistribution.stories.tsx +299 -0
  30. package/src/_stories/Chart.DataCutoff.stories.tsx +147 -0
  31. package/src/_stories/Chart.DataTableDownloadFilename.stories.tsx +60 -0
  32. package/src/_stories/Chart.Dendrogram.stories.tsx +373 -0
  33. package/src/_stories/Chart.Forecast.CILegend.stories.tsx +236 -0
  34. package/src/_stories/Chart.HeatMap.stories.tsx +170 -4
  35. package/src/_stories/Chart.Legend.AxisAlign.stories.tsx +119 -0
  36. package/src/_stories/Chart.LineRace.stories.tsx +149 -0
  37. package/src/_stories/Chart.Network.stories.tsx +432 -0
  38. package/src/_stories/Chart.PaletteConversion.Editor.stories.tsx +208 -0
  39. package/src/_stories/Chart.Patterns.smoke.stories.tsx +31 -0
  40. package/src/_stories/Chart.PercentageValue.stories.tsx +311 -0
  41. package/src/_stories/Chart.PieLabels.stories.tsx +4 -2
  42. package/src/_stories/Chart.RankByValueMutation.stories.tsx +206 -0
  43. package/src/_stories/Chart.RequiredFields.stories.tsx +681 -0
  44. package/src/_stories/Chart.Sankey.stories.tsx +417 -0
  45. package/src/_stories/Chart.SeriesColorAssignments.stories.tsx +47 -0
  46. package/src/_stories/Chart.SmallMultiplesNumericTileOrder.stories.tsx +137 -0
  47. package/src/_stories/Chart.TooltipSeriesLabels.stories.tsx +43 -0
  48. package/src/_stories/Chart.VegaRemoteData.stories.tsx +31 -0
  49. package/src/_stories/ChartAnnotation.Editor.stories.tsx +78 -0
  50. package/src/_stories/ChartAxisTitles.smoke.stories.tsx +48 -0
  51. package/src/_stories/ChartBar.Editor.stories.tsx +499 -57
  52. package/src/_stories/ChartBrush.Editor.stories.tsx +46 -67
  53. package/src/_stories/ChartBrush.Regression.stories.tsx +135 -0
  54. package/src/_stories/ChartEditor.Editor.stories.tsx +33 -3
  55. package/src/_stories/ChartLine.EffectCompatibility.stories.tsx +120 -0
  56. package/src/_stories/_mock/annotation_event-line_mock.json +2 -2
  57. package/src/_stories/_mock/editor-test-configs.json +20 -10
  58. package/src/_stories/_mock/editor-test-datasets.json +38 -42
  59. package/src/_stories/_mock/heatmap-average-age-categorical.json +2 -2
  60. package/src/_stories/_mock/heatmap.json +2 -2
  61. package/src/_stories/_mock/legend-axis-align-stacked-bar.json +125 -0
  62. package/src/_stories/_mock/sankey_mock.json +23 -27
  63. package/src/components/Annotations/components/AnnotationDraggable.styles.css +52 -0
  64. package/src/components/Annotations/components/AnnotationDraggable.tsx +639 -139
  65. package/src/components/Annotations/components/AnnotationDropdown.styles.css +44 -4
  66. package/src/components/Annotations/components/AnnotationDropdown.tsx +10 -32
  67. package/src/components/Annotations/helpers/resolveAnnotationLayout.ts +212 -0
  68. package/src/components/Annotations/tests/AnnotationDraggable.test.tsx +612 -19
  69. package/src/components/Annotations/tests/AnnotationDropdown.test.tsx +50 -0
  70. package/src/components/Annotations/tests/resolveAnnotationLayout.test.ts +203 -0
  71. package/src/components/Axis/BottomAxis.tsx +1 -1
  72. package/src/components/Axis/Categorical.Axis.tsx +3 -3
  73. package/src/components/Axis/RightAxis.tsx +21 -13
  74. package/src/components/BarChart/components/BarChart.Horizontal.tsx +38 -6
  75. package/src/components/BarChart/components/BarChart.StackedHorizontal.tsx +12 -3
  76. package/src/components/BarChart/components/BarChart.StackedVertical.test.ts +28 -0
  77. package/src/components/BarChart/components/BarChart.StackedVertical.tsx +29 -25
  78. package/src/components/BarChart/components/BarChart.Vertical.tsx +37 -26
  79. package/src/components/BarChart/components/PortionPatternOverlay.tsx +61 -0
  80. package/src/components/BarChart/components/context.tsx +6 -0
  81. package/src/components/BarChart/helpers/getPatternUrl.ts +2 -5
  82. package/src/components/BarChart/helpers/index.ts +8 -0
  83. package/src/components/BarChart/helpers/portionPattern.ts +243 -0
  84. package/src/components/BarChart/helpers/tests/addMinimumBarHeights.test.ts +42 -0
  85. package/src/components/BarChart/helpers/tests/getPatternUrl.test.ts +13 -0
  86. package/src/components/BarChart/helpers/tests/portionPattern.test.ts +280 -0
  87. package/src/components/BarChart/helpers/tests/useBarChart.test.tsx +104 -0
  88. package/src/components/BarChart/helpers/useBarChart.ts +60 -59
  89. package/src/components/BarChartRace/BarChartRace.test.tsx +199 -0
  90. package/src/components/BarChartRace/BarChartRace.tsx +230 -0
  91. package/src/components/BarChartRace/BarChartRaceFallback.test.tsx +61 -0
  92. package/src/components/BarChartRace/BarChartRaceFallback.tsx +48 -0
  93. package/src/components/BarChartRace/bar-chart-race.css +160 -0
  94. package/src/components/BarChartRace/helpers.test.ts +114 -0
  95. package/src/components/BarChartRace/helpers.ts +185 -0
  96. package/src/components/BarChartRace/index.ts +3 -0
  97. package/src/components/BoxPlot/helpers/index.ts +11 -82
  98. package/src/components/Brush/BrushSelector.tsx +9 -23
  99. package/src/components/Brush/MiniChartPreview.tsx +33 -1
  100. package/src/components/Dendrogram/components/Dendrogram.tsx +374 -0
  101. package/src/components/Dendrogram/dendrogram.css +113 -0
  102. package/src/components/Dendrogram/helpers/layoutDendrogram.test.ts +95 -0
  103. package/src/components/Dendrogram/helpers/layoutDendrogram.ts +56 -0
  104. package/src/components/Dendrogram/helpers/prepareDendrogramData.test.ts +135 -0
  105. package/src/components/Dendrogram/helpers/prepareDendrogramData.ts +166 -0
  106. package/src/components/Dendrogram/helpers/resolveDendrogramLabels.test.ts +196 -0
  107. package/src/components/Dendrogram/helpers/resolveDendrogramLabels.ts +418 -0
  108. package/src/components/Dendrogram/index.tsx +1 -0
  109. package/src/components/Dendrogram/types/index.ts +66 -0
  110. package/src/components/EditorPanel/EditorPanel.tsx +1005 -760
  111. package/src/components/EditorPanel/components/Panels/Panel.Annotate.tsx +50 -5
  112. package/src/components/EditorPanel/components/Panels/Panel.Dendrogram.css +10 -0
  113. package/src/components/EditorPanel/components/Panels/Panel.Dendrogram.tsx +211 -0
  114. package/src/components/EditorPanel/components/Panels/Panel.ForestPlotSettings.tsx +19 -8
  115. package/src/components/EditorPanel/components/Panels/Panel.General.tsx +88 -54
  116. package/src/components/EditorPanel/components/Panels/Panel.Network.css +9 -0
  117. package/src/components/EditorPanel/components/Panels/Panel.Network.tsx +202 -0
  118. package/src/components/EditorPanel/components/Panels/Panel.PatternSettings.tsx +233 -33
  119. package/src/components/EditorPanel/components/Panels/Panel.Radar.tsx +6 -1
  120. package/src/components/EditorPanel/components/Panels/Panel.Sankey.tsx +89 -105
  121. package/src/components/EditorPanel/components/Panels/Panel.Series.tsx +2 -2
  122. package/src/components/EditorPanel/components/Panels/Panel.SmallMultiples.tsx +1 -1
  123. package/src/components/EditorPanel/components/Panels/Panel.Visual.tsx +8 -66
  124. package/src/components/EditorPanel/components/Panels/RacingControls.test.tsx +131 -0
  125. package/src/components/EditorPanel/components/Panels/RacingControls.tsx +185 -0
  126. package/src/components/EditorPanel/components/Panels/SeriesColorAssignments.tsx +2 -2
  127. package/src/components/EditorPanel/components/Panels/index.tsx +4 -0
  128. package/src/components/EditorPanel/helpers/getVisualizationTypeConfigUpdate.ts +20 -7
  129. package/src/components/EditorPanel/helpers/tests/getVisualizationTypeConfigUpdate.test.ts +25 -2
  130. package/src/components/EditorPanel/helpers/updateFieldRankByValue.ts +2 -1
  131. package/src/components/EditorPanel/useEditorPermissions.test.tsx +62 -0
  132. package/src/components/EditorPanel/useEditorPermissions.ts +70 -24
  133. package/src/components/Forecasting/Forecasting.tsx +15 -6
  134. package/src/components/HeatMap/components/HeatMap.tsx +511 -178
  135. package/src/components/HeatMap/heatmap.constants.ts +7 -3
  136. package/src/components/HeatMap/heatmap.css +101 -2
  137. package/src/components/HeatMap/helpers/layout.ts +80 -0
  138. package/src/components/HeatMap/tests/HeatMap.test.tsx +339 -16
  139. package/src/components/HeatMap/tests/helpers.test.ts +79 -0
  140. package/src/components/Legend/Legend.Component.tsx +110 -90
  141. package/src/components/Legend/LegendGroup/LegendGroup.styles.css +7 -0
  142. package/src/components/Legend/LegendGroup/LegendGroup.tsx +47 -34
  143. package/src/components/Legend/helpers/createFormatLabels.test.ts +226 -0
  144. package/src/components/Legend/helpers/createFormatLabels.tsx +45 -51
  145. package/src/components/LineChart/components/LineChart.Circle.tsx +3 -3
  146. package/src/components/LineChart/helpers.test.ts +126 -38
  147. package/src/components/LineChart/helpers.ts +9 -4
  148. package/src/components/LineChart/index.tsx +69 -24
  149. package/src/components/LineChart/tests/LineChart.test.tsx +630 -0
  150. package/src/components/LineChartRace/LineChartRace.test.tsx +275 -0
  151. package/src/components/LineChartRace/LineChartRace.tsx +134 -0
  152. package/src/components/LineChartRace/LineChartRaceFallback.tsx +28 -0
  153. package/src/components/LineChartRace/helpers.test.ts +88 -0
  154. package/src/components/LineChartRace/helpers.ts +157 -0
  155. package/src/components/LineChartRace/index.ts +3 -0
  156. package/src/components/LineChartRace/line-chart-race.css +16 -0
  157. package/src/components/LinearChart/ValueAxisAnchors.tsx +58 -0
  158. package/src/components/LinearChart/VisualizationRenderer.tsx +18 -23
  159. package/src/components/LinearChart/tests/LinearChart.test.tsx +412 -13
  160. package/src/components/LinearChart/tests/VisualizationRenderer.test.tsx +141 -0
  161. package/src/components/LinearChart/tests/mockConfigContext.ts +2 -1
  162. package/src/components/LinearChart.tsx +81 -51
  163. package/src/components/Network/components/Network.tsx +372 -0
  164. package/src/components/Network/helpers/layoutNetwork.test.ts +68 -0
  165. package/src/components/Network/helpers/layoutNetwork.ts +87 -0
  166. package/src/components/Network/helpers/prepareNetworkData.test.ts +116 -0
  167. package/src/components/Network/helpers/prepareNetworkData.ts +101 -0
  168. package/src/components/Network/helpers/resolveNetworkLabels.test.ts +112 -0
  169. package/src/components/Network/helpers/resolveNetworkLabels.ts +206 -0
  170. package/src/components/Network/index.tsx +3 -0
  171. package/src/components/Network/network.css +107 -0
  172. package/src/components/Network/types/index.ts +56 -0
  173. package/src/components/PairedBarChart.jsx +5 -10
  174. package/src/components/PairedBarChart.test.tsx +71 -0
  175. package/src/components/PieChart/PieChart.tsx +9 -8
  176. package/src/components/RacingChartRenderer.tsx +44 -0
  177. package/src/components/Regions/components/Regions.test.tsx +179 -0
  178. package/src/components/Regions/components/Regions.tsx +104 -69
  179. package/src/components/Regions/index.tsx +2 -3
  180. package/src/components/Sankey/components/Sankey.tsx +264 -437
  181. package/src/components/Sankey/helpers/getSankeyTooltip.ts +12 -0
  182. package/src/components/Sankey/helpers/prepareSankeyData.test.ts +71 -0
  183. package/src/components/Sankey/helpers/prepareSankeyData.ts +90 -0
  184. package/src/components/Sankey/sankey.scss +57 -116
  185. package/src/components/Sankey/types/index.ts +41 -4
  186. package/src/components/ScatterPlot/ScatterPlot.jsx +28 -4
  187. package/src/components/ScatterPlot/ScatterPlot.test.tsx +60 -0
  188. package/src/components/SmallMultiples/SmallMultiples.tsx +12 -12
  189. package/src/components/SmallMultiples/tests/SmallMultipleTile.test.tsx +7 -5
  190. package/src/components/raceTiming.ts +18 -0
  191. package/src/data/initial-state.js +77 -31
  192. package/src/helpers/applyChartTypeContract.ts +71 -0
  193. package/src/helpers/axisLabelFontSize.ts +2 -2
  194. package/src/helpers/boxPlotStats.ts +60 -0
  195. package/src/helpers/bumpChartTooltip.ts +2 -1
  196. package/src/helpers/calculateHorizontalBarCategoryLabelWidth.test.ts +37 -0
  197. package/src/helpers/calculateHorizontalBarCategoryLabelWidth.ts +3 -2
  198. package/src/helpers/calculateRightYAxisWidth.ts +60 -0
  199. package/src/helpers/colorAssignmentHelpers.ts +2 -2
  200. package/src/helpers/createNewChartConfig.ts +56 -0
  201. package/src/helpers/dataDrivenYAxisCategories.ts +18 -0
  202. package/src/helpers/forecastLegend.ts +88 -0
  203. package/src/helpers/getBoxPlotConfig.ts +18 -37
  204. package/src/helpers/getChartTypeDefaultPalette.ts +29 -0
  205. package/src/helpers/getColorCodeCategoryColorMap.ts +26 -0
  206. package/src/helpers/getColorScale.ts +31 -22
  207. package/src/helpers/getDynamicYAxisCategories.ts +69 -0
  208. package/src/helpers/getMinMax.ts +9 -7
  209. package/src/helpers/getNewRuntime.ts +5 -2
  210. package/src/helpers/getStackedSeriesMax.ts +51 -0
  211. package/src/helpers/getV21ChartDistributionColors.ts +57 -0
  212. package/src/helpers/handleRankByValue.ts +15 -15
  213. package/src/helpers/seriesColumnSettings.ts +10 -0
  214. package/src/helpers/sizeHelpers.ts +4 -3
  215. package/src/helpers/smallMultiplesHelpers.ts +10 -13
  216. package/src/helpers/tests/applyChartTypeContract.test.ts +37 -0
  217. package/src/helpers/tests/boxPlotStats.test.ts +31 -0
  218. package/src/helpers/tests/bumpChartTooltip.test.ts +29 -0
  219. package/src/helpers/tests/calculateRightYAxisWidth.test.ts +105 -0
  220. package/src/helpers/tests/countNumOfTicks.test.ts +11 -0
  221. package/src/helpers/tests/createNewChartConfig.test.ts +182 -0
  222. package/src/helpers/tests/getBoxPlotConfig.test.ts +70 -0
  223. package/src/helpers/tests/getColorCodeCategoryColorMap.test.ts +113 -0
  224. package/src/helpers/tests/getColorScale.test.ts +226 -1
  225. package/src/helpers/tests/getDynamicYAxisCategories.test.ts +61 -0
  226. package/src/helpers/tests/getMinMax.test.ts +41 -0
  227. package/src/helpers/tests/getStackedSeriesMax.test.ts +26 -0
  228. package/src/helpers/tests/handleRankByValue.test.ts +55 -37
  229. package/src/helpers/tests/seriesColumnSettings.test.ts +23 -0
  230. package/src/helpers/tests/smallMultiplesHelpers.test.ts +37 -1
  231. package/src/helpers/tests/tooltipHelpers.test.ts +80 -0
  232. package/src/helpers/tooltipHelpers.ts +16 -0
  233. package/src/hooks/tests/useTooltip.test.tsx +353 -1
  234. package/src/hooks/usePrefersReducedMotion.ts +22 -0
  235. package/src/hooks/useReduceData.ts +4 -36
  236. package/src/hooks/useScales.ts +15 -0
  237. package/src/hooks/useTooltip.tsx +95 -64
  238. package/src/scss/main.scss +74 -2
  239. package/src/store/chart.reducer.ts +4 -3
  240. package/src/test/CdcChart.dataTable.test.tsx +490 -16
  241. package/src/test/CdcChart.dendrogram.test.tsx +277 -0
  242. package/src/test/CdcChart.finalization.test.tsx +143 -0
  243. package/src/test/CdcChart.network.test.tsx +271 -0
  244. package/src/types/ChartConfig.ts +91 -54
  245. package/src/types/ChartContext.ts +5 -0
  246. package/src/types/Horizon.ts +1 -1
  247. package/LICENSE +0 -201
  248. package/dist/cdcchart-BWVIUcAF.es.js +0 -4802
  249. package/src/_stories/Chart.Sankey.smoke.stories.tsx +0 -62
  250. package/src/components/Sankey/components/ColumnList.tsx +0 -19
  251. package/src/components/Sankey/helpers/getSankeyTooltip.tsx +0 -34
  252. package/src/components/Sankey/useSankeyAlert.tsx +0 -60
  253. package/src/data/legacy-defaults.ts +0 -18
  254. package/src/helpers/ensureSpecialChartAxisTypes.ts +0 -11
  255. package/src/helpers/tests/ensureSpecialChartAxisTypes.test.ts +0 -30
@@ -1,4 +1,4 @@
1
- import React, { useContext } from 'react'
1
+ import React, { useContext, useId } from 'react'
2
2
 
3
3
  // VisX library imports
4
4
  import * as allCurves from '@visx/curve'
@@ -26,6 +26,7 @@ import { type ChartContext } from '../../types/ChartContext'
26
26
  import { type LineChartProps } from './LineChartProps'
27
27
 
28
28
  const LineChart = (props: LineChartProps) => {
29
+ const lineRaceMaskPrefix = `line-race-reveal-${useId().replace(/[^a-zA-Z0-9_-]/g, '')}`
29
30
  // prettier-ignore
30
31
  const {
31
32
  getXAxisData,
@@ -41,10 +42,12 @@ const LineChart = (props: LineChartProps) => {
41
42
  } = props
42
43
 
43
44
  const {
45
+ brushData,
44
46
  colorScale,
45
47
  config,
46
48
  formatNumber,
47
49
  handleLineType,
50
+ lineRaceProgress,
48
51
  parseDate,
49
52
  seriesHighlight,
50
53
  tableData,
@@ -60,16 +63,21 @@ const LineChart = (props: LineChartProps) => {
60
63
  })
61
64
  const { yScaleRight } = useRightAxis({ config, yMax, data: dataForRightAxis, updateConfig })
62
65
  const showSingleSeries = config.tooltips.singleSeries
66
+ const isLineRace = typeof lineRaceProgress === 'number'
67
+ const normalizedLineRaceProgress =
68
+ isLineRace && Number.isFinite(lineRaceProgress) ? Math.min(Math.max(lineRaceProgress, 0), 1) : 0
63
69
  if (!handleTooltipMouseOver) return
64
70
 
65
71
  const DEBUG = false
66
72
  const { lineDatapointStyle, showLineSeriesLabels, legend } = config
73
+ const activeRawData = Array.isArray(brushData) && brushData.length > 0 ? brushData : tableData
67
74
 
68
75
  const xPos = d => {
69
76
  return xScale(getXAxisData(d)) + (xScale.bandwidth ? xScale.bandwidth() / 2 : 0)
70
77
  }
71
78
 
72
79
  const tooltipPoints = []
80
+ const hasConfidenceIntervalBand = Boolean(config.confidenceKeys?.lower && config.confidenceKeys?.upper)
73
81
 
74
82
  return (
75
83
  <ErrorBoundary component='LineChart'>
@@ -79,12 +87,21 @@ const LineChart = (props: LineChartProps) => {
79
87
  const seriesData = config.runtime.series.find(item => item.dataKey === seriesKey)
80
88
  const _seriesKey = seriesData.dynamicCategory ? seriesData.originalDataKey : seriesKey
81
89
  const lineType = seriesData.type
90
+ const lineRaceMaskId = `${lineRaceMaskPrefix}-${index}`
82
91
  const seriesAxis = seriesData.axis || 'left'
92
+ const seriesColor = colorScale(config.runtime.seriesLabels[seriesKey])
83
93
  const displayArea =
84
94
  legend.behavior === 'highlight' || seriesHighlight.length === 0 || seriesHighlight.indexOf(seriesKey) !== -1
85
95
 
96
+ const _data = seriesData.dynamicCategory
97
+ ? data.filter(d => d[seriesData.dynamicCategory] === seriesKey)
98
+ : data
99
+ const activeRawSeriesData = seriesData.dynamicCategory
100
+ ? activeRawData.filter(d => d[seriesData.dynamicCategory] === seriesKey)
101
+ : activeRawData
102
+ const pointData = isLineRace ? activeRawSeriesData : _data
86
103
  const suppressedSegments = createDataSegments({
87
- data: tableData,
104
+ data: activeRawSeriesData,
88
105
  seriesKey,
89
106
  preliminaryData: config.preliminaryData,
90
107
  dynamicCategory: seriesData.dynamicCategory,
@@ -94,30 +111,28 @@ const LineChart = (props: LineChartProps) => {
94
111
  const isSplitLine =
95
112
  config?.preliminaryData?.filter(pd => pd.style && !pd.style.includes('Circles')).length > 0
96
113
 
97
- const _data = seriesData.dynamicCategory
98
- ? data.filter(d => d[seriesData.dynamicCategory] === seriesKey)
99
- : data
100
114
  const circleData = filterCircles(
101
115
  config?.preliminaryData,
102
- tableData,
116
+ activeRawSeriesData,
103
117
  seriesKey,
104
118
  seriesData.dynamicCategory,
105
119
  _seriesKey
106
120
  )
107
121
 
108
122
  // Prepare sorted data for line and area rendering
109
- const sortedData =
110
- config.visualizationType == 'Bump Chart'
111
- ? _data
112
- : config.xAxis.type === 'date-time' || config.xAxis.type === 'date'
113
- ? _data.sort((d1, d2) => {
114
- let x1 = getXAxisData(d1)
115
- let x2 = getXAxisData(d2)
116
- if (x1 < x2) return -1
117
- if (x2 < x1) return 1
118
- return 0
119
- })
120
- : _data
123
+ const sortedData = isLineRace
124
+ ? [..._data].sort((d1, d2) => xPos(d1) - xPos(d2))
125
+ : config.visualizationType == 'Bump Chart'
126
+ ? _data
127
+ : config.xAxis.type === 'date-time' || config.xAxis.type === 'date'
128
+ ? _data.sort((d1, d2) => {
129
+ let x1 = getXAxisData(d1)
130
+ let x2 = getXAxisData(d2)
131
+ if (x1 < x2) return -1
132
+ if (x2 < x1) return 1
133
+ return 0
134
+ })
135
+ : _data
121
136
 
122
137
  return (
123
138
  <Group
@@ -145,7 +160,7 @@ const LineChart = (props: LineChartProps) => {
145
160
  fill={DEBUG ? 'red' : 'transparent'}
146
161
  fillOpacity={0.05}
147
162
  />
148
- {_data.map((d, dataIndex) => {
163
+ {pointData.map((d, dataIndex) => {
149
164
  tooltipPoints.push({
150
165
  color: colorScale(config.runtime.seriesLabels[seriesKey]),
151
166
  seriesKey: _seriesKey,
@@ -155,7 +170,7 @@ const LineChart = (props: LineChartProps) => {
155
170
  })
156
171
 
157
172
  // Build array of point coordinates for intelligent label positioning
158
- const dataPointsForSeries = _data
173
+ const dataPointsForSeries = pointData
159
174
  .filter(item => isNumber(item[_seriesKey]))
160
175
  .map(item => ({
161
176
  x: xPos(item),
@@ -212,10 +227,11 @@ const LineChart = (props: LineChartProps) => {
212
227
  mode='ALWAYS_SHOW_POINTS'
213
228
  dataIndex={dataIndex}
214
229
  tableData={tableData}
215
- data={_data}
230
+ data={pointData}
216
231
  d={d}
217
232
  config={config}
218
233
  seriesKey={_seriesKey}
234
+ seriesColor={seriesColor}
219
235
  displayArea={displayArea}
220
236
  tooltipData={tooltipData}
221
237
  xScale={xScale}
@@ -234,10 +250,11 @@ const LineChart = (props: LineChartProps) => {
234
250
  mode='HOVER_POINTS'
235
251
  dataIndex={dataIndex}
236
252
  tableData={tableData}
237
- data={_data}
253
+ data={pointData}
238
254
  d={d}
239
255
  config={config}
240
256
  seriesKey={_seriesKey}
257
+ seriesColor={seriesColor}
241
258
  displayArea={displayArea}
242
259
  xScale={xScale}
243
260
  yScale={yScale}
@@ -255,10 +272,11 @@ const LineChart = (props: LineChartProps) => {
255
272
  seriesIndex={index}
256
273
  dataIndex={dataIndex}
257
274
  tableData={tableData}
258
- data={_data}
275
+ data={pointData}
259
276
  d={d}
260
277
  config={config}
261
278
  seriesKey={_seriesKey}
279
+ seriesColor={seriesColor}
262
280
  displayArea={displayArea}
263
281
  xScale={xScale}
264
282
  yScale={yScale}
@@ -336,7 +354,7 @@ const LineChart = (props: LineChartProps) => {
336
354
  ) : (
337
355
  <>
338
356
  {/* Confidence Interval Band */}
339
- {config.confidenceKeys &&
357
+ {hasConfidenceIntervalBand &&
340
358
  config.series.map((seriesData, seriesKey) => {
341
359
  if (seriesData.dynamicCategory) {
342
360
  // Get unique categories from the data
@@ -383,7 +401,31 @@ const LineChart = (props: LineChartProps) => {
383
401
  })}
384
402
 
385
403
  {/* STANDARD LINE */}
404
+ {isLineRace && (
405
+ <mask id={lineRaceMaskId} maskUnits='userSpaceOnUse'>
406
+ <LinePath
407
+ data-line-race-reveal-path
408
+ pathLength={1}
409
+ curve={allCurves[seriesData.lineType]}
410
+ data={sortedData}
411
+ x={d => xPos(d)}
412
+ y={d =>
413
+ seriesAxis === 'Right'
414
+ ? yScaleRight(getYAxisData(d, _seriesKey))
415
+ : yScale(Number(getYAxisData(d, _seriesKey)))
416
+ }
417
+ fill='none'
418
+ stroke='white'
419
+ strokeWidth={(seriesData.weight || 2) + 2}
420
+ strokeDasharray={`${normalizedLineRaceProgress} 1`}
421
+ defined={(item, i) => {
422
+ return item[_seriesKey] !== '' && item[_seriesKey] !== null && item[_seriesKey] !== undefined
423
+ }}
424
+ />
425
+ </mask>
426
+ )}
386
427
  <LinePath
428
+ data-line-race-series-path={isLineRace ? true : undefined}
387
429
  curve={allCurves[seriesData.lineType]}
388
430
  data={sortedData}
389
431
  x={d => xPos(d)}
@@ -397,6 +439,7 @@ const LineChart = (props: LineChartProps) => {
397
439
  strokeOpacity={1}
398
440
  shapeRendering='geometricPrecision'
399
441
  strokeDasharray={lineType ? handleLineType(lineType) : 0}
442
+ mask={isLineRace ? `url(#${lineRaceMaskId})` : undefined}
400
443
  defined={(item, i) => {
401
444
  return item[_seriesKey] !== '' && item[_seriesKey] !== null && item[_seriesKey] !== undefined
402
445
  }}
@@ -473,6 +516,7 @@ const LineChart = (props: LineChartProps) => {
473
516
  )}
474
517
  {/* Render series labels at end if each line if selected in the editor */}
475
518
  {showLineSeriesLabels &&
519
+ (!isLineRace || lineRaceProgress >= 1) &&
476
520
  (config.runtime.lineSeriesKeys || config.runtime.seriesKeys).map(seriesKey => {
477
521
  let lastDatum
478
522
  for (let i = _data.length - 1; i >= 0; i--) {
@@ -540,6 +584,7 @@ const LineChart = (props: LineChartProps) => {
540
584
  <React.Fragment key={`series-${seriesKey}-point-${dataIndex}`}>
541
585
  <LineChartCircle
542
586
  mode='TOOLTIP_POINTS'
587
+ seriesColor={color}
543
588
  dataIndex={dataIndex}
544
589
  tooltipPoint={d}
545
590
  tableData={tableData}