@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
@@ -8,6 +8,7 @@ import { hasVisibleVizFilters } from '@cdc/core/helpers/filterVisibility'
8
8
  export const useEditorPermissions = () => {
9
9
  const { config, isDashboard } = useContext(ConfigContext)
10
10
  const { visualizationType, series, orientation, visualizationSubType } = config
11
+ const isBarRace = visualizationType === 'Bar' && visualizationSubType === 'racing'
11
12
 
12
13
  // Overall support for the chart types
13
14
  // prettier-ignore
@@ -29,11 +30,13 @@ export const useEditorPermissions = () => {
29
30
  'Scatter Plot',
30
31
  'Spark Line',
31
32
  'Sankey',
33
+ 'Network',
34
+ 'Dendrogram',
32
35
  'Warming Stripes'
33
36
  ]
34
37
 
35
38
  const visSupportsDateCategoryAxis = () => {
36
- const disabledCharts = ['Forest Plot', 'Radar', 'Sankey']
39
+ const disabledCharts = ['Forest Plot', 'Radar', 'Sankey', 'Network', 'Dendrogram']
37
40
  if (disabledCharts.includes(visualizationType)) return false
38
41
  return true
39
42
  }
@@ -84,6 +87,8 @@ export const useEditorPermissions = () => {
84
87
  'Horizon Chart',
85
88
  'Radar',
86
89
  'Sankey',
90
+ 'Network',
91
+ 'Dendrogram',
87
92
  'Scatter Plot',
88
93
  'Spark Line',
89
94
  'Warming Stripes'
@@ -101,6 +106,8 @@ export const useEditorPermissions = () => {
101
106
  'HeatMap',
102
107
  'Radar',
103
108
  'Sankey',
109
+ 'Network',
110
+ 'Dendrogram',
104
111
  'Scatter Plot',
105
112
  'Spark Line',
106
113
  'Warming Stripes'
@@ -110,6 +117,7 @@ export const useEditorPermissions = () => {
110
117
  }
111
118
 
112
119
  const visHasLegend = () => {
120
+ if (isBarRace) return false
113
121
  switch (visualizationType) {
114
122
  case 'Box Plot':
115
123
  return true
@@ -120,7 +128,10 @@ export const useEditorPermissions = () => {
120
128
  case 'Spark Line':
121
129
  return false
122
130
  case 'Sankey':
131
+ case 'Dendrogram':
123
132
  return false
133
+ case 'Network':
134
+ return true
124
135
  case 'Warming Stripes':
125
136
  return true
126
137
  default:
@@ -130,10 +141,13 @@ export const useEditorPermissions = () => {
130
141
 
131
142
  const visHasNumbersOnBars = () => {
132
143
  if (visualizationType === 'Forest Plot') return false
144
+ const barRaceUsesDefaultLabelPlacement =
145
+ visualizationType === 'Bar' && config.visualizationSubType === 'racing' && !config.yAxis.labelPlacement
133
146
  if (
134
147
  config.orientation === 'horizontal' &&
135
148
  (config.yAxis.labelPlacement === 'Below Bar' ||
136
149
  config.yAxis.labelPlacement === 'On Date/Category Axis' ||
150
+ barRaceUsesDefaultLabelPlacement ||
137
151
  config.visualizationType === 'Paired Bar' ||
138
152
  config.visualizationType === 'Deviation Bar')
139
153
  )
@@ -147,6 +161,7 @@ export const useEditorPermissions = () => {
147
161
  }
148
162
 
149
163
  const visHasAnchors = () => {
164
+ if (isBarRace) return false
150
165
  switch (visualizationType) {
151
166
  case 'Area Chart':
152
167
  return true
@@ -179,6 +194,7 @@ export const useEditorPermissions = () => {
179
194
  }
180
195
 
181
196
  const visHasBarBorders = () => {
197
+ if (isBarRace) return false
182
198
  const disabledCharts = ['Box Plot', 'Scatter Plot', 'Pie', 'Line']
183
199
  if (disabledCharts.includes(visualizationType)) return false
184
200
  return series?.some(
@@ -191,6 +207,8 @@ export const useEditorPermissions = () => {
191
207
  case 'Warming Stripes':
192
208
  return false
193
209
  case 'Sankey':
210
+ case 'Network':
211
+ case 'Dendrogram':
194
212
  return false
195
213
  case 'Forest Plot':
196
214
  return false
@@ -210,7 +228,9 @@ export const useEditorPermissions = () => {
210
228
  'Forest Plot',
211
229
  'HeatMap',
212
230
  'Spark Line',
213
- 'Warming Stripes'
231
+ 'Warming Stripes',
232
+ 'Network',
233
+ 'Dendrogram'
214
234
  ].includes(visualizationType)
215
235
  const visHasLegendAxisAlign = () => {
216
236
  return visualizationType === 'Bar' && visualizationSubType === 'stacked' && config.legend.behavior === 'isolate'
@@ -220,7 +240,7 @@ export const useEditorPermissions = () => {
220
240
  }
221
241
 
222
242
  const visSupportsTooltipOpacity = () => {
223
- const disabledCharts = ['HeatMap', 'Spark Line', 'Sankey', 'Warming Stripes']
243
+ const disabledCharts = ['HeatMap', 'Spark Line', 'Sankey', 'Network', 'Dendrogram', 'Warming Stripes']
224
244
  if (disabledCharts.includes(visualizationType)) return false
225
245
  return true
226
246
  }
@@ -232,60 +252,84 @@ export const useEditorPermissions = () => {
232
252
  }
233
253
 
234
254
  const visSupportsSequentialPallete = () => {
235
- const disabledCharts = ['Line', 'Paired Bar', 'Deviation Bar', 'Forest Plot', 'Forecasting', 'Sankey']
255
+ const disabledCharts = ['Paired Bar', 'Deviation Bar', 'Forest Plot', 'Forecasting', 'Network', 'Dendrogram']
236
256
  if (disabledCharts.includes(visualizationType)) return false
237
257
  return true
238
258
  }
239
259
 
240
260
  const visSupportsNonSequentialPallete = () => {
241
- const disabledCharts = ['HeatMap', 'Paired Bar', 'Deviation Bar', 'Forest Plot', 'Forecasting', 'Sankey']
261
+ const disabledCharts = [
262
+ 'HeatMap',
263
+ 'Paired Bar',
264
+ 'Deviation Bar',
265
+ 'Forest Plot',
266
+ 'Forecasting',
267
+ 'Sankey',
268
+ 'Network',
269
+ 'Dendrogram'
270
+ ]
242
271
  if (disabledCharts.includes(visualizationType)) return false
243
272
  return true
244
273
  }
245
274
 
246
275
  const visSupportsReverseColorPalette = () => {
247
- const disabledCharts = ['Forest Plot', 'Paired Bar', 'Deviation Bar', 'Sankey']
276
+ const disabledCharts = ['Forest Plot', 'Paired Bar', 'Deviation Bar', 'Sankey', 'Network', 'Dendrogram']
248
277
  if (disabledCharts.includes(visualizationType)) return false
249
278
  return true
250
279
  }
251
280
 
252
281
  const visSupportsDateCategoryAxisLabel = () => {
253
- const disabledCharts = ['Forest Plot', 'HeatMap', 'Spark Line', 'Bump Chart', 'Warming Stripes']
282
+ if (isBarRace) return false
283
+ const disabledCharts = [
284
+ 'Forest Plot',
285
+ 'HeatMap',
286
+ 'Spark Line',
287
+ 'Bump Chart',
288
+ 'Network',
289
+ 'Dendrogram',
290
+ 'Warming Stripes'
291
+ ]
254
292
  if (disabledCharts.includes(visualizationType)) return false
255
293
  return true
256
294
  }
257
295
 
258
296
  const visSupportsDateCategoryAxisLine = () => {
259
- const disabledCharts = ['Forest Plot', 'Spark Line', 'Warming Stripes']
297
+ if (isBarRace) return false
298
+ const disabledCharts = ['Forest Plot', 'Spark Line', 'Network', 'Dendrogram', 'Warming Stripes']
260
299
  if (disabledCharts.includes(visualizationType)) return false
261
300
  return true
262
301
  }
263
302
 
264
303
  const visSupportsDateCategoryAxisTicks = () => {
265
- const disabledCharts = ['Forest Plot', 'Spark Line', 'Warming Stripes']
304
+ if (isBarRace) return false
305
+ const disabledCharts = ['Forest Plot', 'Spark Line', 'Network', 'Dendrogram', 'Warming Stripes']
266
306
  if (disabledCharts.includes(visualizationType)) return false
267
307
  return true
268
308
  }
269
309
 
270
310
  const visSupportsDateCategoryTickRotation = () => {
271
- const disabledCharts = ['Spark Line']
311
+ if (isBarRace) return false
312
+ const disabledCharts = ['Spark Line', 'Network', 'Dendrogram']
272
313
  if (disabledCharts.includes(visualizationType)) return false
273
314
  return true
274
315
  }
275
316
 
276
317
  const visSupportsDateCategoryNumTicks = () => {
277
- const disabledCharts = ['HeatMap', 'Spark Line']
318
+ if (isBarRace) return false
319
+ const disabledCharts = ['Spark Line', 'Network', 'Dendrogram']
278
320
  if (disabledCharts.includes(visualizationType)) return false
279
321
  return true
280
322
  }
281
323
 
282
324
  const visSupportsResponsiveTicks = () => {
283
- const disabledCharts = ['HeatMap', 'Spark Line']
325
+ if (isBarRace) return false
326
+ const disabledCharts = ['HeatMap', 'Spark Line', 'Network', 'Dendrogram']
284
327
  if (disabledCharts.includes(visualizationType)) return false
285
328
  return true
286
329
  }
287
330
 
288
331
  const visSupportsRegions = () => {
332
+ if (isBarRace) return false
289
333
  const disabledCharts = [
290
334
  'Forest Plot',
291
335
  'Horizon Chart',
@@ -295,6 +339,8 @@ export const useEditorPermissions = () => {
295
339
  'Radar',
296
340
  'Spark Line',
297
341
  'Sankey',
342
+ 'Network',
343
+ 'Dendrogram',
298
344
  'Warming Stripes'
299
345
  ]
300
346
  if (disabledCharts.includes(visualizationType)) return false
@@ -302,13 +348,13 @@ export const useEditorPermissions = () => {
302
348
  }
303
349
 
304
350
  const visSupportsValueAxisMax = () => {
305
- const disabledCharts = ['Forest Plot', 'HeatMap']
351
+ const disabledCharts = ['Forest Plot', 'HeatMap', 'Network', 'Dendrogram']
306
352
  if (disabledCharts.includes(visualizationType)) return false
307
353
  return true
308
354
  }
309
355
 
310
356
  const visSupportsValueAxisMin = () => {
311
- const disabledCharts = ['Forest Plot', 'HeatMap']
357
+ const disabledCharts = ['Forest Plot', 'HeatMap', 'Network', 'Dendrogram']
312
358
  if (disabledCharts.includes(visualizationType)) return false
313
359
  return true
314
360
  }
@@ -341,47 +387,47 @@ export const useEditorPermissions = () => {
341
387
  }
342
388
 
343
389
  const visSupportsValueAxisGridLines = () => {
344
- const disabledCharts = ['Forest Plot', 'HeatMap']
390
+ const disabledCharts = ['Forest Plot', 'HeatMap', 'Network', 'Dendrogram']
345
391
  if (disabledCharts.includes(visualizationType)) return false
346
392
  return true
347
393
  }
348
394
 
349
395
  // implement later
350
396
  const visSupportsValueAxisTicks = () => {
351
- const disabledCharts = ['Forest Plot', 'HeatMap']
397
+ const disabledCharts = ['Forest Plot', 'HeatMap', 'Network', 'Dendrogram']
352
398
  if (disabledCharts.includes(visualizationType)) return false
353
399
  return true
354
400
  }
355
401
 
356
402
  // implement later
357
403
  const visSupportsValueAxisLine = () => {
358
- const disabledCharts = ['Forest Plot']
404
+ const disabledCharts = ['Forest Plot', 'Network', 'Dendrogram']
359
405
  if (disabledCharts.includes(visualizationType)) return false
360
406
  return true
361
407
  }
362
408
 
363
409
  // implement later
364
410
  const visSupportsValueAxisLabels = () => {
365
- const disabledCharts = ['Forest Plot', 'HeatMap', 'Bump Chart']
411
+ const disabledCharts = ['Forest Plot', 'HeatMap', 'Bump Chart', 'Network', 'Dendrogram']
366
412
  if (disabledCharts.includes(visualizationType)) return false
367
413
  return true
368
414
  }
369
415
 
370
416
  const visSupportsBarSpace = () => {
371
- const disabledCharts = ['Forest Plot']
417
+ const disabledCharts = ['Forest Plot', 'Network', 'Dendrogram']
372
418
  if (disabledCharts.includes(visualizationType)) return false
373
419
  if (orientation === 'horizontal' || visualizationType === 'Paired Bar') return true
374
420
  return false
375
421
  }
376
422
 
377
423
  const visSupportsBarThickness = () => {
378
- const disabledCharts = ['Forest Plot', 'HeatMap', 'Warming Stripes']
424
+ const disabledCharts = ['Forest Plot', 'HeatMap', 'Network', 'Dendrogram', 'Warming Stripes']
379
425
  if (disabledCharts.includes(visualizationType)) return false
380
426
  return true
381
427
  }
382
428
 
383
429
  const visSupportsChartHeight = () => {
384
- const disabledCharts = ['Spark Line', 'Warming Stripes']
430
+ const disabledCharts = ['Spark Line', 'Network', 'Dendrogram', 'Warming Stripes']
385
431
  if (disabledCharts.includes(visualizationType)) return false
386
432
  return true
387
433
  }
@@ -393,7 +439,7 @@ export const useEditorPermissions = () => {
393
439
  }
394
440
 
395
441
  const visSupportsLeftValueAxis = () => {
396
- const disabledCharts = ['Radar', 'Spark Line', 'Sankey', 'Warming Stripes']
442
+ const disabledCharts = ['Radar', 'Spark Line', 'Sankey', 'Network', 'Dendrogram', 'Warming Stripes']
397
443
  if (disabledCharts.includes(visualizationType)) return false
398
444
  return true
399
445
  }
@@ -403,13 +449,13 @@ export const useEditorPermissions = () => {
403
449
  }
404
450
 
405
451
  const visSupportsRankByValue = () => {
406
- const disabledCharts = ['HeatMap', 'Spark Line']
452
+ const disabledCharts = ['HeatMap', 'Spark Line', 'Network', 'Dendrogram']
407
453
  if (disabledCharts.includes(visualizationType)) return false
408
454
  return true
409
455
  }
410
456
 
411
457
  const visSupportsDateCategoryHeight = () => {
412
- const disabledCharts = ['HeatMap', 'Spark Line', 'Sankey', 'Bump Chart']
458
+ const disabledCharts = ['HeatMap', 'Spark Line', 'Sankey', 'Network', 'Dendrogram', 'Bump Chart']
413
459
  if (disabledCharts.includes(visualizationType)) return false
414
460
  if (config.orientation !== 'horizontal') return false
415
461
  if (config.orientation === 'horizontal' && visualizationType === 'Bar' && !config.isLollipopChart) return false
@@ -5,9 +5,14 @@ import ConfigContext from '../../ConfigContext'
5
5
  import ErrorBoundary from '@cdc/core/components/ErrorBoundary'
6
6
  import { colorPalettesChartV2, sequentialPalettes } from '@cdc/core/data/colorPalettes'
7
7
  import { updatePaletteNames } from '@cdc/core/helpers/updatePaletteNames'
8
- import { getColorPaletteVersion } from '@cdc/core/helpers/getColorPaletteVersion'
8
+ import { getColorPaletteMajorVersion } from '@cdc/core/helpers/getColorPaletteMajorVersion'
9
9
  import { getBridgedData } from '../../helpers/getBridgedData'
10
10
  import { buildForecastPaletteMappings } from '../../helpers/buildForecastPaletteMappings'
11
+ import {
12
+ getForecastConfidenceIntervalKey,
13
+ getForecastLegendKey,
14
+ isForecastLegendSelectionActive
15
+ } from '../../helpers/forecastLegend'
11
16
 
12
17
  // visx & d3
13
18
  import { curveMonotoneX } from '@visx/curve'
@@ -119,7 +124,7 @@ const Forecasting = ({ xScale, yScale, height, width, yAxisWidth, handleTooltipM
119
124
  const forecastingPalettes = useMemo(() => {
120
125
  // Determine palette version from config
121
126
  // Forecasting charts use sequentialPalettes for v1, sequential-only palettes for v2
122
- const paletteVersion = getColorPaletteVersion(config)
127
+ const paletteVersion = getColorPaletteMajorVersion(config)
123
128
 
124
129
  let forecastPalettes
125
130
  if (paletteVersion === 1) {
@@ -148,10 +153,6 @@ const Forecasting = ({ xScale, yScale, height, width, yAxisWidth, handleTooltipM
148
153
  if (!group || !group.stages) return false
149
154
  return group.stages.map((stage, stageIndex) => {
150
155
  const { behavior } = legend
151
- let transparentArea =
152
- behavior === 'highlight' && seriesHighlight.length > 0 && seriesHighlight.indexOf(stage.key) === -1
153
- let displayArea =
154
- behavior === 'highlight' || seriesHighlight.length === 0 || seriesHighlight.indexOf(stage.key) !== -1
155
156
  const bridgedData = getBridgedData(stage.key, group.stageColumn, rawData)
156
157
 
157
158
  return (
@@ -162,6 +163,10 @@ const Forecasting = ({ xScale, yScale, height, width, yAxisWidth, handleTooltipM
162
163
  {group.confidenceIntervals?.map((ciGroup, ciGroupIndex) => {
163
164
  const palette = forecastingPalettes[stage.color] || false
164
165
  const isReversed = stage.color?.toLowerCase().includes('reverse')
166
+ const intervalKey = getForecastConfidenceIntervalKey(group.confidenceIntervals, ciGroupIndex)
167
+ const isActive = isForecastLegendSelectionActive(seriesHighlight, stage.key, intervalKey)
168
+ const transparentArea = behavior === 'highlight' && seriesHighlight.length > 0 && !isActive
169
+ const displayArea = behavior === 'highlight' || isActive
165
170
 
166
171
  const getFill = () => {
167
172
  if (displayArea) return palette?.[2] || 'transparent'
@@ -186,6 +191,10 @@ const Forecasting = ({ xScale, yScale, height, width, yAxisWidth, handleTooltipM
186
191
  / /g,
187
192
  '—'
188
193
  )}--group-${stageIndex}-${ciGroupIndex}`}
194
+ data-forecast-legend-key={
195
+ intervalKey ? getForecastLegendKey(stage.key, intervalKey) : stage.key
196
+ }
197
+ data-forecast-active={isActive ? 'true' : 'false'}
189
198
  >
190
199
  {dataSegments.map((segment, segmentIndex) => (
191
200
  <Group key={`segment-${segmentIndex}`}>