@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
@@ -5,6 +5,7 @@ import ConfigContext from '../ConfigContext'
5
5
  import { type ChartContext } from '../types/ChartContext'
6
6
  import { formatNumber as formatColNumber } from '@cdc/core/helpers/cove/number'
7
7
  import { isDateScale } from '@cdc/core/helpers/cove/date'
8
+ import { getSeriesValueLabel } from '@cdc/core/helpers/getSeriesName'
8
9
  // Third-party library imports
9
10
  import { localPoint } from '@visx/event'
10
11
  import { bisector } from 'd3-array'
@@ -16,18 +17,50 @@ import uniq from 'lodash/uniq'
16
17
  import { getHorizontalBarHeights } from '../components/BarChart/helpers/getBarHeights'
17
18
  import {
18
19
  findColumnConfigByName,
20
+ getAdditionalColumnFormattingParams,
19
21
  getSeriesColumnFormattingParams,
20
22
  getSeriesOwnedColumnNames
21
23
  } from '../helpers/seriesColumnSettings'
22
24
  import {
23
25
  buildTooltipRow,
24
26
  getTooltipSeriesMarker,
27
+ shouldShowTooltipSeriesRow,
25
28
  tooltipHasMarkerColumn,
26
29
  type TooltipRow
27
30
  } from '../helpers/tooltipHelpers'
28
31
  import { publishAnalyticsEvent } from '@cdc/core/helpers/metrics/helpers'
29
32
  import { getVizSubType, getVizTitle } from '@cdc/core/helpers/metrics/utils'
30
33
 
34
+ type TooltipListItemProps = {
35
+ row: TooltipRow
36
+ index: number
37
+ useMarkerColumn?: boolean
38
+ }
39
+
40
+ type TooltipBodyProps = Omit<TooltipListItemProps, 'useMarkerColumn'> & {
41
+ activeLabel: string
42
+ useMarkerColumn: boolean
43
+ }
44
+
45
+ const renderTooltipMarker = (
46
+ shouldRenderMarkerSlot: boolean,
47
+ markerColor: TooltipRow['markerColor'],
48
+ markerShape: NonNullable<TooltipRow['markerShape']>
49
+ ) => {
50
+ if (!shouldRenderMarkerSlot) return null
51
+
52
+ return (
53
+ <span className='tooltip-marker-slot' aria-hidden='true'>
54
+ {markerColor ? (
55
+ <span
56
+ className={`tooltip-marker-swatch tooltip-marker-swatch--${markerShape}`}
57
+ style={{ backgroundColor: markerColor }}
58
+ />
59
+ ) : null}
60
+ </span>
61
+ )
62
+ }
63
+
31
64
  export const useTooltip = props => {
32
65
  // Track the last X-axis value to prevent duplicate analytics events
33
66
  const lastAnalyticsXValue = useRef<string | number | null>(null)
@@ -41,7 +74,8 @@ export const useTooltip = props => {
41
74
  formatTooltipsDate,
42
75
  parseDate,
43
76
  setSharedFilter,
44
- isDraggingAnnotation
77
+ isDraggingAnnotation,
78
+ seriesHighlight
45
79
  } = useContext<ChartContext>(ConfigContext)
46
80
  const { xScale, yScale, seriesScale, showTooltip, hideTooltip, interactionLabel = '' } = props
47
81
  const { xAxis, visualizationType, orientation, yAxis, runtime } = config
@@ -153,11 +187,7 @@ export const useTooltip = props => {
153
187
  if (seriesOwnedColumnNames.includes(columnName)) continue
154
188
 
155
189
  // Extra columns own their affixes; explicit blanks prevent fallback to the value-axis units.
156
- const formattingParams = {
157
- addColPrefix: '',
158
- addColSuffix: '',
159
- ...getSeriesColumnFormattingParams(column)
160
- }
190
+ const formattingParams = getAdditionalColumnFormattingParams(column)
161
191
 
162
192
  const pieColumnData = additionalChartData?.data?.[column.name]
163
193
  const columnData =
@@ -268,29 +298,36 @@ export const useTooltip = props => {
268
298
  const seriesObjWithName = config.runtime.series.find(
269
299
  series => series.dataKey === seriesKey && series.name !== undefined
270
300
  )
301
+ const showTooltipSeriesRow = shouldShowTooltipSeriesRow({
302
+ legendBehavior: config.legend?.behavior,
303
+ seriesHighlight,
304
+ seriesKey
305
+ })
271
306
 
272
307
  if (
273
308
  (value === null || value === undefined || value === '' || formattedValue === 'N/A') &&
274
309
  config.general.hideNullValue
275
310
  ) {
276
311
  return []
277
- } else if (seriesObjWithName && seriesObjWithName.name === '') {
312
+ } else if (config.xAxis?.dataKey == seriesKey) {
278
313
  return [
279
314
  createTooltipRow({
280
- key: '',
315
+ key: seriesKey,
281
316
  value: formattedValue,
282
317
  axisPosition: getAxisPosition(seriesKey),
283
- kind: 'series',
284
- seriesKey
318
+ kind: 'heading'
285
319
  })
286
320
  ]
287
- } else if (config.xAxis?.dataKey == seriesKey) {
321
+ } else if (!showTooltipSeriesRow) {
322
+ return []
323
+ } else if (seriesObjWithName && seriesObjWithName.name === '') {
288
324
  return [
289
325
  createTooltipRow({
290
- key: seriesKey,
326
+ key: '',
291
327
  value: formattedValue,
292
328
  axisPosition: getAxisPosition(seriesKey),
293
- kind: 'heading'
329
+ kind: 'series',
330
+ seriesKey
294
331
  })
295
332
  ]
296
333
  } else {
@@ -758,37 +795,23 @@ export const useTooltip = props => {
758
795
  }
759
796
  }
760
797
 
761
- /**
762
- * find the original series and use the name property if available
763
- * otherwise default back to the original column name.
764
- * @param {String} input - original columnName
765
- * @returns user defined series name.
766
- */
767
- const getSeriesNameFromLabel = originalColumnName => {
768
- let series = config.runtime.series.filter(s => s.dataKey === originalColumnName)
769
- if (series[0] && series[0].name !== undefined) return series[0]?.name
770
- const columnConfig = findColumnConfigByName(config.columns || {}, originalColumnName)?.columnConfig
771
- if (columnConfig?.label !== undefined) return columnConfig.label
772
- return originalColumnName
773
- }
798
+ const renderForestPlotTooltipItem = (row: TooltipRow, activeLabel: string) => {
799
+ if (row.key === config.xAxis.dataKey)
800
+ return (
801
+ <li className='tooltip-heading'>{`${capitalize(config.xAxis.dataKey ? `${config.xAxis.dataKey}: ` : '')} ${
802
+ isDateScale(yAxis) ? formatDate(parseDate(row.key, false)) : row.value
803
+ }`}</li>
804
+ )
774
805
 
775
- const TooltipListItem = ({ row, index, useMarkerColumn = false }) => {
776
- const { key, value, axisPosition, kind, markerColor, markerShape = 'circle' } = row
806
+ return <li className='tooltip-body'>{`${activeLabel}: ${formatNumber(row.value, 'left')}`}</li>
807
+ }
777
808
 
778
- if (visualizationType === 'Forest Plot') {
779
- if (key === config.xAxis.dataKey)
780
- return (
781
- <li className='tooltip-heading'>{`${capitalize(config.xAxis.dataKey ? `${config.xAxis.dataKey}: ` : '')} ${
782
- isDateScale(yAxis) ? formatDate(parseDate(key, false)) : value
783
- }`}</li>
784
- )
785
- return <li className='tooltip-body'>{`${getSeriesNameFromLabel(key)}: ${formatNumber(value, 'left')}`}</li>
786
- }
809
+ const renderTooltipHeading = (row: TooltipRow) => {
810
+ const { key, value } = row
787
811
  const formattedDate = config.tooltips.dateDisplayFormat
788
812
  ? formatTooltipsDate(parseDate(value, false))
789
813
  : formatDate(parseDate(value, false))
790
814
 
791
- // TOOLTIP HEADING
792
815
  if (visualizationType === 'Bar' && orientation === 'horizontal' && key === config.xAxis.dataKey)
793
816
  return (
794
817
  <li className='tooltip-heading'>{`${capitalize(
@@ -805,20 +828,25 @@ export const useTooltip = props => {
805
828
  )} ${isDateScale(xAxis) ? formattedDate : value}`}</li>
806
829
  )
807
830
 
808
- // TOOLTIP BODY
809
- // handle suppressed tooltip items
810
- const shouldCheckSuppression = config.visualizationSubType !== 'stacked'
811
- let suppressionEntry
812
- if (shouldCheckSuppression && config.preliminaryData) {
813
- suppressionEntry = config.preliminaryData.find(
814
- pd =>
815
- pd.label &&
816
- pd.type === 'suppression' &&
817
- pd.displayTooltip &&
818
- value === pd.value &&
819
- (!pd.column || key === pd.column)
820
- )
821
- }
831
+ return null
832
+ }
833
+
834
+ const getSuppressionEntry = (row: TooltipRow) => {
835
+ if (config.visualizationSubType === 'stacked' || !config.preliminaryData) return undefined
836
+
837
+ return config.preliminaryData.find(
838
+ pd =>
839
+ pd.label &&
840
+ pd.type === 'suppression' &&
841
+ pd.displayTooltip &&
842
+ row.value === pd.value &&
843
+ (!pd.column || row.key === pd.column)
844
+ )
845
+ }
846
+
847
+ const renderTooltipBody = ({ row, index, useMarkerColumn, activeLabel }: TooltipBodyProps) => {
848
+ const { value, kind, markerColor, markerShape = 'circle' } = row
849
+ const suppressionEntry = getSuppressionEntry(row)
822
850
 
823
851
  // Remove suppressed items entirely if not showing symbols
824
852
  if (suppressionEntry && !config.general.showSuppressedSymbol) {
@@ -830,22 +858,12 @@ export const useTooltip = props => {
830
858
  let newValue = label || value
831
859
  const style = displayGray ? { color: '#8b8b8a' } : {}
832
860
 
833
- if (index == 1 && config.yAxis?.inlineLabel) {
861
+ if (index === 1 && config.yAxis?.inlineLabel) {
834
862
  newValue = `${config.dataFormat.prefix}${newValue}${config.dataFormat.suffix}`
835
863
  }
836
- const activeLabel = getSeriesNameFromLabel(key)
837
864
  const displayText = activeLabel ? `${activeLabel}: ${newValue}` : newValue
838
865
  const shouldRenderMarkerSlot = useMarkerColumn && kind !== 'heading'
839
- const markerSlot = shouldRenderMarkerSlot ? (
840
- <span className='tooltip-marker-slot' aria-hidden='true'>
841
- {markerColor ? (
842
- <span
843
- className={`tooltip-marker-swatch tooltip-marker-swatch--${markerShape}`}
844
- style={{ backgroundColor: markerColor }}
845
- />
846
- ) : null}
847
- </span>
848
- ) : null
866
+ const markerSlot = renderTooltipMarker(shouldRenderMarkerSlot, markerColor, markerShape)
849
867
  const content = displayText !== undefined ? parse(String(displayText)) : displayText
850
868
 
851
869
  return (
@@ -861,6 +879,19 @@ export const useTooltip = props => {
861
879
  )
862
880
  }
863
881
 
882
+ const TooltipListItem = ({ row, index, useMarkerColumn = false }: TooltipListItemProps) => {
883
+ const activeLabel = row.kind === 'series' ? getSeriesValueLabel(row.key, config) : row.key
884
+
885
+ if (visualizationType === 'Forest Plot') {
886
+ return renderForestPlotTooltipItem(row, activeLabel)
887
+ }
888
+
889
+ const heading = renderTooltipHeading(row)
890
+ if (heading) return heading
891
+
892
+ return renderTooltipBody({ row, index, useMarkerColumn, activeLabel })
893
+ }
894
+
864
895
  return {
865
896
  getIncludedTooltipSeries,
866
897
  getXValueFromCoordinate,
@@ -49,11 +49,61 @@
49
49
  margin-bottom: 0 !important;
50
50
  }
51
51
 
52
+ .chart-required-fields-alerts {
53
+ display: grid;
54
+ gap: 0.75rem;
55
+
56
+ > .alert {
57
+ justify-content: flex-start;
58
+ margin: 0;
59
+ width: 100%;
60
+
61
+ .alert-message,
62
+ > .d-flex {
63
+ align-items: center;
64
+ display: flex;
65
+ }
66
+ }
67
+
68
+ &__link {
69
+ background: transparent;
70
+ border: 0;
71
+ color: inherit;
72
+ cursor: pointer;
73
+ font: inherit;
74
+ font-weight: 700;
75
+ padding: 0;
76
+ text-decoration: underline;
77
+
78
+ &:hover,
79
+ &:focus-visible {
80
+ text-decoration-thickness: 2px;
81
+ }
82
+ }
83
+ }
84
+
85
+ .y-axis-top-title-row {
86
+ display: flex;
87
+ gap: 1rem;
88
+ margin: 0 0 0.5rem;
89
+ width: 100%;
90
+ }
91
+
52
92
  .y-axis-top-title {
53
93
  font-family: var(--fonts-nunito, var(--app-font-secondary));
54
94
  font-weight: 700;
55
95
  line-height: 1.4;
56
- margin: 0 0 0.5rem;
96
+ min-width: 0;
97
+ width: 100%;
98
+ }
99
+
100
+ .y-axis-top-title-row--split .y-axis-top-title {
101
+ flex: 1 1 0;
102
+ }
103
+
104
+ .y-axis-top-title--right {
105
+ margin-left: auto;
106
+ text-align: right;
57
107
  }
58
108
 
59
109
  .legend-top {
@@ -203,6 +253,24 @@
203
253
  outline-offset: 5px;
204
254
  border-radius: 1px;
205
255
  }
256
+
257
+ &--interactive {
258
+ border-radius: 1px;
259
+ isolation: isolate;
260
+ position: relative;
261
+
262
+ &:hover,
263
+ &:focus-visible {
264
+ &::before {
265
+ background-color: var(--colors-cyan-10, #eff9fa);
266
+ border-radius: 6px;
267
+ content: '';
268
+ inset: -6px;
269
+ position: absolute;
270
+ z-index: -1;
271
+ }
272
+ }
273
+ }
206
274
  }
207
275
 
208
276
  &__outer {
@@ -255,7 +323,7 @@
255
323
  display: flex;
256
324
  flex-direction: row;
257
325
  align-items: center;
258
- font-size: 1em;
326
+ font-size: var(--legend-item-font-size);
259
327
  vertical-align: middle;
260
328
 
261
329
  & > span {
@@ -268,6 +336,10 @@
268
336
  max-height: 1px;
269
337
  }
270
338
 
339
+ & > p {
340
+ font-size: var(--legend-item-font-size);
341
+ }
342
+
271
343
  & > span[class*='Asterisk'] {
272
344
  transform: scale(1.8);
273
345
  margin-top: 15px;
@@ -1,7 +1,8 @@
1
1
  import ChartActions from './chart.actions'
2
2
  import defaults from '../data/initial-state.js'
3
- import { ChartConfig, type ViewportSize } from '../types/ChartConfig'
3
+ import { ChartConfig } from '../types/ChartConfig'
4
4
  import { DimensionsType } from '@cdc/core/types/Dimensions'
5
+ import type { ViewPort } from '@cdc/core/types/ViewPort'
5
6
 
6
7
  type ChartState = {
7
8
  isLoading: boolean
@@ -11,8 +12,8 @@ type ChartState = {
11
12
  excludedData: object[]
12
13
  filteredData: object[]
13
14
  seriesHighlight: string[]
14
- currentViewport: ViewportSize
15
- vizViewport: ViewportSize
15
+ currentViewport: ViewPort
16
+ vizViewport: ViewPort
16
17
  dimensions: DimensionsType
17
18
  container: HTMLElement | null
18
19
  coveLoadedEventRan: boolean