Content & Data
Line Chart
Line Chart shows a trend across ordered categories — a single series by default, or several series as separate lines. Static and non-tabbable, with an optional sparkline mode and 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 — no variants
- 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
- Figma covers only the single-series Line Chart (example) static visual reference (a single stroke with hollow-ring markers and no axes); it is not a reusable Figma component. Multiple series, the value axis, grid, legend and tooltip have no Figma reference — they use current Skrewww tokens conservatively and need a design decision before parity can be claimed.
- Point markers, axes and the sparkline treatment beyond the example are this implementation's own decisions; fixed chart height (width is fluid) is likewise not something Figma specified.
- 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.
Purpose
Anatomy
Variants and states
When to use
When not to use
Accessibility
Common mistakes
Properties
Why is there no axis at all by default?
Why "linear" curve type, not a smoothed curve?
How is the underlying data exposed to screen readers?
What is sparkline mode for?
How do I show several series?
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`. |
| sparkline | boolean | false | Compact inline rendering: hides the point markers, uses a 1.5px stroke instead of 2px, and hides every axis, grid line, legend and tooltip. Data and accessibility (role="img" + hidden data table) are unchanged. |
| markers | boolean | true | Draw a hollow-ring marker on each point. Always false in sparkline mode. |
| 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 false (the Figma reference has no axis). |
| 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 { LineChart } from "@/components/ui";
const monthlySignups = [
{ label: "Jan", value: 58 },
{ label: "Feb", value: 95 },
{ label: "Mar", value: 76 },
{ label: "Apr", value: 128 },
{ label: "May", value: 108 },
{ label: "Jun", value: 140 },
];
const trend = [
{ label: "Jan", revenue: 120, orders: 80 },
{ label: "Feb", revenue: 150, orders: 95 },
{ label: "Mar", revenue: 135, orders: 110 },
{ label: "Apr", revenue: 170, orders: 120 },
];
export function Example() {
return <LineChart data={monthlySignups} label="Monthly signups" />;
}
export function MultiSeriesExample() {
return (
<LineChart
data={trend}
label="Revenue and orders"
series={[
{ key: "revenue", label: "Revenue", format: { kind: "currency", currency: "USD", maximumFractionDigits: 0 } },
{ key: "orders", label: "Orders" },
]}
showCategoryAxis
showValueAxis
showGrid
tooltip
/>
);
}