@cdc/chart 4.26.4 → 4.26.5

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 (93) hide show
  1. package/CONFIG.md +349 -29
  2. package/LICENSE +201 -0
  3. package/dist/cdcchart.js +34247 -32805
  4. package/examples/feature/heatmap/average-age-categorical.json +313 -0
  5. package/examples/feature/heatmap/calendar-heatmap.json +134 -0
  6. package/examples/feature/heatmap/cell-values-bottom-axis.json +181 -0
  7. package/examples/feature/heatmap/sparse-aggregation.json +158 -0
  8. package/examples/private/bump-chart.json +1116 -0
  9. package/examples/private/test-123.json +624 -0
  10. package/package.json +4 -3
  11. package/src/CdcChartComponent.tsx +135 -54
  12. package/src/_stories/Chart.AltText.stories.tsx +136 -0
  13. package/src/_stories/Chart.HeatMap.stories.tsx +187 -0
  14. package/src/_stories/Chart.Sankey.smoke.stories.tsx +62 -0
  15. package/src/_stories/Chart.SmallMultiples.smoke.stories.tsx +29 -0
  16. package/src/_stories/ChartAxisTitles.smoke.stories.tsx +13 -0
  17. package/src/_stories/ChartBar.Editor.stories.tsx +63 -0
  18. package/src/_stories/ChartBrush.Interaction.stories.tsx +112 -0
  19. package/src/_stories/ChartBrush.smoke.stories.tsx +13 -4
  20. package/src/_stories/_mock/alt_text_metadata.json +38 -0
  21. package/src/_stories/_mock/heatmap-average-age-categorical.json +315 -0
  22. package/src/_stories/_mock/heatmap.json +156 -0
  23. package/src/_stories/_mock/reported_pertussis_cases.json +1643 -0
  24. package/src/_stories/_mock/sankey_mock.json +78 -0
  25. package/src/_stories/_mock/small_multiples/small_multiples_lines.json +1 -1
  26. package/src/components/Annotations/components/AnnotationDraggable.tsx +1 -1
  27. package/src/components/Annotations/components/AnnotationDropdown.tsx +5 -2
  28. package/src/components/Axis/LeftAxis.tsx +14 -11
  29. package/src/components/Axis/LeftAxisGridlines.tsx +14 -11
  30. package/src/components/Brush/BrushSelector.tsx +88 -187
  31. package/src/components/Brush/brushInteraction.ts +22 -0
  32. package/src/components/Brush/tests/brushInteraction.test.ts +38 -0
  33. package/src/components/EditorPanel/EditorPanel.tsx +310 -49
  34. package/src/components/EditorPanel/components/Panels/Panel.Annotate.tsx +13 -0
  35. package/src/components/EditorPanel/components/Panels/Panel.General.tsx +105 -13
  36. package/src/components/EditorPanel/components/Panels/Panel.PatternSettings.tsx +1 -0
  37. package/src/components/EditorPanel/components/Panels/Panel.Regions.tsx +5 -0
  38. package/src/components/EditorPanel/components/Panels/Panel.Series.tsx +2 -2
  39. package/src/components/EditorPanel/components/Panels/Panel.Visual.tsx +1 -1
  40. package/src/components/EditorPanel/helpers/getVisualizationTypeConfigUpdate.ts +57 -0
  41. package/src/components/EditorPanel/helpers/tests/getVisualizationTypeConfigUpdate.test.ts +56 -0
  42. package/src/components/EditorPanel/useEditorPermissions.test.tsx +70 -0
  43. package/src/components/EditorPanel/useEditorPermissions.ts +42 -22
  44. package/src/components/HeatMap/components/HeatMap.tsx +762 -0
  45. package/src/components/HeatMap/components/HeatMapGradientLegend.tsx +114 -0
  46. package/src/components/HeatMap/heatmap.constants.ts +13 -0
  47. package/src/components/HeatMap/heatmap.css +71 -0
  48. package/src/components/HeatMap/helpers/index.ts +261 -0
  49. package/src/components/HeatMap/index.tsx +5 -0
  50. package/src/components/HeatMap/tests/HeatMap.test.tsx +1040 -0
  51. package/src/components/HeatMap/tests/helpers.test.ts +167 -0
  52. package/src/components/LineChart/components/LineChart.BumpCircle.tsx +19 -22
  53. package/src/components/LineChart/helpers.test.ts +345 -0
  54. package/src/components/LineChart/helpers.ts +15 -5
  55. package/src/components/LineChart/index.tsx +7 -1
  56. package/src/components/LinearChart/tests/LinearChart.test.tsx +107 -33
  57. package/src/components/LinearChart/tests/mockConfigContext.ts +1 -0
  58. package/src/components/LinearChart.tsx +58 -37
  59. package/src/components/PieChart/PieChart.tsx +4 -1
  60. package/src/components/RadarChart/RadarChart.tsx +3 -1
  61. package/src/components/Regions/components/Regions.tsx +195 -41
  62. package/src/components/Sankey/components/Sankey.tsx +7 -3
  63. package/src/components/Sankey/helpers/getSankeyTooltip.tsx +7 -6
  64. package/src/components/SmallMultiples/SmallMultipleTile.tsx +30 -3
  65. package/src/components/SmallMultiples/SmallMultiples.css +12 -0
  66. package/src/components/SmallMultiples/SmallMultiples.tsx +15 -9
  67. package/src/components/SmallMultiples/tests/SmallMultipleTile.test.tsx +152 -0
  68. package/src/components/Sparkline/components/SparkLine.tsx +4 -9
  69. package/src/components/WarmingStripes/WarmingStripesGradientLegend.css +1 -1
  70. package/src/components/WarmingStripes/WarmingStripesGradientLegend.tsx +2 -2
  71. package/src/data/initial-state.js +11 -0
  72. package/src/helpers/axisLabelFontSize.ts +8 -0
  73. package/src/helpers/bumpChartTooltip.ts +54 -0
  74. package/src/helpers/calculateLeftYAxisWidth.ts +4 -0
  75. package/src/helpers/ensureSpecialChartAxisTypes.ts +11 -0
  76. package/src/helpers/getMinMax.ts +2 -3
  77. package/src/helpers/getYAxisAutoPadding.ts +8 -6
  78. package/src/helpers/getYAxisAutoPaddingMode.ts +17 -0
  79. package/src/helpers/handleChartAriaLabels.ts +23 -10
  80. package/src/helpers/seriesHighlight.ts +26 -0
  81. package/src/helpers/tests/axisLabelFontSize.test.ts +15 -0
  82. package/src/helpers/tests/bumpChartTooltip.test.ts +75 -0
  83. package/src/helpers/tests/ensureSpecialChartAxisTypes.test.ts +30 -0
  84. package/src/helpers/tests/getYAxisAutoPadding.test.ts +37 -0
  85. package/src/helpers/tests/getYAxisAutoPaddingMode.test.ts +90 -0
  86. package/src/helpers/tests/handleChartAriaLabels.test.ts +71 -0
  87. package/src/helpers/tests/seriesHighlight.test.ts +61 -0
  88. package/src/hooks/tests/useScales.test.tsx +105 -0
  89. package/src/hooks/useScales.ts +19 -9
  90. package/src/index.jsx +5 -2
  91. package/src/scss/main.scss +32 -49
  92. package/src/types/ChartConfig.ts +18 -0
  93. package/src/types/ChartContext.ts +2 -0
package/CONFIG.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  This document describes the supported configuration contract for `@cdc/chart`.
4
4
 
5
- Shared nested types such as `Axis`, `Series`, `Legend`, `Table`, `Runtime`, `Annotation`, `Region`, `BoxPlot`, `ConfidenceInterval`, `VizFilter`, `FilterBehavior`, `MarkupVariable`, `Footnotes`, and `General` are documented in the [`@cdc/core` config reference](https://github.com/CDCgov/cdc-open-viz/blob/main/packages/core/CONFIG.md).
5
+ Shared nested types such as `Legend`, `Table`, `Annotation`, `VizFilter`, `FilterBehavior`, `MarkupVariable`, `Footnotes`, `General`, and `ComponentThemes` are documented in the [`@cdc/core` config reference](https://github.com/CDCgov/cdc-open-viz/blob/main/packages/core/CONFIG.md). Chart-owned structures such as axes, series, regions, confidence interval wiring, and box plot settings are documented here.
6
6
 
7
7
  To follow those shared types locally, use `packages/core/CONFIG.md` in this monorepo or `node_modules/@cdc/core/CONFIG.md` in an installed app. If neither path is available, use the GitHub link above.
8
8
 
@@ -16,7 +16,7 @@ The chart config is documented in the order the package typically evaluates it:
16
16
  | Chart setup | Visualization type, axes, series, and data shaping |
17
17
  | Copy and authored content | Titles, descriptions, footnotes, and markup variables |
18
18
  | Layout and appearance | Theme, sizing, formatting, palette, and shell options |
19
- | Feature-specific enhancements | Annotations, regions, small multiples, forest plots, radar, Sankey, and similar chart variants |
19
+ | Feature-specific enhancements | Annotations, regions, heatmaps, small multiples, forest plots, radar, Sankey, and similar chart variants |
20
20
  | Fields You Can Ignore | Runtime state, editor artifacts, and legacy migration leftovers |
21
21
 
22
22
  ## Minimum Working Config
@@ -39,7 +39,7 @@ Dashboard flows can also select data from `datasets` with `dataKey`.
39
39
  | Field | Type | Required | Default | Description | Allowed values / Notes |
40
40
  | --- | --- | --- | --- | --- | --- |
41
41
  | `type` | `string` | Yes | None | Identifies the visualization package. | Must be `chart` for standalone chart configs. |
42
- | `version` | [`Version`](https://github.com/CDCgov/cdc-open-viz/blob/main/packages/core/CONFIG.md#version) | Yes | None | Saved config version used by migration logic. | Keep this current so old saved configs can be upgraded safely. |
42
+ | `version` | [`Version`](https://github.com/CDCgov/cdc-open-viz/blob/main/packages/core/CONFIG.md#version) | No | None | Saved config version used by migration logic. | Use a semantic COVE version for authored configs so migrations can reason about saved-version order. Missing versions are treated as legacy configs that need migration. |
43
43
  | `dataKey` | `string` | Conditionally | None | Selects a named dataset when the chart is rendered from `datasets`. | Required in dashboard flows that load data from the `datasets` prop instead of inline `data`. |
44
44
  | `data` | `object[]` | Conditionally | `[]` | Inline dataset rendered by the chart. | Required when `dataUrl` and `datasets` are not used. |
45
45
  | `dataUrl` | `string` | Conditionally | None | Remote JSON or CSV URL fetched at load time. | If both `data` and `dataUrl` are present, the fetched data wins. |
@@ -51,29 +51,99 @@ Dashboard flows can also select data from `datasets` with `dataKey`.
51
51
 
52
52
  | Field | Type | Required | Default | Description | Allowed values / Notes |
53
53
  | --- | --- | --- | --- | --- | --- |
54
- | `visualizationType` | `string` | Yes | None | Chooses the chart family and which renderer mounts. | Exact values: `Area Chart`, `Bar`, `Box Plot`, `Bump Chart`, `Combo`, `Deviation Bar`, `Forest Plot`, `Horizon Chart`, `Line`, `Paired Bar`, `Pie`, `Radar`, `Scatter Plot`, `Spark Line`, `Sankey`, `Forecasting`, `Warming Stripes`. |
55
- | `visualizationSubType` | `string` | No | `regular` | Selects the sub-mode within a chart family. | The editor currently exposes `regular` and `stacked`; `stacked` is used by bar and combo charts. |
54
+ | `visualizationType` | `string` | Yes | None | Chooses the chart family and which renderer mounts. | Exact values: `Area Chart`, `Bar`, `Box Plot`, `Bump Chart`, `Combo`, `Deviation Bar`, `Forest Plot`, `HeatMap`, `Horizon Chart`, `Line`, `Paired Bar`, `Pie`, `Radar`, `Scatter Plot`, `Spark Line`, `Sankey`, `Forecasting`, `Warming Stripes`. |
55
+ | `visualizationSubType` | `string` | No | `regular` | Selects the sub-mode within a chart family. | Current authorable values are `regular` and `stacked`; `stacked` is used by bar, combo, and stacked area flows. Older saved configs may contain `horizontal`; use `orientation: "horizontal"` for current horizontal charts. |
56
56
  | `orientation` | `vertical \| horizontal` | No | `vertical` | Controls the primary chart orientation. | `Bar` and `Box Plot` support both directions; `Deviation Bar` is horizontal only. |
57
- | `xAxis` | [`Axis`](https://github.com/CDCgov/cdc-open-viz/blob/main/packages/core/CONFIG.md#axis) | Conditionally | Shared core default | X-axis / category-axis configuration. | Required for most chart types and for pie category wiring. See `@cdc/core` for nested fields. |
58
- | `yAxis` | [`Axis`](https://github.com/CDCgov/cdc-open-viz/blob/main/packages/core/CONFIG.md#axis) | Conditionally | Shared core default | Y-axis / measure-axis configuration. | Required for `Pie` charts and shared with multi-axis chart flows. See `@cdc/core` for nested fields. |
59
- | `series` | [`Series`](https://github.com/CDCgov/cdc-open-viz/blob/main/packages/core/CONFIG.md#series) | Conditionally | Shared core default | Measure series to render. | Required for non-pie charts unless `dynamicSeries` is enabled. |
57
+ | `xAxis` | `object` | Conditionally | Package-initialized defaults | X-axis / category-axis configuration. | Required for most chart types and for pie category wiring. See `Axis: xAxis and yAxis` below. |
58
+ | `yAxis` | `object` | Conditionally | Package-initialized defaults | Y-axis / measure-axis configuration. | Required for `Pie` charts and shared with multi-axis chart flows. See `Axis: xAxis and yAxis` below. In charts, `yAxis.titlePlacement` controls whether the title stays on the side or moves above the plot. Visible top titles also keep the chart's y-axis auto-padding behavior enabled, including small-multiple titles hidden only by tile layout. |
59
+ | `series` | `Series[]` | Conditionally | Package-initialized defaults | Measure series to render. | Required for most non-pie charts. See `Series: series[]` below. Dynamic-category series still start from an authored `series[]` entry. For HeatMap, each selected series becomes one heatmap row. |
60
60
  | `columns` | `Record<string, Column>` | No | `{}` | Column-level display and formatting overrides. | Column configs drive labels, prefixes, suffixes, and table visibility. |
61
- | `dynamicSeries` | `boolean` | No | `false` | Lets the chart generate series from the loaded dataset. | Useful when authoring against unknown or changing columns. |
61
+ | `dynamicSeries` | `boolean` | No | `false` | Legacy/paused dynamic-series flag. | Current runtime can regenerate generated series during filter updates, but initial rendering still depends on authored `series[]` or `series[].dynamicCategory`. |
62
62
  | `dynamicSeriesType` | `string` | No | None | Type assigned to generated series. | Used only when `dynamicSeries` is enabled. |
63
63
  | `dynamicSeriesLineType` | `string` | No | None | Line style assigned to generated series. | Used for dynamic line and combo charts. |
64
- | `sortData` | `ascending \| descending` | No | `descending` | Sort order for the rendered dataset. | Applied during chart data preparation. |
65
- | `rankByValue` | `asc \| desc` | No | `desc` | Controls value-based ranking when the chart sorts by rank. | Mostly relevant to bar-style charts. |
64
+ | `sortData` | `ascending \| descending` | No | None | Sort order for the rendered dataset. | Sorting only runs when `sortData` is present. Current runtime treats `ascending` as descending numeric order and `descending` as ascending numeric order for the configured sort key; treat the names as legacy until the comparator changes. |
65
+ | `rankByValue` | `asc \| desc` | No | None | Controls value-based ranking when explicitly set. | Mostly relevant to bar-style charts. When omitted, ranking by value is not applied. |
66
66
  | `filters` | [`VizFilter[]`](https://github.com/CDCgov/cdc-open-viz/blob/main/packages/core/CONFIG.md#vizfilter) | No | `[]` | Interactive filters that narrow the active dataset. | Shared filter contract from `@cdc/core`. |
67
67
  | `filterBehavior` | [`FilterBehavior`](https://github.com/CDCgov/cdc-open-viz/blob/main/packages/core/CONFIG.md#filterbehavior) | No | `Filter Change` | Chooses whether filters apply immediately or through a button. | `Filter Change`, `Apply Button`. |
68
- | `exclusions` | `object` | No | `{ active: false, keys: [], dateStart: '', dateEnd: '' }` | Hides specific x-axis values or date ranges from the chart. | Category and date exclusions are handled differently at runtime. |
68
+ | `exclusions` | `object` | No | `{ active: false, keys: [] }` | Narrows the data before filters and rendering. | For categorical axes, `keys` hides matching x-axis values. For date axes, `dateStart` and `dateEnd` keep rows within the selected date range; they do not hide that range. |
69
69
  | `confidenceKeys` | `Record<'lower' \| 'upper', string>` | No | `{}` | Names the lower and upper confidence interval columns. | Used by chart families that support confidence intervals. |
70
- | `preliminaryData` | `object[]` | No | `[]` | Editor-managed suppression/effect overlay rows. | Mostly used for legacy suppression and effect data handling. |
71
- | `suppressedData` | `{ label: string; icon: string; value: string }[]` | No | `[]` | Legacy suppression metadata shown in some chart flows. | Still read by legend and tooltip helpers. |
72
70
  | `highlightedBarValues` | `{ value: any; color: string; borderWidth: number; legendLabel: string }[]` | No | `[]` | Explicit value-to-style overrides for selected bars. | Used by highlight and comparison scenarios. |
73
71
  | `allowLineToBarGraph` | `boolean` | No | `undefined` | Lets a line chart switch to a bar graph when the dataset is too small. | Used when `visualizationType` is `Line`; runtime also applies it for some dynamic-series cases. |
74
- | `useLogScale` | `boolean` | No | `false` | Switches supported axes to log scale. | Mainly used by line, combo, and bar flows. |
72
+ | `useLogScale` | `boolean` | No | `false` | Legacy log-scale flag retained in older configs. | Current authored configs should use `yAxis.type: "logarithmic"`; setting `useLogScale` alone is not the current scale-selection path. |
75
73
  | `dataCutoff` | `number \| string` | No | None | Numeric threshold used for "less than" handling. | Runtime coerces the value with `numberFromString`, so saved configs often serialize it as a string. |
76
74
 
75
+ ### Axis: `xAxis` and `yAxis`
76
+
77
+ Axis settings are chart-owned because their meaning depends on chart family, orientation, and renderer. Runtime layout fields such as `axisBBox`, `maxValue`, and `tickWidthMax` are listed in `Fields You Can Ignore`.
78
+
79
+ | Field | Type | Required | Default | Description | Allowed values / Notes |
80
+ | --- | --- | --- | --- | --- | --- |
81
+ | `xAxis.dataKey`, `yAxis.dataKey` | `string` | Conditionally | `''` | Source field used by the axis. | Required for visible/category axes and most value-axis chart wiring. |
82
+ | `xAxis.type`, `yAxis.type` | `string` | No | Package defaults | Axis scale mode. | Category/date axes commonly use `categorical`, `date`, or `date-time`; Scatter Plot x-axes can use `continuous`; current numeric value axes use `linear` or `logarithmic`. |
83
+ | `xAxis.label`, `yAxis.label` | `string` | No | `''` | Axis title shown near the axis. | Optional display label. |
84
+ | `yAxis.titlePlacement` | `side \| top` | No | `top` for new configs; older configs missing this field migrate to `side` | Chooses where the y-axis title renders. | `top` renders the title above the plot and participates in y-axis auto-padding behavior. |
85
+ | `*.hideAxis`, `*.hideTicks`, `*.hideLabel` | `boolean` | No | `false` | Hides axis line, tick marks, or label. | Supported per axis where the renderer exposes these controls. |
86
+ | `*.labelColor`, `*.tickLabelColor`, `*.tickColor` | CSS color string | No | Package defaults | Axis label, tick-label, and tick-mark colors. | Preserved in saved configs and used by the rendered axes. |
87
+ | `yAxis.gridLines`, `yAxis.enablePadding`, `yAxis.scalePadding`, `yAxis.displayNumbersOnBar`, `xAxis.showYearsOnce` | `boolean`, `number` | No | Package defaults | Axis grid, padding, bar-label, and date-label display controls. | Supported where the chart family and orientation use the related rendering behavior. |
88
+ | `*.dateParseFormat`, `*.dateDisplayFormat` | `string` | No | Package defaults | Input and output date formatting hints. | Used by date-based axes and table/tooltip formatting. |
89
+ | `*.numTicks`, `*.tickRotation`, `*.maxTickRotation` | `number` | No | Package defaults | Tick density and tick-label rotation controls. | Runtime may still adjust ticks for available space. |
90
+ | `*.max`, `*.min` | `string` | No | None | Explicit axis bounds. | Stored as strings in saved configs. |
91
+ | `*.manual`, `*.manualStep`, `*.viewportNumTicks`, `xAxis.viewportStepCount` | `boolean`, `number`, `Record<string, number>` | No | Package defaults | Manual and viewport-specific tick controls. | Mostly used by date/time x-axis editor flows. |
92
+ | `*.padding`, `*.paddingPercent`, `*.size` | `number` | No | Package defaults | Axis spacing and reserved-size controls. | Runtime can still adjust final layout for available space. |
93
+ | `*.sortKey`, `xAxis.sortByRecentDate` | `string`, `boolean` | No | None | Sort helpers for categorical/date axes. | Current configs should use the axis type plus `sortByRecentDate` for recent-date ordering. Legacy `xAxis.sortDates` is migrated to date-axis metadata and removed. |
94
+ | `*.categories` | `object[]` | No | `[]` | Category metadata for specialized axis rendering. | Mostly used by advanced chart flows. |
95
+ | `*.anchors` | `object[]` | No | `[]` | Target-line or anchor metadata. | Each anchor stores `value`, `color`, and `lineStyle`. |
96
+ | `xAxis.target`, `xAxis.targetLabel`, `xAxis.showTargetLabel`, `yAxis.target`, `yAxis.targetLabel`, `yAxis.showTargetLabel` | `number \| string`, `string`, `boolean` | No | Package defaults | Target line and label controls. | Deviation Bar uses the x-axis target fields; renderer support varies by chart family. |
97
+ | `yAxis.inlineLabel`, `yAxis.labelPlacement`, `yAxis.labelsAboveGridlines` | `string`, `string`, `boolean` | No | None, package defaults, `false` | Inline suffix/label controls for the left Y axis. | Used by line and bar axis-label rendering and auto-padding helpers. |
98
+ | `yAxis.rightLabel`, `yAxis.rightNumTicks`, `yAxis.rightAxisSize`, `yAxis.rightLabelOffsetSize` | `string`, `number`, `number`, `number` | No | `''`, package defaults | Right-axis label, tick, width, and offset controls. | Used by combo and line-capable dual-axis charts. |
99
+ | `yAxis.rightAxisLabelColor`, `yAxis.rightAxisTickLabelColor`, `yAxis.rightAxisTickColor` | CSS color string | No | Package defaults | Right-axis label, tick-label, and tick-mark colors. | Only meaningful when right-axis series are configured. |
100
+ | `yAxis.rightHideAxis`, `yAxis.rightHideLabel`, `yAxis.rightHideTicks` | `boolean` | No | `false` | Hides the right-axis line, label, or ticks. | Only meaningful when right-axis series are configured. |
101
+ | `yAxis.rightMin`, `yAxis.rightMax`, `yAxis.smallestLeftAxisMax`, `yAxis.smallestRightAxisMax` | `string \| number` | No | None | Explicit or minimum bounds for left/right axes. | Runtime coerces numeric-like values when calculating scales. |
102
+ | `xAxis.brushActive`, `xAxis.brushDefaultRecentDateCount`, `xAxis.brushDynamicYAxis` | `boolean`, `number`, `boolean` | No | `false`, None, `false` | Enables and configures the x-axis brush range selector. | Supported on vertical Line, Bar, Area Chart, and Combo charts with a non-categorical x-axis. |
103
+
104
+ ### Series: `series[]`
105
+
106
+ `series` is chart-owned and defines which value columns the chart renders.
107
+
108
+ | Field | Type | Required | Default | Description | Allowed values / Notes |
109
+ | --- | --- | --- | --- | --- | --- |
110
+ | `series[].dataKey` | `string` | Yes | None | Source value column for the series. | Must exist in the active dataset unless `dynamicSeries` is generating series. |
111
+ | `series[].name` | `string` | No | Inferred | Display label for the series. | Packages may infer labels when omitted. |
112
+ | `series[].axis` | `Left \| Right \| string` | No | `Left` | Axis assignment for the series. | Used by dual-axis charts. |
113
+ | `series[].type` | `string` | No | Chart-family default | Series renderer type. | Common values include line, bar, area, `HeatMap`, and point-like variants. |
114
+ | `series[].lineType` | `string` | No | `curveLinear` | Line curve style for line-capable series. | Values come from the shared line curve helper, such as `curveLinear`; primarily used by Line and Combo charts. |
115
+ | `series[].weight` | `number` | No | `2` | Stroke width for line-capable series. | Editor limits this to 1-9. |
116
+ | `series[].tooltip` | `boolean` | No | `true` | Includes the series in tooltip output. | `true`, `false` |
117
+ | `series[].dynamicCategory` | `string` | No | None | Category key used by dynamic-series flows. | Optional. |
118
+ | `series[].stageColumn` | `string` | No | None | Stage/category metadata for specialized chart families. | Optional. |
119
+ | `series[].stages[].key`, `series[].stages[].color` | `string` | No | None | Forecasting-stage key and color metadata. | Only meaningful for `visualizationType: "Forecasting"`. |
120
+ | `series[].confidenceIntervals` | `object[]` | No | `[]` | Per-series confidence interval metadata. | Each entry uses `high`, `low`, and optional `showInTooltip`; see `Confidence Intervals` below. |
121
+
122
+ ### Confidence Intervals
123
+
124
+ | Field | Type | Required | Default | Description | Allowed values / Notes |
125
+ | --- | --- | --- | --- | --- | --- |
126
+ | `confidenceKeys.lower`, `confidenceKeys.upper` | `string` | No | None | Column names for lower and upper confidence bounds. | Used by chart families that render confidence intervals from shared columns. |
127
+ | `series[].confidenceIntervals[].low`, `series[].confidenceIntervals[].high` | `number \| string` | Conditionally | None | Lower and upper bounds for a series-specific interval. | Can be column names or numeric values depending on the chart flow. |
128
+ | `series[].confidenceIntervals[].showInTooltip` | `boolean` | No | `false` | Includes confidence interval values in tooltip output. | Only meaningful when interval bounds are configured. |
129
+
130
+ ### Preliminary and Suppression Markers
131
+
132
+ `preliminaryData` is chart-owned marker metadata for suppression and effect styling in supported Line, Bar, and Combo flows. Older saved configs may also contain `suppressedData`; that legacy array is listed in `Fields You Can Ignore`.
133
+
134
+ | Field | Type | Required | Default | Description | Allowed values / Notes |
135
+ | --- | --- | --- | --- | --- | --- |
136
+ | `preliminaryData[]` | `object[]` | No | `[]` | Marker rules for suppression or effect values. | Runtime uses these entries for chart marks, legend entries, tooltips, and table behavior in supported chart families. |
137
+ | `preliminaryData[].type` | `suppression \| effect` | Yes | None | Chooses the marker behavior. | Suppression entries match specific source values; effect entries mark effects in supported line/bar flows. |
138
+ | `preliminaryData[].column`, `preliminaryData[].value` | `string` | Conditionally | None | Source column and value that trigger the marker. | Required for suppression matching. |
139
+ | `preliminaryData[].label` | `string` | No | `''` | Label shown in legend/tooltip contexts. | Optional but needed for visible legend copy. |
140
+ | `preliminaryData[].style`, `preliminaryData[].symbol`, `preliminaryData[].iconCode`, `preliminaryData[].lineCode` | `string` | No | Package/editor defaults | Visual styling metadata for the marker. | Editor-authored values drive the rendered symbol, line, or filled-circle treatment. |
141
+ | `preliminaryData[].seriesKeys` | `string[]` | No | `[]` | Series keys affected by the marker. | Empty or omitted values can apply broadly depending on the marker type and chart family. |
142
+ | `preliminaryData[].displayTooltip`, `preliminaryData[].displayLegend`, `preliminaryData[].displayTable` | `boolean` | No | Editor defaults | Controls whether the marker appears in tooltips, legend output, and table output. | Used by suppression/effect rendering in supported chart families. |
143
+ | `preliminaryData[].hideBarSymbol`, `preliminaryData[].hideLineStyle` | `boolean` | No | Editor defaults | Suppresses the bar symbol or line styling for the marker. | Only meaningful where the selected chart family renders that marker treatment. |
144
+ | `preliminaryData[].circleSize` | `number` | No | Editor defaults | Circle marker size for supported effect/suppression displays. | Pixel-like display value. |
145
+ | `preliminaryData[].displayGray` | `boolean` | No | Editor defaults | Applies gray styling for supported marked values. | Mainly used by suppression/effect visual treatments. |
146
+
77
147
  ## Copy and Authored Content
78
148
 
79
149
  | Field | Type | Required | Default | Description | Allowed values / Notes |
@@ -87,6 +157,10 @@ Dashboard flows can also select data from `datasets` with `dataKey`.
87
157
  | `chartMessage.noData` | `string` | No | `No Data Available` | Message shown when the chart has no renderable data. | Usually only visible after filtering or data loading failures. |
88
158
  | `enableMarkupVariables` | `boolean` | No | `false` | Enables placeholder replacement in supported text fields. | Shared behavior with markup variables documented in core. |
89
159
  | `markupVariables` | [`MarkupVariable[]`](https://github.com/CDCgov/cdc-open-viz/blob/main/packages/core/CONFIG.md#markupvariable) | No | `[]` | Defines placeholder tags available to authored text. | Shared markup-variable contract from `@cdc/core`. |
160
+ | `altText` | [`AltTextConfig`](https://github.com/CDCgov/cdc-open-viz/blob/main/packages/core/CONFIG.md#alttextconfig) | No | None | Optional human-authored accessibility description for the chart SVG. | Chart first builds its generated `aria-label` from chart context, then appends the resolved static or metadata-backed alt text from the shared core shape. |
161
+ | `general.showAnnotationDropdown` | `boolean` | No | `false` | Changes desktop visibility classes for the annotation dropdown. | Annotation dropdown markup renders when annotations exist; this flag controls whether it is shown in desktop layouts. |
162
+ | `general.mobileAnnotationDisplay` | `'symbol' \| 'text'` | No | `'symbol'` | Selects how annotations render on mobile: numbered-circle symbol on the chart, or full HTML text labels. | `'symbol'` (default): mobile shows numbered circles on the chart and auto-forces the annotation dropdown below the chart. `'text'`: mobile renders the same HTML labels as desktop and the dropdown is no longer auto-forced (it follows `general.showAnnotationDropdown`). Author opt-in for `'text'`: labels may overflow narrow viewports. |
163
+ | `general.annotationDropdownText` | `string` | No | `Annotations` | Label shown for the annotation dropdown. | Used when annotation dropdowns are enabled. |
90
164
 
91
165
  ## Layout and Appearance
92
166
 
@@ -94,12 +168,11 @@ Dashboard flows can also select data from `datasets` with `dataKey`.
94
168
  | --- | --- | --- | --- | --- | --- |
95
169
  | `theme` | [`ComponentThemes`](https://github.com/CDCgov/cdc-open-viz/blob/main/packages/core/CONFIG.md#componentthemes) | No | `theme-blue` | Shared shell theme token. | Controls shell classes and some chart accents. |
96
170
  | `showTitle` | `boolean` | No | `true` | Shows or hides the main title area. | `true`, `false`. |
97
- | `showSidebar` | `boolean` | No | `true` | Shows the side panel in editor-like flows. | Mostly editor-facing, but persisted in saved configs. |
98
171
  | `titleStyle` | `legacy \| large \| small` | No | `small` | Chooses the title treatment. | `legacy`, `large`, `small`. |
99
172
  | `animate` | `boolean` | No | `false` | Enables chart animation when the chart enters view. | Disabled for chart types that do not animate. |
100
173
  | `heights.vertical` | `number` | No | `300` | Default vertical chart height. | Used when the chart is rendered vertically. |
101
174
  | `heights.horizontal` | `number` | No | `750` | Default horizontal chart height. | Used when the chart is rendered horizontally. |
102
- | `heights.mobileVertical` | `number` | No | `300` | Mobile height for vertical layouts. | Used in responsive chart layouts. |
175
+ | `heights.mobileVertical` | `number` | No | None | Optional mobile height for vertical layouts. | Not seeded in the package initial state. When omitted, mobile vertical rendering falls back to `heights.vertical`. |
103
176
  | `barHeight` | `number` | No | `25` | Base bar height in bar and combo charts. | Affects row spacing and label placement. |
104
177
  | `barSpace` | `number` | No | `15` | Space between bars. | Mostly used in bar and combo charts. |
105
178
  | `barThickness` | `number` | No | `0.35` | Relative bar thickness. | Influences grouped and stacked bar rendering. |
@@ -116,33 +189,262 @@ Dashboard flows can also select data from `datasets` with `dataKey`.
116
189
  | `isResponsiveTicks` | `boolean` | No | `false` | Enables responsive tick handling. | Helpful for dense x-axis labels. |
117
190
  | `roundingStyle` | `standard \| shallow \| finger` | No | `standard` | Chooses the numeric rounding strategy. | Matches the editor options. |
118
191
  | `tipRounding` | `top \| full` | No | `top` | Controls tooltip rounding behavior. | Legacy-friendly display option. |
119
- | `dataFormat` | `object` | No | `{}` | Controls global number formatting. | Includes prefix/suffix, comma handling, and rounding knobs used across chart families. |
192
+ | `dataFormat` | `object` | No | Package-initialized defaults | Controls chart-owned number formatting. | See `dataFormat.*` below. Column-level overrides in `columns` can override some left-axis/table formatting. |
120
193
  | `tooltips` | `object` | No | `{ opacity: 90, singleSeries: false, dateDisplayFormat: '%B %-d, %Y' }` | Tooltip display settings. | Controls opacity, single-series mode, and tooltip date formatting. |
121
194
  | `topAxis.hasLine` | `boolean` | No | `false` | Draws a top axis line in supported chart types. | Mostly used by bar and line layouts. |
122
195
  | `general` | [`General`](https://github.com/CDCgov/cdc-open-viz/blob/main/packages/core/CONFIG.md#general) | No | Shared core default | Shared chart-wide settings such as missing-data labels and palette selection. | Chart-specific runtime also reads `general.useIntelligentLineChartLabels`; see core for shared fields like `showMissingDataLabel`, `showSuppressedSymbol`, `showZeroValueData`, `hideNullValue`, and `palette`. |
123
- | `visual` | `object` | No | `{ border: false, borderColorTheme: false, accent: false, background: false, hideBackgroundColor: false, tp5Treatment: false, tp5Background: false, verticalHoverLine: false, horizontalHoverLine: false, lineDatapointSymbol: 'none', maximumShapeAmount: 7 }` | Shared chart shell styling flags. | Includes border/background toggles, hover lines, and line-datapoint symbol control. |
196
+ | `general.useIntelligentLineChartLabels` | `boolean` | No | `false` | Enables smarter line-end label placement for line-capable charts. | Chart-specific extension stored under the legacy `general` block. |
197
+ | `visual` | `object` | No | `{ border: false, borderColorTheme: false, accent: false, background: false, hideBackgroundColor: false, tp5Treatment: false, tp5Background: false, verticalHoverLine: false, horizontalHoverLine: false, lineDatapointSymbol: 'none', maximumShapeAmount: 7 }` | Shared chart shell styling flags. | Includes border/accent toggles, hover lines, and line-datapoint symbol control. `visual.background` and `visual.hideBackgroundColor` currently affect Spark Line charts only; chart TP5 treatment flags may be present in saved configs but are feature-gated. |
198
+ | `legend` | [`Legend`](https://github.com/CDCgov/cdc-open-viz/blob/main/packages/core/CONFIG.md#legend) plus chart extensions | No | Package-initialized defaults | Controls chart legend display, layout, and interaction. | See `legend.*` below for chart-owned extensions. |
199
+ | `table` | [`Table`](https://github.com/CDCgov/cdc-open-viz/blob/main/packages/core/CONFIG.md#table) plus chart behavior | No | Package-initialized defaults | Controls the built-in data table and chart download buttons. | See `table.*` below for chart-specific behavior and common shared fields. |
124
200
  | `twoColor.palette` | `string` | No | `monochrome-1` | Palette used for two-color chart variants. | Used when the chart switches to a paired/deviation bar color treatment. |
125
- | `isPaletteReversed` | `boolean` | No | `false` | Reverses the active palette order. | Often used with sequential palettes. |
201
+ | `twoColor.isPaletteReversed` | `boolean` | No | `false` | Reverses the two-color palette variant. | Current active reversal flag for two-color palettes. |
202
+ | `general.palette.isReversed` | `boolean` | No | `true` for current chart defaults | Reverses the active palette order. | Current active reversal flag for the main palette. The top-level `isPaletteReversed` field is legacy. |
126
203
  | `pieType` | `Regular \| Donut` | No | `Regular` | Chooses between a full pie and a donut chart. | Only meaningful for `Pie` charts. |
127
204
  | `showAreaUnderLine` | `boolean` | No | `false` | Fills the area below line series. | Primarily used by line and small-multiple line charts. |
128
205
  | `showLineSeriesLabels` | `boolean` | No | `false` | Appends the series name at the end of line and combo series. | Only meaningful for line-capable charts. |
129
206
  | `colorMatchLineSeriesLabels` | `boolean` | No | `false` | Matches end labels to the series color. | Only relevant when `showLineSeriesLabels` is enabled. |
130
207
  | `stackedAreaChartLineType` | `string` | No | `Linear` | Chooses the curve used by stacked area charts. | Mapped to the supported curve set in the editor. |
131
208
  | `hideXAxisLabel` | `boolean` | No | `false` | Hides the rendered x-axis label. | Mostly used by small multiples and compact layouts. |
132
- | `hideYAxisLabel` | `boolean` | No | `false` | Hides the rendered y-axis label. | Mostly used by small multiples and compact layouts. |
209
+ | `hideYAxisLabel` | `boolean` | No | `false` | Hides the rendered y-axis label. | Mostly used by small multiples and compact layouts. Hidden top-positioned Y-axis titles do not trigger top-title auto-padding, except small multiples still preserve padding for titles hidden only by repeated-tile layout. In small multiples, the leading tile in each row keeps the y-axis title visible while the other tiles hide it, including when `yAxis.titlePlacement` is `top`. |
210
+
211
+ ### Number Formatting: `dataFormat.*`
212
+
213
+ These fields are chart-owned. They are applied by chart number-format helpers for axes, labels, tooltips, and generated table values unless a column-specific formatter overrides the value.
214
+
215
+ | Field | Type | Required | Default | Description | Allowed values / Notes |
216
+ | --- | --- | --- | --- | --- | --- |
217
+ | `dataFormat.commas` | `boolean` | No | `true` when the whole `dataFormat` block is omitted | Adds locale-aware grouping to left/value-axis numbers, tooltips, and data table output. | Missing `commas` inside a partial `dataFormat` object can be backfilled as legacy `false`; author this field explicitly when adding only some number-format options. |
218
+ | `dataFormat.abbreviated` | `boolean` | No | `false` | Abbreviates large or small left/value-axis numbers. | Only applied when the formatter decides the value should be abbreviated. |
219
+ | `dataFormat.roundTo` | `number` | No | `0` when omitted | Decimal precision for left/value-axis numbers and many chart values. | Ignored for a value when `preserveOriginalDecimals` is true. |
220
+ | `dataFormat.preserveOriginalDecimals` | `boolean` | No | `false` | Preserves each value's original decimal places. | Bypasses the configured decimal precision for left, right, and bottom formatting. |
221
+ | `dataFormat.prefix`, `dataFormat.suffix` | `string` | No | `''` | Text added before or after left/value-axis numbers. | Examples: `$`, `%`. Column-level prefixes and suffixes can override these for table/additional-column output. |
222
+ | `dataFormat.rightCommas` | `boolean` | No | `false` | Adds grouping to right-axis numbers. | Used by dual-axis charts. |
223
+ | `dataFormat.rightRoundTo` | `number` | No | `0` when omitted | Decimal precision for right-axis numbers. | Used by dual-axis charts. |
224
+ | `dataFormat.rightPrefix`, `dataFormat.rightSuffix` | `string` | No | `''` | Text added before or after right-axis numbers. | Used by dual-axis charts. |
225
+ | `dataFormat.bottomCommas` | `boolean` | No | `false` | Adds grouping to bottom-axis numbers. | Used for continuous x-axes and logarithmic forest plots. |
226
+ | `dataFormat.bottomRoundTo` | `number` | No | `0`; logarithmic forest plots fall back to `2` when omitted | Decimal precision for bottom-axis numbers. | Used for continuous x-axes and logarithmic forest plots. |
227
+ | `dataFormat.bottomPrefix`, `dataFormat.bottomSuffix` | `string` | No | `''` | Text added before or after bottom-axis numbers. | Used for continuous x-axes and logarithmic forest plots. |
228
+ | `dataFormat.bottomAbbreviated` | `boolean` | No | `false` | Abbreviates bottom-axis values. | Only applied when the formatter decides the value should be abbreviated. |
229
+ | `dataFormat.showPiePercent` | `boolean` | No | `false` | Treats pie values as already-authored percentages. | When disabled, pie output uses the chart's computed slice percentages. |
230
+
231
+ ### Legend: `legend.*`
232
+
233
+ `legend` extends the shared [`Legend`](https://github.com/CDCgov/cdc-open-viz/blob/main/packages/core/CONFIG.md#legend) shape with chart-specific rendering and interaction fields.
234
+
235
+ | Field | Type | Required | Default | Description | Allowed values / Notes |
236
+ | --- | --- | --- | --- | --- | --- |
237
+ | `legend.hide` | `boolean` | No | `false` | Hides the chart legend. | Shared field; charts may still render specialized legends such as warming-stripes gradients separately. |
238
+ | `legend.position` | `left \| bottom \| top \| right \| side` | No | `top` | Places the legend relative to the chart. | Small viewports may force bottom placement. |
239
+ | `legend.behavior` | `highlight \| isolate` | No | `isolate` | Controls click behavior for series legends. | `highlight` emphasizes clicked series; `isolate` narrows display to selected legend entries where supported. |
240
+ | `legend.label`, `legend.description` | `string` | No | `''` | Legend heading and supporting description. | Rendered as authored legend copy. |
241
+ | `legend.singleRow` | `boolean` | No | `true` | Requests a single-row legend layout. | Runtime may wrap when space is limited. |
242
+ | `legend.unified` | `boolean` | No | Package defaults | Combines legend handling for supported chart families. | Common in pie and specialized legend flows. |
243
+ | `legend.axisAlign` | `boolean` | No | `true` | Aligns the legend with the plot/axis area. | Chart-specific layout option. |
244
+ | `legend.colorCode` | `string` | No | `''` | Optional color-code metadata used by some legend modes. | Usually editor-managed. |
245
+ | `legend.reverseLabelOrder` | `boolean` | No | `false` | Reverses the legend item order. | Useful when visual stacking order should match the legend. |
246
+ | `legend.verticalSorted` | `boolean` | No | `false` | Sorts vertical legend items. | Chart-specific layout option. |
247
+ | `legend.highlightOnHover` | `boolean` | No | `false` | Highlights legend items and related marks on hover. | `true`, `false` |
248
+ | `legend.seriesHighlight` | `string[]` | No | `[]` | Initial series keys to highlight. | Runtime also updates this during legend interaction. |
249
+ | `legend.style` | `circles \| boxes \| gradient \| lines` | No | `circles` | Chooses marker style for legend items. | `gradient` is used by gradient/warming-stripes-style legends. |
250
+ | `legend.subStyle` | `linear blocks \| smooth` | No | `linear blocks` | Chooses gradient legend treatment. | Only meaningful for gradient-style legends. |
251
+ | `legend.shape`, `legend.hasShape` | `string`, `boolean` | No | `circle`, package defaults | Shape metadata for shape-based legend entries. | Used by pattern and specialized legend rendering. |
252
+ | `legend.tickRotation` | `number \| string` | No | `''` | Rotates gradient legend tick labels. | Saved configs may store a numeric string. |
253
+ | `legend.groupBy` | `string` | No | `''` | Groups legend items by a source field. | Advanced legend layout option. |
254
+ | `legend.order` | `dataColumn \| asc \| desc` | No | `dataColumn` | Controls legend item ordering. | `dataColumn` follows the data/config order. |
255
+ | `legend.orderedValues` | `{ label?: string; value?: string }[]` | No | `[]` | Explicit legend order/labels. | Used when custom ordering is needed. |
256
+ | `legend.patterns`, `legend.patternField` | `object`, `string` | No | `{}`, `''` | Data-driven pattern configuration for legend marks. | Pattern entries can include label, color, shape, data key/value, and contrast metadata. |
257
+ | `legend.dynamicLegend`, `legend.dynamicLegendDefaultText`, `legend.dynamicLegendItemLimit`, `legend.dynamicLegendItemLimitMessage`, `legend.dynamicLegendChartMessage` | mixed | No | Package defaults | Dynamic legend controls and messages. | Used when legend selections drive chart state or empty-selection copy. |
258
+ | `legend.warmingStripesIntervals` | `object[]` | No | None | Warming-stripes interval metadata. | Used by warming-stripes-style line chart rendering. |
259
+ | `legend.hideSuppressedLabels`, `legend.hideSuppressionLink`, `legend.tooltipLegendVisible` | `boolean` | No | `false`, `false`, inferred from legend visibility | Suppression and tooltip legend controls. | Used by suppression-aware legend and tooltip flows. |
260
+ | `legend.hideBorder.side`, `legend.hideBorder.topBottom` | `boolean` | No | `false`, `true` | Hides side or top/bottom legend borders. | Chart-specific styling option. |
261
+
262
+ ### Data Table: `table.*`
263
+
264
+ `table` uses the shared [`Table`](https://github.com/CDCgov/cdc-open-viz/blob/main/packages/core/CONFIG.md#table) structure. The fields below are the chart-facing table controls consumers are most likely to author or encounter; shared label, caption, collapse, height, and download label fields follow the core table contract.
265
+
266
+ | Field | Type | Required | Default | Description | Allowed values / Notes |
267
+ | --- | --- | --- | --- | --- | --- |
268
+ | `table.show` | `boolean` | No | `true` outside dashboards; otherwise context-dependent | Shows the built-in chart data table. | Chart runtime also ensures a missing/blank `table.label` becomes `Data Table`. |
269
+ | `table.showDataTableLink` | `boolean` | No | `true` | Shows a skip/link target to the table in dashboard-style layouts. | Chart-specific wiring around the shared table. |
270
+ | `table.showVertical` | `boolean` | No | `true` | Uses vertical table output when supported. | Chart runtime honors the authored/default value when rendering the shared table. |
271
+ | `table.dateDisplayFormat` | `string` | No | `%B %-d, %Y` | Date format for table output. | Uses the chart date-format helper conventions. |
272
+ | `table.defaultSort` | `object` | No | Auto-filled for date-axis charts when possible | Initial table sort. | Shared object with `column`, `sortDirection`, and optional `customOrder`; chart can seed the x-axis date column when omitted. |
273
+ | `table.download`, `table.showDownloadImgButton`, `table.showDownloadPdfButton`, `table.showDownloadUrl` | `boolean` | No | `false` | Enables table data, image/PDF, and URL download controls. | See shared `Table` for related labels and download flags. |
274
+ | `table.includeContextInDownload` | `boolean` | No | `false` | Includes chart context in supported downloads. | Used by image/PDF download controls. |
275
+ | `table.customTableConfig` | [`Table`](https://github.com/CDCgov/cdc-open-viz/blob/main/packages/core/CONFIG.md#table) | No | None | Legacy custom-table marker. | Current chart runtime does not pass this as a nested table config; when truthy for non-Sankey tables, it switches the raw table data source to filtered config data. |
133
276
 
134
277
  ## Feature-Specific Enhancements
135
278
 
136
279
  | Field | Type | Required | Default | Description | Allowed values / Notes |
137
280
  | --- | --- | --- | --- | --- | --- |
138
- | `smallMultiples` | `object` | No | Package-initialized defaults | Splits one chart into multiple tiles. | Supports tile order, per-tile titles, synchronized tooltips, independent axes, and optional area fill for line tiles. |
139
- | `forestPlot` | `object` | No | Package-initialized defaults | Forest plot-specific rendering settings. | Includes row height, labels, pooled results, and scaling controls. |
140
- | `horizon` | `object` | No | Package-initialized defaults | Horizon chart settings. | Controls band count, spacing, and padding. |
141
- | `radar` | `object` | No | Package-initialized defaults | Radar chart display settings. | Controls rings, points, fill opacity, and axis label offset. |
142
- | `sankey` | `object` | No | Package-initialized defaults | Sankey layout, sizing, and color settings. | Includes node width, padding, margins, opacity, and story-node text. |
143
- | `boxplot` | `object` | No | Package-initialized defaults | Box plot labels and plot metadata. | Shared box-plot shape from `@cdc/core`; chart-specific config adds the plot collection. |
281
+ | `smallMultiples` | `object` | No | Package-initialized defaults | Splits one chart into multiple tiles. | See `smallMultiples.*` below. |
282
+ | `forestPlot` | `object` | No | Package-initialized defaults | Forest plot-specific rendering settings. | See `forestPlot.*` below. |
283
+ | `heatmap` | `object` | No | Package-initialized defaults | HeatMap layout and label settings. | See `heatmap.*` below. |
284
+ | `horizon` | `object` | No | `HORIZON_DEFAULTS` merged with config | Horizon chart settings. | See `horizon.*` below. |
285
+ | `radar` | `object` | No | Package-initialized defaults | Radar chart display settings. | See `radar.*` below. |
286
+ | `sankey` | `object` | No | Package-initialized defaults | Sankey layout, sizing, and color settings. | See `sankey.*` below. |
287
+ | `boxplot` | `object` | No | Package-initialized defaults | Box plot labels and plot metadata. | See `boxplot.*` below. Runtime-derived plot arrays are listed in `Fields You Can Ignore`. |
144
288
  | `annotations` | [`Annotation[]`](https://github.com/CDCgov/cdc-open-viz/blob/main/packages/core/CONFIG.md#annotation) | No | `[]` | Overlay annotations on the chart canvas. | Shared annotation contract from `@cdc/core`. |
145
- | `regions` | [`Region[]`](https://github.com/CDCgov/cdc-open-viz/blob/main/packages/core/CONFIG.md#region) | No | `[]` | Shaded date or category regions. | Shared region contract from `@cdc/core`. |
289
+ | `regions` | `object[]` | No | `[]` | Shaded date or category regions. | See `Regions: regions[]` below. |
290
+
291
+ ### HeatMap: `heatmap.*`
292
+
293
+ `heatmap` is chart-owned and only meaningful when `visualizationType` is `HeatMap`. HeatMap uses `xAxis.dataKey` as the column bucket and `series[]` as row definitions. `yAxis.label` labels the row axis, but row values come from the matching `columns` label when customized, then `series[].name`, then `series[].dataKey`; they do not come from `yAxis.dataKey`.
294
+
295
+ | Field | Type | Required | Default | Description | Allowed values / Notes |
296
+ | --- | --- | --- | --- | --- | --- |
297
+ | `xAxis.dataKey` | `string` | Yes for heatmaps | None | Source column used to create heatmap columns. | Date and date-time x-axis values are sorted chronologically with the chart date parser; categorical values preserve data order. |
298
+ | `series[]` | `Series[]` | Yes for heatmaps | `[]` | Source value columns used to create heatmap rows. | Each selected series becomes one row. Non-numeric series values are skipped; missing x/series combinations render as empty cells. |
299
+ | `series[].name` | `string` | No | `series[].dataKey` | Display label for the heatmap row when the matching `columns` label is not customized. | Also used in cell accessibility labels and tooltips. |
300
+ | `heatmap.cellPadding` | `number` | No | `1` | Gap between adjacent heatmap cells. | Values below 0 are treated as 0; runtime clamps the effective gap so cells do not render with negative dimensions. |
301
+ | `heatmap.rowLabelGap` | `number` | No | `32` | Horizontal gap between row labels and the heatmap grid. | Values below 0 are treated as 0. Ignored visually when `yAxis.hideLabel` hides row labels. |
302
+ | `heatmap.columnLabelGap` | `number` | No | `56` | Gap between x-axis tick labels and the heatmap grid. | Applies to top and bottom x-axis placement and contributes to reserved axis margin. |
303
+ | `heatmap.colorBucketCount` | `number` | No | `9` | Sets the Data Grouping control for discrete heatmap value groups. | Values below 1 are treated as 1; values above 9 are treated as 9. |
304
+ | `heatmap.xAxisPosition` | `top \| bottom` | No | `top` | Places the heatmap x-axis above or below the grid. | Invalid or omitted values fall back to `top`; the editor exposes this under `Date/Category Axis` for HeatMap only. |
305
+ | `heatmap.showCellValues` | `boolean` | No | `false` | Shows formatted numeric values inside cells. | Values render only when the cell is large enough to remain readable; empty cells do not show labels. |
306
+
307
+ HeatMap-specific behavior:
308
+
309
+ | Behavior | Details |
310
+ | --- | --- |
311
+ | Aggregation | If multiple source rows share the same x-axis value and series key, their numeric values are summed into one cell. |
312
+ | Tooltips | HeatMap cells use the shared chart tooltip markup. `series[].tooltip: false` hides that series row/value from cell tooltips. Column configs with `tooltips: true` can add extra rows unless they refer to the x-axis column or one of the heatmap series columns. Aggregated cells show an aggregated-row count and show `Multiple values` for extra tooltip columns that disagree across source rows. |
313
+ | Palette and legend | HeatMap colors come from `general.palette` or the chart fallback palette. `heatmap.colorBucketCount` quantizes the scale into 1-9 colors. `legend.style: "gradient"` or an omitted style renders a block-based gradient legend. Non-gradient legend styles render generated value ranges. |
314
+ | Axis labels | `xAxis.tickRotation` or `xAxis.maxTickRotation` rotates column labels and contributes to x-axis title spacing. `yAxis.tickRotation` rotates row labels. HeatMap defaults `yAxis.titlePlacement` to `side` when it is not explicitly authored. `yAxis.titlePlacement: "top"` renders the row-axis title above the row labels, aligned with the top x-axis title when one is visible; side placement renders the rotated side title centered beside the row labels. `hideXAxisLabel` and `hideYAxisLabel` hide the axis titles; `xAxis.hideLabel` and `yAxis.hideLabel` hide tick labels. |
315
+
316
+ ### Small Multiples: `smallMultiples.*`
317
+
318
+ Small multiples are chart-owned. They are supported by chart types allowed by the editor/runtime permissions.
319
+
320
+ | Field | Type | Required | Default | Description | Allowed values / Notes |
321
+ | --- | --- | --- | --- | --- | --- |
322
+ | `smallMultiples.mode` | `by-column \| by-series \| ''` | No | `''` | Enables tiling and chooses how tiles are created. | `by-series` creates one tile per configured series; `by-column` creates one tile per unique value in `tileColumn`. Blank disables small multiples. |
323
+ | `smallMultiples.tileColumn` | `string` | Conditionally | `''` | Source column used to create tiles in `by-column` mode. | Required when `mode` is `by-column`. |
324
+ | `smallMultiples.tilesPerRowDesktop` | `number` | No | `3` | Desktop tile count per row. | Editor constrains this to 1-3. |
325
+ | `smallMultiples.tilesPerRowMobile` | `number` | No | `1` | Mobile tile count per row. | Current editor keeps mobile at one tile per row. |
326
+ | `smallMultiples.tileOrderType` | `asc \| desc \| custom` | No | `asc` | Sorts tile order by title or uses `tileOrder`. | `custom` uses the explicit `tileOrder` array. |
327
+ | `smallMultiples.tileOrder` | `string[]` | No | `[]` | Explicit tile order for custom ordering. | Values should match series keys or `tileColumn` values depending on mode. |
328
+ | `smallMultiples.tileTitles` | `Record<string, string>` | No | `{}` | Custom display titles keyed by tile value. | Empty or same-as-key titles can be omitted. |
329
+ | `smallMultiples.independentYAxis` | `boolean` | No | `false` | Gives each tile its own y-axis scale. | Chart-level y-axis min/max overrides this behavior. |
330
+ | `smallMultiples.colorMode` | `same \| different` | No | `same` | Chooses whether tiles reuse the same color or step through the palette. | Editor defaults to `different` when the control is first shown, but initial state is `same`. |
331
+ | `smallMultiples.synchronizedTooltips` | `boolean` | No | `true` | Shows matching tooltips across tiles at the same data point. | `true`, `false` |
332
+ | `smallMultiples.showAreaUnderLine` | `boolean` | No | `true` | Shades the area below line tiles. | Only meaningful for line small multiples. |
333
+
334
+ When `yAxis.titlePlacement` is `top`, the leading tile in each row renders that y-axis title in the tile header instead of inside the SVG plot area.
335
+
336
+ ### Forest Plot: `forestPlot.*`
337
+
338
+ `forestPlot` is chart-owned and only meaningful when `visualizationType` is `Forest Plot`.
339
+
340
+ | Field | Type | Required | Default | Description | Allowed values / Notes |
341
+ | --- | --- | --- | --- | --- | --- |
342
+ | `forestPlot.type` | `Linear \| Logarithmic \| ''` | Yes for forest plots | `''` | Chooses the forest plot scale. | `Linear` places the line of no effect at 0; `Logarithmic` places it at 1. |
343
+ | `forestPlot.title` | `string` | No | `''` | Title centered above the forest plot body. | Optional. |
344
+ | `forestPlot.estimateField` | `string` | Yes for forest plots | `''` | Column containing the point estimate. | Must exist in the active dataset. |
345
+ | `forestPlot.estimateRadius` | `string` | No | `''` | Legacy/source column used by older estimate-radius flows. | Prefer `forestPlot.radius.scalingColumn` for current radius scaling. |
346
+ | `forestPlot.lower`, `forestPlot.upper` | `string` | Yes for forest plots | `''` | Columns containing lower and upper confidence interval bounds. | Must exist in the active dataset. |
347
+ | `forestPlot.shape` | `text \| circle \| square` | No | `square` | Shape used for point estimates. | Editor exposes `text`, `circle`, and `square`. |
348
+ | `forestPlot.hideDateCategoryCol` | `boolean` | No | Package defaults | Hides the date/category column in supported forest plot layouts. | Only meaningful for forest plot side/table output. |
349
+ | `forestPlot.lineOfNoEffect.show` | `boolean` | No | `true` | Shows the line of no effect. | Position depends on `forestPlot.type`. |
350
+ | `forestPlot.startAt` | `number` | No | `0` | Starting value metadata for forest plot layout/scaling. | Advanced forest plot behavior. |
351
+ | `forestPlot.pooledResult.column` | `string` | No | `''` | Column/value used to identify pooled result rows. | Used with diamond pooled-result rendering. |
352
+ | `forestPlot.pooledResult.diamondHeight` | `number` | No | `5` | Height of pooled-result diamonds. | Pixel-like display value. |
353
+ | `forestPlot.rowHeight` | `number` | No | `20` | Height for each study row. | Editor constrains this roughly to 20-45. |
354
+ | `forestPlot.leftLabel`, `forestPlot.rightLabel` | `string` | No | `''` | Labels shown under the plot to describe directionality. | Example: favors treatment / favors control. |
355
+ | `forestPlot.radius.scalingColumn` | `string` | No | `''` | Column used to scale point estimate radius. | Leave blank for fixed-size points. |
356
+ | `forestPlot.radius.min`, `forestPlot.radius.max` | `number` | No | `2`, `10` | Minimum and maximum point radius. | Used when `radius.scalingColumn` is set. |
357
+ | `forestPlot.colors.line`, `forestPlot.colors.shape` | CSS color string | No | `''` | Custom colors for the no-effect line and point estimate shape. | Blank values use renderer defaults. |
358
+ | `forestPlot.regression.showDiamond` | `boolean` | No | Package defaults | Shows a regression diamond when supported. | Only meaningful for regression-style forest plot flows. |
359
+ | `forestPlot.regression.description` | `string` | No | Package defaults | Text label rendered with the regression/diamond summary when present. | Only meaningful for regression-style forest plot flows. |
360
+ | `forestPlot.regression.baseLineColor` | CSS color string | No | Package defaults | Color for the regression baseline and diamond when supported. | Blank values use renderer defaults. |
361
+
362
+ Forest plots also use normal chart `xAxis`, `columns`, `table`, and `dataFormat.bottom*` settings. Column configs can mark forest-plot table columns with the chart-owned column extensions below.
363
+
364
+ | Field | Type | Required | Default | Description | Allowed values / Notes |
365
+ | --- | --- | --- | --- | --- | --- |
366
+ | `columns.*.forestPlot` | `boolean` | No | `false` | Marks the column for forest plot table/sidebar display. | Only meaningful for `visualizationType: "Forest Plot"`. |
367
+ | `columns.*.forestPlotAlignRight` | `boolean` | No | `false` | Right-aligns the forest plot column value. | Only meaningful for forest plot column output. |
368
+ | `columns.*.forestPlotStartingPoint` | `number` | No | None | Forest plot baseline/starting point metadata for that column. | Advanced forest plot table behavior. |
369
+
370
+ ### Regions: `regions[]`
371
+
372
+ Regions are chart-owned shaded ranges or markers.
373
+
374
+ | Field | Type | Required | Default | Description | Allowed values / Notes |
375
+ | --- | --- | --- | --- | --- | --- |
376
+ | `regions[].from`, `regions[].to` | `string` | Yes | None | Start and end values for the region. | May represent dates, categories, or numeric thresholds. |
377
+ | `regions[].label` | `string` | No | `''` | Region label shown in supported UIs. | Optional. |
378
+ | `regions[].color` | `string` | No | App font color (`--cool-gray-90`) | Label text color. | CSS color string. Legacy configs migrated to `red` when this was omitted before `4.26.5`. |
379
+ | `regions[].background` | `string` | No | `--cool-gray-50` | Fill color for the shaded region. | CSS color string. Rendered at 30% opacity. Legacy configs migrated to `red` when this was omitted before `4.26.5`. |
380
+ | `regions[].range` | `string` | No | `Custom` in editor flows | Region mode metadata. | Package-defined values such as `Custom`. |
381
+ | `regions[].fromType`, `regions[].toType` | `string` | No | `Fixed` | Interpretation of the start/end values. | Examples include `Fixed`, `Previous Days`, and `Last Date`. |
382
+
383
+ ### Radar: `radar.*`
384
+
385
+ `radar` is chart-owned and only meaningful when `visualizationType` is `Radar`.
386
+
387
+ | Field | Type | Required | Default | Description | Allowed values / Notes |
388
+ | --- | --- | --- | --- | --- | --- |
389
+ | `xAxis.dataKey` | `string` | Yes for radar | None | Category column used for radar axes. | Required by the radar renderer. |
390
+ | `radar.gridRings` | `number` | No | `5` | Number of concentric grid rings. | Editor constrains this to 3-10. |
391
+ | `radar.showGridRings` | `boolean` | No | `true` | Shows the radar grid rings. | `true`, `false` |
392
+ | `radar.gridRingStyle` | `polygons \| circles` | No | `polygons` | Shape of the grid rings. | `polygons` follows the axis count; `circles` renders rounded rings. |
393
+ | `radar.scaleMin` | `number` | No | `0` | Minimum radar scale value at the center. | Numeric. |
394
+ | `radar.scaleMax` | `number \| string` | No | `''` | Maximum radar scale value. | Blank means auto-calculate from data. |
395
+ | `radar.showFill` | `boolean` | No | `false` when omitted | Fills the polygon area. | The initial state does not seed this field; renderer/editor treat missing as false. |
396
+ | `radar.fillOpacity` | `number` | No | `0.3` | Opacity for polygon fill. | Used when `showFill` is true; expected range is 0-1. |
397
+ | `radar.strokeWidth` | `number` | No | `2` | Width of the polygon outline. | Editor constrains this to 1-5. |
398
+ | `radar.showPoints` | `boolean` | No | `true` | Shows point markers at polygon vertices. | `true`, `false` |
399
+ | `radar.pointRadius` | `number` | No | `4` | Radius of point markers. | Used when `showPoints` is true. |
400
+ | `radar.axisLabelOffset` | `number` | No | `15` | Distance between axis endpoint and label. | Pixel-like offset. |
401
+
402
+ ### Sankey: `sankey.*`
403
+
404
+ `sankey` is chart-owned and only meaningful when `visualizationType` is `Sankey`. Sankey configs commonly use `data[0]` to carry `links`, `storyNodeText`, `tooltips`, and optional `tableData`.
405
+
406
+ | Field | Type | Required | Default | Description | Allowed values / Notes |
407
+ | --- | --- | --- | --- | --- | --- |
408
+ | `sankey.iterations` | `number` | No | `1` | Layout iteration count. | Higher values can adjust node placement. |
409
+ | `sankey.nodePadding` | `number` | No | `55` | Vertical spacing between nodes. | Pixel-like layout value. |
410
+ | `sankey.nodeSize.nodeWidth` | `number` | No | `26` | Width of each node. | Initial state also contains `nodeHeight`, but the public width control is the meaningful renderer field. |
411
+ | `sankey.margin.margin_x`, `sankey.margin.margin_y` | `number` | No | `0`, `25` | Horizontal and vertical layout margins. | Pixel-like layout values. |
412
+ | `sankey.rxValue` | `number` | No | `0.9` | Node corner radius. | SVG rectangle radius value. |
413
+ | `sankey.nodeColor.default`, `sankey.nodeColor.inactive` | CSS color string | No | `#ff8500`, `#808080` | Node colors for default and inactive states. | Used by interactive highlighting. |
414
+ | `sankey.linkColor.default`, `sankey.linkColor.inactive` | CSS color string | No | `#ffc900`, `#D3D3D3` | Link colors for default and inactive states. | Used by interactive highlighting. |
415
+ | `sankey.opacity.nodeOpacityDefault`, `sankey.opacity.nodeOpacityInactive` | `number` | No | `1.0`, `0.1` | Node opacity for default and inactive states. | Expected range is 0-1. |
416
+ | `sankey.opacity.LinkOpacityDefault`, `sankey.opacity.LinkOpacityInactive` | `number` | No | `1.0`, `0.1` | Link opacity for default and inactive states. | Field names preserve legacy capitalization. |
417
+ | `sankey.nodeFontColor`, `sankey.storyNodeFontColor` | CSS color string | No | `black`, `#006778` | Text colors for node labels and story-node text. | CSS color strings. |
418
+ | `sankey.nodeValueStyle.textBefore`, `sankey.nodeValueStyle.textAfter` | `string` | No | `(`, `)` | Text wrapped around node values. | Useful for units or punctuation around displayed values. |
419
+ | `enableTooltips` | `boolean` | No | `false` | Enables authored Sankey tooltip content. | Tooltip data in `data[0].tooltips` only displays when this is enabled. |
420
+ | `data[0].links` | `{ source: string; target: string; value: number }[]` | Yes for Sankey | None | Sankey link definitions. | Required for a Sankey chart to render nodes and flows. |
421
+ | `data[0].storyNodeText` | `{ StoryNode: string; segmentTextBefore: string; segmentTextAfter: string }[]` | No | `[]` | Optional story text for selected nodes. | Editor supports up to three story nodes. |
422
+ | `data[0].tooltips` | `object[]` | No | `[]` | Extra tooltip content for Sankey links/nodes. | `enableTooltips` controls whether configured Sankey tooltips display. |
423
+ | `data[0].tableData` | `object[]` | No | None | Custom table data for Sankey. | When present, chart table output can use this instead of default transformed rows. |
424
+
425
+ ### Box Plot: `boxplot.*`
426
+
427
+ `boxplot` is chart-owned. Chart runtime derives `plots`, `categories`, and `tableData` from the active dataset for `visualizationType: "Box Plot"`; consumers usually only author labels and display toggles.
428
+
429
+ | Field | Type | Required | Default | Description | Allowed values / Notes |
430
+ | --- | --- | --- | --- | --- | --- |
431
+ | `boxplot.labels.q1`, `boxplot.labels.q3` | `string` | No | `Lower Quartile`, `Upper Quartile` | Labels for the lower and upper quartile values in box plot tooltips. | Current runtime renders these labels in tooltip output. |
432
+ | `boxplot.labels.median` | `string` | No | `Median` | Label for the median value in box plot tooltips. | Current runtime renders this label in tooltip output. |
433
+ | `boxplot.labels.iqr` | `string` | No | `Interquartile Range` | Label for the interquartile range in box plot tooltips. | Current runtime renders this label in tooltip output. |
434
+ | `boxplot.plotOutlierValues` | `boolean` | No | `false` | Plots outlier values. | Box plot display toggle. |
435
+ | `boxplot.plotNonOutlierValues` | `boolean` | No | `true` | Plots non-outlier values. | Box plot display toggle. |
436
+ | `boxplot.hideOutliers` | `boolean` | No | `false` | Excludes outlier values from the box plot scale/domain calculation. | Runtime-read advanced setting; this is separate from whether outlier points are drawn. |
437
+ | `boxplot.borders` | `string` | No | `'true'` | Border metadata for box plot rendering. | Stored as a string for compatibility. |
438
+
439
+ ### Horizon Chart: `horizon.*`
440
+
441
+ `horizon` is chart-owned and only meaningful when `visualizationType` is `Horizon Chart`. The renderer merges authored values with `HORIZON_DEFAULTS`.
442
+
443
+ | Field | Type | Required | Default | Description | Allowed values / Notes |
444
+ | --- | --- | --- | --- | --- | --- |
445
+ | `horizon.numLayers` | `number` | No | `4` | Number of horizon layers/bands per series. | More layers provide finer gradations but denser rows. |
446
+ | `horizon.bandGap` | `number` | No | `15` | Gap between series bands. | Pixel-like value subtracted from available row height. |
447
+ | `horizon.bottomPadding` | `number` | No | `15` | Padding below the bottom band above the x-axis. | Pixel-like value. |
146
448
 
147
449
  ## Fields You Can Ignore
148
450
 
@@ -153,15 +455,33 @@ These fields sometimes appear in saved configs, copied editor state, or migratio
153
455
  | `runtime.*` | Internal runtime state created while the chart is loading and transforming data. |
154
456
  | `formattedData` | Runtime-transformed data snapshot, not part of the authoring contract. |
155
457
  | `runtimeDataUrl` | Runtime-managed URL after filters are applied. |
458
+ | `suppressedData` | Legacy suppression metadata from older saved configs. Current suppression/effect markers use `preliminaryData`, documented above, but regular Bar/Combo legend labels can still read this field for legacy suppression labels. |
459
+ | `xAxis.sortDates` | Legacy date-sort flag migrated to `xAxis.type: "date-time"` and then removed. Current configs should use axis type/date fields and `xAxis.sortByRecentDate` where relevant. |
156
460
  | `uid` | Generated identifier used for shared filters and internal wiring. |
157
461
  | `newViz` | Editor confirmation flag. |
158
462
  | `debugSvg` | Debug-only renderer flag. |
159
463
  | `showDownloadMediaButton` | Legacy editor/export artifact. |
464
+ | `showSidebar` | Stale chart-sidebar artifact retained by broad legacy types but not used by current chart rendering. |
465
+ | `legend.lineMode` | Legacy/editor-exported legend style flag. Author `legend.style: "lines"` for current configs. |
466
+ | `visual.tp5Treatment`, `visual.tp5Background` | Feature-gated chart shell flags that may appear in saved/editor configs, but current chart rendering removes TP5 treatment classes while chart/map TP5 treatment is disabled. |
160
467
  | `padding` | Internal layout padding object preserved for compatibility. |
161
468
  | `area` | Legacy area-chart metadata. |
162
- | `brush` | Brush state managed by the renderer. |
469
+ | `brush` | Internal brush selection state managed by the renderer. Consumer-facing brush settings (`brushActive`, `brushDefaultRecentDateCount`, `brushDynamicYAxis`) live on `xAxis` and are documented in the local axis section above. |
470
+ | `xAxis.axisBBox`, `xAxis.maxValue`, `xAxis.tickWidthMax`, `yAxis.axisBBox`, `yAxis.maxValue`, `yAxis.tickWidthMax` | Runtime axis layout measurements and scale snapshots. |
471
+ | `sankey.data` | Processed Sankey container mirrored from `data[0]` by runtime/editor flows. |
472
+ | `sankey.title`, `sankey.overallSize`, `sankey.nodeSize.nodeHeight`, `sankey.storyNodeText` | Saved Sankey defaults or legacy/editor artifacts not used by the current renderer. Story-node text that affects rendering lives in `data[0].storyNodeText`. |
473
+ | `runtime.series[].originalDataKey` | Original series key retained on generated runtime series during dynamic-category rendering. |
474
+ | `boxplot.plots`, `boxplot.categories`, `boxplot.tableData` | Runtime-derived box plot structures generated from the active dataset. |
475
+ | `boxplot.labels.maximum`, `boxplot.labels.minimum`, `boxplot.labels.q2`, `boxplot.labels.q4`, `boxplot.labels.mean`, `boxplot.labels.sd`, `boxplot.labels.count`, `boxplot.labels.outliers`, `boxplot.labels.values`, `boxplot.labels.lowerBounds`, `boxplot.labels.upperBounds` | Persisted box plot label defaults that current chart/table output does not render. |
476
+ | `forestPlot.description.*`, `forestPlot.result.*` | Legacy saved defaults for older forest plot side-column labels. Current side-column rendering uses `columns.*.forestPlot` fields instead. |
477
+ | `forestPlot.leftWidthOffset`, `forestPlot.rightWidthOffset`, `forestPlot.leftWidthOffsetMobile`, `forestPlot.rightWidthOffsetMobile` | Legacy saved/editor layout offsets. Current forest plot layout reserves left/right space from measured text and forest-plot column settings. |
478
+ | `horizon.mode`, `horizon.negativePalette` | Scaffolded horizon metadata not used by the current renderer. Current Horizon rendering treats values as positive magnitudes. |
163
479
  | `color` | Legacy top-level palette token kept for backward compatibility. |
164
480
  | `palette` | Legacy top-level palette token superseded by `general.palette`. |
481
+ | `isPaletteReversed` | Legacy top-level palette reversal flag. Current palette reversal is controlled by `general.palette.isReversed`; two-color charts use `twoColor.isPaletteReversed`. |
482
+ | `visualizationSubType: "horizontal"` | Legacy horizontal-bar subtype. Current configs should use `orientation: "horizontal"` and keep `visualizationSubType` as `regular` or `stacked`. |
483
+ | `isLegendValue` | Legacy legend-display flag from older saved configs; current legend behavior is configured under `legend.*`. |
484
+ | `dataFormat.onlyShowTopPrefixSuffix` | Legacy/editor-export number-formatting artifact; current prefix/suffix behavior is controlled by the axis-specific `dataFormat.*Prefix` and `dataFormat.*Suffix` fields documented above. |
165
485
  | `datasets` | Dashboard-only data container passed into the component, not authored inside a standalone chart config. |
166
486
  | `migrations` | Editor/migration bookkeeping. |
167
487
  | `dynamicMarginTop` | Editor/export artifact used by older saved configs. |