Content & Data
Area Chart
Area Chart shows magnitude over ordered categories with a filled area under each line — a single series by default, or several series overlapped, stacked, or stacked to 100%. Static and non-tabbable, with the data also exposed as a hidden table.
Part of the chart components — see the Charts overview for how the families and dashboard compositions fit together.
Single component — stacking is a prop, not a variant
- React last updated
- 2026-09-22
- Documentation last updated
- 2026-09-26
- Accessibility target
- WCAG 2.2 AA (target)
- Version
- 0.1.0-beta
Known open questions
- A Figma visual reference now exists for Area Chart (static frames, verified 2026-09-26; not a data-bound or reusable component): 2px stroke, 20% fill, category axis shown by default, value axis and grid hidden by default, legend for multi-series, and stacking examples (overlap, stacked, 100% stacked). Runtime and data behavior remain React-only and no full Figma API parity is claimed.
- The categorical series palette (four slots: brand action, primary text, amber, green) is a CH-2 implementation choice checked for >= 3:1 contrast on the default white surface, not a Figma-verified palette. Slots carry no status meaning; positive/negative colors are a separate, unresolved design decision.
- An interactive legend (series toggling) is deferred: it needs a hidden-series state plus keyboard and announcement design. The legend is a non-interactive key.
- The tooltip is pointer/touch-only supplementary information; every value is also in the hidden table. A keyboard-operable chart (focusable points, arrow-key navigation) is deferred.
- Dense data and long category labels have no policy yet: category labels always render (no tick skipping, rotation, truncation, scrolling or aggregation), so many points or long labels can collide or clip. A density and label-length policy is an open decision.
- Stacked area with negative values is not designed; use non-negative data for stacked and percent modes.
Purpose
Anatomy
Variants and states
When to use
When not to use
Accessibility
Common mistakes
Properties
Area Chart or Line Chart?
Why is there no separate StackedAreaChart?
How is the underlying data exposed to screen readers?
Why do overlapped series use translucent fills?
Tokens used
Component API
| Prop | Type | Default | Description |
|---|---|---|---|
| data | ({ label: string } & { [seriesKey: string]: string | number | null })[] | — | One row per category: { label, value } for a single series, or { label, [series.key]: number | null } when `series` is given. null means no data (a gap or no bar). Duplicate labels are allowed. |
| label | string | — | Accessible name for the chart — also used as the hidden data table's caption. |
| height | number | 240 | Fixed pixel height. Width is fluid (ResponsiveContainer), filling the parent. |
| series | { key: string; label: string; color?: "series-1" | "series-2" | "series-3" | "series-4"; format?: ChartValueFormat }[] | — | Series definitions: { key, label, color?, format? }. `key` is the row property holding the value (unique, never "label"); `color` is a slot "series-1"…"series-4" (default: by position, wrapping after four). Omit for a single series read from each row's `value`. |
| stacking | "none" | "stacked" | "percent" | "none" | "none" overlaps series; "stacked" stacks them; "percent" stacks to 100% of each category. |
| legend | boolean | — | Show a legend. Defaults to true when there is more than one series. It is a non-interactive key (no series toggling). |
| tooltip | boolean | — | Show a hover/touch tooltip listing the category and each series' value. Defaults to false. Supplementary only: every value is also in the hidden table. |
| showCategoryAxis | boolean | — | Show the category axis labels. Defaults to true. |
| showValueAxis | boolean | — | Show the value-axis ticks. Defaults to false. |
| showGrid | boolean | — | Show grid lines. Defaults to false. |
| valueFormat | ChartValueFormat | — | How values are formatted on value-axis ticks, in the tooltip, and in the hidden table: a function (value: number) => string, or { kind: "number" | "compact" | "percent" | "currency", ... }. Default: the raw number. A series' own `format` overrides it. |
| labelFormat | ChartLabelFormat | — | How category labels are formatted on the axis, in the tooltip, and in the hidden table: a function (label: string) => string, or { kind: "date", granularity: "day" | "month" | "year" } for normalized ISO date labels (UTC). Default: the label as given. |
React example
import { AreaChart } from "@/components/ui";
const monthlyUsers = [
{ label: "Jan", value: 120 },
{ label: "Feb", value: 180 },
{ label: "Mar", value: 150 },
{ label: "Apr", value: 240 },
{ label: "May", value: 210 },
{ label: "Jun", value: 300 },
];
const traffic = [
{ label: "Mon", web: 320, mobile: 210 },
{ label: "Tue", web: 360, mobile: 240 },
{ label: "Wed", web: 300, mobile: 280 },
{ label: "Thu", web: 410, mobile: 260 },
];
export function Example() {
return <AreaChart data={monthlyUsers} label="Monthly active users" />;
}
export function MultiSeriesExample() {
return (
<AreaChart
data={traffic}
label="Traffic by platform"
series={[
{ key: "web", label: "Web" },
{ key: "mobile", label: "Mobile" },
]}
stacking="stacked"
showValueAxis
showGrid
tooltip
valueFormat={{ kind: "compact" }}
/>
);
}